最近遇到了很多需要Relay的场景,于是现在特定的来学习一下常见的Relay攻击以及手法
NTLM Relay
NTLM认证过程
参考 https://www.freebuf.com/articles/web/269876.html
Windows的NTLM认证就是利用NTLM Hash进行的认证,可以分为本地认证 以及 网络认证两种方式,即可用于域内的认证服务,又可用于工作组环境.NTLM 有 NTLMv1,NTLMv2,NTLMsessionv2等,常用的最多为 NTLMv2
NTLM在本地的认证
当用户在 Windows 本地登录时,用户的密码存储在本地计算机的 SAM 这个文件里,SAM 文件的路径为%SystemRoot%system32configSAM。当用户输入密码进行本地认证的过程中,用户输入的密码将为被转化为 NTLM Hash,然后与SAM中的NTLM Hash进行比较。当用户注销、重启、锁屏后,操作系统会让 winlogon.exe 显示登录界面(输入框)。当 winlogon.exe 接收输入后,会将密码交给lsass进程。lsass.exe 是一个系统进程,用于微软Windows系统的安全机制。它用于本地安全和登陆策略,这个进程中会存一份明文密码,将明文密码加密成 NTLM Hash,对SAM数据库比较认证
NTLM在工作组环境的认证
NTLM在网络环境中的认证采用的是一种 Challenge/Response 验证机制,由三种消息组成:
type 1:协商
type 2:质询
type 3:身份验证
(1) 首先,假设客户端需要访问服务器的某个服务是需要进行身份认证,于是客户端要输入服务器的用户名和密码进行验证,此时客户端本地会缓存一份服务器密码的 NTLM Hash值.客户端发送 TYPE1 Negotiate
协商信息去协商需要认证的主体,用户(服务器端的用户名),机器以及需要使用的安全服务等信息
(2)服务器端收到客户端发送过来的 TYPE 1 消息后,会读取其中的内容,并从中选择出自己所能接受的服务内容,加密等级,安全服务等.此后传入 NTLM SSP
,得到 TYPE 2 Challenge 消息,并将此 TYPE 2 消息发回给客户端。这个 TYPE 2 消息中包含了一个由服务端生成的16位随机值,此随机值被称为 Challenge,服务器也会将该 Challenge 保存起来.
(3)客户端收到服务端返回的 TYPE 2 消息后,会读取出服务端所支持的内容,并取出其中的随机值 Challenge,用缓存的服务器端密码的 NTLM-Hash 对其进行加密,并与用户名、Challenge 等一起组合得到 Net-NTLMHash,最后将 Net NTLM-Hash封装到 TYPE 3 Authenticate消息中(被称为 Authenticate 认证消息),发往服务端.
(4)服务器在收到 TYPE 3 的消息之后,用自己的密码的 NTLM-Hash 对 Challenge 进行加密,并比较自己计算出的 Net NTLM-Hash 认证消息和客户端发送的认证消息是否匹配.如果匹配,则证明客户端掌握了正确的密码,认证成功,否则认证失败.
NTLM在域环境的认证
认证过程与在工作组中是一样的,不同的地方是在第四步:
(4)服务器接收到客户端发送来的 TYPE 3消息后,取出其中的 Net NTLM-Hash值,并向域控制器发送针对客户端的验证请求.该请求主要包含以下三方面的内容:用户名(服务器端的用户名)、原始的 Challenge 和 加密后的 Challenge(即Net NTLM-Hash).
(5)然后域控制器会根据用户名获取该帐号的密码哈希值 NTLM Hash,用哈希值对原始的 Challenge 进行加密得到 Net NTLM-Hash.如果加密后的 Challenge 和服务器发送的一致,则意味着用户拥有正确的密码,验证通过,否则验证失败.并将验证结果发给服务器.
(6)服务器根据域控制器返回的结果,对客户端进行回复.
Net-NTLM Hash的格式
Net-NTLM Hash v1的格式为:
username::hostname:LM response:NTLM response:challenge
Net-NTLM Hash v2的格式为:
username::domain:challenge:HMAC-MD5:blob
各个NTLM的计算方式
LM Hash
1.用户的密码转换为大写,密码转换为16进制字符串,不足14字节将会用0来再后面补全。
2.密码的16进制字符串被分成两个7byte部分。每部分转换成比特流,并且长度位56bit,长度不足使用0在左边补齐长度
3.再分7bit为一组,每组末尾加0,再组成一组
4.上步骤得到的二组,分别作为key 为 “KGS!@#$%“进行DES加密。
5.将加密后的两组拼接在一起,得到最终LM HASH值。
NTLM Hash
1.先将用户密码转换为十六进制格式。
2.将十六进制格式的密码进行Unicode编码。
3.使用MD4摘要算法对Unicode编码数据进行Hash计算
NTLM认证相关安全问题
哈希传递
略
抓取Net-NTLM Hash
利用NtlmRelay需要抓取 Net-NTLMHash,因此先看看有哪些可以方法可以做到,实际上SMB、HTTP、LDAP、MSSQL等协议都可以携带NTLM认证的信息,因此我们可以通过这些协议进行攻击,常见的如 浏览器、word文档、pdf文档、explorer.exe等等,常见的获取Net-NtlmHash手法如下:
1.网络协议的欺骗与劫持
2.钓鱼攻击
3.与其他漏洞结合
利用LLMNR/NBNS欺骗
劫持原理跟 arp 欺骗是很相似的,是利用 LLMNR/NBNS 欺骗进行的
参考 https://zhuanlan.zhihu.com/p/64889695
因此前面解析失败后,就会用 LLMNR/NBNS 进行解析
LLMNR协议
NBNS协议
之后我们伪装为smb跟客户端建立tcp连接,进行NTLM认证获取Net-NTLMHash
4次握手
获取我们设置好的Challenge
返回Net-NTLMHash
因为对 Net-NTLMHash
不太熟悉,因此不能从Wireshark中甄别Hash部分
这里面使用 https://github.com/lgandx/Responder 进行攻击(图片ip不一致因为有些是后面整理的时候做的测试)
随便输入个测试
前四个smb2包就是NTLM的认证过程
从前面将的流程看,我们会在第二步将 challenge 发送过去
同时我们可以获取到目标机器的 Net-NTLM Hash
格式一般为
username::domain:challenge:HMAC-MD5:blob
其中我们可以尝试爆破,但是不推荐尝试,因为 Net-NTLMv2 Hash 很难爆破成功
爆破用的Hashcat参数为
hashcat -m 5600 Net-NTLMv2Hash pass.txt --force
当使用ip进行smb连接时(非NetBios Name时候),是通过arp协议获取的
Responder中没有arp欺骗的功能
当然不止 SMB 请求可以获取到 Net-NTLM,http请求也可以
当然还有一些其他的好玩的方法,参考以下
https://3gstudent.github.io/%E6%B8%97%E9%80%8F%E6%8A%80%E5%B7%A7-%E5%88%A9%E7%94%A8%E5%9B%BE%E6%A0%87%E6%96%87%E4%BB%B6%E8%8E%B7%E5%8F%96%E8%BF%9E%E6%8E%A5%E6%96%87%E4%BB%B6%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%9A%84NTLMv2-Hash
https://whoamianony.top/2021/04/15/%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95/%E5%86%85%E7%BD%91%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95/%E5%86%85%E7%BD%91%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95%EF%BC%9A%E5%8F%91%E9%80%81%20NTLM%20%E8%AF%B7%E6%B1%82%E4%B8%8E%E6%88%AA%E8%8E%B7%20Net-NTLM%20Hash/
WPAD劫持
Web Proxy Auto-Discovery Protocol是用来查找PAC文件的协议,其主要通过DHCP、DNS、LLMNR、NBNS协议来查找存放PAC文件的主机。一个典型的劫持方式是利用LLMNR/NBNS欺骗来让受害者从攻击者获取PAC文件,PAC文件指定攻击者就是代理服务器,然后攻击者就可以劫持受害者的HTTP流量,在其中插入任意HTML标签
参考于:https://zhuanlan.zhihu.com/p/64889695
在浏览器设置为 “自动检测代理设置” 的情况下,用户在访问网页时,首先会查询 PAC 文件的位置,然后获取 PAC 文件,将 PAC 文件作为代理配置文件。查询 PAC 文件的顺序如下:
通过 DHCP 服务器
查询 WPAD 主机的IP
Hosts
DNS (cache / server)
LLMNR
NBNS
sudo python Responder.py -I vnic2 -i 10.37.132.2 -r on -v -F on -w on
参考: https://whoamianony.top/2021/04/15/%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95/%E5%86%85%E7%BD%91%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95/%E5%86%85%E7%BD%91%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95%EF%BC%9A%E5%8F%91%E9%80%81%20NTLM%20%E8%AF%B7%E6%B1%82%E4%B8%8E%E6%88%AA%E8%8E%B7%20Net-NTLM%20Hash/
但是很不幸的是,微软在2016年发布了 MS16-077 安全公告,添加了两个重要的保护措施,以缓解这类攻击行为:
系统再也无法通过广播协议来解析 WPAD 文件的位置,只能通过使用 DHCP 或 DNS 协议完成该任务。
更改了 PAC 文件下载的默认行为,以便当 WinHTTP 请求 PAC 文件时,不会自动发送客户端的域凭据来响应 NTLM 或协商身份验证质询。
参考 https://whoamianony.top/2021/04/15/%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95/%E5%86%85%E7%BD%91%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95/%E5%86%85%E7%BD%91%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95%EF%BC%9A%E5%8F%91%E9%80%81%20NTLM%20%E8%AF%B7%E6%B1%82%E4%B8%8E%E6%88%AA%E8%8E%B7%20Net-NTLM%20Hash/
用于 IPV6绕过
后面玄武实验室的师傅们发现在Java中可以发送Http -> SMB Relay,可以绕过MS16-077
其他
Xss
SSrf
Mysql
Mssql
等等
NTLM Relay
工作组环境下
这个实用性比较差。在工作组环境里面,工作组中的机器之间相互没有信任关系,每台机器的账号密码Hash只是保存在自己的SAM文件中,这个时候Relay到别的机器,除非两台机器的账号密码一样(如果账号密码一样,我为啥不直接pth呢),不然没有别的意义了,这个时候的攻击手段就是将机器reflect回机子本身。因此微软在ms08-068中对smb reflect到 smb 做了限制,防止了同一主机从SMB协议向SMB协议的Net-NTLMhash relay。这个补丁在CVE-2019-1384(Ghost Potato)被绕过。
域环境下
域环境底下域用户的账号密码Hash保存在域控的 ntds.dit里面。如下没有限制域用户登录到某台机子,那就可以将该域用户Relay到别人的机子,或者是拿到域控的请求,将域控Relay到普通的机子,比如域管运维所在的机子(因为域内就域控默认开启smb签名).
利用前提就是目标机器关闭 SMB 签名,可以使用 Responder
中的 RunFinger.py
进行检测
其中 100
是域控,101
是域内机器,因此可以尝试将域控 relay 到 101
机器中
开启 Responder
域控随意访问一个不存在的UNC
常见的Relay攻击
参考 https://blog.csdn.net/whatday/article/details/107698383
SMBRelay
sudo smbrelayx.py -h 192.168.111.101 -c whoami
攻击者伪造一个恶意的SMB服务器,当内网中有机器Client1访问这个攻击者精心构造好的SMB服务器时, smbrelayx.py 脚本将抓到 Client1 的 Net-NTLM Hash ,然后 smbrelayx.py 用抓取到的 Client1 的 Net-NTLM Hash 重放给 Client2
-e
参数也可以指定指执行Binary,用于木马上线,不过要提前做好进程迁移
MSF中的SMBRelay(ms08-068)
仅仅支持 NTLMv1
, 不推荐使用
exploit/windows/smb/smb_relay
攻击手段原理就是自己 relay 自己,然而微软在ms08-068中对smb reflect到 smb 做了限制,防止了同一主机从SMB协议向SMB协议的Net-NTLMhash relay。这个补丁在CVE-2019-1384(Ghost Potato)被绕过.
Impacket中的ntlmrelay
参考 https://www.jianshu.com/p/c7d8e7d9c03c
Net-NTLMv1
之前说过 Net-NTLMv2其实是不提倡爆破的,那么v1呢
参考 https://3gstudent.github.io/Windows%E4%B8%8B%E7%9A%84%E5%AF%86%E7%A0%81hash-Net-NTLMv1%E4%BB%8B%E7%BB%8D
Net-NTLMv1的加密流程如下:
1.客户端向服务器发送一个请求
2.服务器接收到请求后,生成一个8位的Challenge,发送回客户端
3.客户端接收到Challenge后,使用登录用户的密码hash对Challenge加密,作为response发送给服务器
4.服务器校验response
可见,v1的加密算法相对脆弱
我们使用 Responder
等中间人工具,控制Challenge为固定值,然后借助彩虹表还原 NTLM Hash
即可
NTLMv1的格式为
username::hostname:LM response:NTLM response:challenge
hashcat参数如下
hashcat -m 5500 NTLMv1Hash pass.txt -o found.txt --force
利用思路
由于Net-NTLMv1的脆弱性,在控制Challenge后可以在短时间内通过彩虹表还原出用户的ntlm hash,所以在利用上首选的是将Win7环境下的默认Net-NTLMv2降级到Net-NTLMv1,获取本机的通信数据,还原出ntlm hash,通过InternalMonologue能在普通用户权限下获得Net-NTLMv2数据实现工具: InternalMonologue
https://github.com/eladshamir/Internal-Monologue
通过修改注册表使Net-NTLMv2降级到Net-NTLMv1,获得正在运行的用户token,模拟用户同NTLM SSP进行交互,控制Challenge为固定值1122334455667788,导出返回的Net-NTLMv1 response
自Windows Vista起,微软默认使用Net-NTLMv2协议,想要降级到Net-NTLMv1,首先需要获得当前系统的管理员权限,修改注册表开启 Net-NTLMv1
reg add HKLMSYSTEMCurrentControlSetControlLsa /v lmcompatibilitylevel /t REG_DWORD /d 2 /f
reg add HKLMSYSTEMCurrentControlSetControlLsaMSV1_0 /v NtlmMinClientSec /t REG_DWORD /d 536870912 /f
reg add HKLMSYSTEMCurrentControlSetControlLsaMSV1_0 /v RestrictSendingNTLMTraffic /t REG_DWORD /d 0 /f
优点:
1.这种方式不会对lsass.exe进程进行操作
2.同本地NTLM SSP进行交互,不会产生流量
3.没有进行NTLM认证,不会产生日志
Potato家族本地提权
参考于:https://zhuanlan.zhihu.com/p/324113936
Potato的本地提权其实就是一个对本地的 Relay
原理
参考于: https://zhuanlan.zhihu.com/p/324113936
利用Potato提权的前提是拥有 SeImpersonatePrivilege
和 SeAssignPrimaryTokenPrivilege
权限,以下用户拥有 SeImpersonatePrivilege
权限(而只有更高权限的账户比如SYSTEM才有 SeImpersonatePrivilege
权限)
本地管理员账户(不包括管理员组普通账户)和本地服务账户
由SCM启动的服务
Windows服务的登陆账户
Local System(NT AUTHORITYSySTEM)
Network Service(NT AUTHORITYNetwork Service)
Local Service(NT AUTHORITYLocal Service)
也就是说该提权为
Administrator——>SYSTEM
Service——>SYSTEM
在实际渗透过程中,拿到webshell下,用户权限是IIS或者apache,或通过SQLi执行xp_cmdshell,此时手里的服务账户在进行操作时是低权限账户,而使用该提权手法可以直接获取SYSTEM权限
WindowsToken
用户账户的(SID)
用户所属的组的SID
用于标识当前登陆会话的登陆SID
用户或用户组所拥有的权限列表
所有者SID
所有者组的SID
访问控制列表
访问令牌的来源
主令牌/模拟令牌
限制SID的可选列表
模拟等级:
Anonymous: server无法模拟或识别client
Identification: 可识别client的身份和特权,不能模拟
Impersonation: 可在本地系统模拟
Delegation: 可在远程系统上模拟
当用户具有 SeImpersonatePrivilege
特权,则可以调用CreateProcessWithTokenW
以某个Token的权限启动新进程
当用户具有SeAssignPrimaryTokenPrivilege
特权,则可以调用CreateProcessAsUserW
以hToken权限启动新进程
历史Potato
为什么Potato都是本地提权呢?因为 Potato就是一种对本地进行Relay的攻击,而之前我们展示的 Responder
都是用来Relay不同的主机
HOT Potato
之前微软修补了 SMB -> SMB NTLM Relay
同一主机的漏洞(MS08-068),HOT Potato通过劫持 WPAD进行 HTTP -> SMB NTLM Relay
,但是这种手法也被微软打上了补丁(MS16-075)
https://github.com/foxglovesec/Potato
刷新WPAD文件可能需要很长时间,不太适用
Rotten Potato
它是通过DCOM call来使服务向攻击者监听的端口发起连接并进行NTLM认证,需要SelmpersonatePrivilege
权限
https://github.com/foxglovesec/RottenPotato
未尝试
JuicyPotato
Rotten Potato的增强版
是通过Com组件进行提权的,因此需要一个我们可以使用的COM组件(跟BypassUac一个道理)
https://github.com/ohpe/juicy-potato
常见Com组件
https://github.com/ohpe/juicy-potato/blob/master/CLSID/README.md
JuicyPotato.exe -l 1333 -t * -p C:WindowsSystem32cmd.exe -c {555F3418-D99E-4E51-800A-6E89CFD8B1D7}
具体参数看README.md
Ghost Potato
是对于 MS-08068
的一个绕过
https://www.dazhuanlan.com/chenhx/topics/1663909
未复现成功
Pipe Potato
常用的方法效果比较好
https://github.com/BeichenDream/BadPotato
衍生版本为 PrintSpoofer
https://github.com/itm4n/PrintSpoofer
Sweet Potato
COM/WinRM/Spoolsv集合版(Juicy/PrintSpoofer集合)
https://github.com/CCob/SweetPotato
https://github.com/uknowsec/SweetPotato (师傅们重写后可用于webshell等版本的)
总结
Potato提权原理简单来说就是如下三条:
(1)诱使 “SYSTEM” 账户通过NTLM向控制的TCP节点进行身份验证
(2)以本地协商 “NT AUTHORITY SYSTEM” 账户的安全令牌进行NTLM Relay
(3)模拟刚刚协商的令牌,达到提权的目的
其他
关于Relay的例子还有很多,等后面总结到了再继续写(例如最近的Ad cs)
参考
https://www.freebuf.com/articles/web/269876.html
https://github.com/lgandx/Responder
https://3gstudent.github.io/%E6%B8%97%E9%80%8F%E6%8A%80%E5%B7%A7-%E5%88%A9%E7%94%A8%E5%9B%BE%E6%A0%87%E6%96%87%E4%BB%B6%E8%8E%B7%E5%8F%96%E8%BF%9E%E6%8E%A5%E6%96%87%E4%BB%B6%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%9A%84NTLMv2-Hash
https://whoamianony.top/2021/04/15/%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95/%E5%86%85%E7%BD%91%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95/%E5%86%85%E7%BD%91%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95%EF%BC%9A%E5%8F%91%E9%80%81%20NTLM%20%E8%AF%B7%E6%B1%82%E4%B8%8E%E6%88%AA%E8%8E%B7%20Net-NTLM%20Hash/
https://zhuanlan.zhihu.com/p/64889695
https://www.jianshu.com/p/c7d8e7d9c03c
https://3gstudent.github.io/Windows%E4%B8%8B%E7%9A%84%E5%AF%86%E7%A0%81hash-Net-NTLMv1%E4%BB%8B%E7%BB%8D
https://github.com/eladshamir/Internal-Monologue
https://zhuanlan.zhihu.com/p/324113936
https://github.com/foxglovesec/Potato
https://github.com/foxglovesec/RottenPotato
https://github.com/ohpe/juicy-potato
https://www.dazhuanlan.com/chenhx/topics/1663909
https://github.com/BeichenDream/BadPotato
https://github.com/uknowsec/SweetPotato