Automotive CTF Season2 (2024) 予選 Writeup - katagaitai
久々にCTFにがっつり参加しましたので、WriteUpを書きたいと思います(覚えている+わかる範囲で)。
チームkatagaitaiで参加しました。皆さんありがとうございました!
他の方の分も合わせて書かせていただきました。
Automotive CTFについて
Automotive CTFは、もともとBlock Harborが主催していた自動車系のCTFで、今回がSeason2になります。
今回のAutomotive CTF Season2は予選にあたり、日本チームと海外チームが競う形になり、日本チームは日本国内の決勝戦を経てデトロイトでのグローバル決勝戦に臨む形になります(ほかの方のWriteupにある通り、日本からの参加者はなぜか一戦多くなってしまいます)。
というのも、今回の予選は経産省がメインスポンサーとなり、政府の活動アピールの場でもあったのです。
詳細は以下をご確認ください。
第1回「Automotive CTF Japan」の参加者を募集します。
参加結果
9位でした。あと一問解けたら全完でした、残念!
Challengies
覚えている範囲で。
- OSINT
- 1 or 2?
- MISC
- Gameboy Game
- Signal Sleuth
- Rolling Thunder
- Lost in the echo
- Siggy
- FW
- Stego
- ivi
- Walk in the Park
- Reversing
- Power
- We’ll See in the Mach-E
- DID Access
- What is the VIN?
- Steering Angle
- When were we driving?
- Radio
- Street Names
- Where we driving?
- xNexus
- Web RCE Anomaly
- Can bus anomaly #1
- Can bus anomaly #2
- Crypto
- Autosar E2E - NOT solved
OSINT
1 or 2? (tokina)
What is the make and color of our other vehicle we owned? One is grey.
OSINTなので、一般的に得られる情報のみで解くはず(エスパーではない)、と考えCTFのWebサイトからたどれる範囲に絞って調査。
ここからLinkedInへ飛び、GreyのMustangと一緒に写っている車をFlagとして入力していく。
白のTesla、白のMustangなどと映っているものの、以下の写真の赤い車はFordだった。これがFlag。他にも当てはまる自動車があるので、微妙かなと思った。
Flag: bh{red_ford}
MISC
Gameboy Game(smzさん)
Who needs a defcon badge when you've got an emulator? Dodge some cones, have some fun.
今年のDefconではGBエミュレータを搭載したRaspi Picoのバッジが提供されました。それにちなんだ問題でしょう。
.gbファイルが配れるので、エミュレータで遊ぶことができます。面白い。
ハイスコアを超えればいいのかな?
smzさんが、スコアを保持するアドレスを特定して、書き換えることでFlagゲット。
デバッガはいろいろあるので好きなものを使えばOK。
smzさんは以下を使用したらしい。
https://bgb.bircd.org/
BH{CARS_HATE_CONEZ?}
Signal Sleuth (smzさん)
I’ve got a few captures from a key fob but I need help figuring out what the ID of the vehicle is.
The goal here is to demodulate the captures, and once you have a bitstream figure out what parts of the bitstream can be attributed to the different parts of the entire command. You will provide the flag in hex without the preamble “bh{}.” For example, like “AABB”
Free hint: don’t forget to consider encoding, also these captures were recorded at 20 MS/s but you don’t really need to know this.
Binaryファイルが渡される。Keyfobをキャプチャしたデータであり、車両のIDがFlag。
Inspectrumで見てみるとASK変調、20K SPSのよう。
マンチェスター符号化も考慮して16進数に変換するとロックとアンロックでそれぞれ以下
ロック:7C34FFBB19E41DA3F6A7
アンロック:7C34FFCC0E361B3913DF
7C34が車両ID、FFXXがコマンド、それ以降がコードと推測。
Flag: 7C34
Rolling Thunder (smzさん)
This challenge is intended to follow “Signal Sleuth” once you’ve cracked the code!
In this challenge, we have 10 unlock captures from the same key fob. This happens to be the same keyfob you analyzed in part 1. Why bother using peer-reviewed and industry recognized crypto when you can roll your own. ;)
Your goal in this challenge is to figure out the algorithm, implemented in the key fob for generating the rolling code. Once you figure it out, determine the next rolling code that is about to be sent and hasn't yet been consumed. You can assume that the last capture is the most recent one, and the last code is the last code that was consumed. Same deal as part 1: you will provide the flag in hex without the preamble “bh{}.” For example, like “AABBCCDDEEFF”.
Consider that in the real world, if you can achieve this on a real key fob it means you can steal the car!!
Signal Sleuthとつながっている問題。なので、Signal問題であり、Keyfobのバイナリファイルを解析する問題。
Rolling codeを特定する問題と把握し、与えられる10個のキャプチャをデコードすると以下
0: 7C34FFCC020304050615
1: 7C34FFCC030405061529
2: 7C34FFCC040506152950
3: 7C34FFCC05061529509D
4: 7C34FFCC061529509D36
5: 7C34FFCC1529509D3667
6: 7C34FFCC29509D3667C8
7: 7C34FFCC509D3667C87B
8: 7C34FFCC9D3667C87BCD
9: 7C34FFCC3667C87BCD4A
コード部の6bytesを加算したものが次のコードの最終に入り左シフトするようなので「67C87BCD4AF7」がフラグと思ったが通らず。
→運営より以下アナウンス有
Hello, if you believe you had the flags for Rolling Thunder or FW please submit them again.
再度Flagを送ると通った。
Flag: 67C87BCD4AF7
Lost in the echo (smzさん)
I dont like art. Do you?
”ctf.sr”というファイルが渡される。fileコマンドではZIPファイルといわれるが、これは波形データだった。
SIGROKというツールで中身を見ることができた(私はここまでしかわからなかった)。
https://sigrok.org/wiki/Protocol_decoder_HOWTO
以下smzさん。
これはUARTで最初が9600bps、次が1200bpsで通信されている。
1200bpsの方で流れる2進数をROT13変換するとフラグ
01001111 01010101 01111011 01001000 01001110 01000101 01000111 00110011 01000001 01010000 00110000 01010001 00110011 01001110 01000001 01010001 01010001 00110011 01010000 00110000 01010001 00110011 01111101
上記をCyberchefなどで変換してFlag。
Flag: BH{UART3NC0D3ANDD3C0D3}
Siggy (rkumtsさん、smzさん、tokina)
I got a picture of weird Cybertruck from the Internet but it seem to be a
broken picture? Can you recover it and get the flag?
Flag format is bh{FLAG} —— flag has 2 parts
壊れた画像ファイルが渡される。PNGファイルのヘッダが壊れており、まずはヘッダを修正。以下の画像が得られる。
以下Exiftoolの結果の抜粋。
ExifTool Version Number : 12.40
File Name : cybertruck.png
Camera Model Name : Y3liM3JU
Interoperability Index : Unknown (VHJ1Q2tf)
SRGB Rendering : Perceptual
Image Size : 734x734
分からないので放置していたが、ふと思いついて”Camera Model Name”と”Interoperability Index”の謎の文字列をBase64で復号すると
"Y3liM3JU" → "cyb3rT"
"VHJ1Q2tf" → "TruCk_"
となる。このままではFlagではなかったので困っていたところ、smzさんがステガノでQRコードが埋め込まれていることを発見。
つなげてFlag。
Flag: bh{cyb3rTruCk_1s_we1rd}
FW (0x421AA4さん)
I created an encrypted password but it got deleted right away. Can you recover it for me?
バイナリファイルが渡される。中身を見ると、TP LinkのArcher A7であることが分かる。
binwalk -eして中身を見ると、以下の文字列有。
_file.bin.extracted/squashfs-root/root/.local/share/Trash/files/passphrase
wChTlPfMopGGTfAlPIyfHTfKpNNKCMpNoj
恐らく何かしらの方法で、上記の暗号文を復号すればよい。0x421AA4さんが以下の場所に怪しい処理をしているファイルを発見。
_file.bin.extracted_01/squashfs-root/bin/generate
以前に見つけていたpathphraseをpwに入れてkeyを0からlen(let)で振って確かめてみるとその中の一つに"bh{"から始まるものがあった。
import random
def generatePW():
pw = 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
key = random.randint(0, 999)
let = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'
shift = let[key:] + let[:key]
logbook = dict(zip(shift, let))
print(''.join([logbook[_] for _ in pw]))
Flag: bh{y0u_r34lly_f0und_my_p4ssphr4s3}
Stego
Walk in the Park (0x421AA4さん)
Don't waste too much time!
謎のbinファイルが与えられる。誰もわからなかったのですが、突然0x421AA4さんがひらめいたようでSovled。
2022-04-26 19:08:39までのunix時間を計算して、秒数を1バイトずつ文字列にすると"bhC7"になって、微妙にそれっぽい。
とりあえずタイムゾーン分をずらしたらもっとそれっぽいのが出てきたので、4つ分のタイムスタンプでやったらフラグになったとのこと。
Flag: bh{wh4t7ime1s1t}
ivi (kakur41さん、tokina)
The forensics team cloned an image of the IVI from a stolen vehicle. The forensics team is unsure if the image cloned is complete, but they believe all the necessary information required to identify the location of the criminal who was using the vehicle for more than a week.
Please note to add BH{ before the flag and } after the flag.
IVIの物と思われるファイルが渡される。binwalkで解答していくと、Rick Rollの画像があり、さらにbinwalkで抽出すると、ZIPファイルが抽出される。
Zip file size: 254 bytes, number of entries: 1
-rw-rw-r-- 6.3 unx 62 Bx stor 23-Dec-06 12:04 super_safe_password.txt
1 file, 62 bytes uncompressed, 62 bytes compressed: 0.0%
このZIPは暗号化されており、TXTファイルを解凍することができない。
Forensicしていくと、パスワードがあったとのこと。
ZIPの中身を見ると、以下が解凍される。まだこれはFlagではない。
No one's ever gonna find this one haha
Never_g0nna_giveyouUP
vol4のLUKS暗号化済みFSのパスワードが上記の"Never_g0nna_giveyouUP"だったとのこと。
大量の位置情報が記載されたファイルがおかれている。先頭の数行は以下。
typelatitudelongitudenamedesc
T40.9985570-109.0585327Length: 43.47 km (27.01 mi)
T40.9716035-109.0585327
T40.9384150-109.0530396
T40.9155881-109.0557861
T40.8823714-109.0585327
問題文から、この位置情報を特定するタイプかと思いきや、とりあえずグラフにマッピングすると以下が浮かび上がった。目を凝らすと・・・
Flag: BH{ROUND_THE_WORLD}
Reversing
リバースエンジニアリング系の問題。私はわからないのでチームの方のメモを残しておきます。
Power(0x421AA4さん)
What a POWERful binary. Wonder what it does?
バイナリが配られており、fileするとPower PCのバイナリであることが分かる。
このあたり(1枚目)の関数をこのあたり(2枚目)のデータで選択したり引数を与えたりして処理が進んでいくように見える。
以下の情報を踏まえ解析したとのこと
- 最初に/flag.pngを読みだしている
- flag.pngの中身を4byteずついろんな操作で難読化させつつ検証していっているように見える
- 頭4byteのチェック部分から逆算するとpngのヘッダと一致するので、頑張って逆算していくしかなさそう
上記のソルバで以下のPNGファイルを得られた。
Flag: BH{u_g0t_th3_p0w3r}
We’ll See in the Mach-E
全て一つのログを解析していくチャレンジ。大きなCANのログファイルを与えられる。Timestampが削除されているので、ツール等で読み込むにはその修正作業が必要。
なお、チャレンジタイトルにある通りMach-E(For Mustang Mach-E)のCANメッセージログを解析する問題である。
※マッハEと読みます
DID Access (kakur41さん)
What negative response code was given for DID 0x4915?
メモが残っていなかったのでtokinaのほうで再現しました。
UDSの仕様を把握していれば解ける問題。"4915"でgrepしたあとに、UDSでよく使われるCAN ID:7E0 ~ 7E7当たりで絞り込むと以下。
└─$ cat mach-e.log | grep 4915 | grep 7E4
(1724521896.800000) can3 7E4#03224915CCCCCCCC
UDSの仕様通り。
https://ja.wikipedia.org/wiki/Unified_Diagnostic_Services
03: 3バイトの長さ
22: "Read Data By Identifier"
4915: DID (Data Identifier)
Negative Responceは"7F"になるはず。UDSサービスの応答も7Exあたりなので、気合でgrepする。
└─$ cat mach-e.log | grep 7F | grep can3 | grep " 7"
(1724521882.500000) can3 7EC#037F223100000000
Flag: 31
What is the VIN? (kakur41さん)
What is the VIN of the vehicle driving?
CANのPayloadを眺めていると、CAN ID: 40Aがそれっぽいので繋げたらVIN。
Flag: 3FMTK4SX8MME00878
Radio(kakur41さん)
What FM radio station were we listening to?
CAN ID: 1E9にそれっぽい情報があるので、それが周波数でFlag。
関係しなかったが、CAN ID:2B4にも近しい情報が入っていた。
Flag: 95.5
Street Names(kakur41さん)
What street names did we drive on in this log that the vehicle sent on the can bus?
Flag is list of street names without St, Dr, Ave etc and with commas between them. For example:
Woodward,Maple,Southfield
CAN ID: 2C0にStreet Nameっぽい単語がある。
道っぽい名前は以下があった。
Piedmont, Acacia, Wheaton, Rochester
Flagは3つでよかったらしい。
Flag: Piedmont,Acacia,Wheaton
Steering Angle (kakur41さん、tokina)
What arbitration ID has the steering wheel angle?
アナログ値を吐いているっぽいCAN IDを入れていってもだめだった。Flag形式が問題の敵だったかも。
kakur41さんが以下のGithubを見つけてくれたので、ここに書いてあるSteeringを参考にした。
上記のサイトにあるSteeringの計算方式に当てはまるものであり、ステアリング(ハンドル舵角)の特徴から値の振れ幅が大きい順に試した。
Flag: 07e
※ほかの方のWriteUpを見ると、0x07Eでもいけたらしい・・・
When were we driving?(kakur41さん、tokina)
On what day did the drive in this can log take place? (answer in DD/MM/YYYY)
ハンドル舵角の問題と同様に、以下を参考にする。
ChatGPTに変換してもらった。
ログは今年のもののようなので、西暦は2024年と仮定して、計算された日の1日前がFlagだった。
Flag: 26/06/2024
Where we driving?(smzさん)
What was the latitude and longitude of our destination in degrees and minutes?
Example Flag:
LatitudeDegrees.LatitudeMinutes,LongitudeDegrees.LongitudeMinutes
00.00,00.00
FordのDBCファイルを見つけたとのこと。※COMMA.AIはサードパーティー製の自動運転モジュールを開発するコミュニティおよびその製品
これをSavvy CANに読み込ませる。これによると、CAN ID:462にLatitudeとLongitudeがあるので位置情報っぽい。
Decodeすると以下。
Flag: 42.33,-83.07
xNexus
xNexusという、VicOneの監視基盤のデモツールを使った問題。無理やり問題にした感じがある。
指定されたURL先にアクセスすると、なんかいい感じの画面が表示される。
Web RCE Anomaly (0x421AA4さん、tokina)
An RCE has been logged in xNexus, what was the exploit used? The answer should be enclosed in the proper flag format of this game.
検知ログを見ていき、RCE(Remote Code Execution)に関する検知が見つかる。
CVE-2014-6271、ShellShockの形跡が見つかる。いろいろ試すもFlagが通らず困っていたところ、どうやら小文字でshellshockだったらしく、無駄に時間をかけてしまったのが悲しい。
Flag: shellshock
Can bus anomaly #1(kakur41さん)
Analyze CAN Bus Data anomalies and find the pattern. Answer should be enclosed in the standard format flag.
まずどこから手を付けたらよいかわからなかったが、見ていると"OAT Detection"という検知ログがそれっぽい。
とりあえずは手動で必要そうなデータを引っ張ると以下。なお、のちに開発者モードからHARファイルを落としてくると、いい感じに見れることが分かった。
{"payload_fingerprint_violation_reason": ["can_id": 0x00000094, "can_frame": "1337c00000beff00", "hit": true}]}
{"payload_fingerprint_violation_reason": ["can_id": 0x00000094, "can_frame": "0000800000000000", "hit": true}]}
{"payload_fingerprint_violation_reason": ["can_id": 0x00000094, "can_frame": "6c346700000000", "hit": true}]}
{"payload_fingerprint_violation_reason": ["can_id": 0x00000094, "can_frame": "0000400000000000", "hit": true}]}
{"payload_fingerprint_violation_reason": ["can_id": 0x00000094, "can_frame": "0279660000000000", "hit": true}]}
canReasons
{"payload_fingerprint_violation_reason": ["can_id": 0x00000768, "can_frame": "0354ff000000346c", "hit": true}]}
canReasons
{"payload_fingerprint_violation_reason": ["can_id": 0x00000768, "can_frame": "6f6d346e00000000", "hit": true}]}
canReasons
{"payload_fingerprint_violation_reason": ["can_id": 0x00000760, "can_frame": "0314ff0000000000", "hit": true}]}
問題文が"Analyze CAN Bus Data anomalies and find the pattern."というので、異常パターンがあるのかと色々見ていたが何もわからず。しばらくはどのチームも解けていませんでした。
PayloadのASCIIお読める部分だけを復号すると以下(kakur41さん)
なぜかいろいろ並び替えをしてみたところ、Flagが通ったらしい。これはエスパーが必要でした。。。
Flag: bh{4nom4lyfl4g}
Can bus anomaly #2(smzさん、tokina)
Someone is trying to disable the ESP and the power assisted system. Go track that anomaly with CAN ID 0x0645 and determine what car is being targeted for that kind of attack. The vehicle is the flag enclosed in the proper flag format.
開発者モードからHARを落としてきて、CAN ID:0x645だけを切り出すと以下のCAN Frameが入手できました。
\": [\"can_id\": 0x00000645, \"can_frame\": \"0210020000000000\", \"hit\
\": [\"can_id\": 0x00000645, \"can_frame\": \"0211010000000000\", \"hit\
\": [\"can_id\": 0x00000645, \"can_frame\": \"023e000000000000\", \"hit\
CAN ID:645でESPおよびパワーアシストシステムの無効化が可能な車両を調査する必要がある。
smzさんが、過去のKeen Securityの2016年の論文を発見。
https://www.blackhat.com/docs/us-17/thursday/us-17-Nie-Free-Fall-Hacking-Tesla-From-Wireless-To-CAN-Bus-wp.pdf
上記の論文にYoutubeの動画があり、そこに書いてあった車両名・型式名をそのまま送るとFlagだった。
Flag: bh{Tesla Model S P85}
Crypto
Autosar E2E NOT solved
There seems to be a message being sent on the bus... what does it say?
This challenge can be played by visiting vsec.blockharbor.io, launching the Garage block, and entering the "Autosar E2E" simulation.
解けなかったので、わかるところまで。
Block Harborから提供される、ブラウザでアクセスすることができるLinux環境の問題。
ファイルのアップロードはできないが、ダウンロードはできる。
ログインして、ifconfigすると、vcan0というインタフェースがあり、そこに謎のCANメッセージが流れている。これを解析する問題。
チームの皆で色々試したが解けなかった。ちなみにこれはCryptoではないかも・・・。
流れているメッセージは、タイトルにもある通りAutosarという自動車における各プロトコルなどを定めている団体が規定しているE2E(End to End)プロトコルである。
解析して分かった情報は以下。
- E2EのProfile 1で情報が流れている
- 流れているメッセージのうち、CAN ID:102, 101は2バイトであるものの、本来E2Eプロトコルであれば3バイト目があり、これを復号する必要がある?(なかった)
- メッセージは定期送信となっており
- CAN ID:101 ⇒区切りに使われている模様
- CAN ID:102 ⇒おそらく解析対象
- CAN ID:103 ⇒CAN ID:101のメッセージが正しい場合はBase64で'OK'、間違っている場合は'ERR'を返す
- CAN ID:102について
- E→0、F→1でエンコーディングしてやると
01001010 00110001 01001110 01000110 01010100 01101011 01010001 01100111 01010010 01101011 01111000 01001000 01001010 01110111 00111101 00111101
⇒ J1NFTkQgRkxHJw= ⇒ 'SEND FLG'
その後CAN ID:102や101になりすましてFLGなどの情報を送ってもダメでした。
※最終的にはCAN ID:103になりせばよかったようです・・・
感想
チームでの参加は久々だったので、大変刺激になりました。皆さん非常に優秀で、皆さんとやり取りさせていただく中で気づけた問題が多くありました。
Automotive CTF Season1には参加していなかったので初参加だったのですが、教育コンテンツも整備されており大変勉強になりました。
引き続き自動車系のCTFがあれば、参加したいと思います!運営の方々はお疲れ様でした。
(本記事公開日の)決勝戦に参加される皆様のご活躍を応援しております。