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

何かしらの生データを渡されるので,
解析してあるウェブサイトからフラグを取ってきてくれ!
的なことが書いてあったのでそのデータを調べていきます.
ヒントとして

とあるので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 であったページにアクセスすると
フラグの書かれたテキストがダウンロードできます.

SECCON{h3110_w3_h4ve_fun_w4rg4m3}