こんにちは。
テックリードのTerukiです。
昨日から本日にかけてIERAE CTF 2025にOh my teethとして参戦してきました!
どうしてマウスピース矯正に関するサービスのシステムを作っている会社でCTFをやっているのか謎ではありますが、私も分かりません
何か準備などをしていたわけではないですが、急遽参加してだいぶ楽しかったので次回があったらまたやりたいなと思っています。
今日は折角なので解いた問題についてちょっと書いてみようかと思います。
順位
ド直球のOh my teethというチーム名で挑みましたが私一人だけです
参加している538チームのうち98位という結果でした。
一人でやったにしてはまあまあやれてる方なのかなと思います。
次はもうちょっと上を目指したいですね。
問題
正解できた問題は6問でした。1問目はDiscordにあるやつをコピペするだけなので問題というものでもないですが。
- Welcome
- DiNo.1
- Length Calculator
- rev rev rev
- Warmdown
- Skip Skip Skip 1
逆にめっちゃ時間をかけたけど解けなかったやつはこちらです。
- Slide Sandbox
- rot rot rot
- Skip Skip Skip 2
Welcome
Discordにあるコードをコピペして完了するチュートリアルです。
DiNo.1
ブラウザ上で動くミニゲームで高得点を出すとFLAGが出てくるやつです。
バックエンド関係ないのでHTMLを落としてクリア判定のif文の条件を書き換えてしまうのが一番手っ取り早そうですね。
これもチュートリアルという感じですね。
ちなみにプレイヤースキルでゴリ押してクリアすることも出来ます
Length Calculator
コードを読むとSegmentation Faultを引き起こすとFLAGが出てくると書かれています。
// gcc chal.c -o chal
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <sys/mman.h>
void win(int sig) {
puts("Well done!");
system("cat ./flag*");
exit(0);
}
int main() {
// If you cause SEGV, then you will get flag
signal(SIGSEGV, win);
setbuf(stdout, NULL);
while (1) {
unsigned int size = 100;
printf("Enter size: ");
scanf("%u%*c", &size);
char *buf = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
if (!buf) {
puts("Too large!");
exit(1);
}
printf("Input: ");
fgets(buf, size, stdin);
buf[strcspn(buf, "\n")] = '\0';
printf("Your string length: %d\n", strlen(buf));
}
}
C言語の基礎が分かっていてmmapについて別途調べたら解けそうです。
私はテキトーに0を入れたらなんかクリアしてしまいました。。
rev rev rev
短めのPythonコードがFLAGを暗号化したファイルと一緒に渡されます。
気合で処理を逆順にすれば元のFLAGを復元できます。
Warmdown
この辺りからちょっと難しくなってきました。
これはXSSの脆弱性が含まれるページで、document.cookieの値も読めてしまうのでやることは一つです。
Markdown内にimgタグを作ってonerror属性に外部のサーバにdocument.cookieを送りつけるようなスクリプトを書けばCookieに記録されているFLAGを奪取することができます。
このくらいの難易度のやつが一番楽しいかもです。
Skip Skip Skip 1
私が解けた中ではこれだけ難易度がおかしいです。
フォールトインジェクション攻撃をARMのエミュレーターに仕掛けて任意の命令をスキップさせてFLAGを奪うというものです。
昔に自作OSや自作Androidなどで遊んでいたのでアセンブリ言語やQEMUなどのエミュレーターには割と慣れているつもりではありますが、gdbを使うのはいつぶりか覚えてないくらいでした。
Sorry, it's a secret!と表示される直前の分岐命令をスキップさせてFLAGを出力させるわけですが、いやらしいことに*drumroll*の前後に謎の何もしないループが複数個配置されていて正確にスキップさせるにはちゃんと計算しないといけません。
gdbの使い方を思い出すのとインストールにそこそこ時間を使ってしまいましたが、最後は解くことが出来ました。
解けなかったやつ
解法はなんとなく分かったような気はしつつも解けなかったです。
Slide Sandbox
Warmdownの難しい版みたいに思ってましたが、思いつく案はだいたい駄目でした。
XSSだけでなくCSRFも使っていろいろやるところまでは思いついたものの、結局BOTのセッションIDを奪取するか攻撃者のセッションIDを使わせるかしなければFLAG見れなくない?となり時間切れ。。
rot rot rot
暗号化されたフラグをバイナリ解析して元に戻すやつ。。。と思っていたのですが、終わった後ちょっと調べてみたら総当たりでちょっとずつ特定していくのが王道っぽくて拍子抜けでした
IDAでほぼ全てのアセンブリをC言語に書き直しても微妙に上手くいかず、正解者が割と多いのが気がかりだったものの次のやつへ。。
Skip Skip Skip 2
Skip Skip Skip 1の難しいやつです。
1が出来たので2もやってみようという感じでしたが、1のように一発ハマればFLAGが出てくるというよりも何回も試行してちょっとずつ特定していくような感じなのかなと思いました。(違ったら恥ずかしい)
おそらくこれを解いている人はサーバへのアクセスもプログラムからやっているのだと思うのですが、何も準備していなかった私はすべて手動でやっていていろいろと無理があると思ったので諦めました。
これで一発で行ける方法があったのなら悲しいですね。。
久々にやってみたCTFですが、思ってたよりは出来たのかなと思います。
情報処理安全確保支援士も持っていることですし、攻撃手法を知ることによってどう守れば良いか分かるので実際の開発業務でもフィードバックしていけたらと思う次第です。
次は一人じゃなくて誰かと一緒にやりたいですね
Oh my teethについて
Oh my teethでは未来の歯科体験を創るために日々活動しています。
Techチームではより良いユーザー体験を提供するべく、Webフロントエンドからバックエンド、スマホアプリに機械学習モデルなど、さまざまなプロダクトを開発しています。
一緒に未来の歯科体験を創りませんか?興味がある方は是非こちらを確認してください。
カジュアル面談も可能なので気軽に応募してみてください!
