这是一个绿盟弄的 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
随便玩玩的比赛…质量不是很好…