Egregorランサムウェアについて分析 2020年12月7日 Minervaのブログから
調査チームは、Egregorランサムウェアについて感染手口のプロセス及び今後さらに進化していくランサムウェア脅威を見据え、攻撃手法や検知回避など全てに渡り徹底的に調査を実施しました。
Egregorランサムウェアの感染拡大とエクスプロイトコードが、Sekhmet或いはMazeランサムウェアに類似している点を確認しました。さらMazeやEgregorランサムなどは、悪意コードが難読化された手法で組み込まれており、分析するのに多くの時間を費やす結果となりました。
今回のブログでEgregorランサムウェアについてご紹介します。今回の調査で難読化されたランサムウェアをMinervaレスポンスチームが、難読コードを解いたプロセスなどもご紹介します。
ローダー
今回のランサムウェアは、b.dllというDLLファイル名で攻撃を実行しようとしました。以下のスクリーンショットは実際のイベントです。
この悪意のエクスプロイトコードを分解すると、コンパイラーベース手法で難読化されており、分析に多大な時間を費やすことになりました。例えば、以下のDllRegisterServer関数を参照ください。IDAグラフ上でランサムウェアが実行されるまでのプロセスを表示しています。
Egregorの構図は、Mazeランサムウェアと同類タイプである事が判明し、Egregorの難読コードと照らし合わせ、Bluelivというウエブサイトに掲載されているMazeランサムコードの解除スクリプトを参考にしながら分解することに成功しました。
ローダーは“--nop”というコマンドラインをクエリーして来ます。存在に気づかれると攻撃がシャットダウンします。
さらに自己解凍するために、バイナリ・ラージ・オブジェクトが以下のステップに従い復号化されます。
- バイナリ・ラージ・オブジェクトは、ハードコーディングされたキー(今回のケースは0x4)で排他的論理和(xor)がデコードされる。
- 排他的論理和のデータは、WindowsのAPI関数であるCryptStringToBinaryAを使用して、ベース64でデコードされる。
- ハードコーディングされた鍵と初期化ベクトルは、ChaCha20アルゴリズム用に初期化され、ペイロードの最終復号化で使用される。マルウェア作成者は、鍵の変更回数をデフォルトの20回から4回に変更。
2回目のペイロードでDLLファイルが復号化された後、ページアクセス権(パーミッション)RWXとVirtualAllocを使用して、新規アロケーションへコピー作成されます。
初期ローダーの最終ステージでは、メモリー上にペイロードの準備を行います。マルウェアは復号化されたペイロードがロードされ、次のステージを実行するためにCreateThread関数を使用します。
次のステージではコマンドラインの構文解析を行い、ランサムウェアバイナリーを復号するためにパスワードを含むパラメータ”-p”を検索します。このランサムウェアは、ストリーム暗号を使っていくつかの定数をRabbit暗号と共有して復号します。
ランサムウェアコード
ランサムウェアは、「DllEntryPoint」という名前のエクスポートが、1つだけあるDLLファイルとしてコンパイルされます。
この関数は、ランサムウェアのメインサブルーチンを実行するスレッドを作成します。
ランサムウェアの悪意のプログラムが起動する前に関数が呼ばれ、各国の地域コードが決められます。ランサムウェアは、3つの異なるAPI関数を使用しますが、ロシア又はCIS諸国のコンピューターは、攻撃をしかけないように設定されています。
以下のローカルコードを認識した場合、Egregorランサムウェアは活動を停止します。
Locale Code |
Country |
0x843 |
Uzbek - Cyrillic |
0x819 |
Russian - Moldova |
0x440 |
Kyrgyz - Cyrillic |
0x442 |
Turkmen |
0x82C |
Azerbaijani |
0x423 |
Belarusian |
0x42B |
Armenian |
0x443 |
Uzbek - Latin |
0x43F |
Kazakh |
0x437 |
Georgian |
0x42C |
Azerbaijani |
0x818 |
Romanian - Moldova |
0x444 |
Tatar |
0x428 |
Tajik |
ローカルコードを確認した後、ランサム設定は実行可能なデータセクションにあるバッファーから復号化されます。暗号化設定の最初の8バイトは、復号前に構文解析によってスキップされるPNGヘッダーから始まります。8バイトに続く“d”から始まるワードは、復号するためのデータ設定のサイズが包含されています。オフセット12から始まり、データ設定は改良型のストリーム暗号ChaCha20とハードコーディングされた鍵と初期化ベクトルを使用して復号されます。
暗号化されたインメモリのデータ設定
Configurationクラスの初期化関数の逆コンパイル
構造データは、いくつかの興味深い設定がありましたので記載します。
- ランサムノート
- プロセス停止リスト
- アルゴリズムを停止するためのブラックリスト化されたキーワード
- ファイルを暗号化するハードコードRSA2048ビッド公開鍵
- リモートアドレスの存在を指標するフラグ
暗号化されたワークステーションのフィンガープリントを作成するために、Egregorランサムは、いくつかのAPI関数を使ってマシン情報を抽出します。
ランサムウェアは、デバイスと接続しているロジカルディスクのファイル名とタイプを認識するためや、更にはそれぞれどのくらいの空き容量があるのか特定するために、API関数である"GetLogicalDriveStrings” と “GetDiskFreeSpace”使用します。
ランサムウェアのRSA暗号の公開鍵は、暗号化されたデータ設定に保管されています。
各実行ファイルには、プライベート鍵と公開鍵のペアーが生成されています。公開鍵は対称鍵を暗号化するのに利用します。固有の対称鍵は、各ファイルを暗号化する際に生成されます。
Egregorの鍵が、生成される構図は以下になります。
- 2048ビットRSA鍵ペアーは、”CryptGenKey”を使用して生成される。これがセッション鍵である。
- API “CryptExportKey”を使用して鍵は、エクスポートされる。
- エクスポートされたプライベート鍵は、鍵と初期化ベクトルを無作為に利用し、ChaChaで暗号化する。
- ChaCha鍵は、”Crypt Encrypt”関数と埋め込まれたRSA公開鍵データを使って暗号化する。
- 暗号化されたChaCha鍵と暗号化されたセッション鍵は、ハードコーディングされたパス上にあるディスクへ保存される。(今回のケースは%ProgramData%\dtb.dat.)
このランサムウェアは、同じプロトコールでセッション鍵を暗号化し、ランサムペイロード(Rabbit)を復号します。これは注目に値します。
このランサムウェアはマシンを暗号化する前に特定のプロセスとサービスを停止させます。ハードコードプロセス名のリストは暗号化された設定ファイルに保管され、マルウェアは稼働しているプロセスを列挙するために”NtQuerySystemInformation”を使用し、停止する時は”NtTerminateProcess”関数を使います。
今回のケースではプロセスリストは停止されました。
アルゴリズムの停止に関していえば、ランサムウェア設定においてどのサービスが停止されるのか決定するのに用いられます。サービス名を列挙するために、API関数”EnumServicesStatus”を使用します。ブラックリストに紐づけされたサービスは、Windows Service Control Manager APIを使用して止めます。以下はサービスリストのキーワードです。
Egregorランサムウェアは、ハードコードされたHTTP URLへ接続できる特性を備えています。設定にオフセット0x3a31e と0x32fbが0を含まなければ、このランサムウェアは、IPアドレス/DNS名(設定上に埋め込まれている)へ接続し、改良型ストリーム暗号ChaCha20とBase64を使ってコンテンツをデコードします。
IDAPythonの難読化解除スクリプトはこちら
Minerva製品(Minerva Armor)についてのお問い合わせはPico Technologies (info@pico-t.co.jp)までお願い致します。