当社によるこれまでの分析では、悪意あるRenPyキャンペーンを取り上げ、感染チェーンの一部として展開される多段階ローダーを特定していました。
その後の脅威ハンティングにより、当社がPavinLoaderとして追跡しているこの同じローダーが、ClickFix攻撃や偽ソフトウェアダウンロードを含む複数の異なるキャンペーンで使用されていることが判明しました。
これらのキャンペーンが被害者に到達する経路には違いがあるものの、いくつかの共通要素も見つかっています。具体的には、大幅に難読化・トロイの木馬化された.NET DLLを介する多段階の感染チェーン、それらを実行するためのMSBuild、.csproj、.batファイルの悪用、そしてコマンド&コントロール(C2)ドメインを取得するためのEtherHidingの利用です。
攻撃の実態
いずれのキャンペーンも、開始方法が一様というわけではありません。被害者は、コマンドの実行を促す偽のCAPTCHAに遭遇したり、正規のソフトウェアに見えるものをダウンロードしたり、悪意あるゲームをインストールしたりします。
しかし、その後の展開ははるかに一貫しています。PavinLoaderは正規のWindowsツールと悪意ある.NETファイルを組み合わせ、マルウェアの複数段階を実行します。また、ブロックチェーンを利用してインフラ情報を隠蔽する技術であるEtherHidingを使い、追加のマルウェアを取得すべきサーバーを特定します。
分析対象としたRenPyキャンペーンでは、この一連のプロセスは最終的に、感染したコンピューターから情報を盗み出すために設計されたマルウェアであるAmatera Stealerへとつながっていました。当社ではこのほかにも、PavinLoaderの感染を通じて追加のマルウェアが配信される事例を確認しています。
PavinLoaderは複数のキャンペーンで確認
PavinLoaderは、以下のような複数のキャンペーンクラスターで確認されています。
- 悪意あるRenPyキャンペーン(以前のブログ記事で分析済み)
- 複数のClickFixキャンペーン(以前の分析で取り上げた攻撃者による最近の活動を含む)
- Dropboxを使ってPavinLoaderをダウンロードさせる偽ソフトウェアキャンペーン
複数のキャンペーンにまたがってこのローダーが使われている事実は、PavinLoaderがLoader-as-a-Serviceとして提供されている可能性を示唆しています。
この可能性を裏付けるいくつかの痕跡も見つかりましたが、確証を得るには不十分です。VirusTotal上のある特定のアーティファクトは、PavinLoaderに関連する200件を超えるファイルで共有されており、ビルドプロセスにおけるコンパイル成果物である可能性がうかがえます。
また、VirusTotalにアップロードされたPowerShellスクリプトの中に、EDIT HEREやREPLACE with a real direct link to your .batといったコメントを含むものも発見しました。関連するBATファイルには、Automated builder helperという文字列が含まれています。
ただし、PavinLoaderが商業的に販売されていることを裏付けるビルドパネルや販売チャネルは、現時点では発見できていません。


