サイバーリーズンのGSOC(グローバルセキュリティオペレーションズセンター)では、影響力のある新たな脅威に関する情報をお客様に提供するために、『サイバーリーズン脅威アラート』を発行しています。サイバーリーズンの脅威アラートは、脅威に関する調査結果をまとめた上で、それらの脅威から身を守るための実践的な提案を提供するものです。

この脅威分析レポートでは、Cybereason GSOCがネット界隈ではあまり知られていないLockBit 3.0のビルダーとDLLバイナリについての調査結果を紹介します。

重要なポイント

  • 市場の拡大:LockBitランサムウェアグループは、さまざまなツールを、常にそれらのアップデートも提供しているほか、データ流出のような特定の目的に応じたツールも提供しています。さらに、同ランサムウェアグループは、ロケーションチェックをオプションにすることで、標的とする地域を拡大しています。このようなアップデートによって、アンダーグラウンド市場のより多くの人々にアピールすることを目的として行われています。
  • バイナリのカスタマイズが可能:LockBitビルダーは、LockBitランサムウェアのバイナリをビルドするための各種オプションを提供するほか、LockBitの動作を変更するためのコンフィグレーション(構成)オプションや、複数のバイナリタイプも提供します。これらのオプションを利用することで、同ランサムウェアのアフィリエイトは、各自の運用ニーズに合わせてLockBitをカスタマイズできます。
  • 難読化への投資:LockBit 3.0ランサムウェアはパスフレーズ保護でよく知られていますが、デバッガフッキングの除去や自己削除など、その他の難読化手法も採用しています。同ランサムウェアは、防御者による検知を回避するために、難読化手法やアンチ分析手法に多くの投資を行っていることで知られています。

はじめに

LockBitは、2019年から活動しているランサムウェアオペレーショングループです。LockBitランサムウェアは、ランサムウェアアフィリエイトコミュニティにおいて、人気のあるRaaS(Ransomware-as-a-Service)の選択肢の1つとなっています。このような人気の高さを踏まえて、同ランサムウェアグループは、アンダーグラウンド市場での需要に応えるために、さまざまなバージョンの作成とアップデートを行ってきました。

LockBit:豊富なバリエーション

Windowsを標的とするLockBitの既知のバージョンとしては、現時点で次のものがあります。

  • LockBit
  • LockBit 2.0
  • LockBit 3.0(LockBit Black)
  • 2023年以降に導入された2つの新バージョン
    ‒ LockBit Green(Contiランサムウェアをベースとするもの)
    ‒ Lockbit Red(その実体はLockbit 2.0と同じ)

LockBitランサムウェアは、2019年9月に最初のバージョンをリリースした後、絶えずアップデートが行ってきました。注目すべきアップデートは以下の通りです。

  • LockBit to Lockbit 2.0
    ‒ vssadminを使ってシャドウコピーを削除
    ‒ ユーザーアカウント制御(UAC)を回避
    ‒ プリンターを使って身代金要求書を印刷
    ‒ 自己伝播
  • LockBit 2.0 to LockBit 3.0
    ‒ BlackMatterランサムウェアのロジックを導入
    ■ Windows Management Instrumentation(WMI)を使ってシャドウコピーを削除
    ■ パスワード保護
    ■ システムサービスを使って永続化を確立
    ■ API情報の収集
    ■ 身代金要求書をデスクトップの壁紙として出力

LockBitランサムウェアグループは、独自ツールの開発に多大な投資を行っています。これは、タイムリーなバージョンアップや、独自の流出ツールであるStealBitを作成していることからも明らかです。

また、LockBitランサムウェアグループは、Linux端末を標的とするLockBit Linux/ESXiのようなツールを通じて、標的とするOSの種類を増やすことにより、意欲的に市場を拡大しています。さらに、LockBitランサムウェアグループは、ランサムウェアグループのオペレーションを「改善」するために、バグバウンティプログラム(バグの発見者に報奨金を与える制度)を導入していることでも知られています。

Lockbitビルダー

LockBitランサムウェアグループが積極的なオペレーションを実施し、アフィリエイトの要求に応えていたにもかかわらず、2022年9月、ali_qushjiという名のTwitterユーザー(このアカウントは現在停止中です)がLockBit 3.0ビルダーをGitHubにアップロードし、誰もが同プログラムをダウンロードできるようにしました。このリークにより、防御者は同ランサムウェアをさらに分析し、より深く理解できるようになりました。その一方で、このリークにより、BlooDy Ransomware Gangなど、同ビルダーを悪用する他のランサムウェアギャングも現れる結果となりました。


