1.Misc

0x1 签到

by glan & guoguo

我只能说这签到题不简单,但是

都不算太难,但是不会做就很难,会做就很简单。 ——马莉老师

懂得都懂~
image.png
推荐编解码网站:https://gchq.github.io/CyberChef/
下载下来是.pcapng,心中了然,此题为数据分析题
起手式:上WireShark追踪TCP
image.png
客户端向一句话木马tmpshell.php发送了查看flag文件的命令,接下来shell返回的内容就是flag的内容。
接下来,把shell返回的内容拷贝出来
image.png

  1. 64306c455357644251306c6e51554e4a5a3046355355737764306c7154586c4a616b31355357704e65556c7154586c4a616b31355357704e65556c7154586c4a616b31355357704e65556c7154586c4a616b31355357704e65556c7154576c44546d39525241707154586c4a616b31355357704e65556c7154586c4a616b31355357704e65556c7154586c4a616b31355357704e65556c7162314645616b46445357644251306c6e51554e4a5a32644554545a46524530325157704e5a3046365458524e524531305257704e436e5177553078304d464e4d6444425454485177553078304d464e4d6444425454485177553078304d464e4d6444425454485177553078304d464e4d6444425454485177553078304d464e4d644442705130354e65556c7154586c4a616b31355357704e65556b4b4e6b467154576442656b31305455524e644556715458644a616b38775a566f324d6d56774e557377643074795556645a64315a485a48593152556c3051576c4e4d5546355a4777316255733254545a7162475a7763573579555552304d464e4d64444254544170304d464e4d6444425454485177553078304d464e4d6444425454485177553078304d464e4d6444425454485177553078304d464e4d6444425454485177553078304d464e4d537a42425357526159585a764e7a567462485a735130354e564530325255524e436e6f77655531334d464e4e6555467154545a524e327877596a647362584a5252484a7a5131706f516c68614d446c745647637751306c355655524a4d315a74596e4676656d3951567974736357563151303477553078304d464e4d64444254544851775530774b63336858576d786b4d5659354d544e6c4e325179576d684752324a7a576d31615a7a427363446c7064573569567974585a7a427363446c7064573569567974585a7a427363446c706457356956797458537a423354586876564531336230524e6555464454517045546a4252524534775555527356324636546c684e65444258596d593562464a48556b524f5245347759584a6b4d464a6d4f565a6162444658596e644252456c6b556d46746345524c61577832526b6c6b556d46746345524c61577832566b747754544a5a436a303955556c6f545442525245347755516f3d

