2025年5月3日 土曜日 12:00 GMT+9 ~ 2025年5月4日 日曜日 12:00 GMT+9に開催された OSINT多めのCTF, TsukuCTF 2025 に 野菜を食べ、毎食後に歯を磨く という名前のチームで参加してきました
結果は20問中14問解き2071pt、882チーム中21位でした。(参加者めっちゃ増えてるな)
チームメンバーは3人で、このwriteupも3人がリアルタイムに書いています。なので一人称などが同じ人物を指すとは限りません。
歴史あるハクスラとして有名なDiabloシリーズの初代で、ダンジョンの16階に到達すると禍々しいディアブロの声が聞こえるのですが、実はそれは「Eat your vegetables, and brush after every meal!(野菜を食べ、毎食後に歯を磨きましょう)」の逆再生というネタです
https://diablo.fandom.com/wiki/Level_16_(Diablo_I)
知ってるわけがないので説明しました CTFとは何も関係ないです
問題追加のタイミングでハイエナしたら一時的に3位になれて嬉しかったです
書いた人: karubabu
chiphertext.dat
を作る。秘密鍵とカプセル化した共有鍵と暗号化したflagは output.txt
にある。
なので、やる事は、
openssl pkeyutl -decap -inkey priv-ml-kem-768.pem -in ciphertext.dat -secret shared.dat
で出来る。priv-ml-kem-768.pem
とかいうファイルはoutput.txt
のprivate keyの部分を貼り付けるだけ。openssl pkey -in priv-ml-kem-768.pem -text -noout
とかやってまともな出力が返ってくるか見る。ciphertext.dat
はoutput.txt
のciphertext(hex)
部分をciphertext.hex
あたりの名前で作ったファイルに貼り付けて、xxd -r -p encrypted_flag.hex > encrypted_flag.dat
すると出来る。openssl list -public-key-algorithms | grep ML-KEM
で出来る。TsukuCTF25{W3lc0me_t0_PQC_w0r1d!!!}
書いた人: karubabu
ヴィジュネル暗号の問題。平文の30文字から37文字目までが、暗号文にあるtsukuctf
と一致しているらしい。
コメントにあったリンクを見ると、平文の30から37文字目であるtsukuctf
と暗号文の30から37文字目このような関係になっているので、ここからkeyが取得できる。
でもなんか鍵を使い回しても文章にならない?と思って調べていると、オートキーなる方法があるのを見付けた。
Kasiskiによって悪用される繰り返し鍵の周期性は、実行鍵のVigenère暗号によって排除できます。このような暗号は、繰り返しのないテキストがキーに使用された場合に生成されます。 Vigenèreは実際に、オートキーと呼ばれるもので実行キーを提供するために、平文自体を連結して秘密キーワードに従うことを提案しました。
ヴィジュネル暗号 オートキー
でググると、googleのAIが全部教えてくれた。なんでも鍵より長い平文部分は、既に暗号文にした文字を使用して暗号するというもの。
そうなるようなコードを用意する。
出てくる平文はalo xok aqjoy this problem or tsukuctf, or both? the flag is concatenate the seventh word in the first sentence, the third word in the second sentence, and 'fun' with underscores.
になるので、flagはTsukuCTF25{tsukuctf_is_fun}
ところで、この問題はChatGPT o3が3分でやってくれるらしいですよ - Eai
海が綺麗なこの日本の街は、かつてポルトガルのリゾート地との交流がありました。
この写真のすぐ右側にはその記念碑が置かれています。記念碑に書かれている「式典の開催日」を答えてください。
Format:TsukuCTF25{YYYY/MM/DD}
書いた人: karubabu
グーグル画像検索すると、関係がありそうなリンクが出てくる。
お宮緑地・ジャカランダ遊歩道(静岡県熱海市) : 食で奏でる旅の記憶
このサイトでは具体的な日付は分からなかったので、サイト内にある文字列で適当に検索すると以下が見付かった。
熱海・ジャカランダそしてブーゲンビリアを楽しむ: お宮緑地(ジャカランダ遊歩道)(その1) | JINさんの陽蜂農遠日記 - 楽天ブログ
TsukuCTF25{2014/06/06}
これは日本の有名な場所の一部です。あなたはこの写真の違和感に気づけますか?
フラグはこの場所のWebサイトのドメインです。
例:TsukuCTF25{example.com}
書いた人: karubabu
グーグル画像検索するとめっちゃ出てくる。
TsukuCTF25{www.yokohama-landmark.jp}
このTelegramの投稿の写真に写っている学校を特定してください。
フラグフォーマットはその場所の座標の小数点第4位を四捨五入して、小数第3位までをTsukuCTF25{緯度_経度}
の形式で記載してください。
例:TsukuCTF25{12.345_123.456}
注意: この問題を解く過程で、戦争に関わる直接的な画像が表示される場合があります。23:14 GMT+9 追記: フラグを追加しました
書いた人: Eai
いろいろこねくり回したんだけどうまくいかなくて、後でやり直したらさっくりできた
まずTelegramの投稿はGoogle翻訳するとこんな感じ
Наслідки потрапляння ракет у гімназію Степненської громади. Після Другої світової знищене відбудовували полонені нацисти, після цієї війни відбудують рашисти.
ステプノコミュニティ体育館にミサイルが命中した結果。第二次世界大戦後、破壊された地域は捕らえられたナチスによって再建され、この戦争後にはロシア人が再建することになる。
https://t.me/etozp/19319
体育館ってなんやねんとなるが、гімназіюでギムナジウム、ヨーロッパの中等教育機関という意味でこれGoogle翻訳は体育館にするらしい。中学や高校に相当するのかな?
https://ja.wikipedia.org/wiki/ギムナジウム
Степненської, ステップノは地名で、なんか?地域共同体?村が集まっている?よくわからなかったです
https://maps.app.goo.gl/JYUeaQD7tNyx54aNA
まあとにかく教育機関が爆撃されて、その場所を特定すればいいらしい
karubabuが関連しそうなニュース記事を見つけてくれた
これって
ここだよなあ(Stepneの中央にある大きめの建物)
TsukuCTF25{47.798_35.304}
で通った
ところで
【OSINT/destroyed】
私たちのミスで、誤ったフラグを設定していました。そのため、正しいフラグを追加しました。
xryuseix Discord - TsukuCTF 2025 #announcements
これはどういう意味なんだ?
実は最初はLezhyne (Stepneの近く, ステプネン郡の一部)にあるこれかと思ってsubmitしてincorrect言われまくってたので方針変更してやり直したんだけど、もしかしてこれであってた?公式writeup待ち。
遠くまで歩き、夕闇に消える足跡
煌めく街頭が、夜の街を飾る
傍らの道には、バイクの群れが過ぎ去り
風の音だけが残る光と影の中、ふと立ち止まり思う
私は今、どこにいるんだろうフラグフォーマットはこの人が立っている場所の
TsukuCTF25{緯度_経度}
です。ただし、緯度および経度は小数点以下五桁目を切り捨てたものとします。
書いた人: karubabu
OTIと書かれた看板はインドネシアにあるフライドチキンチェーン店なので、ここの公式サイトにある店舗マップから探す。
Kunjungi Kami - OTI Fried Chicken
適当に見ていくと、OTIの看板近くに"KURO"と書かれたパンダの看板が見える場所がある。
Google ストリートビュー
TsukuCTF25{-7.3189_110.4971}
素敵な雪山に辿り着いた!スノーボードをレンタルをして、いざ滑走!
フラグフォーマットは写真の場所の座標の小数点第4位を四捨五入して、小数第3位までをTsukuCTF25{緯度_経度}
の形式で記載してください。
例:TsukuCTF25{12.345_123.456}
書いた人: Eai
とりあえずGoogle Lensに聞くと色々出てくる。スイスらしい。
このインスタの投稿でグリンデルヴァルトにあるBuri Sportという店だと確認できるので、Google Mapで検索
Google Maps
答えをメモり忘れたけど46.6235636, 8.0399819くらいだったはず
あの建物が建ったら、また空が狭くなるんだろうな。
フラグフォーマットはこの人が立っている場所のTsukuCTF25{緯度_経度}
です。ただし、緯度および経度は小数点以下五桁目を切り捨てたものとします。
書いた人: karubabu
ビル一つずつを画像検索すると、判別出来るビルがあるので。それを目印に探していく。
これはロイヤルパークス品川
そして、最も右手前にあるテカテカのビルがShibaura Crystal 品川
このふたつの位置が丁度良い塩梅になる位置がここ
Google street view 35.631806, 139.744194
TsukuCTF25{35.6318_35.6318}
力を感じてきた。
フラグフォーマットはこの人が立っている場所の
TsukuCTF25{緯度_経度}
です。ただし、緯度および経度は小数点以下五桁目を切り捨てたものとします。
書いた人: Eai
右側をGoogle LensするだけでデイリーポータルZの記事が出てきて将門塚であることがわかる。
細かい位置も書いてあるのでGoogle Mapsで当たりをつけてac
https://maps.app.goo.gl/Pcg5iFRwGyFdV5oP6
ここらへん
TsukuCTF25{35.6872_139.7627}
新しいブログサイトを作成したので、ぜひ見に来てください!
ちなみに隠されたページがあります😎注意点: ツールの使用は許可されていますが、短期間で大量にリクエストを送信しないでください。隠されたページのリンクは100文字以上あり、かつ推測不可能です。
書いた人: fuyu
与えられたリンクを開くとブログが出てくる、WordPressなのでまずはREST APIを叩いてみることにした
http://challs.tsukuctf.org:9000/wp-json/wp/v2/posts
が特に得られるものはなかった
http://challs.tsukuctf.org:9000/feed
えあいに教えてもらった /feed
(RSS) でも特に得られるものはなかった…
次に管理画面にアクセスしてみると下記のエラーが表示された
http://challs.tsukuctf.org:9000/wp-admin/
404-solution
というプラグインがインストールされていてエラーになっているらしい
https://ja.wordpress.org/plugins/404-solution/
が、いったんスルーしてしまい wpscan の結果を眺めたり、いろいろAPIを叩いてみたものの何も得られるものがなかった
404-solution
が怪しそうなので、どうにかしてバージョンを取得できないか悩んでいたところ http://challs.tsukuctf.org:9000/?p=4 にアクセスするとリダイレクトが行われるが、その際レスポンスヘッダに X-Redirect-By: 404solution-2.33.0/404-solution.php
が含まれているのをkarubabuが見つけてくれた
このバージョンを元に該当しそうな脆弱性を探してみたところ以下を見つけた
NVD - CVE-2023-52146
ログファイルから機密情報が漏洩するというもの
2.33.1
で修正されたとの事なのでソースコードの差分を見ると、怪しい箇所を見つけることができた
デバッグログのファイル名が abj404_debug.txt
固定なので誰でもアクセスすることができてしまっていたということらしい
getDebugFilePath
https://github.com/aaron13100/404solution/blob/2.33.0/includes/Logging.php#L338
getFilePathAndMoveOldFile
https://github.com/aaron13100/404solution/blob/2.33.0/includes/Logging.php#L367
ABJ404_PATH
https://github.com/aaron13100/404solution/blob/develop/404-solution.php#L34
plugin_dir_path
https://developer.wordpress.org/reference/functions/plugin_dir_path/
処理を追うことで下記のURLにデバッグログが配置される事が分かったのでアクセスする
http://challs.tsukuctf.org:9000/wp-content/uploads/temp_abj404_solution/abj404_debug.txt
デバッグログを見ることで、隠しページのURLが分かるのでアクセスするとGoogle ドキュメントにリダイレクトされてそこにフラグがある
https://docs.google.com/document/d/16K84AlbPOBsGpP14qfpOxBQVlc4J5-Aq4QhbVf6OYlg
TsukuCTF25{b3_c4r3fu1_w17h_w0rd9r355_91u61n5}
昔 WordPress をいろいろ触ってたのが役にたったかもしれない問題だった
TsukuCTFの公式Discordの「announcements」チャンネルにフラグが記載されています。
Flag Format:TsukuCTF25{}
TsukuCTF25{welcome_to_TsukuCTF_2025!}
書いた人: Eai
みそはここであり、パースされたオブジェクトのlengthが0より小さい必要がある
ESの仕様として、Array.lengthがnegativeな値になることはない
Every Array has a non-configurable "length" property whose value is always a non-negative integral Number whose mathematical value is strictly less than 2**32.
ECMAScript® 2026 Language Specification
ではArrayではなく、たまたまlengthというプロパティを持っているObjectだったら?
TsukuCTF25{l4n_l1n_lun_l4n_l0n}
書いた人: Eai
なんかフラッシュ暗算みたいなことさせられるうえに途中から問題が見えなくなる。ナメてる?
とりあえずコードを読んで、
このseedがわかっちゃえばどうにでもなるよな〜と思いながら http://challs.tsukuctf.org:50000/static/seed.txt にアクセスしてみたらなんか普通にseedがある。
どうにでもなるのでどうにでもする。適当に一回実行してsession_idとともにChatGPTに投げる: LCG 数値計算
暗算の答えがわかったので回答欄に入れてフラグゲット
TsukuCTF25{Tr4d1on4l_P4th_Trav3rs4l}
フラグにパストラバーサルと書いてあることからもわかるように、本来はnginxのパストラバーサルを使う想定だったらしい。
そういえば前に見たな
スラッシュの有無だけでセキュリティにとんでもない大穴が空いてしまうNginxのありがちな設定ミスについて実例を踏まえて専門家が解説 - GIGAZINE
今回のnginx.conf:
たしかにlocation /images
になっている
書いた人: fuyu
flag.txt
を読み込む事ができれば、フラグを取得できるが flag
や /
といった文字列を含むリクエストは送れないようになっている
YAMLの仕様の穴(エイリアス機能とか)を突いてフラグを取得するのかなとも考えたけど前述の処理でこれらも塞がれていた
お手上げ状態だったので何かヒントがないかと検索してみたところ、下記の記事を見つけることができた
CTF: Best Web Challenges 2022 | XS-Spin Blog
fs.readFileSync
はパラメータとして <string> | <Buffer> | <URL> | <integer>
を受け付けていて URL
のような形のオブジェクトを渡すことでファイルパスにURLエンコーディングが使えるようになるらしい
File system | Node.js v23.11.0 Documentation
TsukuCTF25{YAML_1s_d33p!}
参考にした writeup がなかったらこの問題を解くことができなかった
writeup を残してくれた先人に大感謝…
つくし君とじゃんけんしよう。負けてもチャンスはいっぱいあるよ!
フラグフォーマットはTsukuCTF25{}
です。
Connection Info:
nc challs.tsukuctf.org 30057
書いた人: karubabu
300回もチャンスがあるので、299回くらい負けて情報をとってseedを特定し、最後に294連勝する…みたいな問題だと思うのだけれど、さっぱり分からずどうにもならなかった。
そもそもrng = xor_tsuku_shift(seed=secrets.randbits(64))
ってことはseedは2^64くらいあるってことだし、普通に探しても見付かるようなものではないきがする。何か上手い方法があるのかしら。
chatgptに聞くと、"まず12回ほど負けてパターンを取得した後、2^32個のseedから候補を100から1000個くらい集めて、失敗しながら候補を狭めていく"という方法とそのコードが貰えた。
でもこれ実行して1時間経った今でも候補すら出揃わない。そこまで時間がかかるとserverとの接続が切れてると思うし、やっぱり駄目そう。なんなのよほんと。seed値御用意しなさいよ。
If you're new to kernel challenges, check out this guide.
You can download the handouts from here.
The flag is in /dev/sdb. Good luck and have fun!
Connection Info:
nc challs.tsukuctf.org 19000
書いた人: fuyu
Kernel Exploitation系ははまったく分からず手も足も出なかった
この領域は勉強が必要だなと感じた
以下は考えていたこと、やってみたことを今後の備忘録となるように書いていく
ただ知識ゼロから初めたので理解が間違っている部分が大半かもしれない
与えられたソースコード類のなかに rootfs.ext3
があるのでこれをマウントすることでローカル環境に簡単にプログラムを配置することができた
新しくビルドしたときは仮想マシンを再起動する必要があった、またビルドして仮想マシンを再起動しても変更が反映されない事が何度かあったマウントオプションの設定を変える必要があるのかもしれない
run.sh
に -gdb
オプションを追加することでGDBでカーネルデバッグをすることができた
(おそらく)これで最低限の準備は整ったのでカーネルモジュールのソースコードを眺めながら脆弱な箇所を見つける作業を始めた
ソースコードを読むと module_ioctl
の中でいろいろやっていて、この辺りの処理の脆弱性を突くことで特権昇格ができそうだと考えた
初めの方は問題文にあるハンズアウトを参考に open()
した fd
に対して read()
や write()
を実行したりしてみたけどこれは意味がなかった
これは file_operations
という構造体に、デバイスファイル( /dev/foo
)への操作(システムコール?)が行われたときどういった処理を呼び出すかが設定されているが ioctl
のみ設定されているため
なので、ioctl
経由で操作ができるように下記のようなコードを書いた
C言語やLinuxプログラミングに慣れていないので普通に動かすにも時間が結構時間が掛かってしまった
これで ioctl
経由で呼び出すことができるようになったはず…
実装した cmd_write
で Buffer Overflow を試してみるも特に何も起こらないようだった
次は Heap Overflow を起こしてみることにした
またハンズアウトを参考に explot コードを書いてみたがうまく動作させることができなかった
最初、ハンズアウトを理解せずコピペしてしまい /dev/ptmx
(擬似端末マスタ)をたくさん開いてなんかゴニョゴニョする!と思ってたがこれは間違いだった
このスプレー部は破壊したいオブジェクトのサイズに合わせて変更する必要があった
ここに破壊に使えそうなオブジェクトの一覧がある
今回は 0x20
なので seq_operations
が該当しそう
(おそらく)正しいスプレーコードは下記になる
ただスプレー部分を直してもコピペコードでは特権昇格を行うことはできず、実際にカーネルのメモリを確認してどうなっているかデバッグしていく必要がありそうだった
ハンズアウトを読みながら、IDAやgdbを使いブレークポイントを設定してメモリを見て…というのをいろいろ試してみたもののうまくいかず、夜遅くということもあり眠くなってしまい時間切れとなってしまった
IDAで調査をするときにアセンブリと格闘する必要があったけど、CTFの参考になればと数日前からアセンブリを書いて遊んでたのでアセンブリを読むのがあまり苦痛ではなくなってたのも良かった(ただ6502だったのでx86とは大きく違った)
When you cannot control RIP, what will you do?
You can download the handouts from here.
The flag is in /dev/sdb. Good luck and have fun!
Connection Info:
nc challs.tsukuctf.org 19002
Looks easy but…
You can download the handouts from here.
The flag is in /dev/sdb. Good luck and have fun!
Connection Info:
nc challs.tsukuctf.org 19001