DEFCON32 CarHackingVillage CTFライトアップ

こんにちは萩原です。
セキュリティ業界では夏のイベントとしてBlackHat/DEFCONが真っ先に思い浮かぶ方も多いのではないでしょうか。2年ぶりに弊社も参加してきました。
今回の会場はLas Vegas Convention Centerとしか説明されていませんでしたが、West Hallでした。South Hallでタクシー(Lyft)を降りてしまい途方に暮れていた処、一緒に迷って会場まで同行してくださったPhilipさん、有り難うございました!

実際の開催日の混み具合は大変なもので、10時開始のところ、8:20頃に会場入りし並ばなくて良いからと運営(Goon)の方に言葉を頂いたので安心していたところ9時過ぎには恐ろしい列ができあがり、開場寸前にはご覧の混みようでした。過去一番の人出だったということです。

さて、開場し向かった先はこちらCarHackingVillageです。

弊社は現地2名+リモート1名という体制で参加しました。上位3チームは大勢の方が現地でも参加されており丸テーブルや現地でしかできないチャレンジに陣取られていました。2年前に参加した時はコロナ禍でしたのでそこまで感じませんでしたが今回は現地の頭数の大切さを痛感しました。

弊社が主にチャレンジしたのはバッジに関連するものとRAMNに関連するものです。
バッジのチャレンジ
今回、CTFで使うよと言われて購入したものは以下の4つです。
Main Badge(使いました)

SPEEDOMETER SAO(使いました)

KEY FOB SAO(メインバッジに接続して上部を押すと光りました)

PRND SAO(メインバッジに接続すると文字が表示されました)

A) Traffic Check
CANデータをダンプすると以下のようなデータが取れます。

canid 601はペイロード8バイトですが、他のcanidは6バイト~8バイトとなっています。どうもペイロードの内容を見ると本来は8バイトあるデータの一部だけが分かるので残りを推測してほしいようです。
flag{if_the_wa??shroom??_are_c???n}
この??の部分に何か入る前提で意味にある文章を推測して入力したところ以下がflagでした。flag{if_the_washrooms_are_clean}

B) Test Drive
Main BadgeをPCに接続したところ2つのCOMポートとして認識しました。そのうち1つをteratermで開き、helpメッセージを表示してflagを入手できました。

C) RPS FTW
問題文からは全く内容の検討がつかないチャレンジでした。

問題文に添付されているバイナリを解析してもまったく問題文と関連がつかず、またCTF adminが誰かも分からないため、CTF adminを探す(そして違う人を紹介される)ことからスタートです。2日目になってようやくCTF adminと会話ができてSPEEDOMETER SAOを2つMain Badgeに接続するとジャンケンモードに突入すること、そしてCTF adminが持っているSPEEDOMETER SAOを片方接続している時にチャレンジを攻略すると正しいフラグが表示されるということが判明しました。
添付されているファームウェアを解析すると以下の脆弱性が判明しました。
じゃんけんの進捗状況を表示するプログラムでぐーちょきぱーを表す文字列配列(rps_str)が存在しますが、配列の範囲外をアクセスすることができます。また、flagはフォントデータのキャラクタ0x7f、0x80のキャラクタコードに相当する箇所に隠されていることが判明しました。そこで、キャラクタコード0x7f、0x80を含むデータを上記の脆弱性を利用することで画面に表示させます。
メモリの構成は以下のようになっています。
rps_str[0] = Rockへのポインタ
rps_str[1] = Paperへのポインタ
rps_str[2] = Sicsorsへのポインタ
font32x32のデータ(1664バイト)
font8x8のデータ(1032バイト)
c_speed : スピード状態

範囲外のアクセスのインデックスとして677を指定すると、ちょうどc_speedの値で指定された番地の内容を文字列データとして表示できることが分かります。よって、c_speedにキャラクタコード0x7f, 0x80を含むデータのあるアドレス40081480を入れ、インデックス677の内容を表示させるようにしました。表示された文字からフォントデータを推測することでflagが判明します。

こちらを表示する攻撃コードを準備し会場で用意されたバッジにて表示することでflagを入手できました。

RAMN
RAMNは4つのECUが搭載された演習環境です。

A) Secret Menu
本問題ではFWが添付されていて、その内容を解析して無効化されたDebug screenの有効化および有効なユーザーへの切り替えを行いました。
ファームウェア内で各ECUのパラメーターとして以下の値になった場合にsecretメニューが有効化されるコードが実装されています。

 ・ブレーキ:EEx(xはマスクされているため0-Fまで有効)
 ・アクセル:F5x
 ・ステアリング:0xD8x
 ・ライト:2
 ・サイドブレーキ:1
 ・エンジンキー:3

RAMNはディスプレイにCANID/パラメーターを表示するモードがあり、どのCAN IDがどのECUに該当するかは基板上のシルク印刷と操作可能なスイッチを切り替えて確認することで確認可能であったため画面のパラメーターを確認しながら値を変更し、無効化されていたDebug screenが有効にできました。また、Debugスクリーンが有効になったと同時にシリアルコンソールが有効化されました。

同じくFW解析の結果、有効なユーザー名としてranohquleを入力するとDebugメニューに遷移すると確認していたため、シリアルコンソールに’#’→’ username ranohqule’の順で入力したところflagが入手できました。

もろもろ
今回は2年ぶりの参加でしたが上位のチームは2年前と変わらず、CTFに対する意気込みを感じました。日本では弊社以外にもう1チーム参加されている方々を確認できました。また、RAMNプラットフォームは大変面白く、社内のスキルアップだけでなく、社外の方向けのコンテンツを作ってスキル研鑽に役立てられないかと早速検討しています。
次回どの様な形での参加になるか…は現時点ではまったく未定ですが今から楽しみでもあります!

Contactお問い合わせ

お問い合わせは、プライバシーポリシーをご参照の上、
sales.team@00one.jpまでご連絡ください。