解码需要不断尝试。。。。。这是真的难(泪流千行)
解码不是用来尝试的,要通过wireshark发现规律
首先筛选出http包,查看其中一个包,发现post是发送命令请求,比如这个是ls,另一个是whoami,大概就能猜到这里是请求linux命令用的。
image.png
image.png
那么之后的返回内容按猜测应该是命令执行结果
image.png
其中一个是这样的十六进制(判断方法,0-9&a+f),尝试将十六进制转换为字符串
image.png
看出来了吧,这明显的两个==结尾,这就是base64编码,再尝试解码。
image.png
发现有一个php,反过来看好像是tmpshell.php,再叠一层反转buff
image.png
嚯嚯,果不其然,确实就是tmpshell.php。
于是继续翻找发现了一个 cat /fl4g 的
image.png
嘶,这tm是个啥,估计是被截断了,再往下翻发现有一个 cat /fl4g | base64,长度长一点
既然他说了叠了一层base64,那就再解密
最终是hex + base64 + reverse + base64
[

](https://gchq.github.io/CyberChef/)
Recipe中添加:From Hex -> From Base64 -> Reverse ->From Base64
image.png

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软件打开,一帧一帧查看。
image.png
其中第二帧的二维码太模糊了,需要用Photoshop处理一下,调整色阶后二维码清晰了
image.png

# 第2帧
flag{a3c7e4e5

# 第10帧
-9b9d

# 第18帧
-ad20

# 第26帧
-0327-288a235370ea}

将各部分连起来,得到flag

flag{a3c7e4e5-9b9d-ad20-0327-288a235370ea}

0x3 银杏岛の奇妙冒险

by glan & guoguo

这题我觉得我们的做法可能是意外解,出题人没有想到可以直接在配置文件看到flag

/附件 2/.minecraft/saves/Where is the flag/customnpcs/quests/主线

在此路径下,有一些json文件
image.png
打开文件可以看到部分flag,一共4部分,最后拼凑起来就是flag了,但请注意flag的格式
image.png

# 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

将题目的两个文件放到工具根目录就行
image.png

python3 firepwd.py

直接运行,firepwd会解析文件,得到firefox配置文件中存储的账号密码,其中密码就是flag
image.png

GKCTF{9cf21dda-34be-4f6c-a629-9c4647981ad7}

0x5 问卷调查

原来这题才是签到题啊!!!
image.png

flag{787c37cc-5ec2-9aae-f9c5-c1cc624caec0}

2.Web

0x1 babycat

by tari & challenger

访问 signup 接口提示 Not Allowed
image.png
看返回包是有东西的
image.png
然后构造 POST请求,即可注册成功
image.png
登录后,发现是 guest 权限
image.png
下载接口发现相对路径,可以目录穿越下载文件,当然 flag 文件权限不足,无法成功下载,然后里面的 Upload 页面也提示我们不是 admin,访问不了
看指纹是 Java,读取 web.xml
image.png
然后,Java 上的类 servlet-class 与真实目录对应的关系如下
image.png
以上传接口类为例子, com.web.servlet.uploadServlet 对应为 classes/com/web/servlet/uploadServlet.class
依次下载可访问接口文件后,把 .class 文件扔进 idea 之类的,能反编译的就好,就能看到源码
这里重要的接口主要有两个 registerupload
通过 register 接口发现
image.png
看似无论如何,,好像都会被替换为 guest ,也就是无法伪造 admin 的身份(做了很多尝试),只能另辟溪路(有绕过这里的大佬欢迎指教!)

文件上传接口有两处waf
image.png
一个是文件名后缀过滤,另外一个是文件内容过滤,文件后缀过滤这里尝试了很多,没法绕过(希望有绕过的大佬指教!虽然这题绕不绕过没关系,看下面分析)
image.png
这里是 or 关系,文件后缀或者内容触碰了里面的规则,就会进入里面的逻辑,但是这个过滤很神奇,
debug,我们的后缀名是 .jsp, 经过判断后触发waf规则,然后重定向输出 upload failed
image.png
Writeup | 2021 GKCTF X DASCTF应急挑战杯 - 图29
但是,他不会因执行到 req.getRequstDispatcher立刻重定向,导致下面的代码不执行,
而是重定向后继续执行下一步并给filePath传值 —>new File 看debug已经跟进到这步
image.png
image.png
也就是说,这个黑白名单好像没啥用。。一开始想着绕过这个后缀,试了半天 = =
不过感觉是出题人的失误吧?应该是有正确的绕过方式的。。

但到这里还有个问题,Upload 页面因为我们不是 admin 身份,无法访问,也就是,我们利用 Unicode 编码混淆过后的马上传上去后,访问不了。

这里再次想到目录穿越,既然下载有目录穿越,那上传有没有目录穿越呢?试了下,果然可以啊(这里有着充满泪的故事导致后面flag没提交成,不详细说了,啊啊啊啊,900多分没了

至于目录穿越的路径,我们登录的时候是不是有只猫,是张图片?我们的目标就是那!原来题目叫babycat 是有原因的,2333
image.png

image.png
上传,虽然结果是 upload failed,但我们刚刚分析过,,waf 是 or 关系,虽然我们文件后缀名不满足,但我们文件内容不包含黑名单的内容,所以就可以上传成功了。
image.png
这里马用的是哥斯拉,因为哥斯拉默认生成的 jsp 马是 unicode编码混淆过的
image.png
在根目录发现 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写的
运行一下
MV}M0Q1RY}M_`G]@D)2K35E.png
看样子就是个简单的check输入的程序
扔进IDA
函数名乱七八糟的(图略
去字符串窗口搜一下“check”字符串并查看引用,没啥线索
V3116JXC]OA$KYQBXST~)LL.png
不过正好看到隔壁有个“flag”字符串
看看“flag”的引用
QTLA$52DDNUG6_$M~DUY]J6.png
TH$LF7G(OKYHXL9HEIKYBQ0.png
第36行看到了疑似转换用的字符串,这个函数应该就是check的核心函数了
函数基本逻辑就是通过一段加密算法后判断结果是否与“56fkoP8KhwCf3v7CEz”一致
注意到第52,53行有整除58,对58求余的代码
第一反应是base58编码
对“56fkoP8KhwCf3v7CEz”进行base58解码,得“12t4tww3r5e77”
check一下
![H3L])$TG0AQ9Z~UO$[IHFO.png
猜中了!好耶! 已经可以不用再战斗了
flag{12t4tww3r5e77}

题外话:球球你们统一一下flag格式罢