PavinLoaderは時間とともに変化してきましたが、当社が分析したキャンペーンにはいくつかの共通した特徴が見られます。
.batファイルや.csprojファイルを実行する、異なるビルダーで生成されたInno SetupまたはMSIインストーラー- DotNetZip、Nancy、Renci.SshNet、OpenXMLを含む、トロイの木馬化された.NET DLL。分析したケースの大半において、挿入された悪意あるメソッドは
DefaultEvaluator5やFallbackFactory5のようなTwoWordsまたはTwoWordsNumberという命名パターンに従っている - 複数の.NET DLL全体で共通して使われている難読化手法
- DLL名、関数名、文字列、C2パスなどのアーティファクトに対して、
GollopDevest、UnbrandRunover、PavinWideのような2つのランダムな単語を組み合わせた命名規則 - C2ドメインを取得するためのEtherHiding、それに続く
assets/{2つのランダムな単語}.jsonのようなパスを使ったHTTPリクエストによる後続段階の取得。C2ドメインには、一般的に.lat、.icu、.shop、.cfdといったトップレベルドメインが使われている - DLLからコードを読み込んで実行するためのMSBuildの仕組み。
[System.Reflection.Assembly]::Load(...)のようなプロパティ関数やUsingTaskを含む name_4characters.cmd/bat/msi/exeという繰り返し出現するファイル名パターン(例:prefetch_9a59.cmd、telemetry_55db.cmd、bootstrap_64be.cmd)、あるいはaegZpQ4C7.batのようなランダムな9文字の名前。Small.msi、small.bat、small.cmdのような短い名前も確認された
PavinLoaderは複数の.NET DLLで構成されており、分析したケースでは以下の段階を確認しました。
- Loader DLL: 以前のRenPy記事で分析したNancyの例のようなトロイの木馬化されたDLL、またはカスタムDLL。アンチフォレンジックおよびアンチ解析操作を行い、次の操作に必要なネットワーク設定を変更し、EtherHiding Loaderを読み込む
- EtherHiding Loader DLL: EtherHidingを通じてC2を取得し、そこから次の段階をダウンロードする
- Anti-Analysis DLL: 仮想化環境を検出するために、広範なアンチ解析チェックを実施する
- PE Loader DLL: 最終的なPEペイロードを読み込む
中間ペイロードはキャンペーンの設定によって異なる場合があります。まずは、PavinLoaderの初期段階を配布するために使われているいくつかの手法を見ていきます。その後、以前の記事で分析したRenPyローダーキャンペーンに立ち返り、ローダーの後段の動作を詳しく検証します。
技術分析
ここからは、PavinLoaderがどのように配布され、各段階がどのように動作するのかを詳しく見ていきます。
PavinLoaderの配布方法
当社では、複数のClickFixキャンペーンを通じてPavinLoaderが配布されている様子を確認しています。
特に、以前の記事で分析したClickFixクラスターが、最近になってPavinLoaderを使い始めていることを検出しました。当社が確認した感染チェーンの全体を通じて、MSBuildの悪用や.csproj・.batファイルの利用は依然として共通しています。
その一例は以前のRenPy分析で取り上げましたが、ここではそれ以外の配布手法をいくつか見ていきます。

以前これらのClickFixキャンペーンを分析した際にも見られたように、関連するPowerShellスクリプトは頻繁に変化します。今回の活動でも、難読化されたものとされていないものの両方を含め、いくつかのバージョンを確認しました。

この例では、CloudflareバケットからダウンロードされたインストーラーはInstaller_57be78.msiと呼ばれています。

prefetch_2f76.exe: 正規のMSBuild実行ファイルprefetch_2f76.csproj:UsingTaskを通じてLoader DLLを実行するために使用DotNetZip.dll: Loader DLL
.csprojファイルは以下のように実行されます。
"C:\Users\{USER}\AppData\Local\Logitech\Device Configuration Helper\prefetch_2f76.exe" /nologo "C:\Users\{USER}\AppData\Local\Logitech\Device Configuration Helper\prefetch_2f76.csproj" /nr:false
Loader DLLはDotNetZipのトロイの木馬化バージョンで、UsingTask要素を使って実行されます。


以前の記事で取り上げたRenPyの例とは異なり、この場合EtherHiding LoaderはDLL自体から抽出されます。埋め込まれたリソースがインデックスとして使われ、.csprojファイルからそのインデックスを取得するのではなく、DLLから直接バイト列を抽出します。
また別のキャンペーンでは、解析や検知をより困難にする目的とみられる、偽のBUILD VERIFICATION REPORTコメントを含むBATファイルが使われていることも検出しました。
このケースでは、MSIのCustomActionが以下のようにBATスクリプトを実行します。
cmd.exe /c C:\Users\{USER}\AppData\Local\Conexant\lite_bootstrap_2.1.7\updater_8219.cmd /launched

難読化されたコードは、この偽コメントの下に記述されています。複数の文字列を連結し、単純な数学演算によって生成されたインデックスを使って元の文字列を復元する仕組みです。分析したBATファイルの大半で、この種の難読化を確認しました。

