👻

SECCON Beginners CTF 2025 WriteUp

に公開

参加しようとしてたけど寝坊して1時間半くらいしか参加できなかたったけど、解けた範囲だけ
記載途中なので随時追加していきます・・・

skipping(Web:beginner)

指定のURLにアクセスすし、flagリンクにアクセスすると403 Forbiddenとなる。
ソースコードを確認すると以下の記述がある。

const check = (req, res, next) => {
    if (!req.headers['x-ctf4b-request'] || req.headers['x-ctf4b-request'] !== 'ctf4b') {
        return res.status(403).send('403 Forbidden');
    }

    next();
}

該当のリクエストにヘッダと値をいれてアクセスしてみるとフラグがGETできた。
request

GET /flag HTTP/1.1
Host: skipping.challenges.beginners.seccon.jp:33455
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:139.0) Gecko/20100101 Firefox/139.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ja,en-US;q=0.7,en;q=0.3
x-ctf4b-request: ctf4b
Accept-Encoding: gzip, deflate
Connection: close
Referer: http://skipping.challenges.beginners.seccon.jp:33455/
Upgrade-Insecure-Requests: 1
Priority: u=0, i

response

HTTP/1.1 200 OK
Server: nginx/1.29.0
Date: Sat, 26 Jul 2025 09:20:53 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 33
Connection: close
X-Powered-By: Express
ETag: W/"21-yD09GLYnLK7z1sHMWHIMg/8bJ/o"

ctf4b{y0ur_5k1pp1n6_15_v3ry_n1c3}

seesaw(Crypto:beginner)

ソースコードをみるとRSA暗号であることがわかる。
下記ソースからqの値が明らかに小さいので、素因数分解ができそう。

q = getPrime(16)

factorDBで素因数分解できるか確認してみる。factorDB
qが33091であることがわかるので、RSA暗号は素因数分解ができれば元の文が復号可能となるので完了。

solve.py
from Crypto.Util.number import inverse, long_to_bytes
from Crypto.PublicKey import RSA
import gmpy2
import binascii

# RSAパラメータ
n = 362433315617467211669633373003829486226172411166482563442958886158019905839570405964630640284863309204026062750823707471292828663974783556794504696138513859209
e = 65537
c = 104442881094680864129296583260490252400922571545171796349604339308085282733910615781378379107333719109188819881987696111496081779901973854697078360545565962079
p = 33091
q = n // p

# dの計算
phi = (p - 1) * (q - 1)
d = inverse(e, phi) 
# d = pow(e, -1, phi)
m = pow(c, d, n)
print(long_to_bytes(m))
ctf4b{unb4l4nc3d_pr1m35_4r3_b4d}

Discussion