NSCTF 2019 WP

  1. 1. Web
    1. 1.1. Web1
    2. 1.2. Web2
    3. 1.3. Web3
    4. 1.4. Web4
    5. 1.5. Web5
    6. 1.6. Web6
  2. 2. Conclusion

这是一个绿盟弄的 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 代码…然后得到源码…

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<?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 盲注,可以利用

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

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

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

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

发现能得到正确的结果…

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

Web6

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

Conclusion

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

版权声明:除文章开头有特殊声明的情况外,所有文章在取得作者允许授权转载的情况下,均可在遵从 CC BY 4.0 协议的情况下转载。

ISITDTU CTF 2019 EasyPHP 回顾 浅谈端口扫描技术

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×