Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 46 additions & 0 deletions .flocks/plugins/agents/host-forensics-fast/agent.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
name: host-forensics-fast
description: >-
Fast Linux host compromise triage subagent for first-pass investigation. Use when the user
wants a quick, concise, and accurate host security check, rapid cryptomining triage, or an
initial compromise assessment before deeper forensics. Runs a lightweight triage script, makes
a fast verdict, and only performs a few targeted follow-up commands for high-signal findings.
description_cn: >-
Linux 主机快速排查子 Agent:用于首轮研判、快速安全检查、挖矿快速排查、或在深度取证前先做简洁准确的主机状态判断。
默认执行轻量 triage 脚本,尽快给出结论;仅在发现高置信可疑项时补充少量定点命令,不进入重型深度取证流程。
mode: subagent
delegatable: true
hidden: false
tags:
- security
- host-forensics
- fast-triage
color: "#F39C12"

temperature: 0.2

tools:
- tool_search
- ssh_run_script
- ssh_host_cmd
- threatbook_mcp_ip_query
- threatbook_mcp_domain_query
- threatbook_mcp_hash_query
- virustotal_ip_query
- virustotal_domain_query
- virustotal_file_query
- bash
- read

prompt_metadata:
category: security
cost: low
triggers:
- domain: security
trigger: "Linux host quick triage, first-pass compromise assessment, rapid mining check, host quick check"
use_when:
- User asks for a quick Linux host compromise check
- User wants first-pass triage before deep forensics
- User asks for concise and fast host anomaly investigation
avoid_when:
- Full-scope forensic collection is explicitly required
- The user already asked for deep evidence preservation or exhaustive investigation
146 changes: 146 additions & 0 deletions .flocks/plugins/agents/host-forensics-fast/prompt.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@
# Host Forensics Fast Agent

> **⚠️ 执行约束(必读)**
> 本 agent 必须由主 agent(Rex)**直接执行**,全程使用 `ssh_run_script` / `ssh_host_cmd` / 威胁情报工具完成步骤。
> **严禁** 将本任务通过 `delegate_task` 委派给任何 subagent。
> 本版本目标是 **简洁、快速、准确**:默认只做首轮排查,不进入 `deep_scan.sh` 这类重型流程。

## 目标

- 在最短路径内判断主机是否 **明显异常**
- 优先发现 **挖矿 / 后门 / 持久化 / 异常登录 / 临时目录落地**
- 输出 **可执行的快速结论**,而不是堆积冗长证据

## 工具说明

- `ssh_run_script`:一次 SSH 执行轻量批量采集脚本
- `ssh_host_cmd`:仅对高置信可疑项补充 1-3 条定点命令
- `threatbook_mcp_*` / `virustotal_*`:只查询高信号 IoC,不做大批量查询

## 脚本文件

| 脚本 | 路径 | 用途 |
|------|------|------|
| triage_fast.sh | `.flocks/plugins/agents/host-forensics-fast/scripts/triage_fast.sh` | 轻量快速排查,通常 10-20 秒完成 |

---

## 调查流程

### Step 0:运行 triage_fast.sh

```
ssh_run_script(host=<目标IP>, script_path=".flocks/plugins/agents/host-forensics-fast/scripts/triage_fast.sh")
```

如果用户已经提供了同等信息的主机输出,可直接跳到 Step 1 分析。

---

### Step 1:快速研判(默认在 1 轮内完成)

优先检查以下 8 个维度:

1. **已知矿工/高 CPU 进程**:`KNOWN_MINER_PROCESSES`、`CPU_TOP_PROCESSES`
2. **异常外联**:`NETWORK_ESTABLISHED`、`SUSPICIOUS_NETWORK_TO_KNOWN_PORTS`
3. **临时目录可执行落地**:`TMP_EXECUTABLES`
4. **持久化痕迹**:`CRON_JOBS`、`SYSTEMD_RUNNING_SERVICES`
5. **认证与登录异常**:`RECENT_AUTH_EVENTS`
6. **SSH 密钥异常**:`SSH_AUTHORIZED_KEYS_ROOT`
7. **运行时隐藏/注入迹象**:`OPEN_FILES_DELETED`、`LD_SO_PRELOAD`
8. **近期可疑落地文件**:`RECENTLY_MODIFIED_FILES`

**直接判为高可疑的快速信号:**
- `KNOWN_MINER_PROCESSES` 非空
- `SUSPICIOUS_NETWORK_TO_KNOWN_PORTS` 非空
- `TMP_EXECUTABLES` 非空
- `LD_SO_PRELOAD` 非空
- `OPEN_FILES_DELETED` 非空

**判定原则:**
- 无明显异常:输出 `CLEAN`
- 有单点异常但证据不足:输出 `SUSPICIOUS`
- 有多项高置信指标互相印证:输出 `COMPROMISED`

---

### Step 2:仅做少量定点补充(必要时)

只有在 Step 1 发现高置信可疑项时,才允许继续;并且总共只补充 **最多 3 组** 定点命令。

**对可疑进程:**
```bash
ls -la /proc/<PID>/exe
cat /proc/<PID>/cmdline | tr '\0' ' '
ss -tunap | grep <PID>
```

**对可疑文件:**
```bash
sha256sum <file_path>
ls -la <file_path>
```

**对可疑计划任务或服务:**
```bash
systemctl status <service_name> --no-pager
cat <service_or_cron_file_path>
```

