面向红队的,高性能、高度自由可扩展的自动化扫描引擎 | 为红队提供高度可控制和可扩展的自动化扫描引擎
blog posts:
完整的文档与教程位于wiki: https://chainreactors.github.io/wiki/gogo/
指纹与poc仓库: https://github.com/chainreactors/templates
当前版本的完整参数以 gogo -h 为准。多字符长参数必须使用双横线,例如 --ipp、--sp、--ef;单横线只用于 -i、-p、-F 等单字符短参数。过滤功能现已拆分为历史结果过滤 --filter、实时输出过滤 --output-filter 和提前停止深层扫描的 --scan-filter。
指定网段进行默认扫描, 并在命令行输出
gogo -i 192.168.1.1/24 -p win,db,top2
一些常用的端口配置:
-p - 等于-p 1-65535-p 1-1000 端口范围-p common tag: common 表示内网常用端口-p top2,top3 可以同时选择多个tag. 外网常见web端口-p all 表示所有预设的tag的合集.通过逗号分割多个配置, 可根据场景进行各种各样的组合配置. 例如:
gogo -i 1.1.1.1/24 -p 1-1000,common,http,db
查看全部端口配置
gogo -P port
可查看所有的tag对应的端口.
…当目标范围的子网掩码小于24时, 建议启用 smart模式扫描(原理见doc), 例如子网掩码为16时(输出结果较多, 建议开启--af输出到文件, 命令行只输出日志)
gogo -i 172.16.1.1/12 -m ss --ping -p top2,win,db --af
--af 表示自动指定文件生成的文件名.
-m ss 表示使用supersmart模式进行扫描. 还有ss,sc模式适用于不同场景
--ping 表示在指纹识别/信息获取前判断ip是否能被ping通, 减少无效发包. 需要注意的是, 不能被ping通不代表目标一定不存活, 使用时请注意到这一点
启发式扫描的命令有些复杂, 但可以使用workflow将复杂的命令写成配置文件, 快捷调用(内置的workflow细节见doc).
gogo -w 172
当前内置 workflow 默认使用 all 端口预设,因此上面的命令等价于 gogo -i 172.16.0.0/12 -m ss --ping -p all --af。如需缩小端口范围,可覆盖为 gogo -w 172 -p top2,win,db。
查看所有workflow
gogo -P workflow
常用的配置已经被集成到workflow中, 例如使用supersmart mod 扫描10段内网, gogo -w 10即可.
还有一些预留配置(即填写了其他配置, 但没有填写目标, 需要-i手动指定目标), 例如:
gogo -w ss -i 11.0.0.0/8
workflow中的预设参数优先级低于命令行输入, 因此可以通过命令行覆盖workflow中的参数. 例如:
gogo -w 10 -i 11.0.0.0/8
一个简单的任务
gogo -i 81.68.175.32/28 -p top2
…如果要联动其他工具, 可以指定-q/--quiet关闭日志信息, 只保留输出结果.
关于输入输出以及各种高级用法请见output的wiki
如果执行gogo -i 81.68.175.1 --af
扫描完成后,可以看到在 gogo 二进制文件同目录下生成类似 .81.68.175.1.32_top1_default_dat.dat 的文件;首次生成使用 .dat,重名时追加数字。该文件是 deflate 压缩的 JSON Lines。
通过gogo格式化该文件, 获得human-like的结果
…导出到其他工具
一些常用的输出格式.
-o full 默认输出格式, 即上面示例所示.-o color 带颜色的full输出. 在v2.11.0版本之后, -F 输出到命令行时为默认开启状态. 如果需要关闭, 手动指定-o full即可-o jl 一行一个json, 可以通过管道传给jq实时处理-o json 一个大的json文件-o url 只输出url, 通常在-F时使用所有的输出格式见: https://chainreactors.github.io/wiki/gogo/start/#_4
输出过滤器
--filter 参数可以从dat文件中过滤出指定的数据并输出.
例如过滤指定字段的值: gogo -F 1.dat --filter framework::redis -o target 表示从1.dat中过滤出redis的目标, 并输出为target字段.
其中:: 表示模糊匹配, 还有其他三种语法,如 == 为精准匹配, != 为不等于, !: 为不包含
-F 1.dat -o json -f result.json 可重新导出为聚合 JSON,也可以使用 -F 1.dat --af 自动生成格式化后的明文文件名。
默认的并发linux为4000, windows为1000, 为企业级网络环境下可用的并发. 不然弱网络环境(家庭, 基站等)可能会导致网络dos
建议根据不同环境,手动使用-t参数指定并发数.
如果如果发生大量漏报的情况, 大概率是网络环境发生的阻塞, 倒是网络延迟上升超过上限.
因此也可以通过指定 -d 5 (tcp默认为2s, tls默认为两倍tcp超时时间,即4s)来提高超时时间, 减少漏报.
未来也许会实现auto-tune, 自动调整并发速率
这些用法大概只覆盖了一小半的使用场景, 请阅读文档
…如果需要编译windows xp/2003的版本, 请先使用高版本的go生成templates. 再使用go 1.11编译即可.
goregexp 用于选择 Go 标准库正则后端,也是 release、nightly 和 TinyGo 构建采用的默认方案。手动编译时不要省略该 tag;否则在部分 Go/Windows 组合下可能进入 go-re2/WASM 路径,并在加载指纹规则时出现 wasm error: invalid table access。
-tags 是 go 命令的编译参数,不是 gogo 的运行参数。编译完成后,Linux/macOS 运行 ./gogo -F 1.json,Windows PowerShell 运行 .\gogo.exe -F .\1.json。不要写成 gogo run -tags goregexp -F 1.json,否则 -tags 会被 gogo 解析为 -t 线程参数。
gogo从这些相似的工作中改进自身. 感谢前人的工作.
细节上的对比请看文档
暂无开放 Issues,或尚未同步最近议题。