zoukankan      html  css  js  c++  java
  • 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%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提权的前提是拥有 SeImpersonatePrivilegeSeAssignPrimaryTokenPrivilege 权限,以下用户拥有 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

  • 相关阅读:
    线程锁lock&rlock
    threading.local
    threading Event
    python中的eval 和 exec 和 execfile
    cloud-init 常见问题
    systemd
    cloud-init 的命令行
    原生js实现Promise
    js 指定位置插入html标签(可编辑div)
    js 实现复制粘贴文本过滤(保留文字和图片)
  • 原文地址:https://www.cnblogs.com/Mikasa-Ackerman/p/relay.html
Copyright © 2011-2022 走看看