はじめに
今更ですが、2024/6/15(土) ~ 2024/6/16 (日) まで開催された、
SECCON Beginners CTF 2024 というオンラインイベントに参加しました。
初めてのCTF参加となります。(初心者の僕にとってはめちゃくちゃ難しかったです)
CTFとは
セキュリティに関する専門知識や技術を駆使して、隠されている答え(Flag)を見つけるイベントです。(専門知識が必要な謎解きゲームのようなもの)
様々な分野の問題を解いて得点を競う形式(Jeopardy形式)や、チーム間で攻撃と防御を行う形式(Attack & Defense形式)が存在します。
今回参加したSECCON Beginners CTF 2024 は、24時間以内に出題された問題を解く Jeopardy形式 のイベントです。
出題分野
SECCON Beginners 2024 は以下の分野が出題されました。
分野 | 説明 |
---|---|
Crypto (暗号) | 暗号技術に関する問題。暗号化されたメッセージの解読など |
Reversing (リバースエンジニアリング) | 与えられたプログラム等の解析など |
Web | Webアプリの脆弱性を突く問題。SQLインジェクション・クロスサイトスクリプティング(XSS)など |
Pwnable (バイナリ攻撃) | バイナリの脆弱性を利用する問題。バッファオーバーフローなど |
Misc(その他) | ステガノグラフィ(画像や音声ファイルに隠されたメッセージの発見)など |
実際はこんな問題が出ました
CTF 初参加ということもあり、ほとんどの問題を解くことができなかったのですが、
そんな私でもある程度解けた問題をいくつか紹介します。
1. 数字当てゲーム攻略
上記に記載のURLにアクセスすると、ランダムに選ばれた1桁の数字を当てる、数字当てゲームで遊ぶことができます。
数字が当たると1ポイント加算され、ポイントに応じてランクが決定するようです。
getRank.tar.gz をダウンロードすると、Typescript で書かれたソースコードがダウンロードできました。ランクは以下の配列で定義されているようです。
const RANKING = [10 ** 255, 1000, 100, 10, 1, 0];
初期ランクが6、1点以上でランク5、10点以上でランク4……とランクが上がっていき
ランクが1になれば、Flagをゲットできるようでした。
つまりランク1になるためには、10 ** 255(10 の 255乗…!)ポイント以上を取得する必要がありそうです。
ソースコードを確認してみると、変数 score が再代入可能なletで定義されていることがわかります。
let score = parseInt(input);
そこで、Google Chrome の開発者ツールで score を変更する…という流れで解いていきます。
# 実際はこの後、高得点過ぎるとチート対策としてスコアが減らされる仕組みがあったりします。
2. 暗号化された文章の復元
問題文の日本語訳は「safe prime を使えば RSA暗号は安全になるよね?」でしょうか。
Safe_Prime.tar.gz をダウンロードすると、以下のようなテキストファイルがありました。
n = 2929273......
c = 4079147......
import os
from Crypto.Util.number import getPrime, isPrime
FLAG = os.getenv("FLAG", "ctf4b{*** REDACTED ***}").encode()
m = int.from_bytes(FLAG, 'big')
while True:
p = getPrime(512)
q = 2 * p + 1
if isPrime(q):
break
n = p * q
e = 65537
c = pow(m, e, n)
print(f"{n = }")
print(f"{c = }")
RSA暗号は詳しくなかったので、色々とWEBで調べました。
ソースコードと安全素数の定義より
今回 q は 2p + 1 で表されることがわかります。
そのうえで、素数の組み合わせ p q を求めて
C(暗号化済のフラグ)から、原文を復号することで
「ctf4b{*** REDACTED ***}"」となっている部分がわかるようでした。
まとめ
今回参加したイベントは、初心者向け、といいつつ完全な初心者にはハードルが高かったです。
ただ、じっくり調べつつ、楽しみながら学ぶいい機会にはなりました。
一般的な謎解きゲームとは違い、知ってる人しか遊べない遊び、に参加できる優越感や、
合法的にハッキング?できる楽しさもあり、難しかったものの、来年も参加したいなと思えるイベントでした。
また今回のような年1回のものではなく、CTFができる常設のサイトがいくつもあるようなので、まずはこういったサイトで勉強してみようかなと思います。