Un port completo en Go de Impacket: 63 herramientas CLI y 24 bibliotecas para ataques a protocolos de Windows y Active Directory, compilado en un único binario sin dependencias.
Por Jacob Paullus (@psycep_)
Una implementación completa en Go de Impacket - 63 herramientas y 24 paquetes de biblioteca para la interacción con protocolos de red de Windows, enumeración de Active Directory y ejecución de ataques. Construido como un framework nativo de Go para que puedas compilar una vez y ejecutar en cualquier lugar sin dependencias de Python.
Versión Beta - Altamente Experimental. gopacket está en desarrollo activo. Las herramientas principales han sido probadas contra entornos de laboratorio de Active Directory, pero se esperan casos límite y peculiaridades de protocolo. Si algo no funciona, por favor prueba la misma operación con Impacket en paralelo e incluye ambas salidas en tu informe de error. Esto nos ayuda a identificar rápidamente si es un problema específico de gopacket o una limitación de protocolo compartida.
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 compilación predeterminada (--target native) requiere Go 1.24.13+, GCC y los encabezados de desarrollo de libpcap (apt install build-essential libpcap-dev en Debian/Ubuntu/Kali, yum install gcc libpcap-devel en RHEL/CentOS, o brew install libpcap en macOS). Los objetivos portable y windows solo necesitan el toolchain de Go; sniff y split se convierten en stubs en esas compilaciones porque requieren libpcap. Consulta Soporte de Plataformas para la matriz completa.
gopacket compila en Linux, macOS y Windows. El conjunto de herramientas funcionales y las rutas de proxy disponibles dependen de los flags de compilación:
| Compilación | Herramientas disponibles | Proxy |
|---|---|---|
| Linux / macOS con cgo (predeterminado) | Las 63 | proxychains (LD_PRELOAD) y/o -proxy SOCKS5 |
Linux con CGO_ENABLED=0 | 61 (sniff, split se convierten en stubs) | solo -proxy (proxychains necesita el hook de libc) |
Windows (GOOS=windows CGO_ENABLED=0) | 60 (stubs de sniff, split, sniffer) | solo -proxy (no hay LD_PRELOAD en Windows) |
sniff y split dependen de libpcap a través de cgo; sniffer depende de sockets raw de Unix. Cuando una herramienta no se puede compilar para el objetivo, gopacket sustituye un stub que imprime un mensaje claro y sale con código 1, de modo que go build ./... siempre tiene éxito y el diseño de instalación es consistente entre plataformas.
Para desinstalar:
./install.sh --uninstall
gopacket soporta dos rutas de proxy independientes. También se pueden encadenar.
Todas las herramientas de gopacket funcionan a través de proxychains. Los binarios de Go normalmente omiten proxychains porque el runtime de Go maneja DNS y redes internamente, saltándose los hooks de LD_PRELOAD en los que se basa proxychains. gopacket soluciona esto enlazando contra la biblioteca C del sistema para operaciones de red, permitiendo que proxychains intercepte las conexiones normalmente.
proxychains gopacket-secretsdump 'domain/user:password@target'
proxychains gopacket-smbclient -k -no-pass 'domain/[email protected]'
-proxy)Todas las herramientas aceptan -proxy para enrutar el TCP saliente a través de un servidor SOCKS5 sin depender de LD_PRELOAD. Esquemas aceptados: socks5 y socks5h. Cuando -proxy no está establecido, se consultan las variables de entorno ALL_PROXY / all_proxy como respaldo.
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'
Las funciones dependientes de UDP están deshabilitadas bajo -proxy en lugar de filtrar paquetes silenciosamente (SOCKS5 UDP ASSOCIATE rara vez es soportado por los proxies, y omitir el proxy para UDP revelaría la IP de origen real del operador). Las funciones afectadas y sus soluciones alternativas están documentadas en KNOWN_ISSUES.md.
Encadenamiento: -proxy es compatible con proxychains. La conexión TCP al propio proxy SOCKS5 todavía pasa por connect() de libc, por lo que proxychains → gopacket → -proxy → target funciona para escenarios de enrutamiento anidado.
Consulta la Guía para Desarrolladores de la Biblioteca para documentación completa de la API, ejemplos de código y descripción general de la arquitectura para construir herramientas personalizadas sobre los 24 paquetes de protocolo de gopacket.
| Herramienta | Descripción |
|---|---|
| psexec | Ejecución remota de comandos mediante creación de servicio SMB |
| smbexec | Ejecución remota de comandos vía SMB (más sigiloso que psexec) |
| wmiexec | Ejecución remota de comandos vía WMI |
| dcomexec | Ejecución remota de comandos vía DCOM |
| atexec | Ejecución remota de comandos vía Task Scheduler |
| Herramienta | Descripción |
|---|---|
| secretsdump | Extracción de SAM/LSA/NTDS.dit y DCSync (remoto + offline) |
| dpapi | Extracción de clave de respaldo DPAPI |
| esentutl | Parser offline de base de datos ESE (NTDS.dit) |
| registry-read | Parser offline de hive del registro de Windows |
| Herramienta | Descripción |
|---|---|
| getTGT | Solicitar un TGT con contraseña, hash o clave AES |
| getST | Solicitar un ticket de servicio con S4U2Self/S4U2Proxy |
| GetUserSPNs | Kerberoasting - encontrar y solicitar SPNs |
| GetNPUsers | AS-REP roasting - encontrar cuentas sin pre-autenticación |
| ticketer | Falsificación de tickets golden/silver |
| ticketConverter | Convertir entre formatos ccache y kirbi |
| describeTicket | Parsear y descifrar tickets Kerberos |
| getPac | Solicitar y parsear información del PAC |
| keylistattack | Ataque KERB-KEY-LIST-REQ (RODC) |
| raiseChild | Escalada de dominio hijo a padre mediante golden ticket |
| Herramienta | Descripción |
|---|---|
| GetADUsers | Enumerar usuarios del dominio vía LDAP |
| GetADComputers | Enumerar equipos del dominio vía LDAP |
| GetLAPSPassword | Leer contraseñas LAPS vía LDAP |
| findDelegation | Encontrar configuraciones de delegación |
| lookupsid | Fuerza bruta de SID vía LSARPC |
| samrdump | Enumerar usuarios vía SAMR |
| rpcdump | Volcar endpoints RPC vía epmapper |
| rpcmap | Escanear interfaces RPC accesibles |
| net | Enumeración de net user/group/computer vía SAMR/LSARPC |
| netview | Enumerar sesiones, recursos compartidos y usuarios conectados |
| CheckLDAPStatus | Verificar requisitos de firma LDAP y channel binding |
| DumpNTLMInfo | Volcar información de autenticación NTLM desde la negociación SMB |
| getArch | Detectar arquitectura del SO remoto vía RPC |
| machine_role | Detectar rol de la máquina (DC, servidor, estación de trabajo) |
| Herramienta | Descripción |
|---|---|
| addcomputer | Crear/modificar/eliminar cuentas de máquina (SAMR + LDAP) |
| rbcd | Manipulación de Resource-Based Constrained Delegation |
| dacledit | Leer/escribir DACLs en objetos de AD |
| owneredit | Leer/modificar la propiedad de objetos |
| samedit | Suplantación de nombre de cuenta SAM (CVE-2021-42278/42287) |
| badsuccessor | Escalada BadSuccessor / backup operator |
| changepasswd | Cambiar/restablecer contraseñas vía SAMR y LDAP |
| Herramienta | Descripción |
|---|---|
| smbclient | Cliente SMB interactivo (shares, ls, get, put, etc.) |
| smbserver | Servidor SMB para compartir archivos |
| attrib | Consultar/modificar atributos de archivos vía SMB |
| filetime | Consultar/modificar marcas de tiempo de archivos vía SMB |
| services | Gestión remota de servicios vía SVCCTL |
| reg | Operaciones remotas de registro vía WINREG |
| Get-GPPPassword | Extraer contraseñas de Group Policy Preferences desde SYSVOL |
| karmaSMB | Servidor SMB falso para captura de hashes |
| Herramienta | Descripción |
|---|---|
| ntlmrelayx | Framework completo de relay NTLM con soporte multiprotocolo |
ntlmrelayx soporta:
| Herramienta | Descripción |
|---|---|
| mssqlclient | Cliente MSSQL interactivo con autenticación SQL/Windows/Kerberos |
| mssqlinstance | Descubrimiento de instancias MSSQL vía SQL Browser |
| Herramienta | Descripción |
|---|---|
| wmiquery | Shell interactivo de consultas WMI |
| wmipersist | Persistencia mediante suscripción a eventos WMI |
| Herramienta | Descripción |
|---|---|
| tstool | Enumeración de sesiones y procesos de Terminal Services |
| Herramienta | Descripción |
|---|---|
| rdp_check | Verificación de autenticación RDP |
| mqtt_check | Verificación de autenticación MQTT |
| exchanger | Cliente de Exchange Web Services |
| Herramienta | Descripción |
|---|---|
| ntfs-read | Parser offline de sistema de archivos NTFS |
| ping / ping6 | Ping ICMP |
| sniff / sniffer | Captura de paquetes de red |
| split | Dividir archivos grandes |
Todas las herramientas de red soportan tres métodos de autenticación:
# 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 | Descripción |
|---|---|
-hashes LMHASH:NTHASH | Autenticación con hash NTLM (el hash LM puede estar vacío) |
-k | Usar autenticación Kerberos |
-no-pass | No solicitar contraseña (usar con -k o -hashes) |
-dc-ip IP | Dirección IP del controlador de dominio |
-target-ip IP | Dirección IP del objetivo (cuando se usa hostname para Kerberos) |
-port PORT | Puerto objetivo (los valores predeterminados varían según la herramienta) |
-proxy URL | Enrutar el TCP saliente a través de un proxy SOCKS5 (ej. socks5h://127.0.0.1:1080). Las funciones UDP están deshabilitadas. |
-debug | Habilitar salida de depuración |
# 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]'
El directorio pkg/ contiene 24 paquetes de protocolo reutilizables que se pueden importar de forma independiente.
| Paquete | Descripción |
|---|---|
| smb | Cliente SMB2/3 con autenticación NTLM y Kerberos |
| ldap | Cliente LDAP con bind NTLM/Kerberos |
| dcerpc | Cliente DCE/RPC + 20 implementaciones de servicios (DRSUAPI, SAMR, SVCCTL, LSARPC, WINREG, NETLOGON, DCOM, TSCH, EPMAPPER, etc.) |
| kerberos | Cliente Kerberos, falsificación de tickets (golden/silver), S4U2Self/S4U2Proxy |
| ntlm | Protocolo de autenticación NTLM |
| relay | Framework de relay NTLM (servidores, clientes, ataques, SOCKS) |
| tds | Protocolo TDS de SQL Server |
| ese | Parser de Extensible Storage Engine |
| registry | Parser de hive del registro de Windows |
| ntfs | Parser de sistema de archivos NTFS |
| security | Descriptores de seguridad, ACLs, SIDs |
| dpapi | Estructuras DPAPI |
| mqtt | Cliente de protocolo MQTT |
| session | Parseo de objetivo/credenciales (domain/user:pass@host) |
| flags | Framework unificado de flags CLI |
gopacket aspira a una paridad completa con Impacket. Lo siguiente aún no está implementado:
Clientes de protocolo de relay:
Módulos de ataque de relay:
Herramientas independientes:
ifmap.py (mapeo de interfaces DCOM)mimikatz.py (Mimikatz limitado sobre RPC)goldenPac.py (MS14-068 - obsoleto en sistemas parcheados)smbrelayx.py (reemplazado por ntlmrelayx)kintercept.py (interceptación Kerberos)Estas brechas son de baja prioridad - la mayoría requieren infraestructura especializada para probar o están obsoletas por técnicas más recientes.
Estas son limitaciones a nivel de protocolo compartidas con Impacket, no errores de gopacket:
Consulta KNOWN_ISSUES.md para información detallada sobre cada problema y soluciones alternativas.
Esta es una versión beta. Se esperan errores, y las contribuciones son bienvenidas.
Debido a que gopacket implementa los mismos protocolos de red que Impacket, una gran fracción de los "errores" resultan ser ambientales, no específicos de gopacket - DCs parcheados, requisitos de firma LDAP, EPA, PKT_INTEGRITY, firma SMB, validación NTLM MIC post-CVE-2019-1040, SPNs faltantes, desfase horario, peculiaridades de DNS, reglas de firewall, etc. Ejecutar la misma operación con Impacket en paralelo elimina el entorno de la ecuación:
Este único paso de triaje ahorra muchas idas y vueltas, así que por favor no lo omitas.
-debug y captura la salida completacorp.internal → example.local
y dc01.corp.internal → dc01.example.local está bien - mantén la
estructura de los datos, solo no los valores identificativos. En caso de duda,
redáctalo.Abre un issue de GitHub describiendo el caso de uso y el equivalente en Impacket (si existe). Si la función está en la lista de "Funciones Faltantes" anterior, menciona cuál - nos ayuda a priorizar.
Los PRs son bienvenidos. Antes de abrir uno:
go build ./..., go vet ./..., gofmt -l . y go test ./...
y asegúrate de que todos pasen limpiamenteLos actores de amenazas están abandonando Python. Las herramientas compiladas en Go y Rust (Sliver, BRC4, Geacon y loaders personalizados) están reemplazando cada vez más a Impacket en intrusiones del mundo real. La mayoría de las herramientas defensivas y la lógica de detección se construyeron en torno al comportamiento de red basado en Python de Impacket, y esa cobertura se está erosionando a medida que el ecosistema de atacantes cambia a lenguajes compilados.
gopacket existe en parte para ayudar a la comunidad de seguridad a adelantarse a este cambio. Al proporcionar una implementación en Go de código abierto y legible de los mismos protocolos y técnicas, los defensores e ingenieros de detección pueden:
La brecha entre las herramientas de los atacantes y la visibilidad de los defensores es más amplia cuando las nuevas herramientas permanecen privadas. Liberar gopacket como código abierto reduce esa brecha.
KRB5CCNAME no está establecido, las herramientas buscarán <username>.ccache en el directorio actual-proxy SOCKS5 (ver Soporte de Proxy)Publicado bajo la Apache License 2.0.