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, 代理链, 内核驱动, 命令执行, 库开发, 开源, 抓包工具, 日志审计, 服务管理, 枚举, 网络交互, 网络协议, 网络安全, 远程执行, 错误配置检测, 隐私保护