Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
sopa — Golang으로 작성된 ADWS 실용 클라이언트. | Kitploit
도구/GitHubGitHub/macmod/sopa
ReconnaissanceInformation GatheringPenetration TestingUtilities & FrameworksAuthenticationRed Teaming
GitHubmacmod/sopa

sopa

Golang으로 작성된 ADWS 실용 클라이언트.

저장소 보기
55215일 전Kitploit 검토 완료

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

sopa

Golang으로 작성된 ADWS 실용 클라이언트입니다.

GitHub Release Go Version Code Size License Build Status Go Report Card GitHub Downloads Twitter Follow

Sopa는 ADWS 프로토콜 스택(MS-NNS + MC-NMF + SOAP)을 구현하며, 다음 명령줄 기능을 제공합니다:

  • 객체 검색 및 조회
    • query: LDAP 필터 검색을 WS-Enumeration Enumerate + Pull 루프를 통해 실행하며, 속성 프로젝션, 범위 제어(Base/OneLevel/Subtree), 페이지네이션 지원
    • get: DN으로 단일 객체를 WS-Transfer Get을 통해 가져옴
  • 객체 수명 주기
    • create: WS-Transfer ResourceFactory를 통해 객체 생성 (내장 유형: user, computer, group, OU, container; 또는 IMDA AddRequest를 통한 YAML 템플릿 기반 사용자 정의 객체)
    • delete: DN으로 객체를 WS-Transfer Delete를 통해 삭제
  • 속성 편집
    • attr: WS-Transfer Put을 통해 기존 객체의 개별 속성 값 추가, 교체, 제거
  • 계정 관리
    • set-password: MS-ADCAP 를 통해 계정 비밀번호 설정

설치

root@kitploit:~
$ go install github.com/Macmod/sopa/cmd/sopa@latest

사용법

root@kitploit:~
# Auth flags (-u, -p, -d, -k, -H, -c, ...) are omitted for brevity - see Authentication section.

# Search objects by LDAP filter
$ sopa [auth_flags] query --dc <DC> --filter '(objectClass=*)'

# Fetch a single object by DN
$ sopa [auth_flags] get --dc <DC> --dn '<DN>'

# Delete an object by DN
$ sopa [auth_flags] delete --dc <DC> --dn '<DN>'

# Edit attribute values
$ sopa [auth_flags] attr add     --dc <DC> --dn '<DN>' --attr <ATTR> --value <VALUE>
$ sopa [auth_flags] attr replace --dc <DC> --dn '<DN>' --attr <ATTR> --value <VALUE>
$ sopa [auth_flags] attr delete  --dc <DC> --dn '<DN>' --attr <ATTR>

# Create objects
$ sopa [auth_flags] create user      --dc <DC> --name <CN> --pass <INITIAL_PASS>
$ sopa [auth_flags] create computer  --dc <DC> --name <CN>
$ sopa [auth_flags] create group     --dc <DC> --name <CN> --type GlobalSecurity
$ sopa [auth_flags] create ou        --dc <DC> --name <CN>
$ sopa [auth_flags] create container --dc <DC> --name <CN>
$ sopa [auth_flags] create custom    --dc <DC> --template <TEMPLATE.yaml>

# Set / change account passwords (MS-ADCAP)
$ sopa [auth_flags] set-password    --dc <DC> --dn '<DN>' --new <NEW_PASS>
$ sopa [auth_flags] change-password --dc <DC> --dn '<DN>' --old <OLD_PASS> --new <NEW_PASS>

# Translate DN <-> canonical name (MS-ADCAP)
# (this call is mostly useless but kept for completeness 😄)
$ sopa [auth_flags] translate-name --dc <DC> --offered DistinguishedName --desired CanonicalName '<DN>'

# Principal group memberships (MS-ADCAP)
$ sopa [auth_flags] groups --dc <DC> --dn '<DN>' --membership --authz

# Group members (MS-ADCAP)
$ sopa [auth_flags] members --dc <DC> --dn '<GROUP_DN>' --recursive

# Toggle optional AD feature, e.g. Recycle Bin (MS-ADCAP)
$ sopa [auth_flags] optfeature --dc <DC> --feature-id <FEATURE_GUID> --enable

# Topology info (MS-ADCAP)
$ sopa [auth_flags] info version --dc <DC>
$ sopa [auth_flags] info domain  --dc <DC>
$ sopa [auth_flags] info forest  --dc <DC>
$ sopa [auth_flags] info dcs     --dc <DC>

# ADWS service endpoint metadata (unauthenticated - auth flags not needed)
$ sopa mex --dc <DC>

인터랙티브 셸

하위 명령어 없이 sopa를 실행하면 인터랙티브 셸이 열립니다. 모든 명령에 대해 단일 연결을 재사용하며 탭 완성을 지원합니다.

root@kitploit:~
$ sopa --dc <DC> -u <USER> -p <PASS> -d <DOMAIN>

sopa v1.1.0
Connected  dc.corp.local  domain=corp.local  user=Administrator
Type 'help' for commands or 'exit' to quit.

