Ein vollständiger Go-Port von Impacket – 63 CLI-Tools und 24 Bibliotheken für Angriffe auf Windows- und Active-Directory-Protokolle, kompiliert zu einer einzigen abhängigkeitsfreien Binärdatei.
Von Jacob Paullus (@psycep_)
Eine vollständige Go-Implementierung von Impacket - 63 Tools und 24 Bibliothekspakete für die Interaktion mit Windows-Netzwerkprotokollen, Active-Directory-Enumeration und Angriffsausführung. Entwickelt als natives Go-Framework, sodass du einmal kompilieren und überall ausführen kannst, ohne Python-Abhängigkeiten.
Beta-Release - Hochgradig experimentell. gopacket befindet sich in aktiver Entwicklung. Die Kerntools wurden gegen Active-Directory-Lab-Umgebungen getestet, aber Edge Cases und Protokoll-Eigenheiten sind zu erwarten. Wenn etwas nicht funktioniert, teste bitte dieselbe Operation parallel mit Impacket und füge beide Ausgaben in deinen Bugreport ein. Das hilft uns, schnell zu erkennen, ob es sich um ein gopacket-spezifisches Problem oder eine gemeinsame Protokollbeschränkung handelt.
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
Der Standard-Build (--target native) benötigt Go 1.24.13+, GCC und libpcap-Entwicklungsheader (apt install build-essential libpcap-dev unter Debian/Ubuntu/Kali, yum install gcc libpcap-devel unter RHEL/CentOS oder brew install libpcap unter macOS). Die Targets portable und windows benötigen nur die Go-Toolchain; sniff und split werden in diesen Builds zu Stubs, da sie libpcap erfordern. Siehe Platform Support für die vollständige Matrix.
gopacket lässt sich unter Linux, macOS und Windows bauen. Die Menge der funktionierenden Tools und verfügbaren Proxy-Pfade hängt von den Build-Flags ab:
| Build | Verfügbare Tools | Proxying |
|---|---|---|
| Linux / macOS mit cgo (Standard) | Alle 63 | proxychains (LD_PRELOAD) und/oder -proxy SOCKS5 |
Linux mit CGO_ENABLED=0 | 61 (sniff, split werden zu Stubs) | nur -proxy (proxychains benötigt den libc-Hook) |
Windows (GOOS=windows CGO_ENABLED=0) | 60 (sniff, split, sniffer Stubs) | nur -proxy (kein LD_PRELOAD unter Windows) |
sniff und split hängen über cgo von libpcap ab; sniffer hängt von Unix-Raw-Sockets ab. Wenn ein Tool nicht für das Ziel gebaut werden kann, ersetzt gopacket es durch einen Stub, der eine klare Meldung ausgibt und mit Exit-Code 1 beendet, sodass go build ./... immer erfolgreich ist und das Installationslayout plattformübergreifend konsistent bleibt.
Zum Deinstallieren:
./install.sh --uninstall
gopacket unterstützt zwei unabhängige Proxy-Pfade. Sie können auch verkettet werden.
Alle gopacket-Tools funktionieren durch proxychains. Go-Binaries umgehen proxychains normalerweise, weil Go's Runtime DNS und Netzwerk intern abwickelt und dabei die LD_PRELOAD-Hooks überspringt, auf die proxychains angewiesen ist. gopacket umgeht dies, indem es für Netzwerkoperationen gegen die System-C-Bibliothek linkt, sodass proxychains Verbindungen normal abfangen kann.
proxychains gopacket-secretsdump 'domain/user:password@target'
proxychains gopacket-smbclient -k -no-pass 'domain/[email protected]'
-proxy)Jedes Tool akzeptiert -proxy, um ausgehendes TCP über einen SOCKS5-Server zu routen, ohne auf LD_PRELOAD angewiesen zu sein. Akzeptierte Schemata: socks5 und socks5h. Wenn -proxy nicht gesetzt ist, werden die Umgebungsvariablen ALL_PROXY / all_proxy als Fallback herangezogen.
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-abhängige Funktionen sind unter -proxy deaktiviert, statt Pakete stillschweigend durchsickern zu lassen (SOCKS5 UDP ASSOCIATE wird von Proxies selten unterstützt, und das Umgehen des Proxys für UDP würde die echte Quell-IP des Operators preisgeben). Betroffene Funktionen und ihre Workarounds sind in KNOWN_ISSUES.md dokumentiert.
Verkettung: -proxy ist mit proxychains kompatibel. Die TCP-Verbindung zum SOCKS5-Proxy selbst läuft weiterhin über libc connect(), sodass proxychains → gopacket → -proxy → target für verschachtelte Routing-Szenarien funktioniert.
Siehe den Library Developer Guide für vollständige API-Dokumentation, Codebeispiele und einen Architekturüberblick zum Erstellen eigener Tools auf Basis von gopackets 24 Protokollpaketen.
| Tool | Beschreibung |
|---|---|
| psexec | Remote-Befehlsausführung über SMB-Diensterstellung |
| smbexec | Remote-Befehlsausführung über SMB (stealthier als psexec) |
| wmiexec | Remote-Befehlsausführung über WMI |
| dcomexec | Remote-Befehlsausführung über DCOM |
| atexec | Remote-Befehlsausführung über Task Scheduler |
| Tool | Beschreibung |
|---|---|
| secretsdump | SAM/LSA/NTDS.dit-Extraktion und DCSync (remote + offline) |
| dpapi | DPAPI-Backup-Key-Extraktion |
| esentutl | Offline-ESE-Datenbank-Parser (NTDS.dit) |
| registry-read | Offline-Parser für Windows-Registry-Hives |
| Tool | Beschreibung |
|---|---|
| getTGT | Fordert ein TGT mit Passwort, Hash oder AES-Key an |
| getST | Fordert ein Service-Ticket mit S4U2Self/S4U2Proxy an |
| GetUserSPNs | Kerberoasting - SPNs finden und anfordern |
| GetNPUsers | AS-REP-Roasting - Konten ohne Pre-Auth finden |
| ticketer | Golden-/Silver-Ticket-Forging |
| ticketConverter | Konvertierung zwischen ccache- und kirbi-Formaten |
| describeTicket | Kerberos-Tickets parsen und entschlüsseln |
| getPac | PAC-Informationen anfordern und parsen |
| keylistattack | KERB-KEY-LIST-REQ-Angriff (RODC) |
| raiseChild | Child-to-Parent-Domain-Eskalation über Golden Ticket |
| Tool | Beschreibung |
|---|---|
| GetADUsers | Domänenbenutzer über LDAP aufzählen |
| GetADComputers | Domänencomputer über LDAP aufzählen |
| GetLAPSPassword | LAPS-Passwörter über LDAP auslesen |
| findDelegation | Delegationskonfigurationen finden |
| lookupsid | SID-Brute-Forcing über LSARPC |
| samrdump | Benutzer über SAMR aufzählen |
| rpcdump | RPC-Endpunkte über epmapper dumpen |
| rpcmap | Nach zugänglichen RPC-Schnittstellen scannen |
| net | net user/group/computer-Enumeration über SAMR/LSARPC |
| netview | Sitzungen, Shares und angemeldete Benutzer aufzählen |
| CheckLDAPStatus | LDAP-Signing- und Channel-Binding-Anforderungen prüfen |
| DumpNTLMInfo | NTLM-Authentifizierungsinformationen aus SMB-Negotiation dumpen |
| getArch | Remote-OS-Architektur über RPC erkennen |
| machine_role | Maschinenrolle erkennen (DC, Server, Workstation) |
| Tool | Beschreibung |
|---|---|
| addcomputer | Maschinenkonten erstellen/ändern/löschen (SAMR + LDAP) |
| rbcd | Manipulation von Resource-Based Constrained Delegation |
| dacledit | DACLs auf AD-Objekten lesen/schreiben |
| owneredit | Objektbesitz lesen/ändern |
| samedit | SAM-Account-Name-Spoofing (CVE-2021-42278/42287) |
| badsuccessor | BadSuccessor / Backup-Operator-Eskalation |
| changepasswd | Passwörter über SAMR und LDAP ändern/zurücksetzen |
| Tool | Beschreibung |
|---|---|
| smbclient | Interaktiver SMB-Client (Shares, ls, get, put usw.) |
| smbserver | SMB-Server für Dateifreigabe |
| attrib | Dateiattribute über SMB abfragen/ändern |
| filetime | Dateizeitstempel über SMB abfragen/ändern |
| services | Remote-Dienstverwaltung über SVCCTL |
| reg | Remote-Registry-Operationen über WINREG |
| Get-GPPPassword | Group-Policy-Preferences-Passwörter aus SYSVOL extrahieren |
| karmaSMB | Rogue-SMB-Server zum Hash-Capture |
| Tool | Beschreibung |
|---|---|
| ntlmrelayx | Vollständiges NTLM-Relay-Framework mit Multi-Protokoll-Unterstützung |
ntlmrelayx unterstützt:
| Tool | Beschreibung |
|---|---|
| mssqlclient | Interaktiver MSSQL-Client mit SQL-/Windows-/Kerberos-Authentifizierung |
| mssqlinstance | MSSQL-Instanz-Erkennung über SQL Browser |
| Tool | Beschreibung |
|---|---|
| wmiquery | Interaktive WMI-Query-Shell |
| wmipersist | Persistenz über WMI-Event-Subscription |
| Tool | Beschreibung |
|---|---|
| tstool | Terminal-Services-Sitzungs- und Prozess-Enumeration |
| Tool | Beschreibung |
|---|---|
| rdp_check | RDP-Authentifizierungsprüfung |
| mqtt_check | MQTT-Authentifizierungsprüfung |
| exchanger | Exchange-Web-Services-Client |
| Tool | Beschreibung |
|---|---|
| ntfs-read | Offline-NTFS-Dateisystem-Parser |
| ping / ping6 | ICMP-Ping |
| sniff / sniffer | Netzwerk-Paket-Capture |
| split | Große Dateien aufteilen |
Alle Netzwerktools unterstützen drei Authentifizierungsmethoden:
# 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'
| Flag | Beschreibung |
|---|---|
-hashes LMHASH:NTHASH | NTLM-Hash-Authentifizierung (LM-Hash kann leer sein) |
-k | Kerberos-Authentifizierung verwenden |
-no-pass | Nicht nach Passwort fragen (mit -k oder -hashes verwenden) |
-dc-ip IP | IP-Adresse des Domänencontrollers |
-target-ip IP | IP-Adresse des Ziels (bei Verwendung eines Hostnamens für Kerberos) |
-port PORT | Zielport (Standardwerte variieren je nach Tool) |
-proxy URL | Ausgehendes TCP über einen SOCKS5-Proxy routen (z. B. socks5h://127.0.0.1:1080). UDP-Funktionen sind deaktiviert. |
-debug | Debug-Ausgabe aktivieren |
# 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]'
Das Verzeichnis pkg/ enthält 24 wiederverwendbare Protokollpakete, die unabhängig importiert werden können.
| Paket | Beschreibung |
|---|---|
| smb | SMB2/3-Client mit NTLM- und Kerberos-Authentifizierung |
| ldap | LDAP-Client mit NTLM-/Kerberos-Bind |
| dcerpc | DCE/RPC-Client + 20 Dienstimplementierungen (DRSUAPI, SAMR, SVCCTL, LSARPC, WINREG, NETLOGON, DCOM, TSCH, EPMAPPER usw.) |
| kerberos | Kerberos-Client, Ticket-Forging (Golden/Silver), S4U2Self/S4U2Proxy |
| ntlm | NTLM-Authentifizierungsprotokoll |
| relay | NTLM-Relay-Framework (Server, Clients, Angriffe, SOCKS) |
| tds | SQL-Server-TDS-Protokoll |
| ese | Extensible-Storage-Engine-Parser |
| registry | Parser für Windows-Registry-Hives |
| ntfs | NTFS-Dateisystem-Parser |
| security | Security Descriptors, ACLs, SIDs |
| dpapi | DPAPI-Strukturen |
| mqtt | MQTT-Protokoll-Client |
| session | Ziel-/Credential-Parsing (domain/user:pass@host) |
| flags | Einheitliches CLI-Flag-Framework |
gopacket strebt vollständige Impacket-Parität an. Folgendes ist noch nicht implementiert:
Relay-Protokoll-Clients:
Relay-Angriffsmodule:
Eigenständige Tools:
ifmap.py (DCOM-Interface-Mapping)mimikatz.py (eingeschränktes Mimikatz über RPC)goldenPac.py (MS14-068 - obsolet auf gepatchten Systemen)smbrelayx.py (abgelöst durch ntlmrelayx)kintercept.py (Kerberos-Interception)Diese Lücken haben niedrige Priorität - die meisten erfordern Nischen-Infrastruktur zum Testen oder sind durch neuere Techniken obsolet geworden.
Dies sind Protokoll-bedingte Einschränkungen, die auch bei Impacket bestehen, keine gopacket-Bugs:
Siehe KNOWN_ISSUES.md für detaillierte Informationen zu jedem Problem und Workarounds.
Dies ist ein Beta-Release. Bugs sind zu erwarten, und Beiträge sind willkommen.
Da gopacket dieselben Wire-Protokolle wie Impacket implementiert, entpuppt sich ein großer Teil der „Bugs" als umgebungsbedingt, nicht gopacket-spezifisch - gepatchte DCs, LDAP-Signing-Anforderungen, EPA, PKT_INTEGRITY, SMB-Signing, NTLM-MIC-Validierung nach CVE-2019-1040, fehlende SPNs, Zeitversatz, DNS-Eigenheiten, Firewall-Regeln und so weiter. Dieselbe Operation parallel mit Impacket auszuführen, entfernt die Umgebung aus der Gleichung:
Dieser einzelne Triage-Schritt spart viele Rückfragen, also bitte nicht überspringen.
-debug aus und erfasse die vollständige Ausgabecorp.internal → example.local und dc01.corp.internal → dc01.example.local zu ersetzen ist in Ordnung - behalte die Struktur der Daten bei, nur nicht die identifizierenden Werte. Im Zweifel: redigieren.Öffne ein GitHub-Issue, das den Anwendungsfall und das Impacket-Äquivalent (falls vorhanden) beschreibt. Wenn das Feature auf der obigen Liste „Fehlende Funktionen" steht, erwähne welches - das hilft uns bei der Priorisierung.
PRs sind willkommen. Bevor du einen öffnest:
go build ./..., go vet ./..., gofmt -l . und go test ./... aus und stelle sicher, dass alle sauber durchlaufenBedrohungsakteure entfernen sich von Python. Kompilierte Go- und Rust-Tooling (Sliver, BRC4, Geacon und maßgeschneiderte Loader) ersetzt zunehmend Impacket in realen Intrusionen. Die meisten defensiven Tools und Erkennungslogiken wurden um Impackets Python-basiertes Netzwerkverhalten herum gebaut, und diese Abdeckung erodiert, während sich das Angreifer-Ökosystem auf kompilierte Sprachen verlagert.
gopacket existiert teilweise, um der Sicherheitscommunity zu helfen, diesem Wandel voraus zu sein. Durch die Bereitstellung einer quelloffenen, lesbaren Go-Implementierung derselben Protokolle und Techniken können Verteidiger und Detection Engineers:
Die Lücke zwischen Angreifer-Tooling und Verteidiger-Sichtbarkeit ist am größten, wenn neues Tooling privat bleibt. Das Open-Sourcing von gopacket verkleinert diese Lücke.
KRB5CCNAME nicht gesetzt ist, suchen die Tools nach <username>.ccache im aktuellen Verzeichnis-proxy-SOCKS5-Flag (siehe Proxy-Unterstützung)Veröffentlicht unter der Apache License 2.0.