@3xp0rtによるLockBitビルダーのリークに関するツイート

LockBitの実行ファイルはランサムウェアのアフィリエイトが利用する最も一般的なバイナリですが、ビルダーはさらに2つの実行ファイルを提供します。

  • Lb3_rundll32.dll:LockBitが必要とする機能を実行する複数のエクスポート関数を備えた、通常のダイナミックリンクライブラリ(DLL)です。
  • Lb3_reflectivedll_dllmain.dll反射型インジェクションを実装するために設計されたDLLです。

このレポートでは、テクニカル分析の章に、次の2つのセクションを設けています。

  • LockBitビルダーの分析:ビルダーの構成についての概要を示し、それが実行するバイナリの作成プロセスを紹介します。
  • LockBitバイナリの分析:ビルダーが作成する2つのDLLバイナリに関する重要なポイントを紹介します。

テクニカル分析

テクニカル分析のセクションでは、LockBitビルダーと同ビルダーが生成する2つのDLLバイナリに焦点を当てます。

■LockBitビルダーの分析
本セクションでは、LockBitビルダーの概要を示した上で、それが実行する構築プロセスについて詳しく説明します。このセクションでは、次のSHA-256(Secure Hash Algorithm-256)シグネチャを持つサンプルを分析しています。

ファイル名 SHA-256
LockBit3Builder.7z 453EEBD2DCF98E15E9CCAB2C7064
38A9D34497631DB1F64B6FE9CC3ED
41696DA
Build.bat 8E83A1727696CED618289F79674B97
305D88BEEEABF46BD25FC77AC53C
1AE339
builder.exe E8E2DEB0A83AEBB1E2CC14846BC71
715343372103F279D2D1622E383FB26
D6EF
config.json 3F7518D88AEFD4B1E0A1D6F9748F9
A9960C1271D679600E34F5065D8DF
8C9DC8
keygen.exe BB76F4D10EC2C1D24BE904D2EE078
F34A6B5BD11F3B40F295E116FEA448
24B89

■LockBitビルダーの概要
アーカイブファイルLockBit3Builder.7zには、5つのコアコンポーネントが含まれています。

  1. Build:ビルダーが関連ファイルを出力するディレクトリです。
  2. Build.bat:下記ファイルをビルドするために、一連のコマンドを実行するbatスクリプトです。
    ‒ 暗号化/複合化キー
    ‒ LockBit 3.0デクリプター
    ‒ Decryption_idテキストファイル
    ‒ LockBit 3.0
    ‒ マニュアル
  3. builder.exe:LockBit 3.0とデクリプター(複合化を行うツール)をビルドする実行ファイルです。
  4. config.json: LockBit 3.0の構成ファイルです。
  5. keygen.exe:Lockbit3.0が暗号化と復号化を行うための公開鍵および秘密鍵を生成する実行ファイルです。


▲LockBit30.7zアーカイブの内容

Build.batスクリプトには、LockBit 3.0のビルドに必要となる複数のコマンドが含まれています。各コマンドラインと、それが実行する操作を下記に示します。

  • keygen
    ‒ keygen.exeを実行することで、2つの鍵を作成します。
    ■ pub.key:LockBit 3.0のメインの暗号化に使用される鍵です。
    ■ priv.key:LockBit 3.0の実行後、暗号化されたファイルを復号化するために使用される鍵です。
  • builder -type dec
    ‒ builder.exeを実行し、LockBit 3.0デクリプターをビルドします。同コマンドラインには、Keygenにより生成された秘密鍵とconfig.jsonが埋め込まれています。
  • builder -type enc -exe
    ‒ builder.exeを実行し、LockBit 3.0の実行ファイルをビルドします。同コマンドラインには、Keygenにより生成された公開鍵とconfig.jsonが埋め込まれています。
    ‒ -passオプションを指定すると、builder.exeは、パスフレーズ保護されていない実行ファイルと、パスフレーズ保護された実行ファイルの両方を作成します。
  • builder -type enc -dll
    ‒ builder.exeを実行し、LockBit 3.0のDLLファイルをビルドします。同コマンドラインには、Keygenにより生成された公開鍵とconfig.jsonが埋め込まれています。
    ‒ -passオプションを指定すると、builder.exeは、パスフレーズ保護されていない実行ファイルと、パスフレーズ保護された実行ファイルの両方を作成します。
  • builder -type enc -ref
    ‒ builder.exeを実行し、反射型DLLインジェクション用のLockBit 3.0 DLLファイルを構築します。同コマンドラインには、Keygenにより生成された公開鍵とconfig.jsonが埋め込まれています。


