Mazeは、増え続けるランサムウェアファミリーの中で、最近注目を集めているランサムウェアです。このランサムウェアは過去1年間活動を続けてきましたが、感染した顧客の機密データを公開するという新たな手法で注目を集めました。
その マルウェア エクスプロイトキットやメールのなりすましなど、様々な手法を用いて侵入を試みます。これらのフィッシングメールには、システム内でマルウェアを実行するためのマクロを含むWord文書が添付されています。
Mazeは暗号化にCHA-CHAアルゴリズムを使用し、鍵はRSAアルゴリズムで暗号化されます。Mazeはミューテックスの有無にかかわらず動作し、Webサーバーが標的のシステムから情報を送信する際にロシアのIPアドレスを使用します。C&C通信にはRSA暗号化リクエストを使用し、キーボードの種類をチェックすることで特定の地域向けのシステムを暗号化することはありません。
ステージ I:
VBAマクロ
添付されたドキュメントファイルには、暗号化されたURLとパスの数値配列を入力するための入力ボックスを含むフォームがあります。ドキュメントファイルにはActiveXオブジェクトが含まれています。実行されると、URLとパスが復号され、URLDownloadToFileA()が呼び出され、指定された場所に実行ファイルがダウンロードされます。

図1. パラメータを指定したURLDownloadToFileA()呼び出し
数値配列はテキストボックスから読み取られ、文字に変換され、連結されてファイルのダウンロード先のURLとパスが作成されます。 PowerShellの ファイルをダウンロードします。ほとんどの場合、ファイルは「C:\Windows\temp」にダウンロードされます。

図2. 数値配列に格納される文字
ステージ II:
- クリプター
Mazeランサムウェアの第一段階はカスタム暗号化プログラムです。この暗号化プログラムは、インポート数が少ないパッケージ型です。kernel32.dllからLoadLibrary()とGetProcAddress()を呼び出すことでライブラリを読み込み、関数名をadler32チェックサム付きで保存します。
暗号化ツールはデバッグ対策用であり、ジャンク文字列を OutputDebugStringW() 関数に渡します。

図3. OutputDebugStringW()の呼び出し
以下のコードでは、ファイルが存在するかどうかを確認し、存在する場合は終了します。同様に、特定のコマンドライン引数も確認し、存在する場合は実行フローを変更します。次に、マルウェアは実際のDLLが存在するリソースを読み込みます。読み込まれたリソースは暗号化され、キー0x41とのXOR演算が行われます。復号後、base64でエンコードされたデータが得られます。

図4. XORループとAPI解決
すべてのデータをスタックにコピーした後、API名を生成し、Loadlibrary() Win32 APIを呼び出します。次に、CryptStringToBinaryA() APIを呼び出してbase64データをデコードします。復号されたバッファは、CHA-CHA 20アルゴリズムを使用して再度復号され、Mazeランサムウェアの実際のペイロードが取得されます。ペイロード(MazeのDLL)とともに、シェルコードも復号されます。CreateThread() APIを使用して、シェルコードを実行します。

図5. CreateThread()の呼び出し
このペイロードコードでは、まずPEB用のkernel32のベースアドレスを読み込みます。以下のコードは、アドレスの読み込みを示しています。

図6. アドレスはPEBからロードされる
シェルコードはVirtualAlloc()を使用してメモリを割り当て、DLLファイルを新しく割り当てられた領域にコピーします。その後、スレッドを作成し、DLL内のコードを実行します。このコードは元のエントリポイントでバイト列を変更し、OEPにジャンプします。
- 迷路ペイロード
復号されたペイロードでは、まずすべてのAPIをロードし、次にntdl.dllからdbgUiRemoteBreakinにパッチを適用します。これは、デバッガのアタッチを回避するために用いられるアンチデバッグ手法の一つです。
まずVirtualProtect()を呼び出します dbgUiRemoteBreakin PAGE_EXECUTE_READWRITE を新しい flNewProtect として設定します。その後、単純な mov 命令によってバイト 6A を C3 に置き換えます。そのため、誰かがデバッガをアタッチしようとすると失敗します。

図7. dbgUiRemoteBreakinエントリポイントで0xC3をコピーする

図8. パッチ適用前と適用後のコード
次に、Process32First() と process32Next() を使用して実行中のプロセスを列挙します。「je」命令を使用してAPIを呼び出し、そのアドレスがスタックにプッシュされます。このスタックはAPI呼び出し後に実行されます。この呼び出しは「push」命令と「jz」命令または「je」命令に置き換えられます。

図9. jz命令を使用したProcess32NextW()の呼び出し
プロセスを列挙した後、XMMレジスタを用いたアルゴリズムですべての名前を難読化します。次に、この難読化された文字列のハッシュを計算し、ハードコードされたハッシュと比較します。そのハッシュの例は以下のとおりです。
Procmon64.exe: 0x776E0635
Procexp64.exe: 0x78020640
Ida.exe: 0x33840485
ダンプキャップ.exe: 0x5FB805C5
X32dbg.exe: 0x50620538

