
このツールは、BlackHat Asia での講演(2019年3月28日)に合わせて公開されました。講演の録画は https://www.youtube.com/watch?v=9ULzZA70Dzg でご覧いただけます。
悪意のあるMS Office文書を作成するためのクロスプラットフォームアシスタント。VBAマクロの隠蔽、VBAコードのスタンピング(P-Code経由)、マクロ解析ツールの混乱を引き起こします。Linux、OSX、Windowsで動作します。
このツールに初めて触れる方は、まずEvil Clippyに関するブログ記事をご一読ください: https://outflank.nl/blog/2019/05/05/evil-clippy-ms-office-maldoc-assistant/
このプロジェクトは、許可されたテストまたは教育目的でのみ使用してください。
これらが何を意味するのか全くわからない場合は、まず以下のリソースをご確認ください:
執筆時点では、このツールはデフォルトのCobalt Strikeマクロを使用して、ほとんどの主要なアンチウイルス製品やさまざまなマルドキュメント解析ツールを回避できます(VBAスタンピングとランダムモジュール名の組み合わせによる)。
Evil Clippyは、OpenMCDFライブラリを使用してMS Office複合ファイルバイナリフォーマット(CFBF)ファイルを操作し、そのためにMS-OVBA仕様と機能を悪用します。ディレクトリストリームとモジュールストリームで使用される圧縮アルゴリズムを実装するために、Kavod.VBA.Compressionのコードを再利用しています(関連仕様はMS-OVBAを参照)。
Evil ClippyはMono C#コンパイラで問題なくコンパイルでき、Linux、OSX、Windowsでテストされています。
EvilClippyのバイナリリリースは提供していません。自分で実行ファイルをコンパイルしてください:
OSX および Linux
Monoがインストールされていることを確認してください。次に、コマンドラインから次のコマンドを実行します:
mcs /reference:OpenMcdf.dll,System.IO.Compression.FileSystem.dll /out:EvilClippy.exe *.cs
次に、コマンドラインからEvil Clippyを実行します:
mono EvilClippy.exe -h
Windows
Visual Studioがインストールされていることを確認してください。次に、Visual Studioの開発者コマンドプロンプトから次のコマンドを実行します:
csc /reference:OpenMcdf.dll,System.IO.Compression.FileSystem.dll /out:EvilClippy.exe *.cs
次に、コマンドラインからEvil Clippyを実行します:
EvilClippy.exe -h
ヘルプの表示
EvilClippy.exe -h
GUIからマクロを隠す/表示する
デフォルトの「ThisDocument」モジュールを除くすべてのマクロモジュールをVBA GUIエディタから隠します。これは、プロジェクトストリーム [MS-OVBA 2.3.1] からモジュール行を削除することで実現されます。
EvilClippy.exe -g macrofile.doc
隠すオプション(-g)による変更を元に戻し、VBA IDEでマクロをデバッグできるようにします。
EvilClippy.exe -gg macrofile.doc
VBAスタンピング(P-codeの悪用)
テキストファイル fakecode.vba から偽のVBAコードをすべてのモジュールに配置し、P-codeはそのまま残します。これはモジュールストリームの文書化されていない機能 [MS-OVBA 2.3.4.3] を悪用します。P-codeが実行されるためには、VBAプロジェクトのバージョンがホストプログラムと一致している必要があることに注意してください(バージョン一致については次の例を参照)。
EvilClippy.exe -s fakecode.vba macrofile.doc
注:VBAスタンピングは、Excel 97-2003 ワークブック (.xls) 形式で保存されたファイルでは機能しません。
VBAスタンピングの対象Officeバージョンの設定
上記と同じですが、今度は明示的にx86上のWord 2016を対象とします。つまり、x86上のWord 2016はP-codeを実行し、他のバージョンのWordは fakecode.vba のコードを実行します。これは、_VBA_PROJECT ストリーム [MS-OVBA 2.3.4.1] で適切なバージョンバイトを設定することで実現されます。
EvilClippy.exe -s fakecode.vba -t 2016x86 macrofile.doc
ランダムモジュール名の設定/リセット(アナリストツールを欺く)
ディレクトリストリーム [MS-OVBA 2.3.4.2] にランダムなASCIIモジュール名を設定します。これは、MODULESTREAMNAMEレコード [MS-OVBA 2.3.4.2.3.2.3] の曖昧さを悪用します。ほとんどのアナリストツールはここで指定されたASCIIモジュール名を使用しますが、MS OfficeはUnicode版を使用します。ランダムなASCIIモジュール名を設定することで、ほとんどのP-codeおよびVBA解析ツールがクラッシュする一方、実際のP-codeとVBAはWordとExcelで正常に動作し続けます。
EvilClippy.exe -r macrofile.doc
注:これはpcodedmpやVirusTotalを欺くのに効果的であることが知られています。
ASCIIモジュール名を対応するUnicodeのものに一致するように設定します。これにより、EvilClippyの(-r)オプションで行われた変更を元に戻します。
EvilClippy.exe -rr macrofile.doc
HTTP経由でVBAスタンピングされたテンプレートを提供
VBAスタンピングを実行した後、HTTPポート8080で macrofile.dot を提供します。このファイルが取得されると、自動的にターゲットのOfficeバージョンに一致します(HTTPヘッダーを使用し、それに応じて_VBA_PROJECTバイトを設定します)。
EvilClippy.exe -s fakecode.vba -w 8080 macrofile.dot
注:提供するファイルはテンプレート(.docではなく.dot)である必要があります。Wordの開発者ツールバーからURL経由でテンプレートを設定できます(.dot拡張子は不要!)。また、fakecode.vbaにはテンプレートからのマクロ用にVB_Base属性が設定されている必要があります(つまり、fakecode.vbaは Attribute VB_Base = "0{00020906-0000-0000-C000-000000000046}" のような行で始まる必要があります)。
VBAプロジェクトのロック/表示不可保護の設定/解除
Locked/Unviewable属性を設定するには、'-u'オプションを使用します:
EvilClippy.exe -u macrofile.doc
Locked/Unviewable属性を解除するには、'-uu'オプションを使用します:
EvilClippy.exe -uu macrofile.doc
注:EvilClippyでロックされていないファイルでもLocked/Unviewable属性を解除できます。
Microsoft WordおよびExcel文書の操作向けに開発されています。
上記の通り、VBAスタンピングはExcel 97-2003 ワークブック (.xls) 形式に対しては効果がありません。
Stan Hegt (@StanHacked) / Outflank
Carrie Roberts (@OrOneEqualsOne / Walmart) による多大な貢献があります。
Nick Landers (@monoxgas / Silent Break Security) には、OpenMCDFを紹介していただき、特別に感謝します。