▲Builder.batファイルの内容

Build.batスクリプトの分析に基づくならば、LockBit 3.0とデクリプターはkeygen.exeとconfig.jsonに依存しています。このような依存関係から、LockBit 3.0のビルドプロセスは次のようになると想定されます:


▲LockBit Builder.batの実行フロー

Builder.datの実行が完了すると、関連するファイルがBuildフォルダー内に出力されます。


▲ビルダーの実行が完了した時点でダンプされるファイル

■ビルダーのコマンドラインオプション
Builder.batスクリプトは、builder.exeとkeygen.exeの両方で実行可能なコマンドラインオプションを導入しています。Builder.batは、暗号化/復号化キー、LockBit 3.0、およびデクリプターをビルドするためのサンプルリファレンスであると思われます。

builder.exeおよびkeygen.exeは次のコマンドラインオプションを利用できます。

実行ファイル コマンドライン
オプション
要約
builder.exe -config config.jsonのパス
-dll DLL形式でLockbitを作成するフラグ
-exe 実行ファイル形式でLockbitを作成するフラグ
-ofile 出力ファイルのパス
-pass パスフレーズ保護付きのエンクリプター(暗号化を行うツール)を作成するフラグ
-pubkey keygen.exeで生成された公開鍵のパス(デクリプターの作成に使用される)
-privkey keygen.exeで生成された秘密鍵のパス(エンクリプターの作成に使用される)
-ref 反射型DLL形式でLockbitを作成するフラグ
-type エンクリプター(enc)またはデクリプター(dec)を作成するためのオプション。Typeの引数としてencが選択された場合、-exe、-dll、-refのいずれかを選択するオプションを使用できる
keygen.exe -path 作成された公開鍵と秘密鍵の出力先ディレクトリのパス
  -pubkey 公開鍵の名前
  -privkey 秘密鍵の名前

keygen.exeは、その名が示す通り、公開鍵と秘密鍵を作成する実行ファイルです。これらの鍵は、LockBit 3.0およびデクリプターにおいて、実行時に暗号化/復号化を行うために使用されます。

builder.exeの実行ファイルでは、コマンドラインオプションでファイル形式を選択できます。これまで見つかった最も一般的なファイル形式は実行ファイル(-exe)ですが、builderはDLL(-dll)または反射型DLL(-ref)形式というオプションも提供しています。LockBit 3.0のファイル形式におけるこれらのオプションを利用することで、脅威アクターは、さまざまな攻撃ベクターを使って被害者の環境を感染させることが可能となります。

Builder.exeは、-config引数に指定された設定ファイルconfig.jsonを読み込むことによりLockBitを設定します。また、LockBitをコマンドラインオプション-pass付きで設定すると、バイナリをアンチ分析用のパスフレーズ保護された状態でビルドできます。

■設定
builder.exeは、LockBit 3.0の各種設定を含むconfig.jsonファイルを提供します。config.jsonファイルのconfigキーには10種類のキーが含まれています。また、settingsキーには、LockBitの動作を変更するためのメインの設定が記述されています。


▲Config.jsonファイルの内容

設定(settings)
オプション
要約
encrypt_mode LockBit暗号化モード。“auto”または“fast”のいずれかを設定可能
encrypt_filename 暗号化されたファイルのファイル名を難読化するフラグ。
デフォルト値は “False”
impersonation impers_accountsに登録されている管理者アカウントの実行を偽装(トークンの成り済ましを実施)するフラグ。
デフォルト値は“True”
skip_hidden_folders 隠しフォルダーの暗号化を行わないようにするフラグ。
デフォルト値は “False”
language_check 被害者端末の言語が旧ソビエト連邦諸国内のものであるかを確認するフラグ。
デフォルト値は“False”
local_disks ローカルドライブを暗号化するフラグ。デフォルト値は“True”。これが設定されている場合、ローカルディスクは暗号化さない
network_shares ネットワークドライブと共有フォルダーを暗号化するフラグ。
デフォルト値は“True”
kill_processes kill_processesにリストされている指定のプロセスを終了させるフラグ。
デフォルト値は“True”
kill_services kill_servicesにリストされている指定のサービスを終了させるフラグ。
デフォルト値は“True”
running_one 1つのプロセスだけが実行されていることを保証するフラグ。複数のプロセスが存在する場合、ミューテックス機構が作成される。
デフォルト値は“True”
print_note 感染先の端末から利用可能なプリンターを通じて、readme.txtをプリントアウトするフラグ。
デフォルト値は“True”
set_wallpaper デスクトップの壁紙を設定するフラグ。
デフォルト値は“True”
set_icons 暗号化されたファイルのアイコンを変更するフラグ。
デフォルト値は“True”
send_report C2サーバーと通信するフラグ。
デフォルト値は“False”
self_destruct 自分自身を削除するフラグ。
デフォルト値は“True”
kill_defender Windows Defenderを終了させるフラグ。
デフォルト値は“True”
wipe_freespace 被害者端末の空きストレージ領域を削除するフラグ。
デフォルト値は“False”
psexec_netspread PSExec経由でラテラルムーブメントを行うフラグ。
デフォルト値は“False”
gpo_netspread グループポリシー経由でラテラルムーブメントを行うフラグ。
デフォルト値は“True”
gpo_ps_update PowerShell経由でシステムグループポリシーを更新するフラグ。
デフォルト値は“True”
shutdown_system システムをシャットダウンするフラグ。
デフォルト値は“False”
delete_eventlogs Windowsのイベントログを削除するフラグ。
デフォルト値は“True”
delete_gpo_delay 実行後にグループポリシーを削除するフラグ。
デフォルト値は“1”