図10: 実行中のプロセスのハッシュとハッシュを比較する
プロセス ハッシュのいずれかが一致すると、TerminateProcess() が呼び出され、実行中のプロセスが終了します。
特定のキーボードタイプ用のファイルは暗号化されません。キーボードタイプを取得するには、GetUserDefaultUILanguage()関数を呼び出します。例:
ロシア語: 0x419 // この値は暗号化しない
ウクライナ語: 0x422 // この値は暗号化しない
セルビア語: 0x7C1A // この値は暗号化しない
en_US : 0x409 // この値を暗号化する

図11. GetUserDefaultUILanguage() によって返される値を確認する
次に、まず IP リストがハードコードされている CnC サーバーと通信しますが、以下に記載されている IP はすべてロシアに属しているようです。
91.218.114.4
91.218.114.11
91.218.114.25
91.218.114.26
91.218.114.32
91.218.114.37
91.218.114.38

図12. ハードコードされたIPリスト
次に、最初の要求でデータが CnC に送信されます。送信されるデータは、ユーザー名、コンピューター名、Os バージョンです。
マルウェアは、一意の ID を持つミューテックスを作成します。一意の ID は、 SHA(GetComputerName() + VolumeID()) を使用して作成されます。
ランサムウェアマーカーの場合、ルートと各フォルダーに一意のファイルを作成します。
迷路暗号化プロセス:
マルウェアは拡張子に基づいて暗号化するファイルを選択します。以下の拡張子は除外されます。
- エグゼ
- Dllファイル
- SYS
- LNK
以下のファイルも除外されます。
- 復号化ファイル.txt
- infファイル
- INI
- INI
- 温度/000.bmp
除外されるフォルダー:
%windows%、@gaming%、%programdata%、%tor Brower%、%local Settings%、%appdata% など

図 13. フォルダー名をチェックし、同じものが見つかった場合はフォルダーは暗号化されません。
暗号化プロセス:
まずキーを作成し、「c:\programdata\data1.tmp」フォルダにエクスポートします。その後、暗号化前に各フォルダに身代金要求のメッセージを配置します。その後、このファイルからキーをインポートし、「CryptEncrypt()」を呼び出します。
ドライブ文字を取得し、GetDriveType() を使用してドライブの種類を特定します。さらに、API 呼び出し FindFirstFileA() と FindNextFileA() を使用して列挙します。
wmic の偽のパスを作成してシャドウコピーを削除し、CreateProcessW() を呼び出して削除/回復を実行します。ファイルは CHA-CHA アルゴリズムで暗号化され、chacha の鍵は RSA で暗号化されます。このために、crypto API が使用されます。暗号化されたファイルの末尾には「66116166」というマーカーが付きます。

図14. Mazeランサムウェアによって暗号化されたファイル
各ドライブごとにスレッドを作成し、各フォルダごとにスレッド作成関数を呼び出して暗号化を実行します。暗号化はC:またはD:のルートから開始され、同時にWNetShareEnum() APIを使用して共有ドライブにもアクセスします。共有ドライブのファイルの暗号化にも同じ暗号化関数が使用されます。最初に暗号化されるフォルダは「$Recycle Bin」です。
各フォルダに対して以下の関数でCreateThread()を実行します。ファイルは以下のように開かれます。ファイルはCryptEncrypt()を呼び出して暗号化され、拡張子を付けてmoveFileEx()を呼び出して名前が変更されます。
暗号化されたファイル

図15. 暗号化後のファイル
Maze マルウェアは、分析回避のためにさまざまな戦術を使用します。
- API 実行時に解決されます。
- JE および JNE 命令を使用した API および関数の間接呼び出し。
- 実行時にデバッガーがアタッチされるのを回避するために DbgUiRemoteTracking にパッチを適用します。
- デバッグ中のフラグをチェックしています。
- VM を確認しています。
- API – GlobalMemoryStatusEx および GetDiskeSpaceW を使用して RAM とハードウェア サイズを確認します。
- ハッシュを計算してプロセス名を確認します。
ランサムウェアから身を守るための予防策
Mazeランサムウェアの一般的な感染経路は、MS Office添付ファイル付きのフィッシングメールと、エクスプロイトキットが仕込まれた偽サイト/フィッシングサイトです。そのため、エンドユーザーの皆様には、不明なソースからのメールの取り扱い、MS Office添付ファイルのダウンロード、マクロの有効化、疑わしいリンクのクリックなどには十分ご注意ください。
妥協の指標
49B28F16BA496B57518005C813640EEB
BD9838D84FD77205011E8B0C2BD711E0
主題専門家
プレクシャ・サクセナ | クイックヒール・セキュリティ・ラボ