このBATファイルはconhost.exeを探し出し、以下のコマンドで自身を再起動します。
"C:\WINDOWS\System32\conhost.exe" --headless cmd.exe /c "C:\Users\{USER}\AppData\Local\Conexant\lite_bootstrap_2.1.7\updater_8219.cmd" /launched
続いてMSBUILDENABLEALLPROPERTYFUNCTIONS=1環境変数を設定し、MSBuild.exeを探し出したうえで、同じファイルを入力として実行します。
"C:\WINDOWS\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe" "C:\Users\{USER}\AppData\Local\Conexant\lite_bootstrap_2.1.7\updater_8219.cmd"
このケースでは、Loader DLLは4つのBase64エンコードされた変数を連結・デコードすることで復元されます。

このLoader DLLはランダムな名前を持ち、リソース内にカスタムバイトコードや暗号化文字列を含んでいないことから、より古いバージョンとみられます。
以前分析したRenPyキャンペーンと同様に、この段階ではCMDファイル内のBuild-...というマーカーの間に格納されたEtherHiding Loaderを、_vezr環境変数を通じて取得し、32バイトのキーによるXORでデコードします。

PavinLoaderの最初の2段階を配布するために使われるいくつかの手法を確認したところで、以前分析したRenPy感染チェーンに立ち返り、ローダー自体をさらに詳しく検証します。
PavinLoaderの分析
PavinLoaderに関連する.NET DLLは、制御フローの平坦化、カスタムバイトコード、calli/ldftnを介した間接呼び出し、異なるアルゴリズムによる文字列暗号化、API ハッシュ化とデリゲート、冗長なメソッド、ジャンクコードや文字列など、多岐にわたる手法で大幅に難読化されています。
今回のサンプルに関連する既知の難読化ツールは特定できなかったため、当社が把握している限りでは、PavinLoaderはカスタムの難読化ツールを使用していると考えられます。
サンプルを完全に難読化解除するのは複雑な作業となるため、動的解析とリフレクションによるメソッド呼び出しを組み合わせたハイブリッドなアプローチを採用しました。インポートやパラメータをもとに重要なメソッドを特定し、それを呼び出して結果の出力を分析しました。
このアプローチでは実行フロー全体を網羅することはできませんが、ローダーの中核機能を特定し、中間段階を抽出するには十分でした。異なる関数同士で同じ名前が頻繁に使われているため、分析全体を通じてメタデータトークンを用いてメソッドを識別しています。
Nancyトロイの木馬化DLL: Loader DLL
この段階については以前のブログ記事で詳しく取り上げているため、ここでは概要のみを記載します。
分析したケースの大半において、Loader DLLはトロイの木馬化された正規のDLLです。悪意あるメソッドには、通常{RandomWord}または{RandomWord_Number}という命名規則が使われます。
このDLLには、メインメソッドが解釈するカスタムバイトコードに関連するリソース、暗号化された文字列を含む2つのリソース、そして場合によっては次の段階を抽出するためのインデックスとして使われる追加リソースが含まれています。その他のリソースは、解析を遅らせるためのおとりとみられます。分析したサンプルにおいて、このDLLは通常以下の動作を行います。
- マルチキーXORを用いてリソースから文字列を復号する
- APIハッシュ化と
GetDelegateForFunctionPointer()を用いてAPIを解決する - TLS証明書検証の無効化やシステムデフォルトプロキシの設定を含む、ネットワーク設定の変更を行う
CreateEventW()、GetTickCount()、WaitForSingleObject()を用いたアンチ解析のタイミングチェックを行う- アンチフォレンジック操作を行う
.csprojやBATファイル内のマーカーから抽出する方法、あるいはリソースをインデックスとして使いDLLから直接バイト列を取得する方法により、EtherHiding Loaderを読み込む
GollopDevest: EtherHiding Loader
EtherHiding Loaderには、EtherHidingを通じてC2ドメインを取得する機能と、そのC2から後続段階をダウンロードして読み込む機能という、2つの主要な機能があります。
クラス0x02000762は、ブロックチェーンおよびネットワーク通信に関連する文字列の復号を担っています。
文字列は0x060027BDによって、以下の手順で復号されます。
- 関数
0x060027BBが、マスターキーであるactiveValuesとBase64デコードされたoptionsCollection文字列のXORを用いてS-boxを初期化する - 関数
0x060027BEはchildSyncObjectを入力として受け取り、文字列の先頭2文字にエンコードされたヘッダー値に基づくXORと置換によりインデックスバイトを返す - 関数
0x060027B9が、そのインデックスと先に生成されたS-boxを使って復号済み文字列を返す
このような形式で暗号化パラメータがエンコードされているクラスは、これのみでした。
それ以外の文字列については、パラメータのシグネチャ(たとえば文字列やバイト列を返すメソッドなど)に基づいて復号済みデータを返す関数を特定し、リフレクションを通じてそれらを呼び出しました。この方法により、1,300を超える文字列を復元することができました。