特定の構成(config)に関しては、次のような追加設定用のリストが用意されています。

構成(config)
オプション
要約
white_folders 指定されたフォルダーの暗号化を防ぐ、フォルダーの除外リスト
white_files 指定されたファイルの暗号化を防ぐ、ファイルの除外リスト
white_extens 指定されたファイル拡張子を持つファイルの暗号化を防ぐ、ファイル拡張子の除外リスト
white_hosts 指定されたホストの暗号化を防ぐ、ホストの除外リスト
kill_processes settingsのkill_processesがtrueに設定されている場合に、終了させるプロセスのリスト
kill_services settingsのkill_servicesがtrueに設定されている場合に、終了させるサービスのリスト
gate_urls C2ドメインのリスト
impers_accounts 成り済ましを行うユーザーアカウントとパスワードのリスト
note 身代金要求書の内容

コマンドライン引数やconfig.json内での設定により、LockBitビルダーの実行フローは変化します。次のセクションでは、LockBitビルダーの実行フローについて詳しく説明します。

ビルダーの実行フロー

builder.exeは、ビルドするバイナリに適したテンプレートを取得するために、まず-typeオプションの引数を確認します。-typeオプションには次の引数を指定できます。

  • enc:Lockbit
  • dec:Lockbitデクリプター
    -typeがdecである場合、builder.exeは、コマンドラインオプション-configおよびprivkeyの値、そして.rsrcセクションにあるデクリプターテンプレートの報を取得した上で、デクリプターをビルドします。
    -typeがencである場合、builder.exeはさらに7つのコマンドラインオプションを取得します。builder.exeが取得するコマンドラインオプションは、次の通りです。
  • -exe
  • -pass
  • -dll
  • -ref
  • -config
  • -pubkey
  • -ofile

builder.exeは、-type encのコマンドラインオプションの詳細を取得した後、Lockbitのファイル形式をチェックします。コマンドラインオプションに見られるように、ビルダーはファイル形式が実行可能(-exe)、DLL(-dll)、または反射型DLL(-ref)のうちどれであるかを確認します。デクリプターと同様に、各実行ファイルタイプは.rsrcセクション内にそれぞれのテンプレートを有しています。

DLLおよび実行ファイルを作成する場合、builder.exeは、設定パス、公開鍵パス、出力ファイルパス、パスワード保護フラグを引数として受け取ります。反射型DLLを作成する場合、builder.exeは、-pass引数を除いて、DLLおよび実行ファイルを作成する場合と同じ引数を受け取ります。


▲基本的なbuilder.exeコードの実行フロー

ファイルの作成中に、実行フローは、LockBit 3.0バイナリに組み込むために、config.jsonとpub.key内に記載されている設定値を準備します。config.jsonとpub.keyの準備フローは次のようになります。

  1. 設定ファイル(config.json)を取得する。
  2. 公開鍵ファイル(pub.key)を取得する。
  3. 取得した公開鍵や設定データを、割り当て済みのヒープに割り当てる。
  4. ステップ3で割り当てたヒープに格納されているデータをaPLibで圧縮する。
  5. さらに、ステップ4のヒープをXORで暗号化する。
  6. それぞれのリソースを取得する。
  7. .rsrcセクション内にあるバイナリテンプレートの.xyzセクションを.pdataへとリネームする。
  8. ステップ5で暗号化したヒープデータを.pdataに格納する。


▲LockBitによるファイル生成の実行フロー

