※本記事は2016年8月18日に米国で掲載されたブログ記事の抄訳を基にしています。

脅威リサーチャーのコミュニティの皆様には、Unit 42セキュリティ コンテスト、LabyREnthにご参加いただきありがとうございました。コンテストが終了いたしましたので、いよいよ各種目の解答を発表いたします。週に1種目ずつ解答を公開しまし。まず、ドキュメント種目から始めます。

ドキュメント1課題: まあ、どうしてこんなマクロをクリックしちゃったの?

課題作成者: Tyler Halfpop @0xtyh

課題の文書を開くと、数多くの文書マルウェアによく見られるこの画像が目に入ります。また、マクロを有効にするためのプロンプトが画面上部に表示されます。

マクロを有効にし、FakeNetのようなツールを実行すると、次のような出力が得られます。

興味深いことに、これはRFC 1918が定めるプライベートIPアドレス10.1.133.7からevil.exeをダウンロードしようとしています。Wordのマクロ ビューアーを使うか、decalageのolevbaのようなツールでマクロをダンプすることでマクロを調べることができます。

見てお分かりのように、このコードは文字列を符号化し難読化していますが、きれいに整理すれば次のようにきわめて簡単なものになります。

さて、ここまでくるとFakeNetで目にしたものとこれが合致することが分かります。検索しているURLはbase64で表現されているようです。復号化してみると、次のようになります。

アスキー16進数文字列のように見えますが、バイト列に変換してもこれはと思えるものが得られません。しかし、このURIにはもうひとつ別の1バイトx58が含まれています(xで始まるのでこのように仮定します)。このバイトを使って16進数文字列を復号化してみるとキーが得られます。ここで、問題のURLからキーを表示するPythonスクリプトの例をご紹介します。

ドキュメント2課題: あなたにドキュメントのクラッキングができるかな?

課題作成者: Tyler Halfpop @0xtyh

この課題用に“CrackDoc.doc”という名前のファイルが与えられています。このファイルを開くと‘UsersForm1’という画面が現れ‘Key’の値を入力するよう言われます。

入力したキーの値が合っていないと“U can do. Try harder…”というメッセージとともに可愛らしい犬の写真が表示されます。

裏に隠れているマクロを見てみようとするとVBProjectがパスワードで保護されていることが分かります。

これを回避するため、使い慣れているバイナリ エディタに文書を読み込ませ、文字列‘DPB=”’を‘DPX=”’に変更してみます。

ファイルが再度開かれ、この文字列が構文解析される場合にこれが正しいキーではないことが分かるよう文書を改変したわけです。しかしそれでもプロジェクトをロードさせることができるので‘DPB’による保護の回避が可能になります。

一度プロジェクトに入ってしまえば‘Project Properties’(プロジェクトのプロパティ)に行き、‘Protection’(保護)タブの‘Lock project for viewing’(プロジェクト表示のロック)のチェックを外してパスワードを永久に削除することができます。

コードを調べてみると‘UserForm1’という名前のフォームと‘NewMacros’というモジュールが見つかります。このフォーム上を右クリックして‘View Code’に行くと、私たちの関心事だった隠れたマクロが表示されるので、キーを構成するバイト配列が直ちに見つかります。

Xがバイト文字列に等しければ勝利のメッセージを手にすることが分かります。値Xは入力を受け渡す‘suchcrypto’関数および4代目‘General Vidal’に由来します。この関数をリバース エンジニアリングするのはさほど難しくなさそうです。

しかし、この課題に打ち勝つために、さらに怠惰な手段をとることにしました。マクロにはマクロで対抗することに決めました。潜在する値の配列を作成し、それらをそれぞれ‘suchcrypto’関数に渡すことで、何がキーで、どのタイミングで一致する値が見つかり、次へ移動するかを簡単に列挙できます。

配列全体とNotepad++を使用して、数回、上矢印キーをたたき、最後のバイトを削除してから、結果をコピーして貼り付け、その後、再度実行する小さいマクロを記録しました。一緒に残すものは、‘UserForm()’マクロにコピーできる‘For’ループの長いリストです。

次で始まります。

次で終わります。

