概要
先日10/05-06に、HackFestaというTOYOTA主催のCTFに参加してきました。
CTFはDiverOSINTCTFに参加して以来の2回目の参加でした。個人的な結果は200点以上の問題が解けず力不足さを感じましたが、自動車システムのセキュリティに触れることができ、貴重な経験となりました。
会場にはお菓子やジュースが充実しておりそういう面でも楽しかったです。競技中にモンスターエナジーを3本飲んだという方もいて驚きました。
個人的にかかわった問題のうち、印象に残った問題に関するWriteUpを書きます。問題は大きくRAMN, Pasta, Serverの3つに分類されていました。自分はRAMN, Pastaの実機を接続せず、チームメイトにやってもらいました。Pasta, RAMNの問題は、実機がなくても処理できる部分について主に扱いました。
参加を検討されているる方へ
CTF初心者の目線からですが、所感をざっくり述べようと思います。問題は10点のものから500点のものまでありました。Asciiの変換についての知識があれば解ける100点問題もありました。RAMNやPastaの問題はドキュメントを正しく読む力が必要だと感じました。
RAMN
RAMNとは、自動車システムの研究開発を行うために設計されたECUテストベッドです。
ディスプレイが接続されており、車の各要素の状態を出力してくれて見ていて面白かったです。
RAMN Plus
本問題では、Teratermを通じたRAMNのある機能へのパスワード認証を、debugモードを用いて突破するというものでした。
- debugモード: debugモードで機能へのアクセスを行うと、入力された誤ったパスワードに対するデバッグメッセージが返されます。また、認証に制限がありませんでした。
今回の場合、パスワードの長さが異なる場合に異なることを知らせてくれたので、長さを変えながらメッセージが変化するか確認しました。
長さがヒットすれば全探索かと考えていましたが、長さがヒットした場合、1文字目からn文字目まで、文字が異なる部分に関して、以下のように正しい文字をデバッグメッセージとして返してくれました。
>unlock-tier-1 42Erminaa
[DEBUG] Incorrect character at index 7, expected 'e', got 'a'.
Incorrect password!
Pasta
Pasta for Educationは、chip 1stopの説明文にあるように、車載ネットワークを搭載したセキュリティテストベッドです。
接続すると車のアクセル、ハンドル、ブレーキなどをGUI的に制御するコンソールが立ち上がり面白かったです。
point cloud
Pastaの通信データをAscii変換すると、3次元データが得られました。その3次元データをプロットして特定の角度から見ると、flagが見える問題でした。
flagの形式が綺麗でテンション上がりました
CAN^2 be encrypted
Pastaに関する問題でした。Pastaに流れるメッセージのうち、あるchannelで通信されている内容の平文が漏えいしたとき、そのchannelと同じ暗号鍵を用いて暗号化されているchannelの平文を推定する問題でした。
平文が漏えいしたchannelでの通信内容(暗号文)を取得し、平文とXORを取ることで暗号鍵を算出しました。
その後、その暗号鍵を用いて暗号文を復号し、flagを取得しました。
画面に埋め込まれた指示は...
画像ファイルとstegano.py
というpythonファイルが渡されました。そのpythonファイルには2つの画像(埋め込むためのダミー画像、埋め込みたい秘密画像)を用いて、どのように画像を埋め込むかが記されていました。
pythonファイルから逆算して画像から秘密画像を取得するプログラムを書くと、指示が書かれた画像が得られました。指示の通りにPastaを動かすとflagが得られました。
server
ここからは3つめの大きな問題分類のserverで、いわゆるCTFで出されるWeb、crypto、reversingなどです。Web問題ではかっこいい車の写真がたくさん出てきました。
RotomCars
Web問題です。電子決済サイトのWebページのリンクとWebページの構造を記述したpythonファイルが与えられ、ある車の名前を電子決済サイトで探し、購入してほしいという問題文でした。普通にWebサイト内を車の名前で探しても、車の種類が多すぎて見つかりませんでした。
そこで、Pythonファイルを見て
-
\〇〇(ディレクトリ名忘れました)
というサブディレクトリに車の名前のクエリを?q=車の名前
の形式でアクセスすると車のidが分かること -
\〇〇\id
にアクセスすることでそのidをもつ車を購入できること
が分かりました。これらのことから車の購入まで進むとflagが得られました。
Grand Theft Credit
音声ファイルが渡され、そこには顧客とカスタマーサポート(?)の電話での会話が録音されていました。途中でクレジットカード番号をプッシュする音が流れ、それを番号に復号するとflagが得られる問題でした。
携帯電話のプッシュ音について調べると、Wikipedia DTMFというページが出てきました。高群、低群とよばれる2つの周波数成分から音が構成されていると書いてありました。
そこで、得られた音声ファイルをプッシュ音ごとに切り出し、それぞれをFFTして周波数を計算しました。すると、きれいに2つのピークが得られ、それらのピークをもとに番号を復元することでflagを得ました。
普段信号処理について勉強していた知識が生きて面白かったです
解けなかった問題について
問題ページが閉じており、解けた問題しか問題名も見られないので詳しく振り返りはできませんが、軽く振り返ります。
web問題(問題名忘れました)
gitがおすすめ、というようなメッセージとともにwebページのリンクが送られてきました。手の付け所が分かりませんでしたが、隠しディレクトリ.git
があるのではと思い〇〇\.git
というリンクを打ちました。
するとログファイルなどの情報を含むページが表示され、PCのマシン名(〇〇@△△
)らしきものまで分かりました。しかし、gitのアカウントまでは分からず、解けませんでした。
Flip the Cookie
Crypto問題です。Crypto好きなので、個人的には最も解きたかった問題で、悔しかったです。pythonファイルから、
- generate機能でSalsaによる暗号文の生成と表示
- validate機能で暗号文の検証
を行っていることが分かりました。
validateでは、暗号文を復号した際にsuperuser=1
という文字列が含まれていると認証に成功します。しかし、generateではデフォルトでsuperuser=0
という文字列を含む平文をもとに暗号文を生成しており、その部分を改ざんする必要がありました。
その方法が思いつかず、解けませんでしたが、解けた人に終了後方法を聞きました。
generate機能で出力された暗号文のうち、superuser=0
にあたる部分をその他のパラメータから特定することができることに気づけませんでした。そこさえ特定すれば平文とのXORを取ることで暗号鍵が取得できるので、その暗号鍵を用いてsuperuser=1
を含む平文を暗号化すればよいということでした。
Raceway
Web問題でした。Webページにアクセスすると意味ありげな2人のF1レーサーを含む文章が表示されました。この問題に関しては全くアプローチが分からず、何もできませんでした。
CarBOT
Web問題です。サイト内のSendという機能にURLを渡すと、User:admin、Pass:xxxx(文字数しか見えない)
のアカウントでサイトにログインしたのち、渡したURLへ自動的に遷移し、その一連の画面キャプチャをビデオ形式で渡してくれました。
flagというページがあり、そのページはログインしないとはじかれる設定だったので、flagのURLを渡しました。すると、意味ありげなthis-means-im-admin
という文字列がありました。それ自体はflagではなく、これ以上先には進めませんでした。
まとめ
はじめて触れるPastaやRAMNといった基板を、ドキュメントを見ながら手探りでやっていくのが面白かったです。ドキュメントを正しく理解する力が必要だと感じました。
Web問題が全く解けないことを実感しました。Crypto問題は解けていれば絶対気持ちよかったので、これからも参加して1問でも解ける問題を増やしたいと思いました。