PEの準備が整った時点で、ビルダーは、最後のコマンドラインオプションである-pass引数の内容を確認します。

パスフレーズ保護

コマンドライン引数-passは、バイナリにパスワード保護を適用し、静的な分析を妨げるためにコードを難読化するよう指定するものです。-passオプションを指定すると、builder.exeは、.text、.data、.pdataセクションを難読化します。続いて、builder.exeは、.itextセクションをLockBitバイナリに取り込みます。.itextセクションにはバイナリのエントリーポイントが含まれているほか、実行時に提供されたパスフレーズでバイナリの難読化を解除する関数も含まれています。

-passフラグが設定されていない場合、builder.exeは、.text、.data、.pdataの各セクションを難読化しません。この場合、builder.exeは.itextセクションの更新へと進み、特に関連セクションの難読化解除を行う関数を更新します。


▲.itextセクションを空の関数(DLL)へとアップデート

builder.exeは、関数内のコードをすべて削除し、実行ファイル内の16進数値である0xC3および0x0CC2(これらはどちらもret命令です)を更新します。


▲.itextセクションの比較

builder.exeは難読化を完了すると、更新されたバイナリをディスク上にダンプします。パスワード保護されたバイナリの場合、builder.exeは、バイナリタイプごとに、Password_dll.txtとPassword_exe.txt内にパスフレーズを提供します。


▲Password_dll.txtとPassword_exe.txt

反射型DLLはコマンドラインオプションに対応していないため、パスワード保護をサポートしておらず、そのテンプレートには.itextセクションが含まれていません。


▲反射型DLLバイナリ

■LockBitバイナリのテンプレート
builder.exeのリソースセクションには、LockBit 3.0とデクリプターのバイナリテンプレートが含まれています。前節で述べたように、builder.exeは、コマンドラインオプションで宣言されたバイナリタイプに応じて異なるテンプレートを使用します。
ビルダーのリソースセクションには、次のような4種類のテンプレートが含まれています。

  • Resource ID 100:デクリプターのテンプレート
  • Resource ID 101:実行ファイルのテンプレート
  • Resource ID 103:DLLのテンプレート
  • Resource ID 106:反射型DLLのテンプレート

LockBitバイナリの分析

このセクションでは、通常のDLLバイナリと、builder.exeにより作成された反射型DLLインジェクションを目的としたDLLバイナリを取り上げます。本分析では、バイナリの概要を示すと共に、同バイナリに見られる主な手法を紹介します。また、本分析では、各バイナリを次の名前で参照します。

  • Lb3_rundll32.dll:通常のDLLバイナリです。
  • Lb3_reflectivedll_dllmain.dll:反射型DLLインジェクションを目的としたDLLバイナリです。

概要

Lb3_rundll32.dll
lb3_rundll32.dllには7つのエクスポート関数があり、各関数はそれぞれ特定の役割を担っています。次の表に、各エクスポート関数の主な機能をまとめて示します。

関数 要約
DEL 自己削除を担当する関数。
GDEL 命名規則から、グループポリシーを削除する関数だと思われる。
GMOD グループポリシーの更新を担当する関数。
PMOD 不明。今回、この関数の分析は行わなかった。
WDLL LockBitアイコンのダンプと、デスクトップ背景の壁紙の変更を担当する関数。
GDLL 感染先の端末の暗号化を担当する関数。
SDLL セーフモードでの端末の再起動を担当する関数。

LockBit 3.0の実行可能なバージョンで提供されるコマンドライン引数のほとんどは、lb3_rundll32.dllにおけるエクスポート関数へと変換されます。
■Lb3_reflectivedll_dllmain.dll

命名規則から、バイナリlb3_reflectivedll_dllmain.dllは、反射型DLLインジェクション用に作成されたものであると考えられます。反射型DLLインジェクションとは、インジェクターがDLLをディスクにドロップすることなく、メモリからホストプロセスへとDLLをインジェクトするインジェクション手法のことです。Stephen Fewer氏による反射型DLLインジェクションに関するGitHubページに紹介されているように、DLLには、悪意あるDLLをホストプロセスにインジェクトしてロードするようなローダーが必要となります。このようなインジェクション方式は、多くの場合、コマンドラインオプションのない最小限の機能を持つDLLをもたらし、その機能はDLLMainの内部で完結することになります。これは、lb3_reflectivedll_dllmain.dllに顕著な特徴です。

lb3_rundll32.dllとは異なり、lb3_reflectivedll_dllmain.dllには、簡略化のためにエクスポート関数は含まれていません。


▲lb3_reflectivedll_dllmain.dllの実行フロー例

