Back

NSCTF 2019 WP

这是一个绿盟弄的 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

Web2

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

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

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

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

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

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

<?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>

Web3

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

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

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

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

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

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

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

Web4

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

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

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

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

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

Web5

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

尝试 bool 盲注,可以利用

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

得到数据库名为 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 就行了。

Conclusion

随便玩玩的比赛…质量不是很好…

Licensed under CC BY-NC-SA 4.0

I am looking for some guys who have a strong interest in CTFs to build a team focused on international CTFs that are on the ctftime.org, if anyone is interested in this idea you can take a look at here: Advertisements


想了解更多有意思的国际赛 CTF 中 Web 知识技巧,欢迎加入我的 知识星球 ; 另外我正在召集一群小伙伴组建一支专注国际 CTF 的队伍,如果有感兴趣的小伙伴也可在 International CTF Team 查看详情


comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy