攻撃の解剖学:VIPERTUNNEL
Detection stack
- AIDR
- Alert
- ETL
- Query
概要
VIPERTUNNELは、サイバー犯罪者が持続的なアクセスを維持し、侵害されたシステムを通じて悪意のあるトラフィックを中継するために使用するPythonベースのバックドアです。これは、正当なPythonインタプリタと起動スクリプトを悪用して、不明瞭化されたペイロードをメモリ上で直接実行します。このマルウェアは、横方向の移動とSOCKS5トンネリングをサポートし、攻撃者が隠れた通信チャネルを確立するのを支援します。
調査
インフォガード・ラボは、DragonForceランサムウェアインシデント対応中に発見されたVIPERTUNNELのインプラントの技術分析を実施しました。この調査により、スケジュールされたタスク、変更されたPythonライブラリファイル、三重層の不明瞭化で保護されたペイロードを含む複数段階の実行チェーンが明らかになりました。研究者はまた、このマルウェアとPyramidポストエクスプロイトフレームワークとの関連を発見しました。
軽減策
ディフェンダーは、不審なPythonベースの実行についてWindowsのスケジュールされたタスクを確認し、 sitecustomize.py ファイル内の不正な変更を監視する必要があります。また、DLLとして偽装されたバイナリではないテキストファイルを示すコントロールの実装もお勧めします。組織は、予期せぬSOCKS接続やポート443を介した不審な通信を検出するために外向きのネットワークトラフィックを基準化する必要があります。
対応策
VIPERTUNNELが検出された場合、管理者は直ちにWindows Security Logs内のEvent ID 4698 を確認して不審なスケジュールされたタスクを特定する必要があります。Pythonのインストールディレクトリを悪意のあるスクリプトがないか検査し、ネットワークテレメトリーをSOCKS風のプロキシ挙動のために分析する必要があります。エンドポイントアーティファクトをネットワークベースの行動証拠と相関させることは、侵入の全容を把握するために不可欠です。
攻撃フロー
## シミュレーションの実行
前提条件: テレメトリー&ベースライン・チェックはパスしている必要があります。
理由: このセクションは、検出ルールをトリガーするように設計された攻撃技法(TTP)の正確な実行を詳述します。コマンドと説明はTTPと直接的に反映されなければならず、検出ロジックによって期待される正確なテレメトリを生成しなければなりません。抽象的または無関係な例は誤診を引き起こします。
-
攻撃のシナリオとコマンド: 攻撃者は、SOCKS5プロキシを使用して外部リスナーを介して内部トラフィックを中継するコマンドアンドコントロール(C2)チャネルを確立しようとしています。基本的なポートベースのフィルタリングを回避するために、攻撃者はTCPポート443を使用します。ただし、ルールによって識別された特定のVIPERTUNNELシグネチャをシミュレートするには、攻撃者は プレーンテキスト でポート443を介してSOCKS5ハンドシェイクを開始します。これにより、プロトコル検査を通じて検出ルールが特に捉えるために設計された誤設定または「怠惰な」C2実装が模倣されます。
-
回帰テストスクリプト: このスクリプトは、ローカルリスナーに対してSOCKS5ハンドシェイクを開始するためのPythonワンライナーを使用し、プロトコル識別をシミュレートします。
import socket import time # シミュレーションパラメータ TARGET_IP = "127.0.0.1" # 実際のテストでは、これはリスナーIPになります TARGET_PORT = 443 def simulate_socks5_tunnel(): print(f"[*] ポート {TARGET_PORT} でのSOCKS5ハンドシェイクをシミュレートしようとしています…") try: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((TARGET_IP, TARGET_PORT)) # SOCKS5挨拶: [バージョン (0x05), NMethods (0x01), メソッド (0x00)] # メソッド0x00 = 認証不要 greeting = b"x05x01x00" s.send(greeting) response = s.recv(1024) print(f"[+] 応答を受信: {response.hex()}") print("[+] シミュレーション完了。ファイアウォールログで'socks5'プロトコルの識別を確認してください。") s.close() except Exception as e: print(f"[-] エラー: {e}") print("[!] 注意: ハンドシェイクを受信するためには、ターゲットポート上でリスナーがアクティブであることを確認してください。") if __name__ == "__main__": simulate_socks5_tunnel() -
クリーンアップコマンド:
# アクティブなpythonシミュレーションプロセスを終了 Stop-Process -Name "python" -ErrorAction SilentlyContinue # もし作成された場合は、一時的なリスナーファイルを削除 Remove-Item -Path ".sim_listener.log" -ErrorAction SilentlyContinue