1.Misc
0x1 签到
我只能说这签到题不简单,但是
都不算太难,但是不会做就很难,会做就很简单。 ——马莉老师
懂得都懂~
推荐编解码网站:https://gchq.github.io/CyberChef/
下载下来是.pcapng,心中了然,此题为数据分析题
起手式:上WireShark追踪TCP
客户端向一句话木马tmpshell.php发送了查看flag文件的命令,接下来shell返回的内容就是flag的内容。
接下来,把shell返回的内容拷贝出来
64306c455357644251306c6e51554e4a5a3046355355737764306c7154586c4a616b31355357704e65556c7154586c4a616b31355357704e65556c7154586c4a616b31355357704e65556c7154586c4a616b31355357704e65556c7154576c44546d39525241707154586c4a616b31355357704e65556c7154586c4a616b31355357704e65556c7154586c4a616b31355357704e65556c7162314645616b46445357644251306c6e51554e4a5a32644554545a46524530325157704e5a3046365458524e524531305257704e436e5177553078304d464e4d6444425454485177553078304d464e4d6444425454485177553078304d464e4d6444425454485177553078304d464e4d6444425454485177553078304d464e4d644442705130354e65556c7154586c4a616b31355357704e65556b4b4e6b467154576442656b31305455524e644556715458644a616b38775a566f324d6d56774e557377643074795556645a64315a485a48593152556c3051576c4e4d5546355a4777316255733254545a7162475a7763573579555552304d464e4d64444254544170304d464e4d6444425454485177553078304d464e4d6444425454485177553078304d464e4d6444425454485177553078304d464e4d6444425454485177553078304d464e4d537a42425357526159585a764e7a567462485a735130354e564530325255524e436e6f77655531334d464e4e6555467154545a524e327877596a647362584a5252484a7a5131706f516c68614d446c745647637751306c355655524a4d315a74596e4676656d3951567974736357563151303477553078304d464e4d64444254544851775530774b63336858576d786b4d5659354d544e6c4e325179576d684752324a7a576d31615a7a427363446c7064573569567974585a7a427363446c7064573569567974585a7a427363446c706457356956797458537a423354586876564531336230524e6555464454517045546a4252524534775555527356324636546c684e65444258596d593562464a48556b524f5245347759584a6b4d464a6d4f565a6162444658596e644252456c6b556d46746345524c61577832526b6c6b556d46746345524c61577832566b747754544a5a436a303955556c6f545442525245347755516f3d
解码需要不断尝试。。。。。这是真的难(泪流千行)
解码不是用来尝试的,要通过wireshark发现规律
首先筛选出http包,查看其中一个包,发现post是发送命令请求,比如这个是ls,另一个是whoami,大概就能猜到这里是请求linux命令用的。
那么之后的返回内容按猜测应该是命令执行结果
其中一个是这样的十六进制(判断方法,0-9&a+f),尝试将十六进制转换为字符串
看出来了吧,这明显的两个==结尾,这就是base64编码,再尝试解码。
发现有一个php,反过来看好像是tmpshell.php,再叠一层反转buff
嚯嚯,果不其然,确实就是tmpshell.php。
于是继续翻找发现了一个 cat /fl4g 的
嘶,这tm是个啥,估计是被截断了,再往下翻发现有一个 cat /fl4g | base64,长度长一点
既然他说了叠了一层base64,那就再解密
最终是hex + base64 + reverse + base64
[
](https://gchq.github.io/CyberChef/)
Recipe中添加:From Hex -> From Base64 -> Reverse ->From Base64
CCCCC!!cc))[删除] [删除] 00mmee__GGkkCC44FF__mm11ssiiCCCCCCC0 20:01:13
[回车] [回车] [回车] ffllaagg{{}}WWeell-----------
窗口:*new 52 - Notepad++
时间:2021-03-301:13
[回车]
---------------------------------------------
窗口:*new 52 - Notepad++
时间:2021-03-30 20:###########
--------------------------------------------21-03-30 20:01:08 #
############################
#######################################
# 20
flag{Welc0me_GkC4F_m1siCCCCCC!}
0x2 你知道apng吗
by glan
关于apng文件的参考资料:http://www.ga1axy.top/index.php/archives/46/
由以上参考资料,我们可知APNG就是一种动图形式的PNG文件
这题是有个别帧放上了二维码,最后把所有部分拼凑起来就是flag
我们可以用Honeyview软件打开,一帧一帧查看。
其中第二帧的二维码太模糊了,需要用Photoshop处理一下,调整色阶后二维码清晰了
# 第2帧
flag{a3c7e4e5
# 第10帧
-9b9d
# 第18帧
-ad20
# 第26帧
-0327-288a235370ea}
将各部分连起来,得到flag
flag{a3c7e4e5-9b9d-ad20-0327-288a235370ea}
0x3 银杏岛の奇妙冒险
这题我觉得我们的做法可能是意外解,出题人没有想到可以直接在配置文件看到flag
/附件 2/.minecraft/saves/Where is the flag/customnpcs/quests/主线
在此路径下,有一些json文件
打开文件可以看到部分flag,一共4部分,最后拼凑起来就是flag了,但请注意flag的格式
# Part1 2.json
w3lc0me_
# Part2 3.json
t0_9kctf_
# Part3 4.json
2021_
# Part4 5.json
Check_1n
GKCTF{w3lc0me_t0_9kctf_2021_Check_1n}
0x4 FireFox Forensics
by glan
拓展学习:Firefox Forensics and SQLite Tables for Computer Forensics Analysis https://resources.infosecinstitute.com/topic/firefox-and-sqlite-forensics/
这题是数字取证题,Firefox 密码脱取。把登录凭证文件里的账号密码提取出来就算成功了
这里需要用到工具firepwd
https://github.com/lclevy/firepwd
# 安装 PyCryptodome>=3.9.0 pyasn1>=0.4.8
python3 -m pip install pycryptodome==3.4.3
python3 -m pip install -r requirements.txt
将题目的两个文件放到工具根目录就行
python3 firepwd.py
直接运行,firepwd会解析文件,得到firefox配置文件中存储的账号密码,其中密码就是flag
GKCTF{9cf21dda-34be-4f6c-a629-9c4647981ad7}
0x5 问卷调查
原来这题才是签到题啊!!!
flag{787c37cc-5ec2-9aae-f9c5-c1cc624caec0}
2.Web
0x1 babycat
by tari & challenger
访问 signup
接口提示 Not Allowed
看返回包是有东西的
然后构造 POST请求,即可注册成功
登录后,发现是 guest
权限
下载接口发现相对路径,可以目录穿越下载文件,当然 flag
文件权限不足,无法成功下载,然后里面的 Upload
页面也提示我们不是 admin
,访问不了
看指纹是 Java,读取 web.xml
然后,Java
上的类 servlet-class
与真实目录对应的关系如下
以上传接口类为例子, com.web.servlet.uploadServlet
对应为 classes/com/web/servlet/uploadServlet.class
依次下载可访问接口文件后,把 .class
文件扔进 idea
之类的,能反编译的就好,就能看到源码
这里重要的接口主要有两个 register
和 upload
通过 register
接口发现
看似无论如何,,好像都会被替换为 guest
,也就是无法伪造 admin
的身份(做了很多尝试),只能另辟溪路(有绕过这里的大佬欢迎指教!)
文件上传接口有两处waf
一个是文件名后缀过滤,另外一个是文件内容过滤,文件后缀过滤这里尝试了很多,没法绕过(希望有绕过的大佬指教!虽然这题绕不绕过没关系,看下面分析)
这里是 or
关系,文件后缀或者内容触碰了里面的规则,就会进入里面的逻辑,但是这个过滤很神奇,
debug,我们的后缀名是 .jsp
, 经过判断后触发waf规则,然后重定向输出 upload failed
但是,他不会因执行到 req.getRequstDispatcher
立刻重定向,导致下面的代码不执行,
而是重定向后继续执行下一步并给filePath传值 —>new File 看debug已经跟进到这步
也就是说,这个黑白名单好像没啥用。。一开始想着绕过这个后缀,试了半天 = =
不过感觉是出题人的失误吧?应该是有正确的绕过方式的。。
但到这里还有个问题,Upload
页面因为我们不是 admin
身份,无法访问,也就是,我们利用 Unicode
编码混淆过后的马上传上去后,访问不了。
这里再次想到目录穿越,既然下载有目录穿越,那上传有没有目录穿越呢?试了下,果然可以啊(这里有着充满泪的故事导致后面flag没提交成,不详细说了,啊啊啊啊,900多分没了)
至于目录穿越的路径,我们登录的时候是不是有只猫,是张图片?我们的目标就是那!原来题目叫babycat 是有原因的,2333
上传,虽然结果是 upload failed,但我们刚刚分析过,,waf 是 or 关系,虽然我们文件后缀名不满足,但我们文件内容不包含黑名单的内容,所以就可以上传成功了。
这里马用的是哥斯拉,因为哥斯拉默认生成的 jsp
马是 unicode
编码混淆过的
在根目录发现 flag
文件和 getflag
程序,运行 getflag
即可
flag{6f00324d-2a41-4563-9a8d-2694fd813402}
3.Crypto
0x1 Random
by Utonai
import random
from hashlib import md5
def get_mask():
file = open("random.txt","w")
for i in range(104):
file.write(str(random.getrandbits(32))+"\n")
file.write(str(random.getrandbits(64))+"\n")
file.write(str(random.getrandbits(96))+"\n")
file.close()
get_mask()
flag = md5(str(random.getrandbits(32)).encode()).hexdigest()
print(flag)
经典预测随机数
python的random库使用的是MT19937算法,只要知道前624个生成状态就可以预测此后生成的随机数
题中生成了32位,64位,96位的随机数,按32位拆分正好可以得到624个生成状态
魔改一下网上找到的的代码
from random import Random
from hashlib import md5
def invert_right(m,l,val=''):
length = 32
mx = 0xffffffff
if val == '':
val = mx
i,res = 0,0
while i*l<length:
mask = (mx<<(length-l)&mx)>>i*l
tmp = m & mask
m = m^tmp>>l&val
res += tmp
i += 1
return res
def invert_left(m,l,val):
length = 32
mx = 0xffffffff
i,res = 0,0
while i*l < length:
mask = (mx>>(length-l)&mx)<<i*l
tmp = m & mask
m ^= tmp<<l&val
res |= tmp
i += 1
return res
def invert_temper(m):
m = invert_right(m,18)
m = invert_left(m,15,4022730752)
m = invert_left(m,7,2636928640)
m = invert_right(m,11)
return m
def clone_mt(record):
state = [invert_temper(i) for i in record]
gen = Random()
gen.setstate((3,tuple(state+[0]),None))
return gen
def get_mask():
file = open("random114514.txt","w")
for i in range(104):
file.write(str(g.getrandbits(32))+"\n")
file.write(str(g.getrandbits(64))+"\n")
file.write(str(g.getrandbits(96))+"\n")
file.close()
f = open("random.txt",'r').readlines()
prng = []
txt = []
for i in f:
i = i.strip('n')
txt.append(int(i))
for i in range(len(txt)//3):
prng.append(txt[3*i])
prng.append(txt[3*i+1]%2**32)
prng.append(txt[3*i+1]>>32)
prng.append(txt[3*i+2]%2**32)
prng.append((txt[3*i+2]>>32)%2**32)
prng.append(txt[3*i+2]>>64)
g = clone_mt(prng[:624])
get_mask()
flag = md5(str(g.getrandbits(32)).encode()).hexdigest()
print(flag)
输出为14c71fec812b754b2061a35a4f6d8421
套一下flag格式
GKCTF{14c71fec812b754b2061a35a4f6d8421}
4.Reverse
0x1 QQQQT
by Utonai这题怎么还报毒的啊(半恼
看题目名字,应该是用QT写的
运行一下
看样子就是个简单的check输入的程序
扔进IDA
函数名乱七八糟的(图略
去字符串窗口搜一下“check”字符串并查看引用,没啥线索
不过正好看到隔壁有个“flag”字符串
看看“flag”的引用
第36行看到了疑似转换用的字符串,这个函数应该就是check的核心函数了
函数基本逻辑就是通过一段加密算法后判断结果是否与“56fkoP8KhwCf3v7CEz”一致
注意到第52,53行有整除58,对58求余的代码
第一反应是base58编码
对“56fkoP8KhwCf3v7CEz”进行base58解码,得“12t4tww3r5e77”
check一下
![H3L])$TG0AQ9Z~UO$[IHFO.png
猜中了!好耶! 已经可以不用再战斗了
flag{12t4tww3r5e77}
题外话:球球你们统一一下flag格式罢