ここで、Enterキーを数回たたくと、キーがキー自体を解除し、私たちはそれを見ることができます。


PAN{L4$t_Night_@f@iry_Vizited_M3}

文書3課題: Adobe、pls

課題作成者: Curtis Carmony @c1fe

抽出されたJavascriptをデバッグすることから始めました。デコードされたYouTube URLを見つけたときはかなり扱いやすいと感じました。それは、Rick Astleyが、決して諦めないと歌い始めるまででした。まさに、Curtisはリックロールされました! それがあなた方も解き放してくれると良いのですが。

次に、Cerberoプロファイラのさまざまなストリームに目を通し、最初のオブジェクト内で16進付きのJSタグを見つけました。

それを16進エディタに入力し、キーをテストして課題を完了しました。

文書4課題: マクロは楽しい。

課題作成者: Curtis Carmony @c1fe

この課題では、ファイル“fun.docm”が提供され、拡張子は、私たちがマクロを楽しむ(楽しまない)ことをほのめかしています。

文書を開くと、繰り返し再生される愛らしいエアホーン サウンドとともに色が変わる大きなフォントで、テキスト“MORE MACROS = MORE FUN”が表示されます。VBプロジェクトを開こうとすると、パスワード保護されていることが明らかになるため、最初はこれをバイパスする必要があります。

Docファイルの新しい形式はアーカイブであるため、7zでそれを開き、‘\word\’ディレクトリの下で‘vbaProject.bin’ファイルを探します。これを16進エディタで開き、文字列‘DPB=”’を検索して、その後、それを単に‘DPX=”’などに変更して、ファイルを保存します。ここで、ファイルをロードすると、無効なキーが含まれるプロジェクトに関するエラーが、強制的にそのロードを続行するためのオプションとともに表示されます。この時点で、VBプロジェクトにアクセスして、Project Properties (プロジェクトのプロパティ)に移動し、‘Lock project for viewing’(プロジェクトの表示をロック)を選択解除して、パスワード保護を削除できます。

プロジェクトを見ると、1つのモジュール‘Z1yiWeP’とともに、2つのフォーム‘NpuXrzgq’と‘U8pblvDZuAh8Gy’があることがわかります。メインの文書とモジュールのコードを見ると、多数の関数があるように見えます。そこで、それをデバッグすることから始め、それが何を実行しようとしているのか感じ取ります。最初の‘Document_Open()’関数の後に‘Stop’を挿入すると、プロセスが開始します。

マクロの中身に取り組む前に、4つの‘VBcomponents’が存在するかどうかを確認すると、それが3つしかない場合は問題があることを発見できます。‘zkceuV405Q5LjUp587OYxTI7OR9zTyPdvz8k’関数をステップごとに実行すると、これが、埋め込みのWAVファイルをデコードし、文書内のテキストを変更しながらエアホーンを連続して再生する一連のイベントであることがわかります。

最初のチェックで引っ掛からないようにコードを調整すると、マクロの‘XiqyXdC809pP5esSrC633ag92w0x6otQylY0’関数にたどり着きます。ここではすぐに‘zoycqKJvqznJMeMpHe7Z61xYJfLLmbObxBVy’を呼び出し、関数名を列挙し始めます。

関数‘BqNFmKCS7cTPv9XNFOd2mCLrdqCfmdNm6HBz’は、関数名をデコードし、文書のさまざまなフィールドに基づいてバイト値を変更するbase-64の処理を開始します。

関数は両方ともそれぞれ44と32の1バイトXoRで、これらは‘U8pblvDZuAh8GY.Label1.Caption’のbase-64デコード値(‘xRgWTqWr7ipEjFBfESrOiaYFu9i9Jml3Q171’)と比較されます。

これに基づいて、すべての関数名を取得し、それぞれをbase64デコードし、44と32でそのバイトをXoRするによって一致を素早く判定できます。

この時点で興味深い関数名を入手しています。マクロを強制実行してこの値を使用し、デバッグを継続できます。

