※ 本ブログは、2021年6月28日にHP WOLF SECURITY BLOGにポストされたSnake Keylogger’s Many Skins: Analysing Code Reuse Among Infostealersの日本語訳です。
Snakeは、2020年11月下旬に初めて発見されたモジュール型の.NETキーロガーおよびクレデンシャルスティーラーです。それ以降、ほぼ毎日のようにこのマルウェアを拡散するキャンペーンが確認されています。Snakeの名前は、ログファイルで見つかった文字列と、文字列難読化コードに由来しています。このマルウェアのビルダーを使用することで、脅威アクターは必要な機能を選択・設定し、新たなペイロードを生成することができます。このため、実際に報告されるサンプルの機能はさまざまです。この記事では、Snakeの機能、感染チェーン、他の4つの汎用キーロガーとのコードの類似性について説明します。
2021年にSnakeを配信したキャンペーンでは、マルウェアの配布に悪質なスパムが使用されており、RTFまたはアーカイブの添付ファイルが使用されていました。
配信
Snakeの展開に使用された最初のタイプのダウンローダーは、よく知られているMicrosoft Office Equation Editorのエクスプロイト(CVE-2017-11882)を含むRTFドキュメントでした。このドキュメントは、ファイル拡張子を.DOCに変更し、正当な業務連絡を装った電子メールに添付されていました。受信者が脆弱なバージョンのMicrosoft Officeを実行している場合、このエクスプロイトは、リモートサーバーから実行ファイルをダウンロードして実行します。このファイルは、Snake キーロガーのパック版です。
2つ目の方法では、攻撃者は、パックされたSnake実行ファイルを含むアーカイブファイルを添付したスパムを送信します。受信者がアーカイブファイルを開くと、そこにはパックされたSnakeのコピーが含まれており、ユーザーは実行ファイルをダブルクリックして実行する必要があります。IMG、ZIP、TAR、Z、GZ、ISO、CAB、7z、RARの添付ファイルとしてSnakeが配布されていることがわかりました。
アンパックと実行
エンドポイント・セキュリティ・ツールによる検知の可能性を減らすために、分析したSnakeのサンプルはパックされていました。実行後すぐに、マルウェアは図4のプロセスに従って自らをアンパックします。
まず、マルウェアは、一般的なブロック暗号DESで暗号化されたファイルを、.NETファイルのリソースセクションに復号してロードします。
ファイルを復号化するためのキーは、ソースコードの文字列のSHA256ハッシュの最初の8バイトです。UTF-16でエンコードされているので、ファイルを復号化するためのハッシュを計算する際には、正しいエンコードを選択する必要があります。図5は、PerSec関数の第2引数として、キー(Unicode文字列)を渡しているところです。DESはブロック暗号なので、復号処理が複数のブロックの暗号文を処理する方法がわかるように、動作モードを指定する必要があります。Snakeのパッカーでは、電子符号表(ECB)モードを使用しているため、初期化ベクターは必要なく、暗号文とキーのみが必要となります。
復号化されたファイルは、CaptIt.dllというダイナミックリンクライブラリ(DLL)で、これがロードされます。このファイルには2つの暗号化されたファイルがリソースとして含まれており、実行時にアンパックされ実行されます。1つはSnakeキーロガーのペイロードで、もう1つはマルウェアの存在を隠すために使用される実行ファイルです。CaptIt.dllは、これらのファイルを復号化する前に、パックされた元の実行ファイルをユーザーのスタートアップフォルダ(C:Users<Username>AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup)にコピーするので、デバイスが再起動されるたびに実行されます。
今回は、ECB モードの AES が、CapIt.dll 内の DLL ファイルの復号に使用されます。ここでも、文字列のSHA256ハッシュがキーとして使われています。
この関数は,DLLの復号化に加えて,アンパックされたばかりのDLLのメソッド名に対応する文字列を復号化します。新しいスレッドで開始されるこのメソッドは、ファイルパスとペイロード名の2つの引数を想定しています(図9)。
CapIt.dllの2つ目の暗号化されたリソースは、CaptIt.dllと同じ方法で復号化されます。ECBモードのDESを使用し、引数としてメソッドに渡されたキーを使用します。
Snakeのペイロードは、プロセスハロウイング技術として知られるRunPEを使用して、正規のプロセスの中に隠されています。まず、第1引数として渡されたファイルパスを使って、サスペンドモードで新しいプロセスを開始します。続いて、Windows API の GetThreadContext、ZwUnmapViewOfSection、VirtualAllocEx、WriteProcessMemory、SetThreadContext、ResumeThread が呼び出されます。これらは、新たに作成されたプロセスのコンテキストをマルウェアに置き換えてから起動します。この関数のC#による実装がGitHubにありました。この時点で、Snakeのペイロードがアンパックされ、攻撃者が設定したモジュールの実行が開始されます。
コードの難読化
Snakeは.NETで書かれているため、ネイティブコードにコンパイルされるのではなく、プロジェクトに関するメタデータを含むMicrosoft Intermediate Languageにコンパイルされます。dnSpyなどのツールを使えば、元のソースコードとほぼ同じ構造を持つ逆コンパイル版のソースコードを復元することができ、解析が容易になります。しかし、.NETマルウェアを使用する多くの脅威アクターは、コードを難読化することで逆コンパイルを防ごうとします。2021年3月には、MalwareBazaarに報告されたSnakeのサンプルが5つのツールを使って難読化されていることがわかりました。
これらの難読化技術は、シンボルの名前を変えたり、コードの制御フローを複雑にしたり、文字列やリソースを暗号化したりすることで、ソースコードの解析を困難にします。幸いなことに、多くの場合de4dotプロジェクトやDeObfuscar-Staticプロジェクトのように、これらの難読化を逆手に取った対抗策が存在します。
Snakeはモジュラー方式を採用しているため、マルウェアをビルドする際にどのような機能を有効にするかによって、採取されたサンプルの挙動が異なります。ビルダーツールを使って機能を設定・作成している可能性が高いです。ビルダーは、選択した機能のみをペイロードに追加するのではなく、すべての機能を統合し、選択した機能のみを有効にするようです。図11はSnakeの機能をMITRE ATT&CKのテクニックにマッピングしたものです。
当然のことながら、Snakeキーロガーの機能のほとんどは、「認証情報へのアクセス」、「収集」、「持ち出し」の戦術カテゴリーに分類されます。以下は、Snakeの機能の説明です。
永続化
アンパックと実行のセクションで説明したように、マルウェアは自分自身をスタートアップフォルダーにコピーし、デバイスの再起動後に再び起動されるようになっています。さらに永続化の機能として、Snakeキーロガーには実行レジストリキーを作成するオプションがあります。これも同様の効果があり、コンピューターのスタート時にマルウェアが起動します。
防衛回避
Snakeは2つの防衛回避テクニックを使用しています。1つ目は、リストされたセキュリティツールのプロセスを終了させる機能です。これには、アンチウイルスプロセスや、マルウェアの分析によく使われるツールが含まれます。OllyDbgの場合、プロセス名のスペルが間違っていたため、Snakeはプロセスの終了に失敗しました。さらに、最近のアンチウィルス・プログラムは、自分自身を再起動するか、マルウェアが適切な権限なしにプロセスへのハンドルを開くのを防ぐためにカーネル・ドライバを使用しているので、このテクニックでは終了できません。2つ目のテクニックは、Snakeが感染したシステムから自身を取り除き、自身のプロセスを終了させる自己終了機能です。
認証情報へのアクセス
Snakeの機能のほとんどは、認証情報や設定など、感染したコンピュータからの機密情報の収集に関するものです。Snakeは、ウェブブラウザのデータベース、電子メールクライアント、DiscordやPidginなどのチャットクライアント、WiFiネットワークの保存されたパスワードなどのログイン認証情報を解析します。Snakeは、Google Chrome、Mozilla Firefox、Microsoft Edgeだけでなく、あまり知られていないいくつかのWebブラウザからも認証情報を抽出することができます。また、Microsoft Outlook、Mozilla Thunderbird、Foxmail、Postboxなど、さまざまな電子メールクライアントからも認証情報を盗み出すことができます。すべての認証情報窃取モジュールの完全なリストは、Appendixに記載されています。
探索
認証情報を取得する前に、Snakeは一連のホストおよびネットワークチェックを行い、被害者の環境内のサンドボックスで実行されているかどうかを判断します。ホスト探索機能では、オペレーティングシステムのバージョン、コンピュータ名、ハードディスクのサイズ、時刻と日付の設定、インストールされているRAMなどをチェックします。あるサンプルでは、チェックをパスするために、ホストに3.75GB以上のRAMが搭載されていることと、ホスト名がブロックリストの名前と一致しないことが必要でした。さらに、ネットワーク探索機能は、オンライン・サービスのcheckip.dyndns[.]orgを使ってクライアントのパブリックIPアドレスを解決します。パブリックIPがマルウェア分析サービスで使用されているアドレスのブロックリストと一致した場合、Snakeは認証情報の窃盗を実行しません。パブリックIPアドレスを使用し、Snakeはfreegeoip[.]appサービスを使用したおおよそのジオロケーションの解決を行います。SnakeのUser-Agent(Appendixを参照)を持つドメインは、Snakeの存在を検知するために使用できます。
収集
また、Snakeは機密情報を含む可能性のある設定ファイルを収集します。Snakeがターゲットにしているプログラムの一つにFileZillaがあります。FileZillaはFTPクライアントとして使用されるため、以前アクセスしたサーバーの設定を保存します。また、Snakeは感染したシステムのWindowsプロダクトキーを探します。もう1つの機能は、Snakeのクリップボードスティーラーで、最初の実行時に1回ではなく、定期的に実行される点が他のスティーラー機能と異なります。このモジュールは、クリップボードの内容を保存します。クリップボードには、パスワードマネージャーからコピーされたときに一時的に保存されるパスワードなどの機密情報が含まれている可能性があります。またSnakeは、感染したシステムのスクリーンショットを定期的に撮影します。これらの画像は、攻撃者に送信されるまで、ユーザーのドキュメントフォルダー内の "Snake keylogger" というフォルダーに保存されます。後に、画像は削除されます。Snakeのキーロガー機能は、SetWindowsHookExA APIを呼び出すことでバックグラウンドで永続的に実行され、それによってキーボードフックチェーンに自身を追加します。キーが押されるたびに、コールバック関数が呼び出され、入力を保存してフックチェーンの次のリンクに呼び出しを渡します。収集された入力は、複数用意されている持ち出し機能のいずれかを使って、定期的に攻撃者に送り返されます。興味深いことに、2020年2月末以降に発見されたSnakeキーロガーのサンプルでは、キーロガーモジュールが起動していませんでした。これが攻撃者側のミスなのか、それとも意図的に選択したものなのかは明らかではありません。
持ち出し
Snakeには、設定可能な持ち出し経路がいくつかあります。FTPプロトコルを使用してデータをサーバーにアップロードするオプション、Eメールでデータを添付ファイルとして送信するオプション、POSTリクエストを介してTelegramでデータを公開するオプションがあります。攻撃者は、ビルダーを使用してマルウェアを構成する際に、これらの持ち出しテクニックのうちどのテクニックを選択するかを決定します。そのため、必要な認証情報、設定、トークンなどは、マルウェアに直接保存されます。我々が観測したサンプルでは、攻撃者はTelegramまたはEメールを介してデータを持ち出すことを好んでいました。
影響
このマルウェアは、エンドポイントの防御を回避するためにセキュリティプログラムを終了させる機能に加えて、Chromeウェブブラウザーを終了させる機能も備えています。Webブラウザの終了は、予防や検知のために行われるものではないため、別の理由があるはずです。1つの可能性として、SnakeはChromeが起動していない場合にのみ、Chromeに保存された認証情報にアクセスすることができます。Matiexと呼ばれる別のキーロガーにもこの欠陥があり、2つのファミリーがコードを共有しているのではないかと疑われています。
2020年11月、あるマルウェア研究者がSnakeとMatiexの間にコード上のつながりがある可能性についてコメントしました。ハッキングフォーラムの広告によると、Matiexの開発者は、マルウェア・アズ・ア・サービスで一般的なサブスクリプションモデルを使用して、マルウェア・クライアントを設定、生成するために使用するキーロガービルダーを販売していました。
この2つのマルウェアファミリーのソースコードを比較すると、多くの類似点が見つかりました。2つのマルウェアファミリーは、同じアンチウイルスやセキュリティツールのプロセスのリストを終了させる関数を持っています。
さらに、どちらも同じコマンドを使って自分自身をアンインストールする手続きを持っています。
また、記録されたキーストロークをPOSTリクエストでアップロードする関数も同じです。
どちらのファミリーも、Telegramによりデータを持ち出すオプションを持っています。関数の内容は同じですが、名前が違います。
両者のGeoIP関数の違いは、名前だけです。
ロギング関数中に、キーロガーの名前が明示されています。しかし、コードは変数名も含めてほぼ同じです。
TheInfoは、感染したシステムの情報を含む変数です。MatiexはSnakeよりもはるかに多くの情報を収集し、それを攻撃者に送信します。一方、SnakeにはAntiBot関数があり、感染したシステムにブロックリストに登録されたIPアドレスやホスト名があった場合、マルウェアを終了させます。
両ファミリー間で使用される変数名の多くは似ています。例えば、持ち出しチャネルは、両ファミリーの文字列変数によって類似の定義がなされています。さらに、キーロガークラスは同じ名前で、どちらも同じ初期値を持つ変数HSHCheckerを持っています。
上記のようなコードの類似性と対応するマルウェアの分析結果から、MatiexとSnakeは同じコードベースを共有しており、Snakeは前者から派生したものである可能性が高いと考えられます。このファミリーには、いくつかの細かい違いもあります。
問題は、いつ、どのようにしてMatiexのソースコードがSnakeに再利用されたのかということです。2021年2月、アンダーグラウンドなフォーラムで、Matiexのソースコードが売りに出されました。1つの可能性として、誰かがMatiexのソースコードを購入し、それをSnakeにリブランドしたと考えられます。しかしながら、Snakeが最初に目撃されたのは、ソースコードが売りに出される数ヶ月前だったので、Snakeの開発者は別の方法でMatiexのソースコードを入手したのでしょう。
今回の調査では、Matiexに類似したサービスとして宣伝されている他の.NETキーロガーを発見しました。404、Cheetah、Phoenixの各キーロガーのコードを分析すると、これらもMatiexと非常によく似ていることがわかりました。図22は、各ファミリーがサービスとして販売された時期と、そのソースコードが販売された時期を示しています。
異なるキーロガーのコードの類似性を見て、私たちは驚かされました。404とPhoenixキーロガーは、キーストロークを記録する関数がわずかに異なり、Pastebin APIを使用してデータを持ち出すことができますが、それ以外は他のファミリーと極めて似ています。Cheetahは、SnakeやMatiexと同じキーロガー関数を使用していますが、パスワードを抽出するためのモジュールが少ないのが特徴です。データはSnakeと同じようにTelegram、FTP、SMTPを介して持ち出します。
Snakeを分析すると、確かに包括的なキーロガーでデータスティーラーであることがわかりました。我々の分析によると、過去2年間に活動した5つのキーロガー・ファミリーは、同じコードベースから派生したものである可能性が高いと考えられます。また、これは網羅的なリストではないため、同様のコードを持つ他のキーロガーが流通している可能性もあります。このように、既存のマルウェアファミリーのソースコードを日和見的にコピーする「リミックス」行動は、サイバー犯罪者がいかに簡単に独自のMalware as a Serviceビジネスを構築できるかを示すものであり、企業の防御力がマルウェア開発者の先を行くことの重要性を示しています。
Snakeの認証情報窃盗モジュール:
Outlook | Chrome | Cent | Yandex | FireFox |
Foxmail | Coowon | xVast | Nichrome | WaterFox |
Kinzaa | CocCoc | Chedot | Amigo | Thunderbird |
Sputnik | Uran | Superbird | Kometa | SeaMonkey |
Falkon | 360_English | Xpom | IceDragon | |
SalamWeb | orbitum | 360_China | Elements | CyberFox |
CoolNovo | Slimjet | Comodo | Microsoft | Slim |
QIPSurf | Iridium | Brave | Opera | IceCat |
BlackHawk | Vivaldi | Torch | FileZilla | PostBox |
7Star | Iron | UC | Pidgin | PaleMoon |
Sleipnir | Chromium | Blisk | Liebao | TheWiFi_Orginal |
Citrio | Ghost | Epic | avast | WindowsProductKey_Orginal |
Chrome_Canary | Discord |
除外IPアドレス:
Author : Patrick Schläpfer
監訳:日本HP