4つの重要な手法


▲LockBitバイナリが使用する4つの注目すべき手法

このセクションでは、LockBitバイナリが使用する4つの注目すべき手法について説明します。

  1. DbgUiRemoteBreakinへのパッチ適用
  2. 名前付きパイプとインジェクション手法
  3. パスフレーズ保護
  4. 自己削除

■DbgUiRemoteBreakinへのパッチ適用
LockBitは、バイナリの初期化(コードの難読化解除や必要なライブラリのロードなど)が完了すると、他のアンチデバッグ手法に対する準備を整えます。LockBitは、必要なハッシュ値を取得した後、その値を難読化解除とアドレス出力を行う関数に渡します。この関数が返す値は、ntdll.dll関数のアドレスであるDbgUiRemoteBreakinになります。


▲DbgUiRemoteBreakinアドレスの難読化解除

その後、LockBitは、ZwProtectVirtualmemoryを呼び出してDbgUiRemoteBreakinのメモリ領域を更新し、このメモリ領域をPAGE_EXECUTE_READWRITEへと更新します。続いて、この関数は、RtlEncryptMemoryのエイリアス関数であるSystemFunction040を呼び出すことにより、DbgUiRemoteBreakinのメモリ領域を暗号化します。


▲実行時に.textを難読化解除

これはアンチデバッグ手法の一部であり、デバッガがプロセスにアタッチしてLockBitの動作をデバッグして分析することを防ぐものです。DbgUiRemoteBreakinへのパッチ適用は、MazeやRagnar Lockerなどの他のランサムウェアでも観測されています。


▲DbgUiRemoteBreakinの取得と暗号化

■名前付きパイプとインジェクション手法
LockBitランサムウェアグループは、ツールに名前付きパイプを多用しています。名前付きパイプとは、名前付きパイプサーバーが複数のクライアントと通信できるようにする技術です。この手法は、データを効率的に流出させるために、StealBitのサンプルでも確認されています。ただし、ほとんどのDLL内の関数は、1対1の関係を持つことがありません。そのような関数の例としては、自己削除(DEL、GDLL)とデスクトップの壁紙更新(WDLL)が挙げられます。

DEL関数とWDLL関数は、どちらも同じ一般的な実行フローを持ちます。LockBitはまず、CSIDLにCSIDL_COMMON_APPDATAを指定してSHGetSpecialFolderPathWを呼び出すことにより、クライアントプロセスのファイルのダンプ先となるディレクトリを取得します。これにより、C:¥ProgramDataへのフォルダーパスを取得できます。続いて、LockBitは、関数GetTempFileNameW、CreateFileW、およびWriteFileを使用して、ディレクトリC:\ProgramData下にあるディスクへと、当該ファイルを一時ファイルとしてダンプします。


▲WriteFileによりPEファイルを一時ファイルへと書き出す

続いてLB3_rundll32.dllは、次のようなWIN32 API関数を順番に呼び出します。

上記の組み合わせにより、プロセスインジェクションが実施されます。LB3_rundll32.dllは、CREATE_SUSPENDモードでプロセスを作成した後、インジェクトするプロセスの.textセクションを取得します。LB3_rundll32.dllは、ZwProtectVirtualMemoryによるメモリ保護をPAGE_EXECUTE_READWRITE権限へと更新することで、インジェクションの準備を整えます。その後、LB3_rundll32.dllはZwWriteVirtualMemoryを使用して、.textに対して悪意あるコードを書き出します。


▲ZwWriteVirtualMemory経由でクライアントプロセスに対するポストインジェクションを実施

続いて、名前付きパイプによる接続を準備するために、LB3_rundll32.dllは、関数NtOpenProcessを呼び出して、LB3_rundll32.dllを実行しているプロセスをオープンします。その後、LB3_rundll32.dllは、ZwDuplicateObjectを呼び出すことで、必要なアクセス権を得るために取得したプロセスハンドルを複製します。


▲ZwDuplicateObjectを呼び出してハンドルを複製する

クライアントプロセスの準備が完了すると、この関数は続いて、インジェクトされたコードの開始命令で始まるクライアントプロセスにおいて、CreateNamedPipeWとResumeThreadを呼び出すことで名前付きパイプを作成します。その後、LB3_rundll32.dllはConnectNamedPipeへと進み、クライアントの応答を待ちます。クライアントプロセスが名前付きパイプへの接続を完了した時点で、LB3_rundll32.dllはファイルの設定情報を送信し、バッファをクローズします。


▲クライアントとの名前付きパイプ接続を確立する

それぞれの関数に関連する機能の実行は、クライアントプロセスで行われます。

