分析 Active Directory ACL 濫用 是做什麼的?
概覽
Active Directory 存取控制清單 (ACL) 透過包含存取控制項目 (ACE) 的選擇性存取控制清單 (DACL) 來定義 AD 物件的權限。錯誤配置的 ACE 可能會授予非特權使用者危險的權限,例如 GenericAll(完全控制)、WriteDACL(修改權限)、WriteOwner(取得擁有權)以及 GenericWrite(修改屬性),這些權限可能套用於 Domain Admins 群組、網域控制器或 GPO 等敏感物件。
此技能使用 ldap3 Python 函式庫連線至網域控制器,查詢物件的 nTSecurityDescriptor 屬性,將二進位安全描述元解析為 SDDL(安全描述元定義語言)格式,並識別出授予非管理員主體危險權限的 ACE。這些錯誤配置是 BloodHound 等工具發現的基於 ACL 攻擊路徑的基礎。
使用時機
- 調查需要分析 Active Directory ACL 濫用的安全事件時
- 為此領域建置偵測規則或威脅狩獵查詢時
- SOC 分析師需要此分析類型的結構化程序時
- 驗證相關攻擊技術的安全監控覆蓋範圍時
先決條件
- Python 3.9 或更新版本,並安裝 ldap3 函式庫(
pip install ldap3) - 擁有可讀取 AD 物件權限的網域使用者憑證
- 可連線至網域控制器的連接埠 389(LDAP)或 636(LDAPS)的網路連線
- 對 Active Directory 安全模型與 SDDL 格式的理解
步驟
-
連線至網域控制器:使用 ldap3 透過 NTLM 或簡單驗證建立 LDAP 連線。在生產環境中建議使用 LDAPS(連接埠 636)進行加密連線。
-
查詢目標物件:搜尋目標 OU 或整個網域,尋找使用者、群組、電腦和 OU 等物件。請求
nTSecurityDescriptor、distinguishedName、objectClass和sAMAccountName屬性。 -
解析安全描述元:將二進位的 nTSecurityDescriptor 轉換為 SDDL 字串表示法。解析 DACL 中的每個 ACE,以擷取信任項 SID、存取遮罩和 ACE 類型(允許/拒絕)。
-
將 SID 解析為主體:使用對網域的 LDAP 查閱,將安全識別碼 (SID) 對應至人類可讀的帳戶名稱。識別內建群組的已知 SID。
-
檢查危險權限:將每個 ACE 的存取遮罩與危險權限位元遮罩進行比較:GenericAll (0x10000000)、WriteDACL (0x00040000)、WriteOwner (0x00080000)、GenericWrite (0x40000000) 以及特定延伸權限的 WriteProperty。
-
過濾非管理員信任項:排除預期的管理員信任項(Domain Admins、Enterprise Admins、SYSTEM、Administrators),並標記非特權使用者或群組持有危險權限的 ACE。
-
描繪攻擊路徑:針對每個發現項目,記錄潛在的攻擊鏈(例如,使用者身上的 GenericAll 允許重設密碼,群組上的 WriteDACL 允許將自己加入群組)。
-
產生修復報告:輸出包含所有危險 ACE、受影響物件、非管理員信任項以及建議修復步驟的 JSON 報告。
預期輸出
{
"domain": "corp.example.com",
"objects_scanned": 1247,
"dangerous_aces_found": 8,
"findings": [
{
"severity": "critical",
"target_object": "CN=Domain Admins,CN=Users,DC=corp,DC=example,DC=com",
"target_type": "group",
"trustee": "CORP\\helpdesk-team",
"permission": "GenericAll",
"access_mask": "0x10000000",
"ace_type": "ACCESS_ALLOWED",
"attack_path": "GenericAll on Domain Admins group allows adding arbitrary members",
"remediation": "Remove GenericAll ACE for helpdesk-team on Domain Admins"
}
]
}