forensics-osquery
概述
osquery 将操作系统转换为可查询的关系数据库,使安全分析师能够使用 SQL 而不是传统的 CLI 工具来调查违规行为。这项技能提供了取证调查工作流程、常见检测查询和应急响应模式,以快速收集跨 Linux、macOS 和 Windows 端点的证据。 核心能力:
- 基于 SQL 的系统询问,用于进程、网络、文件和用户分析
- 跨平台取证物证收集(Linux、macOS、Windows)
- 无需部署重量级取证工具即可进行实时系统分析
- 针对 MITRE ATT&CK 技术的威胁狩猎查询
- 使用 osqueryd 进行定期监控以持续检测
- 与 SIEM 和应急响应平台集成
快速开始
交互式调查(osqueryi)
# 启动交互式 shell
osqueryi
# 检查正在运行的进程
SELECT pid, name, path, cmdline, uid FROM processes WHERE name LIKE '%suspicious%';
# 识别监听网络服务
SELECT DISTINCT processes.name, listening_ports.port, listening_ports.address, processes.pid, processes.path
FROM listening_ports
JOIN processes USING (pid)
WHERE listening_ports.address != '127.0.0.1';
# 查找具有已删除可执行文件的进程(潜在恶意软件)
SELECT name, path, pid, cmdline FROM processes WHERE on_disk = 0;
# 检查持久性机制(Linux/macOS 定时任务)
SELECT command, path FROM crontab;
单行取证查询
# 单次查询执行
osqueryi --json "SELECT * FROM logged_in_users;"
# 导出查询结果以供分析
osqueryi --json "SELECT * FROM processes;" > processes_snapshot.json
# 检查可疑内核模块(Linux)
osqueryi --line "SELECT name, used_by, status FROM kernel_modules WHERE name NOT IN (SELECT name FROM known_good_modules);"
核心工作流程
工作流程 1:初始应急响应分类
对于快速评估潜在受威胁的系统:
进度:
[ ] 1. 收集正在运行的进程和命令行
[ ] 2. 识别网络连接和监听端口
[ ] 3. 检查用户账户和最近的登录
[ ] 4. 检查持久性机制(计划任务、启动项)
[ ] 5. 审查可疑文件修改和执行
[ ] 6. 用时间戳和进程祖先记录发现
[ ] 7. 将证据导出为 JSON 以保存
系统地完成每个步骤。使用捆绑的分类脚本来自动收集。
执行分类:./scripts/osquery_triage.sh > incident_triage_$(date +%Y%m%d_%H%M%S).json
工作流程 2:针对特定 TTP 的威胁狩猎
当寻找特定的 MITRE ATT&CK 技术时:
- 选择目标技术
- 从威胁情报中识别技术(例如,T1055 - 进程注入)
- 将技术映射到可观察的系统工件
- 参见 references/mitre-attack-queries.md 以获取预构建的查询
- 构建检测查询
- 确定相关的 osquery 表(进程、文件事件、注册表等)
- 连接表以关联相关工件
- 使用 references/table-guide.md 作为模式参考
- 执行狩猎
-- 示例:寻找凭证转储(T1003) SELECT p.pid, p.name, p.cmdline, p.path, p.parent, pm.permissions FROM processes p JOIN process_memory_map pm ON p.pid = pm.pid WHERE p.name IN ('mimikatz.exe', 'procdump.exe', 'pwdump.exe') OR p.cmdline LIKE '%sekurlsa%' OR (pm.path = '/etc/shadow' OR pm.path LIKE '%SAM%'); - 分析结果
- 审查进程祖先和命令行参数
- 检查文件哈希值与威胁情报
- 记录可疑活动的timeline
- 调查转移
- 使用发现结果识别额外的指标
- 查询相关工件(网络连接、文件、注册表)
- 如果确认了妥协,扩大狩猎范围
工作流程 3:持久性机制分析
跨平台检测持久性: Linux/macOS 持久性:
-- 定时任务
SELECT * FROM crontab;
-- 系统服务(Linux)
SELECT name, path, status, source FROM systemd_units WHERE source != '/usr/lib/systemd/system';
-- 启动代理/守护进程(macOS)
SELECT name, path, program, run_at_load FROM launchd WHERE run_at_load = 1;
-- Bash 配置文件修改
SELECT * FROM file WHERE path IN ('/etc/profile', '/etc/bash.bashrc', '/home/*/.bashrc', '/home/*/.bash_profile');
Windows 持久性:
-- 注册表运行键
SELECT key, name, path, type FROM registry WHERE key LIKE '%Run%' OR key LIKE '%RunOnce%';
-- 计划任务
SELECT name, action, path, enabled FROM scheduled_tasks WHERE enabled = 1;
-- 服务
SELECT name, display_name, status, path, start_type FROM services WHERE start_type = 'AUTO_START';
-- WMI 事件消费者
SELECT name, command_line_template FROM wmi_cli_event_consumers;
查看结果以找出:
- 启动位置中不寻常的可执行文件
- Base64编码或混淆的命令
- 在临时或用户可写目录中的可执行文件
- 最近修改的持久性机制
工作流程 4:网络连接分析
调查可疑网络活动:
-- 具有进程详细信息的活跃网络连接
SELECT p.name, p.pid, p.path, p.cmdline, ps.remote_address, ps.remote_port, ps.state
FROM processes p
JOIN process_open_sockets ps ON p.pid = ps.pid
WHERE ps.remote_address NOT IN ('127.0.0.1', '::1', '0.0.0.0')
ORDER BY ps.remote_port;
-- 映射到进程的监听端口
SELECT DISTINCT p.name, lp.port, lp.address, lp.protocol, p.path, p.cmdline
FROM listening_ports lp
LEFT JOIN processes p ON lp.pid = p.pid
WHERE lp.address NOT IN ('127.0.0.1', '::1')
ORDER BY lp.port;
-- DNS 查找(需要事件表或进程监控)
SELECT name, domains, pid FROM dns_resolvers;
调查清单:
- [ ] 识别非标准监听端口(不是 80、443、22、3389)
- [ ] 检查具有外部连接的进程
- [ ] 根据威胁情报审查目标 IP
- [ ] 将连接与进程执行时间线相关联
- [ ] 验证连接的合法商业目的
工作流程 5:文件系统取证
分析文件修改和可疑文件:
-- 在敏感位置最近修改的文件
SELECT path, filename, size, mtime, ctime, md5, sha256
FROM hash
WHERE path LIKE '/etc/%' OR path LIKE '/tmp/%' OR path LIKE 'C:\Windows\Temp\%'
AND mtime > (strftime('%s', 'now') - 86400); -- 最后 24 小时
-- 在不寻常位置的可执行文件
SELECT path, filename, size, md5, sha256
FROM hash
WHERE (path LIKE '/tmp/%' OR path LIKE '/var/tmp/%' OR path LIKE 'C:\Users\%\AppData\%')
AND (filename LIKE '%.exe' OR filename LIKE '%.sh' OR filename LIKE '%.py');
-- SUID/SGID 二进制文件(Linux/macOS) - 潜在权限提升
SELECT path, filename, mode, uid, gid
FROM file
WHERE (mode LIKE '%4%' OR mode LIKE '%2%')
AND path LIKE '/usr/%' OR path LIKE '/bin/%';
文件分析工作流程:
- 通过位置和时间戳识别可疑文件
- 提取文件哈希值(MD5、SHA256)以进行威胁情报查找
- 审查文件权限和所有权
- 检查生活离地二进制文件(LOLBins)滥用
- 为取证时间线记录文件元数据
取证查询模式
模式 1:进程分析
标准进程调查查询:
-- 具有网络连接的进程
SELECT p.pid, p.name, p.path, p.cmdline, ps.remote_address, ps.remote_port
FROM processes p
JOIN process_open_sockets ps ON p.pid = ps.pid;
-- 进程树(父子关系)
SELECT p1.pid, p1.name AS process, p1.cmdline,
p2.pid AS parent_pid, p2.name AS parent_name, p2.cmdline AS parent_cmdline
FROM processes p1
LEFT JOIN processes p2 ON p1.parent = p2.pid;
-- 高权限进程(UID 0 / SYSTEM)
SELECT pid, name, path, cmdline, uid, euid FROM processes WHERE uid = 0 OR euid = 0;
模式 2:用户活动监控
跟踪用户账户和认证:
-- 当前登录的用户
SELECT user, tty, host, time, pid FROM logged_in_users;
-- 具有登录 shell 的用户账户
SELECT username, uid, gid, shell, directory FROM users WHERE shell NOT LIKE '%nologin%';
-- 近期认证事件(需要 auditd/Windows 事件日志集成)
SELECT * FROM user_events WHERE time > (strftime('%s', 'now') - 3600);
-- Sudo 使用历史记录(Linux/macOS)
SELECT username, command, time FROM sudo_usage_history ORDER BY time DESC LIMIT 50;
模式 3:系统配置审查
识别配置更改:
-- 内核配置和参数(Linux)
SELECT name, value FROM kernel_info;
SELECT path, key, value FROM sysctl WHERE key LIKE 'kernel.%';
-- 安装的软件包(检测未经授权的软件)
SELECT name, version, install_time FROM deb_packages ORDER BY install_time DESC LIMIT 20; -- Debian/Ubuntu
SELECT name, version, install_time FROM rpm_packages ORDER BY install_time DESC LIMIT 20; -- RHEL/CentOS
-- 系统信息
SELECT hostname, computer_name, local_hostname FROM system_info;
安全考虑
- 敏感数据处理:osquery 可以访问敏感的系统信息(密码哈希、私钥、进程内存)。将访问权限限制在取证分析师和应急响应者。将查询结果导出到加密存储。在与第三方共享之前清理日志。
- 访问控制:需要在调查系统上具有 root/管理员权限。使用专用的取证用户账户,并进行审计日志记录。限制 osqueryd 配置文件(osquery.conf)以防止查询篡改。实施对查询结果的最小权限访问。
- 审计日志:记录所有 osquery 执行以进行取证链的保管。记录分析师用户名、时间戳、执行的查询和查询的系统。维护不可变的审计日志以符合合规和法律要求。使用
osqueryd --audit标志进行详细日志记录。 - 合规性:osquery 支持 NIST SP 800-53 AU(审计和责任)控制和 NIST 网络安全框架检测能力。能够为 GDPR 数据泄露调查(第 33 条)收集证据。查询结果构成取证证据 - 维护完整性和链的保管。
- 安全默认值:在调查期间使用只读查询以避免系统修改。在生产环境中使用之前,在实验室环境中测试复杂的查询。监控 osqueryd 资源消耗以防止拒绝服务。除非明确需要,否则在 osqueryd 配置中禁用危险的表(例如,
curl、yara)。
捆绑资源
脚本
scripts/osquery_triage.sh- 用于快速应急响应的自动化分类收集脚本scripts/osquery_hunt.py- 具有 MITRE ATT&CK 映射的威胁狩猎查询执行器scripts/parse_osquery_json.py- 解析和分析 osquery JSON 输出scripts/osquery_to_timeline.py- 从 osquery 结果生成取证时间线
参考资料
references/table-guide.md- 用于取证调查的全面 osquery 表参考references/mitre-attack-queries.md- 映射到 MITRE ATT&CK 技术的预构建查询references/platform-differences.md- 平台特定的表和查询变体(Linux/macOS/Windows)references/osqueryd-deployment.md- 部署 osqueryd 进行持续监控和车队管理
资产
assets/osquery.conf- 用于安全监控的生产 osqueryd 配置模板assets/forensic-packs/- 用于应急响应场景的查询包ir-triage.conf- 初始分类查询persistence-hunt.conf- 持久性机制检测lateral-movement.conf- 横向移动指标credential-access.conf- 凭证转储检测
常见调查场景
场景 1:Webshell 检测
在受威胁的 Web 服务器上检测 Webshell:
-- 检查具有可疑子进程的 Web 服务器进程
SELECT p1.name AS webserver, p1.pid, p1.cmdline,
p2.name AS child, p2.cmdline AS child_cmdline
FROM processes p1
JOIN processes p2 ON p1.pid = p2.parent
WHERE p1.name IN ('httpd', 'nginx', 'apache2', 'w3wp.exe')
AND p2.name IN ('bash', 'sh', 'cmd.exe', 'powershell.exe', 'perl', 'python');
-- Web 目录中最近修改的文件
SELECT path, filename, mtime, md5, sha256
FROM hash
WHERE path LIKE '/var/www/%' OR path LIKE 'C:\inetpub\wwwroot\%'
AND (filename LIKE '%.php' OR filename LIKE '%.asp' OR filename LIKE '%.jsp')
AND mtime > (strftime('%s', 'now') - 604800); -- 最后 7 天
场景 2:勒索软件调查
识别勒索软件指标:
-- 快速写入许多文件的进程(潜在加密活动)
SELECT p.name, p.pid, p.cmdline, COUNT(fe.path) AS files_modified
FROM processes p
JOIN file_events fe ON p.pid = fe.pid
WHERE fe.action = 'WRITE' AND fe.time > (strftime('%s', 'now') - 300)
GROUP BY p.pid
HAVING files_modified > 100;
-- 查找勒索信文件
SELECT path, filename FROM file
WHERE filename LIKE '%DECRYPT%' OR filename LIKE '%README%' OR filename LIKE '%RANSOM%';
-- 检查文件扩展名更改(加密文件)
SELECT path, filename FROM file
WHERE filename LIKE '%.locked' OR filename LIKE '%.encrypted' OR filename LIKE '%.crypto';
场景 3:权限提升检测
检测权限提升尝试:
-- 从非标准路径以 root 身份运行的进程
SELECT pid, name, path, cmdline, uid, euid FROM processes
WHERE (uid = 0 OR euid = 0)
AND path NOT LIKE '/usr/%'
AND path NOT LIKE '/sbin/%'
AND path NOT LIKE '/bin/%'
AND path NOT LIKE 'C:\Windows\%';
-- SUID 二进制文件(Linux/macOS)
SELECT path, filename, uid, gid FROM file
WHERE mode LIKE '%4%' AND path NOT IN (SELECT path FROM known_suid_binaries);
-- Sudoers 文件修改
SELECT * FROM file WHERE path = '/etc/sudoers' AND mtime > (strftime('%s', 'now') - 86400);
集成点
SIEM 集成
将 osqueryd 日志转发到 SIEM 平台:
- Splunk:使用 Splunk 为 osquery 添加或通用转发器
- Elasticsearch:配置 osqueryd 输出 JSON 日志,使用 Filebeat 进行摄取
- Sentinel:通过 Azure Monitor Agent 或自定义摄取流日志
- QRadar:使用 QRadar osquery 应用程序或日志源扩展 配置 osqueryd 结果日志记录:
{
"options": {
"logger_plugin": "filesystem",
"logger_path": "/var/log/osquery",
"disable_logging": false
}
}
EDR/XDR 集成
与端点检测结合:
- 将 osquery 结果与 EDR 警报相关联
- 使用 osquery 进行 EDR 警报丰富和调查
- 根据 EDR 威胁情报部署 osquery 包
- 用自定义 osquery 表增强 EDR 遥测
威胁情报丰富
用威胁情报丰富发现结果:
- 对 VirusTotal、MISP 或威胁源数据库查询文件哈希值
- 将网络指标与 IOC 数据库匹配
- 用 MITRE ATT&CK 技术标记发现结果
- 从威胁报告中生成狩猎假设
故障排除
问题:osquery 未找到预期结果
解决方案:验证表可用性和平台兼容性
- 检查表模式:
osqueryi ".schema processes" - 列出可用表:
osqueryi ".tables" - 查阅 references/platform-differences.md 中的平台特定表
- 一些表需要特定的 osquery 版本或内核功能
问题:高资源消耗
解决方案:优化查询性能和调度
- 在 WHERE 子句中使用索引列(pid、uid、path)
- 避免没有过滤器的无界查询
- 在 osquery.conf 中减少 osqueryd 查询频率
- 使用 LIMIT 子句限制结果集大小
- 监控:
SELECT * FROM osquery_info; SELECT * FROM osquery_schedule;
问题:权限拒绝错误
解决方案:确保适当的权限提升
- 使用 sudo/admin 权限运行 osqueryi:
sudo osqueryi - 一些表需要 root 访问权限(kernel_modules、process_memory_map)
- 检查 osqueryd 配置文件上的文件权限
- 查看阻止 osquery 的 SELinux/AppArmor 策略
最佳实践
- 记录查询:维护查询库,包括描述和预期结果
- 生产前测试:在生产系统上运行之前,在实验室中验证查询
- 最小化范围:使用 WHERE 子句限制查询范围,减少性能影响
- 导出结果:保存查询输出以保存证据(
--json或--csv标志) - 关联发现:连接多个表以进行全面的工件分析
- 版本控制:在 Git 中跟踪 osquery 配置和查询包
- 监控性能:在计划查询期间观察 osqueryd 的 CPU/内存使用情况
- 定期更新:保持 osquery 更新以获得最新的表模式和安全补丁
MITRE ATT&CK 覆盖范围
osquery 支持检测和调查 ATT&CK 矩阵中的技术:
- 初始访问:检测可疑服务和计划任务(T1053)
- 执行:监控进程创建和命令行参数(T1059)
- 持久性:识别注册表修改、cron 作业、启动项(T1547、T1053)
- 权限提升:找到 SUID 二进制文件、sudo 滥用、服务创建(T1548、T1543)
- 防御绕过:检测进程注入、文件删除、时间戳伪造(T1055、T1070)
- 凭证访问:狩猎凭证转储工具和访问(T1003、T1552)
- 发现:跟踪系统枚举活动(T1082、T1083、T1057)
- 横向移动:监控远程服务创建和认证(T1021)
- 收集:检测归档创建和数据分阶段(T1560、T1074)
- 外泄:识别不寻常的网络连接和数据传输(T1041)
参见 references/mitre-attack-queries.md 以获取特定技术的检测查询。