emancipat3r/theo
GitHub: emancipat3r/theo
theo 是一款无状态的 Linux 威胁分诊自动化工具,通过 SSH 并发登录目标主机执行 IoC 启发式检测并按严重性分类发现结果。
Stars: 0 | Forks: 0
# theo
无状态的 Linux 威胁分诊工具。并发 SSH 登录到目标主机,提权至 root,运行即时 IoC 启发式检测,内省 Docker/Podman 容器,并按严重性对发现进行分类 —— 所有这些都通过单一编译后的二进制文件完成。
## 安装
```
go build -o theo .
```
为不同的目标进行交叉编译:
```
GOOS=linux GOARCH=amd64 go build -o theo .
```
## 用法
```
./theo
```
交互式表单会提示输入:
- **目标 IP** —— 逗号分隔的主机列表以进行分诊
- **SSH 端口** —— 默认为 22
- **SSH 用户名** —— 无需是 root
- **认证方式** —— 密码、SSH 密钥或两者兼有
- **SSH 密码** —— 无回显输入
- **SSH 密钥路径** —— 默认为 `~/.ssh/id_rsa`
- **Sudo 密码** —— 默认为 SSH 密码;如为 NOPASSWD sudo 则留空
## 提权工作原理
1. 通过 SSH 以提供的用户身份登录
2. 运行 `id -u` 检查是否已是 root
3. 如果是 root —— 直接运行分诊
4. 如果不是 root —— 先尝试 `sudo -n`(无密码),然后回退到通过 stdin 传递密码的 `sudo -S`(绝不会在命令字符串中传递)
## 检查内容
### 主机级检查
| 检查项 | 类别 | 检测内容 |
|---|---|---|
| MEMEXEC | 恶意软件 | `/dev/shm`, `/tmp`, `/var/tmp` 中的可执行文件 |
| DELETED | 恶意软件 | 二进制文件已从磁盘删除但仍在运行的进程 |
| HIDDEN | 恶意软件 | 可写临时目录中的隐藏文件 |
| UID0 | 后门 | UID 为 0 的非 root 账户 |
| LDPRELOAD | Rootkit | `/etc/ld.so.preload` 中的条目(用户态 rootkit 挂钩) |
| PROCHIDE | Rootkit | 进程隐藏 —— 比较 `ps` 的 PID 数量与 `/proc` 中的条目 |
| TAINTED | Rootkit | 内核污染标志(加载了未签名/树外模块) |
| KMOD | Rootkit | 已加载的内核模块(标记已知的 rootkit 模块名称) |
| IMMUTABLE | Rootkit | `/etc`, `/tmp`, `/var/tmp` 中设置了不可变属性的文件 |
| MODBINS | 篡改 | 过去 7 天内被修改的系统二进制文件 |
| SUID | 权限提升 | 标准系统路径之外的 SUID/SGID 二进制文件 |
| CRON | 持久化 | 所有用户的 Crontab 和 cron 目录 |
| TIMERS | 持久化 | Systemd 定时器 |
| ATJOBS | 持久化 | 计划的 `at` 任务 |
| SHELLINIT | 持久化 | `.bashrc`, `.profile`, `/etc/profile.d/` 中的可疑命令 |
| RCLOCAL | 持久化 | `/etc/rc.local` 中的非注释条目,非标准的 init.d 脚本 |
| PAM | 持久化 | 最近修改过的 PAM 配置或模块 |
| AUTHKEYS | 持久化 | 所有用户的 SSH authorized_keys |
| SERVICES | 侦察 | 正在运行的 systemd 服务(标记加密挖矿程序模式) |
| LISTEN | 侦察 | 带有进程信息的正在监听的 TCP 端口 |
| OUTBOUND | C2/Exfil | 已建立的出站 TCP 连接(标记可疑端口) |
| DNSCONF | C2/Exfil | DNS 解析器配置 |
| IPTABLES | 规避 | 非默认的 iptables 规则 |
| HISTORY | 规避 | Bash 历史记录异常(符号链接、丢失、空) |
| SHADOWPERMS | 凭据 | `/etc/shadow` 权限检查 |
| KNOWNHOSTS | 横向移动 | SSH known_hosts 条目(映射横向移动路径) |
| FAILEDAUTH | 暴力破解 | 过去 24 小时内失败的 SSH 登录尝试 |
| LOGCHECK | 反取证 | 空的或异常近期的日志文件 |
| NETNS | 上下文 | 网络命名空间 |
| CONTAINERENV | 上下文 | 宿主机本身是否运行在容器内 |
### 容器级检查(Docker / Podman)
如果检测到容器运行时,theo 会枚举所有正在运行的容器并执行两遍扫描:
**宿主机侧检查**(`docker inspect`):
- 特权模式(CRITICAL —— 完全的主机访问权限)
- 单个危险能力:`SYS_ADMIN`, `SYS_PTRACE`, `SYS_MODULE`, `SYS_RAWIO`, `DAC_OVERRIDE`, `DAC_READ_SEARCH`, `NET_ADMIN`
- 宿主机网络 / PID 命名空间共享
- 绑定挂载 —— 标记 docker 套接字(CRITICAL),宿主机根文件系统(CRITICAL),敏感路径如 `/etc`, `/root`, `/home`(HIGH)
**容器内分诊**(`docker exec`):
- 正在运行的进程(如果 `ps` 不可用,则回退至 `/proc`)
- 正在监听的端口(`ss` / `netstat` / `/proc/net/tcp`)
- 临时目录中的可执行文件
- 临时目录中的隐藏文件
- 非 root 的 UID 0 账户
- Crontab
- 可从容器内部访问的 Docker 套接字(容器逃逸向量)
- Kubernetes 服务账户 token
容器内脚本使用 `sh` 并对每个命令使用 `command -v` 进行保护,因此它能在最小化/alpine/distroless 镜像中优雅降级。如果 `sh` 完全不可用(例如 distroless),它会从宿主机侧回退到 `docker top`。
## 自动化分析
发现的结果不仅会被收集起来 —— 它们还会被分析和分类:
### 严重性级别
| 级别 | 含义 | 示例 |
|---|---|---|
| **CRITICAL** | 确切的 IoC —— 很可能已遭到入侵 | 已删除的正在运行的二进制文件,UID 0 后门,`ld.so.preload` 条目,隐藏进程,rootkit 内核模块 |
| **HIGH** | 强烈指标 —— 需要调查 | `/tmp` 中的可执行文件,非标准的 SUID,可疑的 shell 初始化,PAM 修改,特权容器 |
| **MEDIUM** | 值得审查 | Crontab 条目,修改过的系统二进制文件,at 任务,敏感的容器挂载,空的日志文件 |
| **LOW** | 上下文 / 噪音 | 失败的认证尝试,iptables 规则,出站连接 |
| **INFO** | 基准数据 | 正在运行的服务,监听端口,内核模块,DNS 配置 |
### 模式匹配
分析层会根据内容升级严重性级别,而不仅仅是基于哪项检查产生了发现:
- KMOD 中的 **Rootkit 模块名称**(diamorphine, reptile 等) → CRITICAL
- SERVICES 中的 **加密挖矿程序服务名称**(xmrig, minerd) → HIGH
- OUTBOUND 中的 **可疑出站端口**(4444, 1337, 31337) → HIGH
- **进程隐藏**(ps/proc PID 计数不匹配 > 5) → CRITICAL
- **内核被污染**(非零) → HIGH
- **History 规避**(符号链接到 /dev/null) → CRITICAL;root 缺失/为空 → HIGH
- **Shadow 权限**(全局可读) → CRITICAL;权限错误 → HIGH
### 主机结论
每台主机会根据最高严重性的发现获得一个整体结论:
| 结论 | 条件 |
|---|---|
| `COMPROMISED` | 任何 CRITICAL 发现 |
| `SUSPICIOUS` | 任何 HIGH 发现 |
| `REVIEW` | 任何 MEDIUM 发现 |
| `CLEAN` | 仅有 LOW/INFO 发现 |
## 输出
### 终端
- 摘要表:主机,状态,结论,提权方式,容器数量,按严重性统计的发现数量(`3C 2H 5M 1L 12I`)
- 详细视图:仅显示 MEDIUM 及以上的发现,按严重性进行颜色编码分组
- INFO 级别的发现会被计数但不会被打印(有关完整数据,请参阅 JSON 报告)
### JSON 报告
完整的结构化报告保存至 `triage_YYYYMMDD_HHMMSS.json`,包含所有严重性级别的每个发现。可用于:
- 在多次运行之间进行对比以检测随时间发生的变化
- 接入其他工具或仪表板
- 归档 / 审计跟踪
## 依赖
- [charmbracelet/huh](https://github.com/charmbracelet/huh) —— 交互式表单
- [charmbracelet/log](https://github.com/charmbracelet/log) —— 运行时日志
- [charmbracelet/lipgloss](https://github.com/charmbracelet/lipgloss) —— 样式化的终端输出
- [x/crypto/ssh](https://pkg.go.dev/golang.org/x/crypto/ssh) —— SSH 客户端
标签:EVTX分析, Go, Ruby工具, Web归档检索, Web报告查看器, 内存分配, 后门检测, 子域名变形, 库, 应急响应, 日志审计, 自定义DNS解析器, 请求拦截