[corp.local]> query --filter '(objectClass=user)' --attrs sAMAccountName
[corp.local]> get --dn 'CN=Administrator,CN=Users,DC=corp,DC=local'
[corp.local]> exit

exit, quit 또는 Ctrl-D를 사용하여 셸을 종료합니다.

사용자 정의 객체 생성

예제 템플릿: examples/custom-create.example.yaml

템플릿 스키마(YAML):

  • parentDN (문자열, 필수): 컨테이너 DN
  • rdn (문자열, 필수): 새 객체의 상대 DN (예: CN=Foo)
  • attributes (목록, 필수): 각 항목에는 다음이 포함됩니다:
    • name (문자열, 필수): 속성 이름 (cn 또는 addata:cn)
    • type (문자열, 선택): string|int|bool|base64|hex (또는 명시적 xsd:*), 기본값 string
    • value (문자열) 또는 values (문자열 목록) 중 하나

참고:

  • 템플릿에 ad:relativeDistinguishedName 또는 ad:container-hierarchy-parent를 포함하지 마십시오 (자동으로 주입됩니다).
  • hex 값은 xsd:base64Binary로 변환됩니다.
  • 빈 문자열을 명시적으로 설정하려면 value: ""를 사용하십시오.

DC 검색 및 DNS

--dc는 FQDN, IP 주소를 허용하거나 생략할 수 있습니다. DC의 호스트 이름이 네트워크 기본 DNS에서 확인되지 않는 경우가 있으므로, 항상 --dns <DC-IP>를 전달하여 sopa가 모든 조회에 DC 자체 DNS 서버를 사용하도록 하는 것이 좋습니다:

root@kitploit:~
# Option 1: let sopa resolve everything through the DC's DNS
$ sopa query --dns 192.168.1.10 -d corp.local -u user -p pass --filter '(objectClass=user)'

--dc가 생략되고 --domain이 제공되면 sopa는 SRV 레코드를 질의하여 DC를 자동으로 검색합니다:

root@kitploit:~
_ldap._tcp.<domain>        (먼저 시도)
_kerberos._tcp.<domain>    (대체)

가장 높은 우선순위의 레코드 대상이 사용됩니다. 이를 위해서는 --dns가 가리키는 DNS 서버가 해당 SRV 쿼리에 응답할 수 있어야 합니다. DC 자체 통합 DNS 서버(있는 경우)가 이를 처리할 수 있어야 합니다.

root@kitploit:~
# Option 2: provide DC explicitly without Kerberos
$ sopa info version --dc 192.168.1.10 --domain corp.local -u user -p pass

--dc에 IP가 제공되면 IP는 항상 역방향 PTR 조회를 통해 FQDN으로 확인됩니다. ADWS 엔드포인트의 WCF 주소 필터는 인증 방법과 관계없이 wsa:To 헤더에 FQDN이 필요합니다. 이 PTR 조회도 --dns를 통해 이루어지므로 DC에 올바르게 구성된 역방향 영역이 필요합니다:

root@kitploit:~
# Option 3: IP input - PTR lookup resolves 192.168.1.10 -> dc.corp.local
$ sopa info version --dc 192.168.1.10 --dns 192.168.1.10 --domain corp.local -u user -p pass

스택의 모든 DNS 작업(DC 검색, PTR 확인, ADWS TCP 연결, Kerberos KDC 연결)은 --dns / --dns-tcp로 구축된 동일한 리졸버를 사용합니다.

인증

sopa는 다음 자격 증명 모드를 지원합니다:

root@kitploit:~
# Password
$ sopa --dc <DC> -d <DOMAIN> -u <USER> -p <PASS> <subcommand> [...]

# NT hash
$ sopa --dc <DC> -d <DOMAIN> -u <USER> -H <NT_HASH> <subcommand> [...]

# AES session key (Kerberos is implied)
# 32 hex chars = AES-128, 64 hex chars = AES-256
$ sopa --dc <DC> -d <DOMAIN> -u <USER> --aes-key <HEX_KEY> <subcommand> [...]

# Kerberos ccache (Kerberos is implied)
$ sopa --dc <DC> -d <DOMAIN> -u <USER> -c <CCACHE_PATH> <subcommand> [...]

# PFX certificate (Kerberos is implied / via PKINIT)
$ sopa --dc <DC> -d <DOMAIN> -u <USER> --pfx <CERT.pfx> --pfx-password <PFX_PASS> <subcommand> [...]

# PEM certificate (Kerberos is implied / via PKINIT)
$ sopa --dc <DC> -d <DOMAIN> -u <USER> --cert <CERT.pem> --key <KEY.pem> <subcommand> [...]

SOCKS5

모든 TCP 연결(ADWS, Kerberos, DNS)은 -x / --socks5를 통해 SOCKS5 프록시로 터널링할 수 있습니다:

root@kitploit:~
# Route everything through a SOCKS5 proxy
$ sopa -x 127.0.0.1:1080 --dc dc.corp.local -d corp.local -u user -p pass query --filter '(objectClass=user)'

# Use the DC's own DNS through the proxy, then connect via proxy
$ sopa -x 127.0.0.1:1080 --dns 192.168.1.10 --dc 192.168.1.10 -d corp.local -u user -p pass query --filter '(objectClass=user)'