その中には、AMSIおよびETWのパッチ処理に関連する文字列も含まれていました。
AmsiScanStringSystem.Management.Automation.AmsiUtils
System.Management.Automation.AmsiUtils+AmsiNativeMethods
ntdll
EtwEventWriteNtQueryInformationProcess
NtSetInformationThread
VirtualProtect
正規サービスに属する100件を超えるURLも復号されており、HTTPリクエストの生成やネットワークノイズの発生に使われます。この挙動はすべてのサンプルで確認されたわけではなく、ビルドごとに異なる可能性があります。
Serverクラス(0x02000052)は、X-Timestamp、X-Nonce、X-SignatureのHTTPヘッダーを生成し、後続段階を取得するためのリクエストを行います。
後続段階の取得には、パラメータを同期するリクエストとペイロードを取得するリクエストという2種類のHTTPリクエストが行われ、リクエストの検証にはHMACが使われます。リフレクションを用いてメソッド0x06000A77を実行し、後続段階の取得に必要なヘッダー値を得ました。
C2ドメインは、以下のJSON-RPCボディを使ってbsc-dataseed.binance.orgにETH RPC(リモートプロシージャコール)を送信することで取得されます。
{"jsonrpc":"2.0","method":"eth_call","params":[{"to":"0x328a1fadff154290f0ce1389a4e633698cdfdaa7","data":"0x06fdde03"},"latest"],"id":1783436775}
後続段階は、この結果得られたC2ドメインからダウンロードされます。XORエンコードされたペイロードは、JSONレスポンス内のcache.contentに格納されています。
{"type":"cache-binary","meta":{"version":"2.3.1","timestamp":"…","platform":"win32-x64"},"cache":{"id":"e2b69…","content":"1c.."}}
このケースでは、この段階およびアンチ解析DLLから復号されたC2パスとXORキーは以下の通りです。
| パス | XORキー | 種類/機能 |
/assets/ExponeAboard.json |
QBBBfWow4lb |
PavinWride .NET DLL、アンチ解析 |
/assets/MailersKogasin.json |
WjcsVTKmuoBRqe |
GollopDevest .NET DLL、PE Loader |
/assets/LanoseThrip.json |
WwUX66Br |
WPA.exe PE実行ファイル、Amatera Stealer |
次に実行される段階は、アンチ解析DLLです。
PavinWride: アンチ解析DLL
このDLLは、複数のアンチ解析チェックを実行する役割を担っています。
アンチ解析DLLは、異なる方法でシステムコールを実行します。
- レジストリ操作やネットワーク操作を含む、標準的な.NET Base Class Library(BCL)の呼び出し
GetCurrentThread、NtQueryInformationThread、NtQueryInformationProcess、NtCurrentTebを含む、Win32のP/Invoke呼び出し- APIハッシュ化とProcess Environment Block(PEB)のエクスポートテーブル走査によって解決されるWin32 API
関数MenuItemService.ProcessDirectory(0x06000151)は、デリゲートのキャッシュとWin32 APIの解決を担うメインメソッドです。
managerMap.TryGetValue()を使い、デリゲートが既に解決済みかどうかを確認する- 未解決の場合は
ProcessDirectory(0x06000150)を呼び出してHMODULEハンドルを取得する - PEのエクスポートテーブルを走査してハッシュを照合する
ProcessDirectory(0x0600003A)を呼び出す。同一のハッシュ出力が他の複数のメソッド(例:0x06000039、0x0600003B、0x0600004E)でも得られることを確認した GetDelegateForFunctionPointer()でデリゲートを取得し、辞書に保存する

