Relay

最近遇到了很多需要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%\system32\config\SAM。当用户输入密码进行本地认证的过程中,用户输入的密码将为被转化为 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 HKLM\SYSTEM\CurrentControlSet\Control\Lsa\ /v lmcompatibilitylevel /t REG_DWORD /d 2 /f
reg add HKLM\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0\ /v NtlmMinClientSec /t REG_DWORD /d 536870912 /f
reg add HKLM\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_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提权的前提是拥有 SeImpersonatePrivilegeSeAssignPrimaryTokenPrivilege 权限,以下用户拥有 SeImpersonatePrivilege 权限(而只有更高权限的账户比如SYSTEM才有 SeImpersonatePrivilege 权限)
 

本地管理员账户(不包括管理员组普通账户)和本地服务账户
由SCM启动的服务

Windows服务的登陆账户
Local System(NT AUTHORITY\SySTEM)
Network Service(NT AUTHORITY\Network Service)
Local Service(NT AUTHORITY\Local 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:\Windows\System32\cmd.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

posted @ 2021-08-07 18:48  Zahad003  阅读(448)  评论(0编辑  收藏  举报