# Keep DNS local (e.g. DNS already reachable without proxy), only proxy TCP connections
$ sopa -x 127.0.0.1:1080 --no-proxy-dns --dc dc.corp.local -d corp.local -u user -p pass query --filter '(objectClass=user)'

기여하기

이슈 열기 또는 풀 리퀘스트 제출을 통해 기여해 주시기 바랍니다.

기타 ADWS 도구

이 도구를 작성하게 된 아이디어는 주로 우회 목적으로 ADWS에 초점을 맞춘 도구들의 물결에서 비롯되었습니다. 이론적으로 이 도구들로 할 수 있는 모든 것은 sopa로도 가능하지만, 더 복잡하거나 특정한 작업을 수행하려면 다음 도구들도 확인해 보세요:

  • wh0amitz/SharpADWS
  • logangoins/SOAPy
  • FalconForceTeam/SOAPHound
  • mverschu/adwsdomaindump

감사의 말

oiweiwei님의 go-msrpc에 큰 감사를 드립니다. 그의 ssp 패키지가 GSSAPI를 통해 인증 흐름을 완벽하게 구현해 주었기 때문입니다.

참고 문헌

  • MS-NNS: .NET NegotiateStream 프로토콜
  • MS-NMF: .NET 메시지 프레이밍 프로토콜
  • MS-ADDM: Active Directory 웹 서비스: 데이터 모델 및 공통 요소
  • MS-WSDS: WS-Enumeration: 디렉터리 서비스 프로토콜 확장
  • MS-WSTIM: WS-Transfer: 디렉터리 액세스 확장을 위한 ID 관리 작업
  • MS-ADCAP: Active Directory 웹 서비스 사용자 정의 작업 프로토콜
  • MS-ADTS: Active Directory 기술 사양

라이선스

MIT 라이선스 (MIT)

저작권 (c) 2023 Artur Henrique Marzano Gonzaga

본 소프트웨어 및 관련 문서 파일("소프트웨어")의 사본을 획득하는 모든 사람에게는, 사용, 복제, 수정, 병합, 게시, 배포, 서브라이선스 및/또는 판매를 포함하여(제한 없이) 소프트웨어를 제한 없이 다룰 수 있는 권리가 무료로 부여되며, 소프트웨어가 제공된 사람이 다음 조건을 준수하도록 허용합니다:

위의 저작권 고지 및 본 허가 고지는 소프트웨어의 모든 사본 또는 상당 부분에 포함되어야 합니다.

본 소프트웨어는 "있는 그대로" 제공되며, 상품성, 특정 목적에의 적합성 및 비침해에 대한 보증을 포함하되 이에 국한되지 않는 어떠한 명시적 또는 묵시적 보증도 없이 제공됩니다. 어떠한 경우에도 저작자 또는 저작권 보유자는 계약, 불법 행위 또는 기타 행위에 관계없이 소프트웨어 또는 소프트웨어의 사용 또는 기타 거래로 인해 발생하는 모든 청구, 손해 또는 기타 책임에 대해 책임을 지지 않습니다.

도구 다운로드
SetPassword
  • change-password: MS-ADCAP ChangePassword를 통해 계정 비밀번호 변경 (이전 비밀번호 필요)
  • ADCAP 사용자 정의 작업
    • translate-name: TranslateName을 통해 DN과 정식 이름 형식 간 변환
    • groups: GetADPrincipalGroupMembership / GetADPrincipalAuthorizationGroup을 통해 보안 주체의 그룹 구성원 또는 권한 부여 그룹 나열
    • members: GetADGroupMember를 통해 그룹 구성원 열거 (재귀 선택 가능)
    • optfeature: ChangeOptionalFeature를 통해 선택적 AD 기능(예: 휴지통) 전환
    • info: GetVersion, GetADDomain, GetADForest, GetADDomainControllers를 통해 토폴로지 메타데이터(버전, 도메인, 포리스트, DC 목록) 검색
  • 서비스 메타데이터
    • mex: 인증되지 않은 WS-MetadataExchange 요청을 통해 ADWS 서비스 엔드포인트 메타데이터 가져오기
  • 플래그설명
    --dns <host[:port]>모든 조회(SRV, PTR, 정방향)에 대한 사용자 정의 DNS 서버. 기본 포트는 53입니다.
    --dns-tcpUDP 대신 TCP를 통해 DNS 쿼리를 강제 실행합니다. UDP가 차단되거나 SRV 응답이 큰 경우 유용합니다.
    -x / --socks5 <host:port>모든 TCP 연결을 SOCKS5 프록시를 통해 라우팅합니다. --no-proxy-dns가 설정되지 않은 경우 DNS 쿼리도 프록시를 통해 터널링됩니다.
    --no-proxy-dns--socks5가 활성화된 경우, 프록시 대신 로컬 시스템 리졸버를 통해 DNS를 확인합니다.
    --dns-timeout <duration>DNS 작업의 제한 시간 (기본값 10초).
    --tcp-timeout <duration>TCP 연결 및 ADWS 프로토콜 작업의 제한 시간 (기본값 30초).