‘XiqyXdC809pP5esSrC633ag92w0x6otQylY0’関数に戻ると、この関数は別の関数名‘d7KRoSK5UEDh35jJNkj0TtcJjOIbmBZlyCql’を取得し、これを対応する名前とともに別の関数に渡します。その関数は‘d7KRoSK5UEDh35jJNkj0TtcJjOIbmBZlyCql’をbase64デコードして配列にします。次に関数‘XWn5TNdoykQb0QoitVEG7sLOxIRSi97XmqmM’に移動すると、ここには‘MsgBox’呼び出しがあり、フラグを印刷することが想定されます。

表示される関数を確認すると、VBProject内のフォームのプロパティ値に対してさらにXoRおよび比較のチェックが行われます。

この時点で、‘d7KRoSK5UEDh35jJNkj0TtcJjOIbmBZlyCql’関数の名前が144と85によってXoRされ、その結果が取得され、‘XJCR/DogZt7bduvvusJgAQu6QX9DmtKN+bZB’のbase-64デコード値に対してXoRされ、一致するかどうかが確認されます。一致しません。

パズルの2つの部分を知っているため、元々の2番目の関数名が何であるべきかを解くためにそこから後方に作業できます。‘XJCR’文字列および‘yRQa’文字列をbase-64デコードし、これらを同時にXoRしてからそれぞれの結果のバイトを144と85でXoRします。

文書5課題: EXCEL.EXEは単なるCALC.EXEではない

課題作成者: Curtis Carmony@c1fe

Crackmeを含むExcel文書が与えられています。キーをテストしようとすると、小癪なポップアップが表示され、間違っている、Excelを閉じ、calc.exeを起動するように命令します。

文書のバックアップを開き、マクロを表示すると、文書を閉じる非常に簡単なマクロが1つだけあります。いたずらがあることは明らかです。

下部のシートを右クリックしてunhide(再表示)をクリックすると、secretという非表示シートが表示されます。

secretシートに移動し、「Show Formulas(数式の表示)」をクリックし、フォントを黒にすると、セルにExcelの関数が表示されます。見えないsuper secretシートを表す興味深そうな1つのセルがA14にあります。

マクロを変更してすべてのシートが表示されるようにし、ボタンをクリックしました。

さらに多くの数式を含むsuper secretシートが表示されます。Excelに非表示シートとスーパー非表示シートを作成できることは非常に驚くべきことです。

「Show Formulas(数式の表示)」のチェックを外し、F13から連結関数を除くすべてを削除すると、Excelは数式を出力します。

=CONCATENATE(D7,A5,C5,B4,E20,B6,A8,B8,A12,B10,E10,C9,B13,D12,C11,B16,A25,A18,B19,
C20,B21,B2,D23,B24,E4,B26,D16,A21,C14,A16)

このキーを元のファイルに入力すると、勝利のメッセージが表示され、EXCELULATORになったことがわかります。Excelで成し遂げたすべてのことは非常に驚くべくことです。

以下にコメントを入力してこれらの課題について感じたことを共有しましょう。他の脅威リサーチャーがこれらの課題をどのように解決したかも確認してください。

文書1課題

·    https://dbheise.github.io/2016/08/15/2016-Palo-Alto-Labyrenth-CTF-Doc-01/

·    https://github.com/uafio/git/blob/master/scripts/labyREnth-2016/labyrenth-2016-docs-1.py

文書2課題

·    https://dbheise.github.io/2016/08/15/2016-Palo-Alto-Labyrenth-CTF-Doc-02/

·    https://github.com/uafio/git/blob/master/scripts/labyREnth-2016/labyrenth-2016-docs-2.py

文書3課題

·    https://dbheise.github.io/2016/08/15/2016-Palo-Alto-Labyrenth-CTF-Doc-03/

·    https://github.com/uafio/git/blob/master/scripts/labyREnth-2016/labyrenth-2016-docs-3.txt

文書4課題

·    https://dbheise.github.io/2016/08/15/2016-Palo-Alto-Labyrenth-CTF-Doc-04/

·    https://github.com/uafio/git/blob/master/scripts/labyREnth-2016/labyrenth-2016-docs-4.py

文書5課題

·    https://dbheise.github.io/2016/08/15/2016-Palo-Alto-Labyrenth-CTF-Doc-05/

·    https://github.com/uafio/git/blob/master/scripts/labyREnth-2016/labyrenth-2016-docs-5.txt