Active Directory Web Services (ADWS) Enumeration & Stealth Collection

Tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримайте HackTricks

What is ADWS?

Active Directory Web Services (ADWS) is enabled by default on every Domain Controller since Windows Server 2008 R2 and listens on TCP 9389. Despite the name, no HTTP is involved. Instead, the service exposes LDAP-style data through a stack of proprietary .NET framing protocols:

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

Оскільки трафік інкапсульований у цих бінарних SOAP-фреймах і передається по незвичному порту, перерахунок через ADWS значно менш ймовірно буде інспектований, відфільтрований або розпізнаний за сигнатурами, ніж класичний LDAP/389 & 636 трафік. Для операторів це означає:

  • Stealthier recon – Blue teams often concentrate on LDAP queries.
  • Можливість збирати дані з non-Windows hosts (Linux, macOS) шляхом тунелювання 9389/TCP через SOCKS-проксі.
  • Ті самі дані, які ви б отримали через LDAP (users, groups, ACLs, schema тощо) і можливість виконувати writes (наприклад msDs-AllowedToActOnBehalfOfOtherIdentity для RBCD).

Взаємодії ADWS реалізовані через WS-Enumeration: кожен запит починається з повідомлення Enumerate, яке визначає LDAP-фільтр/атрибути і повертає EnumerationContext GUID, після чого йдуть одне або кілька повідомлень Pull, що стрімлять результати до розміру вікна, визначеного сервером. Контексти вичерпуються приблизно через ~30 minutes, тому інструменти або повинні робити пагінацію результатів, або розбивати фільтри (префіксні запити по CN), щоб уникнути втрати стану. Коли запитуєте security descriptors, вкажіть контроль LDAP_SERVER_SD_FLAGS_OID, щоб опустити SACLs, інакше ADWS просто видаляє атрибут nTSecurityDescriptor зі свого SOAP-відповіді.

NOTE: ADWS is also used by many RSAT GUI/PowerShell tools, so traffic may blend with legitimate admin activity.

SoaPy – Native Python Client

SoaPy is a full re-implementation of the ADWS protocol stack in pure Python. It crafts the NBFX/NBFSE/NNS/NMF frames byte-for-byte, allowing collection from Unix-like systems without touching the .NET runtime.

Key Features

  • Supports proxying through SOCKS (useful from C2 implants).
  • Fine-grained search filters identical to LDAP -q '(objectClass=user)'.
  • Optional write operations ( --set / --delete ).
  • BOFHound output mode for direct ingestion into BloodHound.
  • --parse flag to prettify timestamps / userAccountControl when human readability is required.

Targeted collection flags & write operations

SoaPy ships with curated switches that replicate the most common LDAP hunting tasks over ADWS: --users, --computers, --groups, --spns, --asreproastable, --admins, --constrained, --unconstrained, --rbcds, plus raw --query / --filter knobs for custom pulls. Pair those with write primitives such as --rbcd <source> (sets msDs-AllowedToActOnBehalfOfOtherIdentity), --spn <service/cn> (SPN staging for targeted Kerberoasting) and --asrep (flip DONT_REQ_PREAUTH in userAccountControl).

Example targeted SPN hunt that only returns samAccountName and servicePrincipalName:

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

Використовуйте ті самі host/credentials, щоб негайно weaponise findings: dump RBCD-capable objects за допомогою --rbcds, потім застосуйте --rbcd 'WEBSRV01$' --account 'FILE01$' щоб stage Resource-Based Constrained Delegation chain (see Resource-Based Constrained Delegation for the full abuse path).

Встановлення (хост оператора)

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

ADWSDomainDump – LDAPDomainDump через ADWS (Linux/Windows)

  • Форк ldapdomaindump, який замінює LDAP-запити на виклики ADWS по TCP/9389, щоб зменшити спрацьовування сигнатур LDAP.
  • Виконує початкову перевірку доступності порту 9389, якщо не передано --force (пропускає перевірку, якщо порт-скани створюють шум або фільтруються).
  • Протестовано проти Microsoft Defender for Endpoint та CrowdStrike Falcon — успішний обхід описано в README.

Встановлення

pipx install .

Використання

adwsdomaindump -u 'thewoods.local\mathijs.verschuuren' -p 'password' -n 10.10.10.1 dc01.thewoods.local

Типовий вивід логів записує 9389 reachability check, ADWS bind і dump start/finish:

[*] Connecting to ADWS host...
[+] ADWS port 9389 is reachable
[*] Binding to ADWS host
[+] Bind OK
[*] Starting domain dump
[+] Domain dump finished

Sopa - Практичний клієнт для ADWS у Golang

Подібно до soapy, sopa реалізує стек протоколів ADWS (MS-NNS + MC-NMF + SOAP) у Golang, надаючи параметри командного рядка для виконання викликів ADWS, таких як:

  • Пошук та отримання об’єктів - query / get
  • Життєвий цикл об’єкта - create [user|computer|group|ou|container|custom] and delete
  • Редагування атрибутів - attr [add|replace|delete]
  • Керування обліковими записами - set-password / change-password
  • та інші такі як groups, members, optfeature, info [version|domain|forest|dcs], etc.