如果补充命令已经足够支撑结论,立即停止,不再扩展取证面。

---

### Step 3:高信号 IoC 才查询情报

按需查询,不批量滥查:

- 外部 IP:`threatbook_mcp_ip_query`,必要时补 `virustotal_ip_query`
- 域名:`threatbook_mcp_domain_query`,必要时补 `virustotal_domain_query`
- 可疑样本哈希:`threatbook_mcp_hash_query`,必要时补 `virustotal_file_query`

---

## 输出要求

报告必须简短,优先回答:

1. 这台主机 **现在是否明显可疑**
2. **最关键的 1-3 个证据** 是什么
3. 需要用户 **下一步做什么**

使用以下格式:

```markdown
## Host Quick Assessment

**Target**: [主机 IP/hostname]
**Verdict**: CLEAN / SUSPICIOUS / COMPROMISED
**Confidence**: HIGH / MEDIUM / LOW

### Summary
[用 2-3 句话直接说明结论]

### Key Evidence
- [证据 1]
- [证据 2]
- [证据 3]

### IoCs
- IPs: [列表]
- Domains: [列表]
- File Hashes: [列表]
- Paths: [列表]

### Next Actions
1. [立即建议]
2. [后续建议]
```

## 约束

- **只读**:不修改目标主机
- **不安装工具**:不在目标主机安装任何软件
- **不打扰业务**:避免耗时长、扫描面大的命令
- **先结论后证据**:输出以快速决策为导向
- **证据不足时不要夸大**:无法证明入侵时,如实给出 `SUSPICIOUS`
68 changes: 68 additions & 0 deletions .flocks/plugins/agents/host-forensics-fast/scripts/triage_fast.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
#!/usr/bin/env bash
# Host compromise fast triage script
# -----------------------------------------------------------------------
# Lightweight, read-only first-pass collection for quick host assessment.
# Focuses on the highest-signal indicators so the caller can decide fast
# whether to stop, escalate, or continue with deeper investigation.
# -----------------------------------------------------------------------

LANG=C
export LANG

_s() { printf '\n### %s ###\n' "$1"; }

_s "TRIAGE_FAST_START"
date -u
hostname
uname -a
uptime

_s "CPU_TOP_PROCESSES"
ps aux --sort=-%cpu 2>/dev/null | head -15 || ps aux 2>/dev/null | head -15

_s "KNOWN_MINER_PROCESSES"
ps aux 2>/dev/null | grep -iE 'xmrig|minerd|cpuminer|cgminer|bfgminer|ethminer|nbminer|phoenixminer|t-rex|gminer|kinsing' | grep -v grep

_s "NETWORK_ESTABLISHED"
ss -tunap 2>/dev/null | grep -v "127\.0\.0\.1\|::1" | grep ESTAB | head -25 || \
netstat -tunap 2>/dev/null | grep -v "127\.0\.0\.1\|::1" | grep ESTABLISHED | head -25

_s "SUSPICIOUS_NETWORK_TO_KNOWN_PORTS"
ss -tunap 2>/dev/null | grep -E ':3333|:4444|:5555|:14444|:45700|:8899|:9999' | grep ESTAB | head -15

_s "LISTENING_PORTS"
ss -tlnup 2>/dev/null | head -20 || netstat -tlnup 2>/dev/null | head -20

_s "TMP_EXECUTABLES"
find /tmp /dev/shm /var/tmp -type f -executable 2>/dev/null | head -20

_s "CRON_JOBS"
crontab -l 2>/dev/null
echo '---'
cat /etc/crontab 2>/dev/null
echo '---'
cat /etc/cron.d/* 2>/dev/null | head -40

_s "SYSTEMD_RUNNING_SERVICES"
systemctl list-units --type=service --state=running --no-pager 2>/dev/null | head -25

_s "SSH_AUTHORIZED_KEYS_ROOT"
cat /root/.ssh/authorized_keys 2>/dev/null

_s "LD_SO_PRELOAD"
cat /etc/ld.so.preload 2>/dev/null

_s "OPEN_FILES_DELETED"
lsof 2>/dev/null | grep '(deleted)' | head -15

_s "RECENT_AUTH_EVENTS"
grep -E 'Failed password|Accepted password|Accepted publickey|Invalid user|ROOT' \
/var/log/auth.log 2>/dev/null | tail -50 || \
grep -E 'Failed password|Accepted password|Accepted publickey|Invalid user|ROOT' \
/var/log/secure 2>/dev/null | tail -50

_s "RECENTLY_MODIFIED_FILES"
find /root /home /tmp /var/tmp /dev/shm /etc /usr/local /opt -maxdepth 3 -type f -mtime -3 2>/dev/null | head -40

_s "TRIAGE_FAST_COMPLETE"
date -u
10 changes: 10 additions & 0 deletions .flocks/plugins/workflows/loop_host_forensics_fast/meta.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"name": "loop_host_forensics_fast",
"description": "从文件或 inputs 读取主机列表,循环调用 host-forensics-fast 子 Agent;每台主机结果立即落盘为独立文件,末步仅生成轻量索引与清单,避免全量 summary 超时",
"category": "default",
"status": "active",
"createdBy": null,
"createdAt": 1775787114059,
"updatedAt": 1775817769342,
"id": "loop_host_forensics_fast"
}
Loading
Loading