CISA ICS CTF 2024 Writeup - Learning to Drift
感想
ICS CTFに初めて参加した。このCTFはMalcomの使い方を問う問題が非常に多く(Malcomを作成しているCISA主催なので)、次に、ICS、Hardwareとかフォレンジックの問題が多かった。また、難易度も難しすぎず、非常に楽しめた。
自分のスキル的に、こういうCTFの方が得意なんだろうな。
pwnとかreversingとか王道の分野で強くなりたい。
では、日本人の参加者が少なさそうなので、今回は英語で書いていく。
9/8 Learning to Drift - 3 は時間あるときに追記します。
I participated in the CISA ICS CTF because I was interested in OT security.
Since there are not many writeups. (Am I the only one who hasn't found it?
)
This problem is to analyze what kind of communication is taking place given a proprietary protocol specification and a pcap file.
Learning to Drift - 1

Reading the pcap file, we see that the 4th packet corresponds to MessageCode 0x01.
We know that the 6th packet is a response to the HMI request because the 3rd bytes of the packet is 0x01. And the first half of the AES cipher was found to be 0x61cb506b8ff1b477.
The purpose of this problem is to find the current value of the Sensor ID of 100. Let's look at the ninth packet.
Once again, check the specifications.It can be seen that the 3rd~10th Bytes of the Data section is the second half of the AES key.
This means that the AES encryption key is 0x61cb506b8ff1b4779191c45d7fe2ddca.Now that the encryption key is known, decrypt the 9th packet with CyberChef.
By decoding the Data section, the following was found.
Message code : 0x03 (READ-SENSOR)
Response code : 0x00 (Success)
Sesnsor ID : 0x64 (100)
Value : 0x206 (518)
So, flag is 518
Learning to Drift - 2

Decoding the 44th packet with CyberChef reveals that it starts with a MessageCode of 0x07.
By decoding the Data section, the following was found.
Message Code : 0x07(GET-ALARMS)
Response code : 0x00 (Success)
Alarm count : 2
1st Alarm
Sensor ID : 0x66
Alarm code : 0xa0 (WARNING: LOW)
Value : 0x3f
2nd Alarm
Sensor ID : 0x6b
Alarm code : 0xb0(ALERT: HIGH)
Value : 0x41a (1050)
So, flag is 1050.
ex ) Alarm code

Learning to Drift - 3
I'll write next time.
4-Girls ぷち CTF Writeup
はじめに
初めましてzer0です。
CTF初参加!
— zer0🦊 (@nova_zer0) 2023年12月23日
詳細を読んでおらず、スコアサーバーもあるCTFとは知らずに参加したけけど、FirstBlood賞ももらえて、めっちゃ楽しかった
CTFの勉強してなくても、セキュリティの勉強した時の知識が多く役立って、成長を実感!
最後解けなかった問題も、今やったらできたのが悔しい笑#ctf4g #seccon pic.twitter.com/7tqWi2f5fK
今回は、初CTF参加の記念にWriteUpを書きました。(CTFはWriteUpを書くまでがCTFらしい)
結果は以下の通りです。


感想としては、予想していたよりはできたけど、簡単な問題から解いていたら300pt問題まで解き終わらなかったので、問題を速く解けるようになりたいなと感じました。(300pt問題は年始までにゆっくり解きたいと思います)あとは、専門分野を作って、高得点問題から解けるようになるとかっこいいですね。では、早速WriteUpを書いていきます~
Reversing
[100pt] banner4you
stringsコマンドで無事にフラグを獲得

Answer: ctf4g{S4nt4_C14us}
[200pt] Find Me
fileコマンドでファイルを調べると、elfファイルだったので、実行してみました。

すると、Find me in memory!と表示されたので、IDA Freeで静的解析を行いました。

読んでみると、分岐があって、片方の分岐に行くと、xor15で暗号化された文字列が復号されそうだとわかりました。
暗号化された文字列を復号するために、CyberChefを使用しました。

無事に、フラグが表示されました!
Answer: ctf4g{10v31y_61n63rbr34d}
Misc
[100pt] この模様はなーんだ?
MaxiCodeという規格の2次元コードらしく、こちらのサイトで読み取ってみると、フラグが表示されました。

Answer:ctf4g{Hotwine0rHotChocolate?}
[200pt] chirstmas card
christmascardを見てみると、文字列っぽいものもなく、stringsコマンドをしてみるも、情報がないため、ステガノグラフィっぽいなと予想しました。
そのため、StegOnlineに画像をアップロードして、BitBrowsePlanesを押すと、フラグが表示されました。

Answer:ctf4g{3nj0y_5te9}
[300pt] 3keywords
ctf4gの3種類のステッカーを使用する問題でした。モールス信号、ASCIIコード表、アルファベット順の数字が書かれているため、まずは、それをアルファベットに変換してみると、beads, sect, encourageが出てきました。写真はTwitterで探してみてください。
この問題は、なかなか解けなかったため、ヒントを見てみると、3つのキーワードで特定の場所を示す方法があるとのことで、調べてみました。すると、what3wordsというアプリが使えそうということがわかりました。インストールして調べてみると、SantaClause Villageっぽいとわかりました。

