60

NSCTF 2019 WP

 4 years ago
source link: https://www.tuicool.com/articles/q6FRZzy
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.

这是一个绿盟弄的 CTF ,因为在复习考试所以没怎么玩…随便玩了一下顺手写个 wp

Web

Web1

地址在 http://39.106.184.130:8084/

扫目录得到 .DS_Store 文件,使用 lijiejie 的 dstore_exp 工具恢复文件,又得到一个 CTF_Can_U_Tell_Me_The_Flag 的文件夹,发现有 .git ,直接用 GitHack 弄下来,在 git log 中发现 flag

ZJBRjuQ.png!web

Web2

Web2地址给了两个,两个地址都不一样…蒙蔽…

n673EnM.png!web

第二个地址给了个 GitLab 的地址,我以为官方弄错了啥的,一直怼第一个地址,各种猜,SSRF、注入啥的都猜了结果都没用。

结果在赛后有师傅说 Gitlab 有越权…然后自己扫了一下当真扫到了 /root 的地址,可以越权访问 Administrator 的页面

或者说可以看到 Administrator 的提交记录

yQrYJr3.png!web

可以看到下面有个 commit 描述:增加读取 flag 代码…然后得到源码…

mYnuama.png!web

后面就没什么好说的了…源码如下:

<?php
session_start();

function get_contents($url) {

        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_MAXREDIRS, 0);
        curl_setopt($curl, CURLOPT_TIMEOUT, 3);
        curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 3);
        curl_setopt($curl, CURLOPT_RESOLVE, array($host . ":" . $port . ":" . $ip)); 
        curl_setopt($curl, CURLOPT_PORT, $port);

        $data = curl_exec($curl);

        if (curl_error($curl)) {
            error(curl_error($curl));
        }

        $status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
        if ($status >= 301 and $status <= 308) {
            $url = curl_getinfo($curl, CURLINFO_REDIRECT_URL);
        } else {
            return $data;
        }

    }

function error($s) {
    clear_directory();
    die("<h2><b>ERROR</b></h2> " . htmlspecialchars($s));
}

$msg = "";
if (isset($_GET["url"])&&"0769cdd4c5a9d8142a08373826c87baa"==md5($_GET["pass"])) {
    $msg =  get_contents($_GET["url"]);    
}
?>

<html>
    <head><title>找flag!</title></head>
    <body>
        <form>
            <h1>猜一猜flags在哪里!</h1>
            <p><b>请输入URL:</b></p>
            <p><input type="text" size="100" name="url"></p>
            <p><input type="submit" value="提交"></p>
        </form>
        <?php if (!empty($msg)) echo "<hr><p>" . $msg . "</p>"; ?>
    </body>
</html>

fAzumeV.png!web

Web3

发现由 JSESSIONID=54361A6D54D3993C78020F67804A0248 ,直接上 struts-scan ,可以扫到s2-045,直接上 exp 可以拿到 shell

但是可以发现 flag.txt 只有 600 的权限,查看内核,尝试用 CVE-2018-18182 进行提权,后来貌似被主办方修了,没提成功。

U7rYzye.png!web

尝试使用 SUID 进行提权,可以参考 【安全科普】Linux提权——利用可执行文件SUID

使用 find / -user root -perm -4000 -print 2>/dev/null 查看可以拥有 SUID 权限的执行文件:

vENJV32.png!web

发现有 tac 命令,然后直接用 tac 就可以拿到 flag 了

qU7bAny.png!web

这里比赛的时候直接用 tac 可以拿到了,现在又不可以了…不知道是不是这个 exp 的原因…没有深入…

然后也拿到了题目源码,看了一下貌似是个上传的点,不过可以直接用 s2-045 进来可能也是一种预期解法?

Web4

没搞出来…给了个 password.txt ,也是给了两个 web 地址,比较迷。

然而用这个文本里面的登录第一个 web admin 账户,没有成功…

看第二个 web 地址回显了一个 mysql 的错误。

vEJvEzy.png!web

不确定是不是被搅屎了…两个 web 地址的脑洞真搞不动…

(盲猜第一个进入管理员后用 Rogue mysql 来拿 flag

Web5

2qYNZrE.png!web

中间有个按钮用来随机 id ,一看就是个注入题。ban了比较多的关键字,大小写也绕不过,而且还 ban 了 information_schema 关键字。那就说明不能用一般的注入方法来弄。

尝试 bool 盲注,可以利用

(case when (hex(substr( database() ,1,1)) in(33) ) then 1 else 0 end)

vABNzyA.png!web

得到数据库名为 deb7cb73f0ea2b2af2d1e3715fd12044 。接下来怎么弄表名呢?尝试了好一会,绕不过限制,然后题目又提示 flag 长度为32…

然后盲猜 flag 表名库名为 flag ,字段名也是 flag,所以有

(case when (hex(substr( length(select flag from deb7cb73f0ea2b2af2d1e3715fd12044.flag ) ) ,1,1)) in(33) ) then 1 else 0 end)

发现能得到正确的结果…

后面就像直接直接爆就好了…更扯淡的是… flag 跟数据库名一样…

Web6

毫无技术含量的题目,伪造 xff 就行了。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK