SECCON 2016 Online CTFに参加しました
12/10~12/11に行われた SECCON 2016 Online CTFの Write upです.
内容は
- Vigenere
- VoIP
- Memory Analysis
となっています.
Vigenere
ヴィジュネル暗号の解読です.
暗号の説明はウィキペディア先生にあります.
解き方をざっくり言うと,暗号文(と平文の一部)が渡されているので,
鍵を見つけて復号していきます.
ヒントとして
- 平文は「SECCON{」から始まり「}」で終わる
- 鍵の文字数は12文字
ということが与えられています.
そのため,実は7文字までは鍵を調べることができます.
調べた結果「VIGENE」と分かったため,「VIGENERE」プラス何かとなるのですが,
残り4文字のため多分コードだろうということで「VIGENERECODE」としたらビンゴでした.
(見といて良かった ○ccultic; Nine 笑)
SECCON{ABABABCDEDEFGHIJJKLMNOPQRSTTUVWXYYZ}
書いたスクリプト↓
#!/usr/bin/env python3 # -*- coding: utf-8 -*- k = "" keylength = 6 p = "SECCON{"[:keylength] md5_p = "f528a6ab914c1ecf856a1d93103948fe" c = "LMIG}RPEDOEEWKJIQIWKJWMNDTSR}TFVUFWYOCBAJBQ" init_plain_table = "ABCDEFGHIJKLMNOPQRSTUVWXYZ{}" v_s_d = {init_plain_table[i]: i for i, _ in enumerate(init_plain_table)} vigenere_square = [init_plain_table[i:] + init_plain_table[:i] for i in range(28)] if __name__ == '__main__': for l, i in enumerate(p): for m, j in enumerate(vigenere_square[v_s_d[i]]): if c[l] == j: k += init_plain_table[m] k = 'VIGENERECODE' k *= 8 for n, i in enumerate(c): print(init_plain_table[v_s_d[i] - v_s_d[k[n]] % 28], end="")
VoIP
何かしら通話しているであろうパケットファイルが渡されるので,
Wiresharkで調べていきます.
日本語環境のWiresharkであれば起動後,
「電話タブ→RTP→RTPストリーム 」
と選択して音声があるであろうストリームに対して
「分析→保存→音声」
とすることで「NAME.au」という形式で保存できます.
その後はその音声を聞いてフラグをゲットです!
…という簡単なお仕事なはずだったのですが,
僕の日本人耳では2箇所聞けずにかなり間違えました….
特に9とVが分かりませんでした.
9は再生速度をいじって0.8とか1.2とかにすると
それっぽく聞こえたのでまだ何とかなったのですが,
VはGやBに聞こえて曲者でした.
もしかしてVかも?と思えたのはMacのAlexさんのおかげです.
$ say -v Alex "B G V"
SECCON{9001IVR}
Memory Analysis
何かしらの生データを渡されるので,
解析してあるウェブサイトからフラグを取ってきてくれ!
的なことが書いてあったのでそのデータを調べていきます.
ヒントとして
- The Volatility Foundation - Open Source Memory Forensics
- hostsファイルを調べてみよう
とあるのでvolatilityをダウンロードします(Linux版で解析しました).
まず,「Volatility Frameworkを使ったメモリフォレンジック」と言うハンズオンに参加させて頂きました。 | Developers.IOを参考にし,
データのOSの特定→hostsの復元→アクセス先の調査
という流れで行いました.
(下記コマンドはファイルの場所によって若干変わってきます.)
OSの特定
$ ./volatility_2.5_linux_x64 -f ./../forensic_100.raw imageinfo
より32ビットのWindows XP(SP3)ということが分かります.
hostsの復元
$ ./volatility_2.5_linux_x64 -f ./../forensic_100.raw --profile=WinXPSP3x86 filescan $ ./volatility_2.5_linux_x64 -f ./../forensic_100.raw --profile=WinXPSP3x86 dumpfiles -Q 0x000000000217b748 -D .
よりhostsファイルが復元できます.
アクセス先の調査
復元したhostsファイルや通信履歴などを見て対象を絞ります.
$ ./volatility_2.5_linux_x64 -f ./../forensic_100.raw --profile=WinXPSP3x86 connscan $ ./volatility_2.5_linux_x64 -f ./../forensic_100.raw --profile=WinXPSP3x86 iehistory
により3つほどIPが分かるので,
とりあえずアクセスしてみて怪しいサイトが1つ見つかると思います.
そして iehistory であったページにアクセスすると
フラグの書かれたテキストがダウンロードできます.