Основні моменти відображення протоколів

  • LDAP-пошуки здійснюються через WS-Enumeration (Enumerate + Pull) з проекцією атрибутів, контролем області (Base/OneLevel/Subtree) та пагінацією.
  • Отримання одного об’єкта використовує WS-Transfer Get; зміни атрибутів — Put; видалення — Delete.
  • Вбудоване створення об’єктів використовує WS-Transfer ResourceFactory; кастомні об’єкти використовують IMDA AddRequest, керований шаблонами YAML.
  • Операції з паролями — це дії MS-ADCAP (SetPassword, ChangePassword).

Неавторизоване виявлення метаданих (mex)

ADWS надає WS-MetadataExchange без облікових даних, що є швидким способом перевірити доступність перед автентифікацією:

sopa mex --dc <DC>

DNS/DC discovery & Kerberos targeting notes

Sopa може розв’язувати DCs через SRV, якщо --dc опущено і вказано --domain. Він виконує запити в такому порядку і використовує ціль з найвищим пріоритетом:

_ldap._tcp.<domain>
_kerberos._tcp.<domain>

З операційної точки зору, надавайте перевагу резолверу, керованому DC, щоб уникнути збоїв у сегментованих середовищах:

  • Використовуйте --dns <DC-IP>, щоб всі SRV/PTR/forward-запити проходили через DNS, керований DC.
  • Використовуйте --dns-tcp, коли UDP заблоковано або відповіді SRV великі.
  • Якщо Kerberos увімкнено і --dc — це IP, sopa виконує reverse PTR, щоб отримати FQDN для коректного націлювання SPN/KDC. Якщо Kerberos не використовується, PTR-запит не виконується.

Приклад (IP + Kerberos, примусове використання DNS через DC):

sopa info version --dc 192.168.1.10 --dns 192.168.1.10 -k --domain corp.local -u user -p pass

Опції матеріалів для аутентифікації

Окрім plaintext passwords, sopa підтримує NT hashes, Kerberos AES keys, ccache та PKINIT certificates (PFX або PEM) для ADWS auth. Kerberos застосовується при використанні --aes-key, -c (ccache) або опцій, що базуються на сертифікатах.

# NT hash
sopa --dc <DC> -d <DOMAIN> -u <USER> -H <NT_HASH> query --filter '(objectClass=user)'

# Kerberos ccache
sopa --dc <DC> -d <DOMAIN> -u <USER> -c <CCACHE> info domain

Створення власних об’єктів за допомогою шаблонів

Для довільних класів об’єктів команда create custom приймає YAML-шаблон, який відображається на IMDA AddRequest:

  • parentDN і rdn визначають контейнер і відносний DN.
  • attributes[].name підтримує cn або іменований простір addata:cn.
  • attributes[].type приймає string|int|bool|base64|hex або явні xsd:*.
  • Не включайте ad:relativeDistinguishedName або ad:container-hierarchy-parent; sopa вставляє їх.
  • Значення hex конвертуються в xsd:base64Binary; використовуйте value: "" щоб задати порожні рядки.

SOAPHound – High-Volume ADWS Collection (Windows)

FalconForce SOAPHound — це .NET collector, який тримає всі LDAP-взаємодії всередині ADWS і видає JSON, сумісний з BloodHound v4. Він один раз будує повний кеш objectSid, objectGUID, distinguishedName та objectClass (--buildcache), а потім повторно використовує його для високопродуктивних проходів --bhdump, --certdump (ADCS) або --dnsdump (AD-integrated DNS), тож лише ~35 критичних атрибутів покидають DC. AutoSplit (--autosplit --threshold <N>) автоматично шардує запити за префіксом CN, щоб витримати 30-хвилинний таймаут EnumerationContext у великих лісах.

Типовий робочий процес на 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-style snapshots.

Робочий процес прихованого збирання AD

Наведений нижче робочий процес показує, як перерахувати domain & ADCS objects через ADWS, конвертувати їх у BloodHound JSON і шукати шляхи атак, що базуються на сертифікатах — все з Linux:

  1. Tunnel 9389/TCP з цільової мережі на вашу машину (наприклад через Chisel, Meterpreter, SSH dynamic port-forward тощо). Експортуйте export HTTPS_PROXY=socks5://127.0.0.1:1080 або використайте параметри SoaPy --proxyHost/--proxyPort.

  2. Зібрати об’єкт кореневого домену:

soapy ludus.domain/jdoe:'P@ssw0rd'@10.2.10.10 \
-q '(objectClass=domain)' \
| tee data/domain.log
  1. Зібрати об’єкти, пов’язані з ADCS, з Configuration NC:
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 та виконайте cypher queries, такі як MATCH (u:User)-[:Can_Enroll*1..]->(c:CertTemplate) RETURN u,c, щоб виявити шляхи ескалації сертифікатів (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 enumerationSoaPyPython, SOCKS, read/write
High-volume ADWS dumpSOAPHound.NET, cache-first, BH/ADCS/DNS modes
BloodHound ingestBOFHoundConverts SoaPy/ldapsearch logs
Cert compromiseCertipyCan be proxied through same SOCKS
ADWS enumeration & object changessopaGeneric client to interface with known ADWS endpoints - allows for enumeration, object creation, attribute modifications, and password changes

Посилання

Tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримайте HackTricks