Un portage complet en Go d'Impacket - 63 outils CLI et 24 bibliothèques pour les attaques de protocoles Windows et Active Directory, compilés en un seul binaire sans dépendances.
Par Jacob Paullus (@psycep_)
Une implémentation complète en Go de Impacket - 63 outils et 24 packages de bibliothèque pour l'interaction avec les protocoles réseau Windows, l'énumération Active Directory et l'exécution d'attaques. Conçu comme un framework Go natif afin que vous puissiez compiler une fois et exécuter partout sans dépendances Python.
Version bêta - Hautement expérimentale. gopacket est en développement actif. Les outils principaux ont été testés contre des environnements de laboratoire Active Directory, mais des cas limites et des particularités de protocole sont à prévoir. Si quelque chose ne fonctionne pas, veuillez tester la même opération avec Impacket en parallèle et inclure les deux sorties dans votre rapport de bug. Cela nous aide à identifier rapidement s'il s'agit d'un problème spécifique à gopacket ou d'une limitation de protocole partagée.
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
La compilation par défaut (--target native) nécessite Go 1.24.13+, GCC et les en-têtes de développement libpcap (apt install build-essential libpcap-dev sur Debian/Ubuntu/Kali, yum install gcc libpcap-devel sur RHEL/CentOS, ou brew install libpcap sur macOS). Les cibles portable et windows ne nécessitent que la chaîne d'outils Go ; sniff et split deviennent des stubs dans ces compilations car ils dépendent de libpcap. Voir Platform Support pour la matrice complète.
gopacket se compile sur Linux, macOS et Windows. L'ensemble des outils fonctionnels et des chemins de proxy disponibles dépend des options de compilation :
| Build | Tools available | Proxying |
|---|---|---|
| Linux / macOS with cgo (default) | All 63 | proxychains (LD_PRELOAD) and/or -proxy SOCKS5 |
Linux with CGO_ENABLED=0 | 61 (sniff, split become stubs) | -proxy only (proxychains needs the libc hook) |
Windows (GOOS=windows CGO_ENABLED=0) | 60 (sniff, split, sniffer stubs) | -proxy only (no LD_PRELOAD on Windows) |
sniff et split dépendent de libpcap via cgo ; sniffer dépend des sockets bruts Unix. Lorsqu'un outil ne peut pas être compilé pour la cible, gopacket substitue un stub qui affiche un message clair et se termine avec le code 1, de sorte que go build ./... réussit toujours et que la disposition d'installation est cohérente entre les plateformes.
Pour désinstaller :
./install.sh --uninstall
gopacket prend en charge deux chemins de proxy indépendants. Ils peuvent également être chaînés.
Tous les outils gopacket fonctionnent via proxychains. Les binaires Go contournent normalement proxychains car le runtime Go gère le DNS et la mise en réseau en interne, ignorant les hooks LD_PRELOAD sur lesquels proxychains s'appuie. gopacket contourne cela en se liant à la bibliothèque C du système pour les opérations réseau, permettant à proxychains d'intercepter les connexions normalement.
proxychains gopacket-secretsdump 'domain/user:password@target'
proxychains gopacket-smbclient -k -no-pass 'domain/[email protected]'
-proxy)Chaque outil accepte -proxy pour router le TCP sortant via un serveur SOCKS5 sans dépendre de LD_PRELOAD. Schémas acceptés : socks5 et socks5h. Lorsque -proxy n'est pas défini, les variables d'environnement ALL_PROXY / all_proxy sont consultées comme solution de repli.
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'
Les fonctionnalités dépendant d'UDP sont désactivées sous -proxy plutôt que de laisser fuiter silencieusement des paquets (SOCKS5 UDP ASSOCIATE est rarement pris en charge par les proxys, et contourner le proxy pour UDP révélerait l'IP source réelle de l'opérateur). Les fonctionnalités affectées et leurs solutions de contournement sont documentées dans KNOWN_ISSUES.md.
Chaînage : -proxy est compatible avec proxychains. La connexion TCP vers le proxy SOCKS5 lui-même passe toujours par connect() de la libc, donc proxychains → gopacket → -proxy → target fonctionne pour les scénarios de routage imbriqué.
Voir le Library Developer Guide pour la documentation complète de l'API, des exemples de code et un aperçu de l'architecture pour construire des outils personnalisés au-dessus des 24 packages de protocole de gopacket.
| Tool | Description |
|---|---|
| psexec | Exécution de commandes à distance via la création de service SMB |
| smbexec | Exécution de commandes à distance via SMB (plus discret que psexec) |
| wmiexec | Exécution de commandes à distance via WMI |
| dcomexec | Exécution de commandes à distance via DCOM |
| atexec | Exécution de commandes à distance via le Planificateur de tâches |
| Tool | Description |
|---|---|
| secretsdump | Extraction SAM/LSA/NTDS.dit et DCSync (à distance + hors ligne) |
| dpapi | Extraction de la clé de sauvegarde DPAPI |
| esentutl | Analyseur de base de données ESE hors ligne (NTDS.dit) |
| registry-read | Analyseur de ruche de registre Windows hors ligne |
| Tool | Description |
|---|---|
| getTGT | Demander un TGT avec mot de passe, hash ou clé AES |
| getST | Demander un ticket de service avec S4U2Self/S4U2Proxy |
| GetUserSPNs | Kerberoasting - trouver et demander des SPN |
| GetNPUsers | AS-REP roasting - trouver des comptes sans pré-authentification |
| ticketer | Falsification de tickets golden/silver |
| ticketConverter | Convertir entre les formats ccache et kirbi |
| describeTicket | Analyser et déchiffrer les tickets Kerberos |
| getPac | Demander et analyser les informations PAC |
| keylistattack | Attaque KERB-KEY-LIST-REQ (RODC) |
| raiseChild | Élévation de privilèges du domaine enfant vers le parent via golden ticket |
| Tool | Description |
|---|---|
| GetADUsers | Énumérer les utilisateurs du domaine via LDAP |
| GetADComputers | Énumérer les ordinateurs du domaine via LDAP |
| GetLAPSPassword | Lire les mots de passe LAPS via LDAP |
| findDelegation | Trouver les configurations de délégation |
| lookupsid | Force brute de SID via LSARPC |
| samrdump | Énumérer les utilisateurs via SAMR |
| rpcdump | Vider les points de terminaison RPC via epmapper |
| rpcmap | Scanner les interfaces RPC accessibles |
| net | Énumération net user/group/computer via SAMR/LSARPC |
| netview | Énumérer les sessions, partages et utilisateurs connectés |
| CheckLDAPStatus | Vérifier les exigences de signature LDAP et de liaison de canal |
| DumpNTLMInfo | Extraire les informations d'authentification NTLM de la négociation SMB |
| getArch | Détecter l'architecture de l'OS distant via RPC |
| machine_role | Détecter le rôle de la machine (DC, serveur, station de travail) |
| Tool | Description |
|---|---|
| addcomputer | Créer/modifier/supprimer des comptes machine (SAMR + LDAP) |
| rbcd | Manipulation de la délégation contrainte basée sur les ressources |
| dacledit | Lire/écrire les DACL sur les objets AD |
| owneredit | Lire/modifier la propriété des objets |
| samedit | Usurpation du nom de compte SAM (CVE-2021-42278/42287) |
| badsuccessor | BadSuccessor / élévation via opérateur de sauvegarde |
| changepasswd | Changer/réinitialiser les mots de passe via SAMR et LDAP |
| Tool | Description |
|---|---|
| smbclient | Client SMB interactif (partages, ls, get, put, etc.) |
| smbserver | Serveur SMB pour le partage de fichiers |
| attrib | Interroger/modifier les attributs de fichiers via SMB |
| filetime | Interroger/modifier les horodatages de fichiers via SMB |
| services | Gestion des services à distance via SVCCTL |
| reg | Opérations sur le registre à distance via WINREG |
| Get-GPPPassword | Extraire les mots de passe des préférences de stratégie de groupe depuis SYSVOL |
| karmaSMB | Serveur SMB malveillant pour la capture de hash |
| Tool | Description |
|---|---|
| ntlmrelayx | Framework complet de relais NTLM avec prise en charge multi-protocoles |
ntlmrelayx prend en charge :
| Tool | Description |
|---|---|
| mssqlclient | Client MSSQL interactif avec authentification SQL/Windows/Kerberos |
| mssqlinstance | Découverte d'instances MSSQL via SQL Browser |
| Tool | Description |
|---|---|
| wmiquery | Shell interactif de requêtes WMI |
| wmipersist | Persistance par abonnement aux événements WMI |
| Tool | Description |
|---|---|
| tstool | Énumération des sessions et processus Terminal Services |
| Tool | Description |
|---|---|
| rdp_check | Vérification de l'authentification RDP |
| mqtt_check | Vérification de l'authentification MQTT |
| exchanger | Client Exchange Web Services |
| Tool | Description |
|---|---|
| ntfs-read | Analyseur de système de fichiers NTFS hors ligne |
| ping / ping6 | Ping ICMP |
| sniff / sniffer | Capture de paquets réseau |
| split | Découper des fichiers volumineux |
Tous les outils réseau prennent en charge trois méthodes d'authentification :
# 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 | Description |
|---|---|
-hashes LMHASH:NTHASH | Authentification par hash NTLM (le hash LM peut être vide) |
-k | Utiliser l'authentification Kerberos |
-no-pass | Ne pas demander de mot de passe (à utiliser avec -k ou -hashes) |
-dc-ip IP | Adresse IP du contrôleur de domaine |
-target-ip IP | Adresse IP de la cible (lors de l'utilisation d'un nom d'hôte pour Kerberos) |
-port PORT | Port cible (les valeurs par défaut varient selon l'outil) |
-proxy URL | Router le TCP sortant via un proxy SOCKS5 (par ex. socks5h://127.0.0.1:1080). Les fonctionnalités UDP sont désactivées. |
-debug | Activer la sortie de débogage |
# 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]'
Le répertoire pkg/ contient 24 packages de protocole réutilisables qui peuvent être importés indépendamment.
| Package | Description |
|---|---|
| smb | Client SMB2/3 avec authentification NTLM et Kerberos |
| ldap | Client LDAP avec bind NTLM/Kerberos |
| dcerpc | Client DCE/RPC + 20 implémentations de services (DRSUAPI, SAMR, SVCCTL, LSARPC, WINREG, NETLOGON, DCOM, TSCH, EPMAPPER, etc.) |
| kerberos | Client Kerberos, falsification de tickets (golden/silver), S4U2Self/S4U2Proxy |
| ntlm | Protocole d'authentification NTLM |
| relay | Framework de relais NTLM (serveurs, clients, attaques, SOCKS) |
| tds | Protocole TDS de SQL Server |
| ese | Analyseur Extensible Storage Engine |
| registry | Analyseur de ruche de registre Windows |
| ntfs | Analyseur de système de fichiers NTFS |
| security | Descripteurs de sécurité, ACL, SID |
| dpapi | Structures DPAPI |
| mqtt | Client de protocole MQTT |
| session | Analyse cible/identifiants (domain/user:pass@host) |
| flags | Framework unifié de flags CLI |
gopacket vise une parité complète avec Impacket. Les éléments suivants ne sont pas encore implémentés :
Clients de protocole de relais :
Modules d'attaque de relais :
Outils autonomes :
ifmap.py (cartographie des interfaces DCOM)mimikatz.py (Mimikatz limité via RPC)goldenPac.py (MS14-068 - obsolète sur les systèmes corrigés)smbrelayx.py (remplacé par ntlmrelayx)kintercept.py (interception Kerberos)Ces lacunes sont de faible priorité - la plupart nécessitent une infrastructure de niche pour être testées ou sont rendues obsolètes par des techniques plus récentes.
Il s'agit de limitations au niveau du protocole partagées avec Impacket, et non de bugs de gopacket :
Voir KNOWN_ISSUES.md pour des informations détaillées sur chaque problème et les solutions de contournement.
Ceci est une version bêta. Des bugs sont à prévoir, et les contributions sont les bienvenues.
Parce que gopacket implémente les mêmes protocoles réseau qu'Impacket, une grande fraction des « bugs » s'avèrent être environnementaux, et non spécifiques à gopacket - DC corrigés, exigences de signature LDAP, EPA, PKT_INTEGRITY, signature SMB, validation NTLM MIC post-CVE-2019-1040, SPN manquants, décalage horaire, particularités DNS, règles de pare-feu, etc. Exécuter la même opération avec Impacket en parallèle élimine l'environnement de l'équation :
Cette seule étape de tri permet d'économiser beaucoup d'allers-retours, alors ne la sautez pas.
-debug et capturez la sortie complètecorp.internal → example.local
et dc01.corp.internal → dc01.example.local est acceptable - conservez la
structure des données, mais pas les valeurs identifiantes. En cas de doute,
masquez.Ouvrez une issue GitHub décrivant le cas d'usage et l'équivalent Impacket (le cas échéant). Si la fonctionnalité figure dans la liste « Missing Features » ci-dessus, mentionnez laquelle - cela nous aide à prioriser.
Les PR sont les bienvenues. Avant d'en ouvrir une :
go build ./..., go vet ./..., gofmt -l ., et go test ./...
et assurez-vous qu'ils passent tous proprementLes acteurs malveillants délaissent Python. Les outils compilés en Go et Rust (Sliver, BRC4, Geacon, et des loaders sur mesure) remplacent de plus en plus Impacket dans les intrusions réelles. La plupart des outils défensifs et de la logique de détection ont été construits autour du comportement réseau d'Impacket basé sur Python, et cette couverture s'érode à mesure que l'écosystème des attaquants évolue vers des langages compilés.
gopacket existe en partie pour aider la communauté de la sécurité à prendre de l'avance sur cette évolution. En fournissant une implémentation Go open source et lisible des mêmes protocoles et techniques, les défenseurs et les ingénieurs en détection peuvent :
L'écart entre les outils des attaquants et la visibilité des défenseurs est le plus large lorsque les nouveaux outils restent privés. L'ouverture du code de gopacket réduit cet écart.
KRB5CCNAME n'est pas défini, les outils chercheront <username>.ccache dans le répertoire courant-proxy (voir Proxy Support)Publié sous la Apache License 2.0.