■パスフレーズ保護
パスフレーズ保護の項で述べたように、実行ファイルおよびDLLは、バイナリにおけるパスフレーズ保護機能を備えています。この機能は、バイナリ内の .text、.data、および .pdata セクションを難読化し、ランタイム中に難読化を解除するものです。この難読化機能は、反射型DLLインジェクション向けに作成されたDLLでは利用できません。そのようなDLLは、コマンドライン引数を渡すことを意図していないためです。

DLLがメモリにロードされると、.textセクションには書き込み権限が付与されます。これは、実行中のある時点で.textセクションが更新されることを意味しています。


▲書き込み可能な.textセクション

すべてのエクスポート関数において、オフセット0x19000の関数が最初の関数として呼び出されます。この関数は、難読化されたセクションである.text、.data、および.pdataの難読化を解除するものです。この関数は、-passオプションの引数として渡されたパスフレーズを取得し、そのパスフレーズを使用して当該セクションの難読化を解除します。


▲-pass引数を取得する関数

実行時に、バイナリはセクションを適切に難読化するために、次の処理を実行します。

  1. バイナリのセクションを取得する。
  2. 各セクションに対してループ処理を実行する。
  3. 取得したセクションの難読化された値を計算する。
  4. 難読化された値のリストを比較する。
  5. 0x76918075: .text
  6. 0x4a41b: .data
  7. 0xb84b49b: .pdata
  8. 難読化された値がセクションの値と一致すれば、そのセクションを復号化する。


▲セクションのハッシュ値をチェックする関数

セクションの比較は、セクション名の難読化された値をチェックすることで行われます。これは、静的分析に対するアンチ分析に利用されます。チェックの結果が一致すると、実行フローは対応するセクションの難読化を解除します。


▲実行時に.textの難読化を解除

■自己削除
設定(setting)オプションrunning_oneは、暗号化手順の実行時に、LockBitの単一のプロセスインスタンスが実行されていることを保証するものです。暗号化処理中に、LockBitは、まず「Global\」で始まるミューテックスをチェックします。複数のスレッドやプロセスが存在する場合、それらのプロセスは、名前付きミューテックスを使用して共有リソースを管理できるようになります。ミューテックスには、Global\で始まるものとLocal\で始まるものの2種類があります。共有リソースに異なるセッションを通じてアクセスしなければならない場合、Global\で始まるミューテックス(以下「グローバルミューテックス」)は、この動作を可能にします。LockBitは、まずOpenMutexWを実行することで、グローバルミューテックスをチェックします。


▲OpenMutexWパラメータ

環境内にグローバルミューテックスが存在しない場合、LockBitは同ミューテックスを作成した上で、環境を暗号化する準備を整えます。一方、環境内にグローバルミューテックスが存在する場合、LockBitは次の操作を実行します。

  1. オープンしているグローバルミューテックスのハンドルをクローズします。
  2. self_destructフラグを確認します。
  3. self_destructフラグがtrueである場合、名前付きパイプの作成に進みます。この名前付きパイプの作成処理は、「名前付きパイプ」セクションで紹介した動作と同じものになります。続いて、この名前付きパイプクライアントは、自分自身を削除します。削除が完了したら、ステップ5に進みます。
  4. self_destruct flagがfalseである場合、ステップ5に進みます。
  5. ExitProcessを実行して、プロセスを終了します。

LockBitプロセスが名前付きパイプへの接続を確立すると、クライアントプロセスは次の操作を実行します。

  • NtOpenProcessとZwTerminateProcessにより、元の暗号化プロセスを強制終了させます。
  • MoveFileExWを使って元ファイル名を変更します。このファイルは「AAAAAAAAAAAAAAAA」へとリネームされます。

  • ▲ファイル名をAAAAAAAAAAAに変更

  • ファイル名が「ZZZZZZZZZZZZZZZZ」になるまで26回リネームします。

  • ▲File name update until ZZZZZZZZZZZZZZZZまでファイル名更新

  • ファイル名がZZZZZZZZZZZZZZZZに変更されると、クライアントプロセスはDeleteFileWでファイルを削除します。
  • クライアントプロセスは、ShellExecuteWを通じて、コマンドラインでcmd.exeを呼び出すことにより、クライアントプロセスのオリジナルファイルを削除します。これによりクライアントプロセスは、自分自身を終了させます。


▲クライアントプロセスの元の.tmpファイルを削除

上記の動作から、暗号化手順は2つのプロセスで役割が分担されているように見えます。つまり、ミューテックスを作成した最初のプロセスが暗号化手順を担当し、2番目のプロセスが関連ファイルの削除を担当しているようです。

