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解析器, 请求拦截