文字列の取得には同様のリフレクション手法を使いました。多くの文字列は、XORキー4B729A1F5CE387D6で暗号化されています。

このローダーはGetKeyboardLayoutList()を使ってシステムのLCIDを取得し、ロシア語、ウクライナ語、ベラルーシ語、アルメニア語を含む17種類を超える言語と照合します。
また、レジストリキーの列挙や、GetSystemFirmwareTable()、EnumSystemFirmwareTables()といったWin32 APIの呼び出しを含む、仮想化環境を特定するための広範なシステム偵察も行います。
| カテゴリ | 値 |
| PCIベンダー/デバイスID | VEN_80EE、VEN_15AD、VEN_1AB8、VEN_5853、VEN_1AF4、VEN_1234&DEV_111、… |
| SMBIOS/ACPI OEM ID | VMWARE、VBOX、BOCHS、VRTUAL、MSFTVM、MSHYPR、Xen、Parall、BHYVE、AMAZON、Google |
| ACPIテーブル署名 | VBOX、BXPC、VMW、Xen、PRLS、AMZN、MICR |
| BIOS/製造元/製品文字列 | vmware、vmw、innotek、virtualbox、vbox、qemu、seabios、bochs、standard pc、kvm virtual machine、xen、hvm domu、parallels |

また、GetCurrentProcess()、CreateToolhelp32Snapshot()、Process32First()、Process32Next()、OpenMutex()を含むAPIへの参照が復号されていることも確認しましたが、実行フローの中でこれらの関数が実際に呼び出される様子は観測していません。
さらに、以下のいずれかのサービスに対してHTTPリクエストが送信されます。
https://ipv4[.]ipleak[.]net/json/https://get[.]geojs[.]io/v1/ip/geo[.]jsonhttps://ipapi[.]co/json/https://api[.]ipapi[.]is/https://ipinfo[.]io/json
また、返却されたデータを96のホスティング/インフラプロバイダーと照合し、地域コードがRU、UA、BY、AM、KZ、KG、TJ、UZ、GE、AZ、MDのいずれかに該当するかどうかも確認します。

アンチ解析チェックを通過すると、次の2段階がダウンロードされ、XORキーを使って復号されます。
これらの段階に関するC2パスとXORキーを復元するため、SelectionScope.ProcessDirectory(0x06000014)にパッチを適用しました。
/assets/MailersKogasin.json|WjcsVTKmuoBRqe|/assets/LanoseThrip.json|WwUX66Br
GollopDevest: PE Loader DLLとAmatera Stealer
3番目のDLLは2番目のDLLと同じGollopDevestという名前を持ちますが、PEの読み込みを担っています。
復号された文字列の中には、以下のようなものがあります。
'GollopMailers LDR DllBase VeneryCondole EdiyaFoully=0x{0:X} EdiyaStelae=0x{1:X}'
'GollopMailers LDR Flags missing IMAGE_DLL 0x{0:X8}'
'GollopMailers LDR SaranPisco invalid 0x{0:X}'
'GollopMailers LDR TlsIndex invalid {0}'
'GollopMailers LDR sanity exception: '
'HIGHLOW relocation'
'Import DLL name'
'Import FunctusAurata'
'Import INT'
'Import descriptor'
'Import hint/name'
'Import thunk'
'LdrpHandleTlsData outside ntdll .text'
'LdrpReleaseTlsEntry outside ntdll .text'
'LoadConfig32'
'OK'
'PE headers'
'Required API resolve failed: type={0}, FreshBubals={1}, module=0x{2:X}'
'TLS32'
'TLS64'
'x86 disabled until ABI proof'
ntdll.dll
kernel32.dll
LdrpInitializeTls
"STATUS_SUCCESS"
UNKNOWN(0x00000001)
UNKNOWN(0x00000002)
UNKNOWN(0x00000003)
ServerEditor.SortMemoryメソッド(0x06000014)は、ペイロードを読み込む前にPE構造とフラグをチェックします。
この挙動を確認するため、ダウンロードされたWPA.exeファイルを入力として、リフレクションを通じて同メソッドを呼び出しました。その結果、PEは正常に読み込まれました。
このC++でコンパイルされたPEはWPA.exe(Windows Performance Analyzer)に偽装しています。当社はこのペイロードを、難読化されたAmatera Stealer 4.2.3-alpha1のバージョンであると特定しました。
解析を困難にするため、制御フローの平坦化、APIハッシュ化、アンチデバッグチェック、不透明述語(opaque predicates)が使われています。さらに、Heaven’s Gate手法、Google DNSを介したDNS-over-HTTPS(DoH)による名前解決、そしてネットワーク通信に\Device\Afd\Endpointを用いた生ソケットの使用も確認しました。

