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

Learning to Drift - 1
Reading the specifications, I found that when communication is initiated from the HMI to the PLC, the instruction New-Connection is given. At this time, we know that the first half of the AES encryption key is given to the HMI from the PLC. 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

Learning to Drift - 2
] The purpose of this problem is to find the sensor value of the ALERT-HIGH. Let's check the specifications. 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参加の記念にWriteUpを書きました。(CTFはWriteUpを書くまでがCTFらしい)

結果は以下の通りです。

Scoreboard

感想としては、予想していたよりはできたけど、簡単な問題から解いていたら300pt問題まで解き終わらなかったので、問題を速く解けるようになりたいなと感じました。(300pt問題は年始までにゆっくり解きたいと思います)あとは、専門分野を作って、高得点問題から解けるようになるとかっこいいですね。では、早速WriteUpを書いていきます~

Reversing

[100pt] banner4you

stringsコマンドで無事にフラグを獲得

Answer: ctf4g{S4nt4_C14us}

[200pt] Find Me

fileコマンドでファイルを調べると、elfファイルだったので、実行してみました。

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

IDA Free解析画面

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

暗号化された文字列を復号するために、CyberChefを使用しました。

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{という文字列はあるが、他の写真に隠れてフラグが見えないという問題でした。

問題PDF
kaliでforemost(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が良い思い出として記憶に残り、セキュリティに対するモチベも上がり、参加してよかったなと本当に思います。