E4delとPINHOLEはFTPバナーデッドドロップをC2に悪用する
Detection stack
- AIDR
- Alert
- ETL
- Query
概要
脅威アクターは、FTPサーバーの挨拶バナーをデッドドロップリゾルバとして悪用し、E4delとPINHOLEマルウェアを配信しています。FTPプロトコルの認証前フェーズを利用して、攻撃者は従来のファイル転送を行わずに、被害者側のインタープリターにコマンドを直接渡すことができます。この手法により、多くのファイルベースのセキュリティ制御を回避できる、ステルス性に優れた現場活用型の感染チェーンが可能となります。
調査
調査では、FTP出力をコマンドインタープリターにパイプする、HTTP経由でWebDAVを使用する、BITSベースのダウンロードに依存するという3つの配信バリアントを調査しました。研究者は、リダイレクターおよびペイロード配信ノードとして機能するFTPホストのクラスターを特定しました。E4delとPINHOLEの解析では、APIフックを回避するために設計された電子ベースの偽装、シェルコードの変動、直接のシステムコールなどの技術も明らかになりました。
緩和策
防御者は、特にアウトバウンドTCP/21接続の後に即座にコマンドインタープリターが実行される動作を監視することで、ファイルハッシュに依存しない行動検知を重視するべきです。厳格な制御により、 conhost.exe, bitsadmin.exe、およびWebDAVベースのUNCパスの曝露を減らすことができます。セキュリティチームはまた、 ApplicationFrameHost.exe.
によって生成された不審な子プロセスを監視するべきです。
この活動が検出された場合、影響を受けたエンドポイントは、追加のコマンド実行やデータ抽出を防ぐために直ちに隔離する必要があります。対応者は、特に以下のような正当なプロセス内でのコードインジェクションを特定するためにメモリフォレンジックを実施しなければなりません。 ApplicationFrameHost.exe。PowerShell Script Blockログも確認し、FTPデッドドロップを通じて受信したコマンドを再構築し、侵害の範囲を特定するべきです。
攻撃フロー
この部分はまだ更新中です。
検出
LOLBAS WScript / CScript(via process_creation)
考えうる持続ポイント[ASEPs – Software/NTUSERハイブ](via registry_event)
PowerShellを介したダウンロードまたはアップロード(via cmdline)
LOLBAS Conhost(via cmdline)
PowerShellを使用して不審なディレクトリにアーカイブが抽出されました(via powershell)
IOC(SourceIP)を検出する: FTPバナーデッドドロップ: E4delとPINHOLEのハンターズフィールドガイド
IOC(DestinationIP)を検出する: FTPバナーデッドドロップ: E4delとPINHOLEのハンターズフィールドガイド
FTPとPowerShellを使用したConhostの不審な使用[Windowsプロセスの作成]
E4delおよびPINHOLEリモートアクセストロイの木馬のためのFTPバナーデッドドロップを検出[Windowsネットワーク接続]
シミュレーション実行
-
攻撃のシナリオとコマンド: 敵はFTPの「デッドドロップ」を介してコマンドを取得することを目的としています。ファイルをダウンロードする代わりに、敵は制御されたFTPサーバーへの接続を開始します。インタープリター(PowerShell)が接続すると、サーバーのバナーを読み込み、次のステージのコマンドがエンコードされています。これにより、「ファイルのダウンロード」署名を回避し、トリガーの配信にプロトコルハンドシェイク自体を利用します。我々は、ポート21でリスナーへの接続を試みるためにPowerShellを使用します。
-
回帰テストスクリプト:
# シミュレーション: Port 21でのFTPサービスへのPowerShellの接続試行 # これはE4del/PINHOLEの「デッドドロップ」行動を模倣します $TargetIP = "127.0.0.1" # 実際のテストでは、制御されたリスナーを指します $TargetPort = 21 Write-Host "[+] シミュレーション開始: FTPバナーデッドドロップへの接続..." -ForegroundColor Cyan try { # System.Net.Socketsを使用して、PowerShellによるネットワーク接続イベントのトリガー $client = New-Object System.Net.Sockets.TcpClient $client.Connect($TargetIP, $TargetPort) Write-Host "[!] 成功: 接続が確立されました。テレメトリが生成されるはずです。" -ForegroundColor Green $client.Close() } catch { Write-Host "[-] 接続失敗(リスナーがアクティブでない場合は期待通り)、しかしテレメトリは存在するはずです。" -ForegroundColor Yellow } -
クリーンアップコマンド:
# クリーンアップ: 残りの接続またはプロセスが残らないようにします Stop-Process -Name "powershell" -ErrorAction SilentlyContinue Write-Host "[+] クリーンアップ完了。" -ForegroundColor Green