■比較表
次の表は、テクニカル分析で紹介した通常のDLLと反射型DLLの違いをまとめたものです。

使われる手法 DLL DLL(反射型インジェクション)
DbgUiRemoteBreakinへのパッチ適用
名前付きパイプとインジェクション
パスフレーズ保護
自己削除

このセクションで述べた機能の多くは、lb3_rundll32.dllとlb3_reflectivedll_dllmain.dllの両方で提供されていますが、2つのバイナリ間における主な違いは、コマンドライン引数のサポートにあるようです。パスフレーズ保護や壁紙の変更といったコマンドライン引数は、lb3_reflectivedll_dllmain.dllには含まれていませんでした。

反射型DLLインジェクションとは、ホストプロセス内でのインジェクションを通じてDLLを実行するものです。この使い方はすでに、難読化のようなものを必要としない回避手法の一部となっている可能性があります。また、リモートプロセスで反射的にロードされたDLLをコマンドライン引数経由で制御することは、開発に対して不必要な複雑さをもたらす可能性があります。

MITRE ATT&CKフレームワークとの対応

戦術 手法 /サブ手法
TA0002:実行 T1047 – Windows Management Instrumentation(WMI)
TA0002:実行 T1106 – ネイティブAPI
TA0003:永続化 T1543.003 – システムプロセスの作成または変更:Windowsサービス
TA0003:永続化 T1547.001 –ブートまたはログオン時のオートスタート実行: レジストリ実行キー/スタートアップフォルダー
TA0004:権限昇格 T1078.001 – 有効なアカウント:デフォルトアカウント
TA0004:権限昇格 T1078.002 – 有効なアカウント:ドメインアカウント
TA0004:権限昇格 T1548.002 – 権限昇格制御メカニズムを悪用:ユーザーアカウント制御(UAC)を回避
TA0005:防御回避 T1055 – プロセスインジェクション
TA0005:防御回避 T1070.001 – ホスト上のインジケーターを除去:Windowsのイベントログを消去
TA0005:防御回避 T1218.003 – システムバイナリプロキシの実行:CMSTP
TA0005:防御回避 T1406.002 – ファイルや情報の難読化:ソフトウェアのパッキング
TA0005:防御回避 T1620 – 反射型コードローディング
TA0005:防御回避 T1622 – デバッガ回避
TA0006:クレデンシャルアクセス T1003.001 – OSクレデンシャルのダンプ:LSASSメモリ
TA0008:ラテラルムーブメント T1021.002 – リモートサービス:SMB/Windows管理共有
TA0009:収集 T1119 – 自動収集
TA0040:影響 T1485 – データの破壊
TA0040:影響 T1489 – サービスの停止
TA0040:影響 T1490 – システム復旧の妨害

LockBitランサムウェアの検知と防止

■Cybereason Defense Platform
Cybereason Defense Platformは、マルウェアを検知してブロックする多層的な防御を利用することで、LockBitへの感染を検知して阻止できます。同プラットフォームには、脅威インテリジェンス、機械学習、次世代アンチウイルス(NGAV)などの機能が搭載されています。


▲Cybereason Defense Platformは、ランサムウェアの振る舞いに基づいてMalOpを作成する

■Cybereason GSOC MDR
Cybereason GSOCは、Cybereason Defense Platformにおいて、次の措置を実施することを推奨しています。

  • アプリケーション制御を有効にし、悪意あるファイルの実行をブロックすること。
  • お使いの環境のポリシーでCybereason Anti-Ransomware(アンチランサムウェア)を有効にし、Cybereason Anti-Ransomware(アンチランサムウェア)の保護モードを「Prevent」に設定すること。また、シャドウコピー検知を有効にすることで、ランサムウェアに対する最大の防御を実現できます。
  • Cybereason Behavioralの実行防止でPreventモードを設定し、Variant Payload Prevention(VPP:亜種実行防止)を有効にすること。

【ホワイトペーパー】ランサムウェア対策ガイド~二重脅迫型など進化するランサムウェアから情報資産を守るために~

近年、世界中で深刻な問題となっているランサムウェア。

このガイドは、日本における深刻な問題やランサムウェアの歴史を踏まえ、最新のランサムウェア攻撃にはどのような特徴や脅威があるのかについて解説するとともに、巧妙化するランサムウェアに対し私たちはどのような対策を講じれば良いのか。最新のランサムウェア攻撃への5つの対策ポイントをご紹介します。
https://www.cybereason.co.jp/product-documents/white-paper/6525/