Impacket 的完整 Go 移植版——63 个 CLI 工具和 24 个库,用于 Windows 和 Active Directory 协议攻击,编译为单个无依赖的二进制文件。
作者:Jacob Paullus(@psycep_)
Impacket 的完整 Go 实现——包含 63 个工具和 24 个库包,用于 Windows 网络协议交互、Active Directory 枚举和攻击执行。作为原生 Go 框架构建,因此你可以编译一次并在任何地方运行,无需 Python 依赖。
Beta 版本 - 高度实验性。 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 上构建。可用工具集和 可用的代理路径取决于构建标志:
| 构建 | 可用工具 | 代理 |
|---|---|---|
| 带 cgo 的 Linux / macOS(默认) | 全部 63 个 | proxychains(LD_PRELOAD)和/或 -proxy SOCKS5 |
带 CGO_ENABLED=0 的 Linux | 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 原始
套接字。当某个工具无法为目标平台构建时,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)每个工具都接受 -proxy,以通过 SOCKS5 服务器路由出站 TCP,而不依赖 LD_PRELOAD。接受的方案: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 检测远程操作系统架构 |
| 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 查询 shell |
| 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 | 通过 SOCKS5 代理路由出站 TCP(例如 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 | 可扩展存储引擎解析器 |
| 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。
这是一个 beta 版本。预期会有错误,欢迎贡献。
因为 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 替换是可以的——保留
数据的结构,只是不要保留识别值。如有疑问,
就涂黑它。打开一个 GitHub issue 描述用例 和 Impacket 中的对应功能(如果有)。如果该功能在上面的 “缺失功能”列表中,请说明是哪一个——这有助于我们确定优先级。
欢迎 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 发布。