2021/06/29

難読化された AutoIt マルウェアについて

2021 年 6 月 29 日 Abdul Samee 著

マルウェアの目標は、コンピュータの防御機能を回避した上で標的を感染させ、可能な場合はシステムに常駐することです。その際、マルウェア作成者のスキルと、標的となった被害者の防御能力の次第で、さまざまな回避技術が使用されます。マルウェアで最も広く使われている手法のひとつは難読化です。難読化は、パッカー、暗号化、文字列操作といった形で行われ、効果的に利用された場合、検体を分析して脅威を特定するためにかかる時間とリソースが大幅に増えてしまいます。

スクリプト言語で書かれたマルウェアは多く、ランタイムライブラリとともにコンパイルされて実行ファイルとなります。そして PowerShell や Python を使用したマルウェアが後を絶たない中、新たに人気を獲得しているマルウェア開発言語が AutoIt です。AutoIt は本来、Windows のグラフィカルユーザインターフェイス (GUI) や基本的なタスクを自動化するために正規に使用されるスクリプト言語です。しかし攻撃者は、AutoIt フレームワークで難読化した脅威を用い、ウイルス対策による検出を回避しています。AutoIt はマルウェアと密接に関連しており、AutoIT の Web サイト内にある wiki の記事でも、正規の AutoIt バイナリがウイルス対策によって悪意のあるものとして検出されることがある、という事実が取り上げられています。

以下は、ウォッチガードが最近検出した AutoIT スクリプトの分析結果です。このファイルは、BitPaymer ランサムウェアの亜種をドロップします。分析結果の通り、このファイルは意味のない変数や関数名、ガーベッジコード、定義済みの switch-case 操作、簡易なアルゴリズムで難読化された Unicode 配列によるコードの難読化など、さまざまな手法で高度に難読化されています。Notepad++ でコードの難読化を解除してコードブロックを最小化した後、マルウェアをゼロから構築し、無防備な被害者にマルウェアをドロップします。ただしマルウェアの作成者を感染させないよう、事前にいくつかのチェックが行われます。

AutoIt スクリプトの分析: コンパイルされたバイナリから平文スクリプトへ

最近筆者は、マルウェア検出やリバースエンジニアリングのためのファイルの検体を入手しました。悪意のあるファイルのため、隔離された感染ネットワークの中で開きます。これは、筆者が分析した AutoIt スクリプトを WatchGuard Panda AD360 が検出した例です。

これにより、そのファイルが疑わしいことが確認されました。その後、隔離されたネットワークを使用して、さらなる分析を行いました。

AutoIT のコンパイルオプション

最初に理解しておくべきは、AutoIT はユーザに 2 つの異なるコンパイルオプションを提供しているということです。コンパイルされたスクリプトと、スタンドアロンの実行ファイルです。

  • コンパイルされたスクリプトの場合、悪意のあるペイロードは少なくとも 2 つのファイルとして表示されます。1 つはコンパイルされたスクリプト、もう 1 つは正当な AutoIt Interpreter です。
  • スタンドアロン実行ファイルの場合、悪意のあるペイロードは、リソースとしてコンパイルされたスクリプトが埋め込まれた AutoIt Interpreter である、1 つの .exe ファイルとして表示されます。

逆コンパイル

AutoIt を逆コンパイルして .au3 ファイルを抽出および分析できます。

このファイルを開くと、悪意のあるスクリプトが難読化されていることがわかります。

分析の過程で、悪意のある AutoIt スクリプトの内部に興味深いデータを発見したため、精査してその仕組みを調べました。

  • コードは 16 進数の文字で埋め尽くされています。

16 進数の文字は適切な位置にないため、ASCII に変換しようとすると不適切な結果になります。注意したいのは、機能の 1 つにより、生の 16 進数を使って別のファイルが一から作り出されている、ということです。これは、AutoIT スクリプトが 64 ビット環境にある場合と 32 ビット環境にある場合で、異なるファイルを作成します。

  • 使用した python – regex

解析を困難にする攻撃者の手法を回避する上で、スクリプトを書いてコードの難読化を解除するよりも良い方法がありました。
それは、(r’PIkUFK\(\”([0-9.]*)\”,([0-9])\)’) という正規表現です。

  • さらに、ファイルを切り詰めて while ループをすべて消去しました。ガーベッジコードや余分なコードを消去することが目的でしたが、これは Notepad ++ で簡単に実行できました。

検索と置換を使って、以下の正規表現でコードの一部を削除しました。


最終的に、すべての LF/CR を削除しました。

最初の画像は完全に難読化されたもので、2 番目の画像は難読化された関数を PIkUFK 関数で実行した後の、読みやすいテキストを示しています。

AutoIt スクリプトは、マルウェア対策エンジンによる検出を避けるためにシステム内のファイルやコンピュータ名をチェックすることが可能です。また、サンドボックスエミュレーションを検出するために API GetTickCount をチェックします。さらに、ドメイン「OJtmGmql.OJtmGmql」をチェックし、ドメインが稼働している場合は終了します。以上の処理がすべてパスになった場合、シェルコードを注入します。

さらに、このコードはシェルコードをメモリに注入し、「JFTZRATSJPATTZLFCUTTH」という名前のミューテックスを最初に作成し、復号化された PE ファイルを取得し、注入し、実行します。最後にペイロードを復号化し、ウイルス対策ソフトに捕捉されないようにメモリ内で実行されます。

結論

結果として、難読化されたコードが何をしているのかを予想することができました。この関数の後にあるコードは関数ではなく、事実上の「メイン」関数である可能性が高いでしょう。その動作を行ごとに解説します。

  1. コンピュータ名が「DESKTOP-Qo5QU33」、「NfZtFbPfH」、「tz」、「ELICZ」のいずれかであるかどうかを確認します。もしそうであれば、スクリプトは終了します。これらの名前は、AV エミュレータで使用されます。
    • 「NfZtFbPfH」 – カスペルスキー
    • 「tz」 – ビットディフェンダー
    • 「ELICZ」 – AVG
    • 「DESKTOP-Qo5QU33」 – 攻撃者のマシン名
  2. 「C: \aaa _TouchMeNot_.txt」というファイルが存在するかどうかを確認し、存在する場合は終了します。
    • 最初の 5 行は、キルスイッチでしょう。作者はスクリプトをテストする際にこれらを使用し、自身のマシンを感染させないようにしたのでしょう。これらのコンピュータ名やファイルがついている場合、基本的にこの特定の機能からは免れます。
  3. 元のファイル名を別のファイル名にコピーします。
  4. Kernel32.dll に DLLCall を行い、エラーモードを 8006 に設定します。つまり以下のようになります。
    • SEM_NOALIGNMENTFAULTEXCEPT – 0x0004
    • SEM_NOGPFAULTERRORBOX – 0x0002
    • SEM_NOOPENFILEERRORBOX – 0x8000
  5. また、ping 操作を実行し、実行に成功するとスクリプトを終了します。
  6. スクリプトを実行し、タイミング関数を再度呼び出して終了します。

これらの AutoIt スクリプトのように難読化されたマルウェアは、高度なエンドポイントプロテクションサービスが非常に重要であることを示しています。他のプロセスのメモリにコードを注入することで、従来のシグネチャベースのツールを回避する回避型ペイロードを作成したり、ファイルレス攻撃を仕掛けたりすることが、攻撃者にとってこれまで以上に容易になっています。