この段階が実行された後、C2のIPアドレスから追加のペイロードがダウンロード・実行される様子も確認しました。
ケースによっては、WiX BurnバンドルがPavinLoaderに関連する別のペイロードをダウンロードしていました。また別のケースでは、HijackLoaderを検出しています。これにより、キャンペーンの運用者は侵害したマシンに複数のペイロードを展開できるようになります。
侵害指標(IOC)
SHA-256ハッシュ
bdf313a019e025ebf58ccef4619444ee70e661bd444e0644ebeabd8f5caad14c
e3830f5747e3f46537d217124d80c9f3bb4d89f8d4f5138dce69ee54ea4fb6b9
a4f03272cf96732dc9f58bb466d16f358e7f50d46dba30526a9fbebfec11717b
bf04160dd1ce3571e0eb6d6dda1713c788797b5599399d4a93665a757eec376e
54fa8083c05334aa360256fbbb0ca901ce7e244a0359dd664cae78977371ec91
c1ea6d169565c70ac5d812e73483814929e9b3548ead6633595937e71a334adb
001337488c32d8610c2aef6f9330acca825f0afacd071bf6ebfc06b5a1a69f09
2837099af431e9afee76ce5e6ab5cb86bedce06e31c22be46250cb453cfdb978
252c5a3d150275013f52b4820097d7163ced4aa2f1be0fca032f8a5017673816
0c9c64b7383ec249bcf6271a4b73206d94de130ca401d16ab77fe01e5193a312
6700f62e1a3b33340cd678c388ecc8bac2e5943c0627df5d1b99b879c3ca42c9
IPアドレス
93.152.224[.]75: PavinLoaderをダウンロード
65.21.80[.]170: PavinLoaderをダウンロード
195.63.142[.]49: PavinLoaderをダウンロード
ドメイン
perfectverified[.]com: ClickFix
PavinLoader C2
catalyst-pro[.]lat
twigoamwu[.]cfd
trusaifi[.]cfd
stellar-minds[.]cfd
pinnacle-labs[.]lat
nexahub[.]lat
fimwoglea[.]shop
velodium[.]lat
rpcsecnoweb[.]pro
more-arpc[.]icu
echo-systems[.]cfd
kelemet[.]shop
zarwieciv[.]cfd
URL
telegra[.]ph/Project-PySynth-06-28: Amateraのデッドドロップ
謝辞
- このローダーに関する以前の分析: https://www.derp.ca/research/hellsuchecker-clickfix-etherhiding/#26-anti-sandbox-checks-and-a-nintendo-bypass(AI生成コンテンツの可能性あり)
- 関連する可能性のある活動: https://cyberowi.pl/lumma-stealer-renpy-fitgirl-osmiowarstwowy-loader/
- 関連する可能性のある活動: https://medium.com/@djordje.brankovic/from-fake-captcha-to-in-memory-execution-unraveling-a-multi-stage-malware-chain-part-1-496c603f3641
- フォーラムユーザーによる分析: https://forums.malwarebytes.com/topic/338102-solution-of-gollopdevestdll-renpy-loader-malware-from-malwarebytes-blog/
脅威の報告から、その排除まで。
サイバーセキュリティのリスクを、見出しの中だけで終わらせてはいけません。 今すぐMalwarebytesをダウンロードして、お使いのデバイスを脅威から守りましょう。