Zscalerのブログ
Zscalerの最新ブログ情報を受信
購読するRaccoonファミリーの最新世代「Raccoon Stealer v2」
はじめに
マルウェア ファミリーの一種であるRaccoonは、2019年初め頃からダーク ウェブでMalware-as-a-Serviceとして販売されてきました。2022年7月初め、このマルウェアの新しいバージョンがリリースされました。これは一般にRaccoon Stealer v2として知られており、主にC++で書かれていた以前のバージョンとは異なり、C言語で書かれています。
Raccoonは、ブラウザーからパスワード、Cookie、オートフィル データなどを盗むことができる強力な情報窃取型マルウェアです。Raccoonは、あらゆる暗号通貨ウォレットからの窃取にも対応しています。
このブログ記事では、ThreatLabzの調査を基に、exe形式のRaccoon Stealer v2に関する分析と、前バージョンとの主な違いについて解説していきます。なお、Raccoonの作成者たちは、DLL形式や他のPEファイルに埋め込んだ形式など、exe以外のバージョンの存在を公表しています。
詳細な分析
Raccoon v2は情報窃取型のマルウェアで、2022年7月3日に初めてその存在が確認されました。このマルウェアはC言語とアセンブリー言語で書かれています。
Raccoon v2でも、データ窃取のメカニズムは以前のバージョンで見られたものと同じですが、以下のような新たな特徴がいくつか確認されています。
- すべての文字列リテラルに対応するBase64およびRC4暗号化スキーム
- WinAPI関数の動的読み込み
- Telegram APIへの依存の廃止
コマンド&コントロール サーバーのリスト取得方法に大きな変化が確認されています。Raccoon v1は、Telegramネットワークを悪用してコマンド&コントロール サーバーのリストを取得していることが確認されましたが、Raccoon v2ではTelegramの使用が廃止されています。代わりに、脅威アクターが制御するサーバーのハードコードされたIPアドレスを使用して、次の段階のペイロード(主にDLL)がダウンロードされるコマンド&コントロール サーバーのリストを取得します。
ファイル情報
- マルウェア名:Raccoon Stealer v2
- 言語:C
- ファイル形式:exe
- ファイル サイズ:56832
- MD5:0cfa58846e43dd67b6d9f29e97f6c53e
- SHA1:19d9fbfd9b23d4bd435746a524443f1a962d42fa
- SHA256:022432f770bf0e7c5260100fcde2ec7c49f68716751fd7d8b9e113bf06167e03
デバッグ情報
分析したファイルにはデバッグ データがそのまま含まれていました。デバッグ ヘッダーによると、コンパイル日時は、図1に示すように2022年5月26日木曜日の13時58分25秒(協定世界時)でした。
図1:Raccoon v2のデバッグ ヘッダー
また、Raccoon Stealer v2では、本来の意図を隠すための方法にも変化が見られ、API名を静的に読み込むのではなく、動的に解決するメカニズムが使用されています。この情報窃取型マルウェアは、LoadLibraryWとGetProcAddressを使用して必要な各関数を解決します(図2参照)。DLLとWinAPI関数の名前は、クリアー テキストとしてバイナリーに格納されます。
図2:Raccoon v2の動的解決
読み込まれたDLLのリスト
- kernel32.dll
- Shlwapi.dll
- Ole32.dll
- WinInet.dll
- Advapi32.dll
- User32.dll
- Crypt32.dll
- Shell32.dll
Raccoon v1は、使用する関数に動的解決を採用していなかったため、実際に出回っていたものでは、検出メカニズムを回避するためにサンプルを圧縮している例がしばしば確認されていました。逆に、Raccoon v2は圧縮されずに配信されることが多くなっています。図3は、Racoon v1でインポートされたDLLを示しています。
図3:Raccoon v1でインポートされたもの(圧縮されていない)
関数の解決が完了すると、Raccoon v2は文字列復号ルーチンを実行します。このルーチンはシンプルなもので、RC4で暗号化された文字列はBase64エンコードを使用してサンプルに格納されます。このサンプルは最初にBase64エンコードをデコードし、次に暗号化された文字列をキー「edinayarossiya」で復号します。また、このルーチンは関数string_decryption()のすべての文字列に対して実行されます。図4には「string_decryption」ルーチンが表示されています。
図4:Raccoon v2の文字列復号ルーチン
Raccoon Stealerの前バージョンでは、ハード コードされたIPアドレス以外の文字列リテラルは暗号化されませんでしたが、Raccoon v2では、プレーンテキストのすべての文字列を暗号化することでこれを克服しています。Raccoon v1のプレーンテキストの文字列を図5にいくつか示します。
図5:Raccoon v1のプレーン テキストの文字列
Raccoon v1の文字列のサンプルを手動で復号すると、プレーンテキスト形式で次の文字列(図6および7)が得られました。
図6:Raccoon v2の復号された文字列
図7:Raccoon v2の復号された文字列
コマンド&コントロールのIPアドレスはマルウェアに保存されて同じ復号ルーチンに従いますが、キーは異なります(59c9737264c0b3209d9193b8d6c127)。マルウェアがコンタクトしたIPアドレスは「hxxp://51(.)195(.)166(.)184/)」です。図8は復号ルーチンを示しています。
図8:Raccoon v2のIPアドレス復号
コマンド&コントロールのIPアドレスの復号
暗号化されたコマンド&コントロールのIPアドレスは、CyberChefなどの公開ツールを使用して簡単に復号できます(図9)。
図9:Raccoon v2のIPアドレス(CyberChefのユーティリティーを使用)
この技法はRaccoonの両バージョンで共通しています。図10に示すルーチンはRaccoon v1で採用されているのと同じものです。
図10:IPアドレス復号前のRaccoon v1のセットアップのオーバーヘッド
関数の設定と文字列の復号のすべてのオーバーヘッドが完了すると、Raccoon v2はコマンド&コントロールのサーバーに接続して悪意のあるDLLをダウンロードして情報を窃取する前に、いくつかの確認を行います。
窃取前のオーバーヘッド
Raccoon v2では、中核機能の実行前に、決まった内容のチェックを行って実行環境を把握します。その際には、Raccoon v2がそのマシン上でまだ実行されていないことも確認します。さらに、Raccoon v2がNT権限/システムとして実行されるかどうかもチェックします。
Raccoon v2はミューテックスのハンドルを取得して、特定の値と一致するかどうかをチェックし、一致する場合には実行を継続します。
値:8724643052
この技法によって、Raccoonのインスタンスが同時に2つ以上実行されないようにしています。図11は、Raccoon v2のミューテックスの確認と作成の手順を示しています。図12に示すのは、Raccoon v1で使用されている同様の手順です。
図11:Raccoon v2のミューテックス チェック
図12:Raccoon v1のミューテックス チェック
図13に表示されているように、プロセス トークンを取得し「S-1-5-18」のテキストと照合することで、Raccoon v2がSYSTEMユーザーとして実行されているかどうかを判断します。
図13:Raccoon v2によるプロセス トークンの列挙
SYSTEMユーザーとして実行している場合は、fun_CreateToolhelp32Snapshotを活用して、実行中のすべてのプロセスの列挙を行います。SYSTEMユーザーとして実行されていない場合は、列挙なしで先に進みます。図14が示すのは「enumerate_processes()」関数の呼び出し、図15が示すのはRaccoon v2によるプロセスの反復処理です。
図14:Raccoon v2によるプロセスの列挙
図15:Raccoon v2によるプロセス構造の反復
ホストのフィンガープリントの取得
Raccoon v2は、実行されている環境を認識すると、ホストのフィンガープリントの取得を開始します。以下のような関数を使用します。
- RegQueryValueExW (マシンID取得用)
- GetUserNameW
Raccoon v2は、RegQueryKeyExWおよびRegQueryValueExW関数を使用して、レジストリー キー「SOFTWAREMicrosoftCryptography」からマシンIDを取得します(図16)。また、Raccoon v2は、GetUserNameW関数を使用してユーザー名を取得します(図17)。
図16:Raccoon v2によるマシンIDの取得
図17:Raccoon v2によるユーザー名の取得
図18:Raccoon v2のユーザー名のバッファー
こうした処理すべての実行後、Raccoon v2はマシンIDやユーザー名などの情報を列挙し、そのデータをリモートのコマンド&コントロール サーバーに送信します。
これを行うために、マルウェアはchar文字列を作成してこれらの値の追加を開始します。まずマシンIDとユーザー名を追加します。図19は、バッファーに組み込まれたペイロードです。
図19:Raccoon v2によるフィンガープリント取得のペイロード
次に、RC4暗号化キーであるconfigIdを生成して追加します。
machineId=<MachineGuid>|<UserName>&configId=<RC4 key>
コマンド&コントロールとの通信
コマンド&コントロールとの通信は、プレーンテキストのHTTPプロトコルを介して行われ、前の過程で復号されたIPアドレスhxxp://51(.)195(.)166(.)184/はコマンド&コントロールの通信に使用されます。
Raccoon v2は、前の過程で復号されたコマンド&コントロールのIPアドレスのリスト(local_3cに保存)にアクセスします。Raccoon v2はコマンド&コントロールのIPアドレスを1つしか持たないため、図20の通り、POSTリクエストの送信先は1件のみとなります。
図20:Raccoon v2のコマンド&コントロールとの通信
コマンド&コントロールのURL
図21:Raccoon v2のバッファー内のURL
リクエスト ヘッダー
図22:Raccoon v2のリクエスト ヘッダー
リクエストが行われるとRaccoon v2はコンテンツ本文の長さがゼロかどうかを確認します。コマンド&コントロールからコンテンツが受信されない場合や、コンテンツ本文の長さがゼロの場合、Raccoon v2は動作を終了します。このチェックが行われるのは、このマルウェアのデータ窃取メカニズムでは、コマンド&コントロールからの応答に、抜き取ったデータの送信先となるIPアドレスのリストが必要となるためです。図23は、この条件と「ExitProcess()」関数の呼び出しを示しています。
図23:Raccoon v2による応答コンテンツの検証
Telegram Botへの依存の廃止
Raccoon v1はTelegram Bot APIの説明ページに依存して、コマンド&コントロールのIPアドレスを取得し、接続を確立していました。Raccoon v2では、バイナリー内のIPアドレスをハードコードすることで、このタスクを実行するようになっています。Raccoon v2は、ハードコードされた5件のIPアドレスを使用および反復処理します。
データの窃取
Raccoon v2はコマンド&コントロール サーバーからの応答に応じて、必要なDLLをダウンロードして次のアクションを決定します。
このブログの執筆時点では、このコマンド&コントロールのIPは機能を停止しているため、ホストへのトラフィックの分析は不可能です。追加のペイロードをどこからダウンロードするかや、それ以後の通信にどのIPアドレスを使用するかといった情報をコマンド&コントロール サーバーが提供していることは、以前ThreatLabzで確認済みです。
図24:Raccoon v2による抽出されたIPアドレスへのpingの実行
grepされたDLL
図25:ダウンロードされたRaccoon v2のDLL
Raccoon v2は、SHGetFolderPathWへのWINAPI呼び出しを使用して、C:\Users\<User>\AppDataへのパスを取得し、そこに「Local」を追加して、コマンド&コントロールに送信する前に盗んだ情報を保存するためのパスとして使用します。
図26:Raccoon v2のバッファー内のストレージ パス
侵害の痕跡(IoC)
分析したRaccoon v2のサンプルがコンタクトしたIP
55(.)195(.)166(.)184
他のサンプルでC2として機能するその他のIPのリストはこちらをご覧ください。
ダウンロードされたDLL
- nss3.dll
- sqlite3.dll
- GdiPlus.dll
- Gdi32.dll
Raccoon v2で使用されるパス
- C:\Users\<USERNAME>\AppData\Local
使用が確認されたRaccoon v2の他のサンプル
- 0123b26df3c79bac0a3fda79072e36c159cfd1824ae3fd4b7f9dea9bda9c7909
- 022432f770bf0e7c5260100fcde2ec7c49f68716751fd7d8b9e113bf06167e03
- 048c0113233ddc1250c269c74c9c9b8e9ad3e4dae3533ff0412d02b06bdf4059
- 0c722728ca1a996bbb83455332fa27018158cef21ad35dc057191a0353960256
- 2106b6f94cebb55b1d55eb4b91fa83aef051c8866c54bb75ea4fd304711c4dfc
- 263c18c86071d085c69f2096460c6b418ae414d3ea92c0c2e75ef7cb47bbe693
- 27e02b973771d43531c97eb5d3fb662f9247e85c4135fe4c030587a8dea72577
- 2911be45ad496dd1945f95c47b7f7738ad03849329fcec9c464dfaeb5081f67e
- 47f3c8bf3329c2ef862cf12567849555b17b930c8d7c0d571f4e112dae1453b1
- 516c81438ac269de2b632fb1c59f4e36c3d714e0929a969ec971430d2d63ac4e
- 5d66919291b68ab8563deedf8d5575fd91460d1adfbd12dba292262a764a5c99
- 62049575053b432e93b176da7afcbe49387111b3a3d927b06c5b251ea82e5975
- 7299026b22e61b0f9765eb63e42253f7e5d6ec4657008ea60aad220bbc7e2269
- 7322fbc16e20a7ef2a3188638014a053c6948d9e34ecd42cb9771bdcd0f82db0
- 960ce3cc26c8313b0fe41197e2aff5533f5f3efb1ba2970190779bc9a07bea63
- 99f510990f240215e24ef4dd1d22d485bf8c79f8ef3e963c4787a8eb6bf0b9ac
- 9ee50e94a731872a74f47780317850ae2b9fae9d6c53a957ed7187173feb4f42
- bd8c1068561d366831e5712c2d58aecb21e2dbc2ae7c76102da6b00ea15e259e
- c6e669806594be6ab9b46434f196a61418484ba1eda3496789840bec0dff119a
- e309a7a942d390801e8fedc129c6e3c34e44aae3d1aced1d723bc531730b08f5
- f7b1aaae018d5287444990606fc43a0f2deb4ac0c7b2712cc28331781d43ae27
まとめ
Malware-as-a-Serviceとして販売されているRaccoon Stealerは、ここ数年間でよく使用されるようになってきており、このマルウェアによるインシデントが一定数確認されています。また、作成者はこのマルウェア ファミリーに常に新機能を追加しています。Raccoon v2は、2019年の最初のリリースに続く、このマルウェア ファミリーの2つ目のメジャー リリースです。このような状況を踏まえると、Raccoon Stealerが今後も進化していき、組織にとって脅威となり続ける可能性が考えられます。
Zscalerの対応
このような攻撃で見られるペイロードには、高度な脅威シグネチャと当社の高度なクラウドサンドボックスによって確実に対応します。
図27:Zscalerのサンドボックスによる検出
Zscalerの多層クラウド セキュリティ プラットフォームは、さまざまなレベルで指標を検出します。詳細は以下のページでご確認ください。