答えは、公式サイトの第2ドメインを答える必要があったので、公式サイトを調べて、無事にフラグを獲得
Answer:ctf4g{santaclausevillage}
Crypto
[100pt] Do not use the default passwords!
mykeystoreはJAVAで使用されるキーストアらしいです。keytoolを使用してみると、パスワードの入力が求められるので、題名からしてもデフォルトパスワードを使用するのだろうと予想し、mykeysotreのデフォルトパスワードであるchangeitを使用して無事にフラグを獲得
Answer:ctf4g{holidayiscoming2023}
[200pt] R.I.P
FirstBlood賞が取れた問題です。
2023年以降の使用が禁止された暗号ということでTripleDESかなと予想し、問題を解き始めました。Pythonで復号化するためのプログラムが書けそうなので、ChatGPTにコードの型を作ってもらい、プログラムを作成しました。
from Crypto.Cipher import DES3 import binascii def triple_des_decrypt(ciphertext, key, iv): cipher = DES3.new(binascii.unhexlify(key), DES3.MODE_CBC, binascii.unhexlify(iv)) decrypted_text = cipher.decrypt(ciphertext) return decrypted_text.rstrip(b'\0') def main(): # キーとIV key = "1025A62F14749D12B6A089A22B481CE99049A0F4CD69B9F7" iv = "772E34E730489472" # encodeされたバイナリファイルのパス encoded_file_path = "cipher.bin" # decodeして出力するバイナリファイルのパス decoded_file_path = "decoded_file.bin" # encodeされたファイルをバイナリモードで読み込む with open(encoded_file_path, 'rb') as file: encoded_data = file.read() # Triple DESでデコード decrypted_data = triple_des_decrypt(encoded_data, key, iv) # デコードされたデータをバイナリファイルに書き込む with open(decoded_file_path, 'wb') as file: file.write(decrypted_data) print(f"Decoding complete. Decoded data written to {decoded_file_path}") if __name__ == "__main__": main()
少し悩んだのが、最初はtxtファイルにデコードした文字列を入れていたのですが、Unicodeにdecodeできないといわれて、binaryファイルで保存したところです。fileコマンドでdecodeしてみると、PDFファイルだったので、納得です。PDFファイルを確認するとフラグを獲得!

Answer:ctf4g{R.I.P_TripleDES}
Forensic
[100pt] Snow covered
問題PDFはいくつもの写真が貼られていて、その中の写真にctf4g{という文字列はあるが、他の写真に隠れてフラグが見えないという問題でした。

foremost -t jpg,gif,png -i snowcoverd.pdf)を使用し、PDFからjpgファイルを抽出してフラグを獲得

Answer:ctf4g{PdFw0nd3rLan:D}
[200pt] クジラからのプレゼント
本番では間に合わなかったのですが、せっかく解けたので記載します。
Dockerコンテナをバックアップしたtarファイルが配られました。最初は、imageにしてimportすればよいのかなと思いましたが、docker runでコンテナの中に入ってもフラグっぽいものは見つかりませんでした。そのため、コンテナが起動中にフラグが書き込まれ、そのあと消されたのかなと予想し、tarファイルの中を見ていきました。tarファイルの階層は以下のようになっていました。
ファイルのサイズが、他フォルダと異なるフォルダから中を見ていきました。
すると、af2c7c~フォルダの中のlayer.tarのoptの中に、フラグの一部が書かれた.another_flag_fragment.jpgがありました。
また、optフォルダの中のmyfilesフォルダにもa_piece_of_flag.jpgがありました。←上のフラグを見つけて油断して、このフラグを見落としてしまい本番は間に合いませんでした...
最後のフラグは、365f79~フォルダの中のlayer.tarのrootフォルダの中にある.ash_historyに書いてありました
Answer:ctf4g{I_know_all_t#e_His+ory_0f_th1s_im@ge}
Web
[100pt] トナカイ専用
指定されたサイトにアクセスすると、このサイトはトナカイ専用ブラウザ ReindeerBrowser でしか閲覧できませんと表示されます。
User-AgentをReindeerBrowserにすればいけそうかなと予想を立てて、burpsuiteを使用し書き換えてみると、フラグを獲得
Answer:ctf4g{y0u_ar3_th3_r3d-n0s3d_r31nd33r}
[200pt] Escape
指定されたサイトにアクセスすると、検索ページが出てきます。検索ページなので、SQLinjectonと予想し、シングルクォーテーションを入力してみると、やはりSQLinjection可能性が高そうだとerror文から予想しました。

次に、mySQLが動作していることがわかったので、'or1=1#を入力すると、orがサンタさんにEscape処理されてしまいます。
そのため、orを使用せずに、フラグを取り出す方針で進めました(WriteUpを書いている途中でorが大文字ならエスケープ処理されないことに気づいた...)
次に、UNION SELECTでテーブル情報を取り出そうと考え、'UNION/**/SELECT/**/1,2,3,TABLE_NAME/**/FROM/**/INFORMATION_SCHEMA.TABLES#と入力すると怪しい2つのテーブルが見つかりました←空白文字もエスケープ処理されてしまうため、/**/を使用しています。
次に、怪しい2つのテーブルの中身を取り出すことを考え、'UNION/**/ALL/**/SELECT/**/*/**/FROM/**/SantaClauses#を入力してみます。すると、以下のようにフラグの一部が表示されました。
同様に、もう一つのテーブルの中身を取り出すと、フラグを獲得できました
Answer: ctf4g{Chr1stm@s_Pre5ent:)}
さいごに
オフラインでの開催だったので、同じテーブルの人たちとわちゃわちゃ解いたのも楽しいですし、いろいろ情報交換もできて非常に楽しかったです。また、難易度的にも解きやすかったですし、初めてのCTFが良い思い出として記憶に残り、セキュリティに対するモチベも上がり、参加してよかったなと本当に思います。