前のエントリでグローバル決勝進出の旨を書いたが、この度デトロイトで開催されたAutomotive CTF 2024のグローバル決勝に参加してきた。結果は4位だった。
参加レポート
準備
グローバル決勝進出が確定して少ししたら、決勝運営からグローバル決勝についての案内が送られてきて、その中にこんなのがあった。
NRCはNFCのtypoだろう。
家探ししたところ、RTL-SDRとBus PirateとSaleae Logic 4(なお4はもう売られていない)が出てきた。これは以前ICSセキュリティのトレーニングを受けた時に提供されたもの。受けた時、と言ったが実際は仕事の都合の問題で参加できず、キャンセルはしなかった(できなかった)ので後日連絡して資料と配布物をもらったという悲しい経緯がある。
あと、RTL-SDRではスペックが足りない可能性も考慮してHackRF Oneを購入した。国内では送信できないがアメリカに行けばこっちのもんさという思惑もあり。
また自分でもCANをいじりたいという欲から、USB2CANを購入。OBD IIのコネクタも買って自分の車で試したところちゃんとCANメッセージが読めて感動。
といった感じで必要なツールを準備していった。自分だけで全部用意する必要はないので残りはチームメンバーに任せたり。
あとは自動車関係とハードウェア関係の知識が足りないので、それを補うための勉強。自動車についてはオライリーのカーハッカーズ・ハンドブック、ハードウェア関係はハッカーの学校 IoTハッキングの教科書が良かった。
Automotive CTF 2024決勝
前の週にHardeningがあり(これについては別途書く)、10/19に沖縄から帰宅した。その翌日の10/20にデトロイトに向けて出発。日付変更線を越えて現地10/20にデトロイトに降り立った。
到着の翌日、10/21がAutomotive CTF 2024決勝の日だった。ホテルから少し離れたところにあるNewlabというベンチャーが集まる施設の一室で行われた。
チームごとに机が割り当てられていて、行ってみるとJapan決勝でも出てきたRAMNが2台。まさかRAMNが出てくるとは思わなかったのでびっくり。あとはチームの机とは別の机にスピードメーターがあった。
問題は大半がRAMNを使った問題。あとはスピードメーターを使った問題とNFCカードを使った問題、RFIDを使った問題、VSOCプラットフォームxNexusを使った問題があった。一部のWriteupは後述。
CTFでは最初から最後までスコアが隠されたままだった。これにより自分たちが今何位なのかわからず緊張感があった。一方問題の点数は見えるようになっていて、初期1000点で正解したチームが増えるごとに減点され6チーム全部が解くと100点になっていたため、解けた問題と解けてない問題の点数を見ることでなんとなく位置を把握できるようになっていた。
7時間のCTFを終えた後は軽い立食パーティーが催された。他チームの人と話した、というよりは話をしてるのを横で聞いていた。英語で話に混ざるのは難しい。言葉が出てこない。
パーティーが終わって片付けフェーズに入った時、上の写真の幕の左にある赤白黒の風船を割りまくるイベントが発生して楽しかった。心はいつも男子小学生。
おまけ
会場近くにあるミシガン・セントラル駅。駅としての営業は30年以上前に終わっている。しばらく廃墟だったところ、ちょうど最近リノベが終了したそうで、こんなきれいな感じになっていた。
結果発表
CTFの結果はその場では発表されず、2日後の10/23にAuto ISAC Summitの中で発表された。会場はまた変わってMGM Grand Detroit。
というわけで結果発表。4位だった。6チーム中4位というと聞こえが悪いけど、全世界500以上のチームで競った結果の4位なので全然悪くないのである。なお、イエラエは2位。さすが。ちなみに1位はcomma.aiのチームでメンバーが2人であるにも関わらずぶっちぎりだった。CTFdのスコアボードが公開されていたので貼っておく。
感想
予選から日本決勝、グローバル決勝まで参加できて、とても楽しかった。オンサイトのCTFに参加する(できる)ことはあまりないのでいい経験にもなった。ハードウェア主体のCTFというのも珍しくてよかった。誘ってくれたチームリーダーには感謝。CTFを開催してくれた運営にも感謝。
せっかく学んだ自動車関係の知識をここだけで終わらせるのはもったいないので、今後もこういうのに参加する機会があれば参加していきたい。勉強会とかやって裾野を広げるのもいいね。あとはいろいろ学習したりするのにRAMNを作りたい。
Writeup
Misc / OSINT [200pt]
スピードメーターが搭載されていた車種を当てる問題。スピードメーターの裏の写真はこんな感じ。
「K1054 speedmeter」でググるとMazda CX-3と出てくるがこれは間違い。他にMazda 2というのも出てきたのでこれを入れたら正解。
Flag: bh{Mazda 2}
RAMN / [D] Follow Me [100pt]
ECU DのExpansionにあるLEDの制御をSPIでやっているので見てみろという問題。どのピンが使われてるかはわからない。というわけでロジアナの出番。Expansionソケットのピンを片っ端から試していくと定期的な信号を出しているものとちょっと乱れた信号を出しているものが見つかる。それらをSCKとMOSIとしてロジアナで解釈させるとフラグが出てきた。
Flag: bh{TREE_FORMS_WIND}
当初、これを何度入れてもIncorrectだった。CTFdのフラグの設定が間違っていたらしく、修正されて「もう一度入れてみて」とアナウンスがあったので入れたら通った。テストしてくれ。
RAMN / [D] Forgotten Field [400pt]
解けなかった問題。CAN ID 0x607をよく見ろとのこと。
candumpで見ると何かフラグがあるように見えるが、そこにあるようにこれは偽のフラグ。
(1729536958.126117) can0 607 [3] 62 67 18 'bg.'
(1729536958.126397) can0 607 [3] 68 10 99 'h..'
(1729536958.126422) can0 607 [3] 7B 46 F6 '{F.'
(1729536958.126684) can0 607 [3] 6C 2F E3 'l/.'
(1729536958.126772) can0 607 [3] 6D 7D 06 'm}.'
(1729536958.127402) can0 607 [3] 61 66 56 'afV'
(1729536958.127595) can0 607 [3] 6F 67 09 'og.'
(1729536958.127606) can0 607 [3] 5F 72 CC '_r.'
(1729536958.127614) can0 607 [3] 6E 0A 1B 'n..'
(1729536958.127623) can0 607 [3] 6F 67 09 'og.'
(1729536958.127632) can0 607 [3] 74 42 7F 'tB.'
(1729536958.128603) can0 607 [3] 5F 2C 42 '_,B'
(1729536958.128671) can0 607 [3] 68 78 5D 'hx]'
(1729536958.128680) can0 607 [3] 65 73 28 'es('
(1729536958.128691) can0 607 [3] 72 16 32 'r.2'
(1729536958.128702) can0 607 [3] 65 31 E8 'e1.'
(1729536958.128718) can0 607 [3] 21 65 25 '!e%'
(1729536958.128728) can0 607 [3] 7D 28 FE '}(.'
WikipediaのCANの項目を見ると、CANのフレームにはCRCがあることがわかるが、これは上記のcandumpには出てこない。
CANアダプタはネットワークデバイスとして認識されているのでtcpdumpで見てみるもCRCフィールドは0になっていた。
PC上ではこれより下のレイヤを見る手段がなく、ロジアナでCANバスを見てみることにした。しかし、CANメッセージをある程度見られるようにはなったものの、ID 0x607以外のメッセージが多くID 0x607をうまく抜き出すことができないまま終了。
作問者と話をする機会があったので聞いてみたところ、他のECUを止めればID 0x607だけ見られたらしい。その発想はなかった。
RAMN / [A/C] Ramen Clicker [1000pt]
スイッチを押すとクリック数が1増える。0x9000以上を目指そう!無理!
スイッチを押したときにCAN ID 0x45が出るが、それをそのまま送ってもチートはダメだと怒られて最初からになってしまう。candumpを眺めていると0x45の周囲に他のIDのメッセージも流れているので、これもセットかと思いまとめてリプレイしてみてもダメ。
結局糸口をつかめないまま終了。解けたのは優勝したチームだけだったらしい。