mandiant/gopacket
GitHub: mandiant/gopacket
gopacket 是 Impacket 的干净 Go 实现,提供 63 个网络协议工具,用于 AD 枚举、凭据操作与 NTLM 中继。
Stars: 122 | Forks: 6
# gopacket
一个完整的 Go 实现 [Impacket](https://github.com/fortra/impacket) - 63 个工具和 24 个库包,用于 Windows 网络协议交互、Active Directory 枚举和攻击执行。构建为一个原生的 Go 框架,因此可以编译一次并在任何地方运行,无需 Python 依赖。
## 安装
```
git clone https://github.com/mandiant/gopacket
cd gopacket
# 构建并安装所有工具到 PATH 中,格式为 gopacket-
./install.sh
# 仅构建不安装
./install.sh --build-only
# 使用 make 构建
make build
```
需要 Go 1.24.13+、GCC 和 libpcap 开发头文件
(在 Debian/Ubuntu/Kali 上使用 `apt install build-essential libpcap-dev` 安装,
或在 RHEL/CentOS 上使用 `yum install gcc libpcap-devel`,或在 macOS 上使用 `brew install libpcap`)。
仅当使用 `sniff` 和 `split` 工具时才需要 libpcap 头文件 - 如果
缺少 libpcap,`install.sh` 将跳过这两个工具并构建其余部分。
要卸载:
```
./install.sh --uninstall
```
## 代理链支持
所有 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/user@dc.domain.local'
```
## 文档
请参阅 [Library Developer Guide](https://github.com/mandiant/gopacket/wiki) 获取完整的 API 文档、代码示例以及架构概述,了解如何基于 gopacket 的 24 个协议包构建自定义工具。
## 工具(63 个)
### 远程执行
| 工具 | 描述 |
|------|-------------|
| **psexec** | 通过 SMB 服务创建进行远程命令执行 |
| **smbexec** | 通过 SMB 进行远程命令执行(比 psexec 更隐蔽) |
| **wmiexec** | 通过 WMI 进行远程命令执行 |
| **dcomexec** | 通过 DCOM 进行远程命令执行 |
| **atexec** | 通过任务计划程序进行远程命令执行 |
### 凭据转储与 DPAPI
| 工具 | 描述 |
|------|-------------|
| **secretsdump** | SAM/LSA/NTDS.dit 提取和 DCSync(远程 + 离线) |
| **dpapi** | DPAPI 备份密钥提取 |
| **esentutl** | 离线 ESE 数据库解析器(NTDS.dit) |
| **registry-read** | 离线 Windows 注册表 hive 解析器 |
### Kerberos
| 工具 | 描述 |
|------|-------------|
| **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** | 通过金票进行子到父域提升 |
### Active Directory 枚举
| 工具 | 描述 |
|------|-------------|
| **GetADUsers** | 通过 LDAP 枚举域用户 |
| **GetADComputers** | 通过 LDAP 枚举域计算机 |
| **GetLAPSPassword** | 通过 LDAP 读取 LAPS 密码 |
| **findDelegation** | 查找委派配置 |
| **lookupsid** | 通过 LSARPC 进行 SID 暴力破解 |
| **samrdump** | 通过 SAMR 枚举用户 |
| **rpcdump** | 通过 epmapper 转储 RPC 端点 |
| **rpcmap** | 扫描可访问的 RPC 接口 |
| **net** | 通过 SAMR/LSARPC 进行用户/组/计算机枚举 |
| **netview** | 枚举会话、共享和已登录用户 |
| **CheckLDAPStatus** | 检查 LDAP 签名和通道绑定要求 |
| **DumpNTLMInfo** | 从 SMB 协商中转储 NTLM 认证信息 |
| **getArch** | 通过 RPC 检测远程操作系统架构 |
| **machine_role** | 检测机器角色(域控制器、服务器、工作站) |
### Active Directory 攻击
| 工具 | 描述 |
|------|-------------|
| **addcomputer** | 通过 SAMR + LDAP 创建/修改/删除机器账户 |
| **rbcd** | 资源约束委派操作 |
| **dacledit** | 读取/写入 AD 对象上的 DACL |
| **owneredit** | 读取/修改对象所有者 |
| **samedit** | SAM 账户名称欺骗(CVE-2021-42278/42287) |
| **badsuccessor** | BadSuccessor / 备份操作员提升 |
| **changepasswd** | 通过 SAMR 和 LDAP 更改/重置密码 |
### SMB 工具
| 工具 | 描述 |
|------|-------------|
| **smbclient** | 交互式 SMB 客户端(共享、ls、get、put 等) |
| **smbserver** | SMB 文件共享服务器 |
| **attrib** | 通过 SMB 查询/修改文件属性 |
| **filetime** | 通过 SMB 查询/修改文件时间戳 |
| **services** | 通过 SVCCTL 进行远程服务管理 |
| **reg** | 通过 WINREG 进行远程注册表操作 |
| **Get-GPPPassword** | 从 SYSVOL 提取组策略偏好密码 |
| **karmaSMB** | 用于哈希捕获的 Rogue SMB 服务器 |
### NTLM 中继
| 工具 | 描述 |
|------|-------------|
| **ntlmrelayx** | 支持多协议的全功能 NTLM 中继框架 |
ntlmrelayx 支持:
- **捕获服务器:**SMB、HTTP/HTTPS、WCF (ADWS)、RAW、RPC、WinRM
- **中继客户端:**SMB、LDAP/LDAPS、HTTP/HTTPS、MSSQL、WinRM、RPC
- **攻击:**secretsdump、smbexec、ldapdump、RBCD 委派、ACL 滥用、影子凭据、ADCS ESC8、addcomputer、DNS 操纵等
- **基础设施:**支持协议感知插件的 SOCKS5 代理、交互式控制台、REST API、多目标轮询、WPAD 服务
### SQL Server
| 工具 | 描述 |
|------|-------------|
| **mssqlclient** | 支持 SQL/Windows/Kerberos 认证的交互式 MSSQL 客户端 |
| **mssqlinstance** | 通过 SQL Browser 发现 MSSQL 实例 |
### WMI
| 工具 | 描述 |
|------|-------------|
| **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** | 分割大文件 |
## 认证
所有网络工具三种认证方式:
```
# 密码
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` | 目标端口(各工具的默认值不同) |
| `-debug` | 启用调试输出 |
### 快速示例
```
# 通过 DCSync 转储域哈希
gopacket-secretsdump 'corp.local/admin:Password1@dc01.corp.local'
# 交互式 SMB shell
gopacket-smbclient -hashes ':aabbccdd...' 'corp.local/admin@fileserver'
# Kerberoast
gopacket-getuserspns 'corp.local/user:pass@dc01.corp.local'
# Golden ticket
gopacket-ticketer -nthash -domain-sid S-1-5-21-... -domain corp.local admin
# 使用 SOCKS 代理的 NTLM 中继
sudo gopacket-ntlmrelayx -t smb://target -socks
# RBCD 的 LDAP 中继
sudo gopacket-ntlmrelayx -t ldaps://dc01.corp.local --delegate-access
```
## 库
`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 注册表 hive 解析器 |
| **ntfs** | NTFS 文件系统解析器 |
| **security** | 安全描述符、ACL、SIDs |
| **dpapi** | DPAPI 结构 |
| **mqtt** | MQTT 协议客户端 |
| **session** | 目标/凭据解析(`domain/user:pass@host`) |
| **flags** | 统一的 CLI 标志框架 |
## 缺失功能(与 Impacket 相比)
gopacket 力求实现与 Impacket 的完全兼容。以下功能尚未实现:
**中继协议客户端:**
- IMAP 中继客户端 + 攻击(需要 Exchange/IMAP 服务器)
- SMTP 中继客户端(需要 SMTP 服务器)
**中继攻击模块:**
- SCCM 策略/DP 攻击(需要 SCCM 基础设施)
**独立工具:**
- `ifmap.py`(DCOM 接口映射)
- `mimikatz.py`(有限的通过 RPC 的 Mimikatz)
- `goldenPac.py`(MS14-068 - 在已打补丁的系统上已废弃)
- `smbrelayx.py`(已被 ntlmrelayx 取代)
- `kintercept.py`(Kerberos 拦截)
这些差距属于低优先级 - 大多数需要特定的基础设施进行测试,或已被更新的技术所取代。
## 已知限制
这些是与 Impacket 共享的协议级限制,而非 gopacket 的缺陷:
- **SMB 到 LDAPS 中继** 在已打补丁的域控制器上会失败,原因是 NTLM MIC 验证(CVE-2019-1040)。请改用 HTTP 强制。
- **WinRM 中继** 在已打补丁的 Server 2019+ 上被 EPA(扩展保护认证)阻止。
- **RPC 中继攻击**(tschexec、enum-local-admins)需要 PKT_INTEGRITY,而在中继会话中不可用。
- **到端口 389 的 LDAP 中继** 在需要 LDAP 签名的域控制器上会失败。请始终中继到 LDAPS(端口 636)。
有关每个问题的详细信息及变通方法,请参阅 [KNOWN_ISSUES.md](KNOWN_ISSUES.md)。
## 报告问题与贡献
### 为何我们要求您先使用 Impacket 测试
因为 gopacket 实现了与 Impacket 相同的线协议,因此大量“错误”实际上是**环境问题**,而非 gopacket 特有的 - 已打补丁的域控制器、LDAP 签名要求、EPA、PKT_INTEGRITY、SMB 签名、NTLM MIC 验证(CVE-2019-1040 后)、缺失的 SPN、时钟偏差、DNS 异常、防火墙规则等。在 Impacket 旁路并排运行相同的操作可以排除环境因素:
- **如果 Impacket 以相同方式失败**,该问题几乎总是环境问题,并且很可能已在
[KNOWN_ISSUES.md](KNOWN_ISSUES.md) 中记录。不需要提交错误报告。
- **如果 Impacket 成功而 gopacket 失败**,这是一个真正的 gopacket 错误,我们非常希望收到反馈。
此单一分类步骤可节省大量往返,因此请不要跳过它。
### 提交错误报告
1. 使用 Impacket 运行相同的操作并记录其成功或失败
2. 使用 `-debug` 重新运行 gopacket 并捕获完整输出
3. **在发布前匿名化任何敏感信息。** GitHub 问题是公开的。
删除或替换真实主机名、IP地址、用户名、密码哈希、
Kerberos 票据、域名称、SIDs 以及任何可能
追溯到实际参与的内容。将 `corp.internal` 替换为 `example.local`,
将 `dc01.corp.internal` 替换为 `dc01.example.local` 是可以的 - 保持数据结构不变,仅替换标识值。**如有疑问,请脱敏处理。**
4. 打开 [GitHub issue](https://github.com/mandiant/gopacket/issues/new) 并包含:
- 匿名化后的 gopacket 和 Impacket 输出(文本而非截图)
- 运行的精确命令行(已匿名化)
- 目标操作系统、AD 功能级别以及任何相关加固
(签名、EPA、通道绑定、补丁级别)
- gopacket 版本 / 提交哈希
### 功能请求
打开 [GitHub issue](https://github.com/mandiant/gopacket/issues/new) 描述使用案例
以及 Impacket 等效功能(如果有)。如果该功能在上面的“缺失功能”列表中,请提及它 - 这有助于我们确定优先级。
### 拉取请求
欢迎提交 PR。在打开之前:
- 运行 `go build ./...`、`go vet ./...`、`gofmt -l .` 和 `go test ./...`
- 确保全部通过
- 与现有代码风格匹配
- 保持变更聚焦 - 将重构与功能开发分开
- 对于非平凡更改,请先打开问题以讨论方法
## 为什么这对防御者很重要
威胁行为者正在远离 Python。编译后的 Go 和 Rust 工具
(Sliver、BRC4、Geacon 以及定制加载器)正在逐步取代 Impacket
用于真实的入侵。大多数防御工具和检测逻辑都是围绕 Impacket 的 Python 网络行为构建的,而随着攻击者生态系统转向编译语言,这种覆盖正在减弱。
gopacket 的存在部分是为了帮助安全社区领先于这一趋势。通过提供相同协议和技术的开源、可读的 Go 实现,防御者和检测工程师可以:
- **研究 Go 实现的工具在网络上的行为**,而不是等待在事件期间遇到
- **了解 Go 与 Python 实现之间的协议级差异**,这些差异使现有签名变得不那么有效
- **使用相同的编译、单一二进制工具进行真实的紫色团队练习**,而不是仅针对 Python 脚本进行测试,这些脚本在网络层的行为不同
攻击者工具与防御者可见性之间的差距在新技术保持私有时最大。开源 gopacket 缩小了这一差距。
## 备注
- Kerberos 认证需要有效的 ccache 文件(TGT 或服务票据)
- 对于 Kerberos,请使用 FQDN 主机名 - 而不是 IP 地址
- 如果未设置 `KRB5CCNAME`,工具将在当前目录中查找 `.ccache`
- 所有工具都可以通过 proxychains 运行
- 本项目仅用于授权的安全测试和研究目的
## 许可证
根据 [Apache License 2.0](LICENSE) 发布。
gopacket 是 [Impacket](https://github.com/fortra/impacket) 的干净 Go 重新实现;请参阅 [NOTICE](NOTICE) 获取完整第三方致谢。
标签:Active Directory, Cloudflare, EVTX分析, Go, Impacket, MITRE ATT&CK, Plaso, PSEXEC, Ruby工具, SMB, Windows网络, WMI, 代理链, 内核驱动, 命令执行, 库开发, 开源, 抓包工具, 日志审计, 服务管理, 枚举, 网络交互, 网络协议, 网络安全, 远程执行, 错误配置检测, 隐私保护