Getfact是一款面向企业安全团队和运维工程师的跨平台自动化取证工具。在真实的应急响应场景中,我们经常遇到这样的困境:当服务器出现安全事件时,安全工程师需要手动登录机器,逐个执行几十条命令来收集系统状态、进程、网络连接等信息。这个过程不仅耗时(通常需要2-3小时),而且容易遗漏关键证据。更棘手的是,不同操作系统(Windows/Linux/macOS)的命令语法差异巨大,跨平台环境下的统一取证尤为困难。
Getfact的诞生正是为了解决这些痛点。我在参与某金融企业挖矿病毒应急时深有体会——当时我们团队花了整整4小时手动收集20台服务器的数据,等分析完所有日志时,攻击者早已清理痕迹。而使用Getfact后,同样的工作只需15分钟即可完成全量数据采集,且所有报告采用标准化JSON格式,极大提升了应急响应效率。
关键优势速览:
- 单条命令完成全量数据采集(平均3分钟/台)
- 覆盖Windows/Linux/macOS/国产麒麟系统
- 原始数据AES-256加密存储
- 可视化分析替代命令行苦力活
工具底层采用Go语言开发,通过条件编译实现跨平台兼容。对于每个采集模块(如进程列表、网络连接等),都包含三个实现版本:
go复制// windows_process.go
func GetProcessList() []Process {
// 调用Win32 API枚举进程
}
// linux_process.go
func GetProcessList() []Process {
// 解析/proc文件系统
}
// darwin_process.go
func GetProcessList() []Process {
// 调用ps命令行工具
}
编译时通过//go:build标签自动选择对应平台实现。这种设计既保证了各平台采集逻辑的针对性,又对外提供统一接口。我在测试中发现,相比Python等解释型语言,Go编译后的二进制文件执行效率更高,且无需目标机器安装运行时环境。
27个采集模块分为四大类:
| 类别 | 包含模块示例 | 技术实现要点 |
|---|---|---|
| 系统基础信息 | 硬件配置、OS版本、时区 | WMI(Windows)/sysfs(Linux) |
| 运行时状态 | 进程树、CPU负载、内存占用 | 进程注入检测(对比ps与/proc) |
| 网络拓扑 | 活动连接、路由表、ARP缓存 | RAW Socket抓包辅助验证 |
| 安全配置 | 防火墙规则、SSH授权、补丁 | 注册表解析(Windows)/sudo日志 |
特别值得一提的是进程采集策略:除了常规的进程列表,工具还会记录每个进程的:
这些数据在分析挖矿病毒时尤其有用。曾有一次排查中,我们通过进程树发现某个"java"进程的实际父进程是已被删除的/tmp/.x临时文件,从而锁定了攻击入口点。
推荐使用静态编译的独立二进制版本(无需依赖):
bash复制# Linux/macOS
curl -L https://github.com/Parad0xss/Getfact/releases/latest/download/getfact_linux_amd64 -o getfact
chmod +x getfact
sudo ./getfact collect
# Windows (管理员权限运行)
Invoke-WebRequest -Uri "https://github.com/Parad0xss/Getfact/releases/latest/download/getfact_windows_amd64.exe" -OutFile "getfact.exe"
.\getfact.exe collect
重要安全提示:
- 采集敏感数据时建议使用
-encrypt-key参数指定加密密钥- 企业内网可搭建私有更新镜像加速分发
- 麒麟系统需先安装glibc兼容层
场景:某电商平台服务器CPU异常飙升,疑似挖矿病毒
紧急采集(3分钟):
bash复制./getfact collect --output suspicious_host.json --modules=all --encrypt-key=YourStrongPassword
报告分析(GUI操作):
证据固化:
bash复制# 生成数字摘要
sha256sum suspicious_host.json > report.sha256
# 使用专用USB设备存储原始数据
技巧1:时间线重建
技巧2:隐蔽通道检测
netstat与/proc/net/tcp的结果差异技巧3:持久化手段排查
在拥有500+服务器的金融客户实践中,我们采用以下架构:
code复制[边缘节点] --> [Kafka集群] --> [分析中心]
↑ ↑
Getfact Flink实时处理
具体实施步骤:
该方案使得全量资产的安全状态检查从原来的3天缩短至2小时,且能自动生成符合等保要求的检查报告。
| 工具 | 跨平台性 | 采集速度 | 可视化 | 二次开发 | 适合场景 |
|---|---|---|---|---|---|
| Getfact | ★★★★★ | ★★★★☆ | ★★★★☆ | ★★★★☆ | 应急响应/日常巡检 |
| GRR | ★★★★☆ | ★★☆☆☆ | ★★★☆☆ | ★★★★★ | 长期监控 |
| Osquery | ★★★★☆ | ★★★☆☆ | ★★☆☆☆ | ★★★★★ | 安全分析平台集成 |
| F响应 | ★★☆☆☆ | ★★★★★ | ★☆☆☆☆ | ★★☆☆☆ | Windows专项取证 |
从实战角度看,Getfact在平衡易用性和功能性方面表现突出。其JSON报告可直接导入Splunk等SIEM系统,我们也提供了Logstash的解析模板。
Q1:麒麟系统运行报"GLIBC not found"
yum install compat-glibc或使用musl编译版本Q2:Windows下某些模块采集失败
-skip-wmi参数绕过WMI查询Q3:报告文件无法在GUI打开
getfact verify report.jsonQ4:网络连接信息不全
-raw-socket参数启用底层抓包对于需要定制功能的企业用户,工具提供两种扩展方式:
方式1:插件开发(Go语言)
go复制// 自定义采集模块示例
type MyPlugin struct {}
func (p *MyPlugin) Name() string {
return "custom_checks"
}
func (p *MyPlugin) Collect() (interface{}, error) {
// 实现采集逻辑
return map[string]interface{}{
"check1": runCustomCheck1(),
"check2": runCustomCheck2(),
}, nil
}
// 注册插件
func init() {
getfact.RegisterPlugin(&MyPlugin{})
}
方式2:规则引擎(YAML配置)
yaml复制# suspicious_process.yaml
rules:
- name: "隐藏的挖矿进程"
condition: |
process.name matches ".*(xmr|monero|minerd).*"
OR
(process.cpu_usage > 80 AND process.name not in known_whitelist)
severity: "critical"
actions:
- tag: "crypto_mining"
- alert: "发现疑似挖矿进程 {{process.name}}"
在实际客户环境中,我们曾通过自定义插件实现了:
企业部署时需特别注意:
数据加密:
权限控制:
法律风险:
某次红队演练中,我们意外发现Getfact收集的日志包含了员工个人信息。后续版本增加了-privacy-filter参数,可自动过滤身份证、手机号等敏感字段。