GitLab CIランナーをコマンド&コントロールフレームワークとして悪用する
Detection stack
- AIDR
- Alert
- ETL
- Query
概要
この記事では、GitLab CI ランナーバイナリをコマンドアンドコントロールフレームワークに変えるGitRunner C2という概念実証を説明しています。ランナーをWindowsサービスとしてインストールすることで、攻撃者は任意のPowerShellコマンドを実行し、GitLabの組み込みインフラを通じてデータを漏洩させることができます。このトラフィックがアウトバウンドのHTTPSを使用するため、 gitlab.comとの通信と容易に混ざり合い、通常の開発者の通信として偽装できます。
調査
研究者は、エレベーテッドPowerShellワンライナーでの登録から対話型コマンド実行までの攻撃チェーン全体を実証しました。この調査は、SysmonおよびPowerShell Operationsログを使用して、プロセスの作成、レジストリの変更、およびスクリプトブロックロギングを介して実行されたコマンドを記録しました。研究では、ランナーの正当な動作が従来のEDRおよびネットワークベースの検出を回避するのに役立つことが示されました。
緩和策
防御者は、異常な名前を持つ新たにインストールされたWindowsサービスや標準でないファイルパスから開始されたサービスを監視する必要があります。PowerShellスクリプトブロックロギングを有効にすることは、ランナーを介して実行されるコマンドの可視性に不可欠です。組織はサービスをインストールできる人を制限し、開発作業に使用されていないエンドポイントからのGitLabへの疑わしいアウトバウンドHTTPSトラフィックをモニタリングするべきです。
対応策
この活動が検出された場合、さらなるコマンドアンドコントロール通信を阻止するために、影響を受けたエンドポイントを直ちに隔離してください。GitLabの個人アクセスおよびランナー登録トークンも取り消してください。調査員は、その後、PowerShellログとWindowsイベントログを確認して、実行されたコマンドの範囲や結果として生じたデータ漏洩を特定する必要があります。
"フローチャート TD step_ingress["T1105 u2013 イングレストランスファー: PowerShellを介してS3から合法的なgitlab-runner-windows-amd64.exeをダウンロード"] step_persistence["T1543.003 u2013 システムプロセスの作成または変更: Windowsサービス: 永続性のためにGitLabランナーをネイティブのWindowsサービスとしてインストール"] rules_for_persistence("<b>ルール名</b>: 疑わしいサービスバイナリパス (via system)<br/><b>ルールID</b>: 780e6396-d9f4-42b2-8d73-89918e2dab16") step_trust_subversion["T1553.002 u2013 信頼コントロールの覆し: コードサイニング: デジタル署名済みのGitLabバイナリを使用して検出を回避"] step_execution["T1059.003 u2013 コマンドおよびスクリプトインタプリタ: Windowsコマンドシェル: 長距離の変数を使用してCIを介したコマンドペイロードの実行"] step_c2["T1071 u2013 アプリケーションレイヤープロトコル: GitLabインフラストラクチャをC2リレーとしてHTTPS (ポート443) を使用"] step_exfiltration["T1567.001 u2013 ウェブサービスを介した漏洩: コードリポジトリへの漏洩: GitLabアーティファクトとジェネリックパッケージレジストリを介してファイルを移動"] step_ingress –>|リード| step_persistence step_persistence –>|有効化| step_trust_subversion step_persistence -.->|検出| rules_for_persistence step_trust_subversion –>|その後| step_execution step_execution –>|使用| step_c2 step_c2 –>|リード| step_exfiltration "
攻撃フロー
検出
隠れたPowerShellコマンドライン経由での実行の可能性 (via cmdline)
表示
GitRunner C2実行の可能性 (via powershell)
表示
スケジュールされたタスク作成の可能性 (via powershell)
表示
PowerShellを使用したスケジュールされたタスク作成の可能性 (via powershell)
表示
希少なプロセスによるサービスイメージの操作 (via registry_event)
表示
疑わしいサービスバイナリパス (via system)
表示
GitLab ランナーの潜在的な悪用を示すPowerShellスクリプトブロックのログ記録 [Windows Powershell]
表示
GitLab ランナーサービスの回避のためのPowerShell [Windows Sysmon]
表示
シミュレーション実行
前提条件: テレメトリーとベースラインの事前フライトチェックが合格している必要があります。
理論: このセクションでは、検出ルールを引き起こすために設計された敵対者手法 (TTP) の正確な実行を詳述します。コマンドと記事は、特定されたTTPを直接反映し、検出論理によって期待される正確なテレメトリーを生成することを目的としています。抽象的または無関係な例は誤診を招くでしょう。
-
攻撃のストーリーとコマンド: 敵対者が初期アクセスを獲得し、持続的なコマンドアンドコントロール (C2) チャネルを確立することを意図しています。既知のマルウェアを使用する代わりに、合法的な
gitlab-runner-windows-amd64.exeをダウンロードしてDevOpsアクティビティに自然に溶け込むようにします。彼らはこのファイルを一時ディレクトリにドロップし、”gitlab-runner”という名前のWindowsサービスとして登録します。この手法は、CI/CDツールの信頼された特性を利用して、従来のセキュリティ監査を回避することを目的としています。 -
リグレッションテストスクリプト:
# 検出検証のためのGitLabランナーのインストールのシミュレーション $ErrorActionPreference = "Stop" # 1. 検出論理にぴったりと一致するパスと名前を定義 $TargetDir = "C:WindowsTemp" $BinaryName = "gitlab-runner-windows-amd64.exe" $BinaryPath = Join-Path $TargetDir $BinaryName $ServiceName = "gitlab-runner" Write-Host "[+] シミュレーション開始: $BinaryName のインストール" # 2. ファイル作成のシミュレーション (Sysmon イベントID 11) # 実際の攻撃ではウェブダウンロードがこれに当たります。ここでは特定の名前でダミーファイルを作成します。 New-Item -Path $BinaryPath -ItemType File -Force | Out-Null Write-Host "[+] ファイルを作成: $BinaryPath (イベントID 11をトリガー)" # 3. レジストリサービスインストールのシミュレーション (Sysmon イベントID 13) # 検出のためのイメージパスをトリガーするためにレジストリにサービスパスを作成します。 $RegPath = "HKLM:SYSTEMCurrentControlSetServices$ServiceName" New-Item -Path $RegPath -Force | Out-Null Set-ItemProperty -Path $RegPath -Name "ImagePath" -Value $BinaryPath Write-Host "[+] レジストリキーとイメージパスを作成: $RegPath (イベントID 13をトリガー)" Write-Host "[+] シミュレーション完了。SIEMでのアラートをチェック。" -
クリーンアップコマンド:
# シミュレーションアーティファクトのクリーンアップ $TargetDir = "C:WindowsTemp" $BinaryName = "gitlab-runner-windows-amd64.exe" $BinaryPath = Join-Path $TargetDir $BinaryName $ServiceName = "gitlab-runner" Remove-Item -Path $BinaryPath -Force -ErrorAction SilentlyContinue Remove-Item -Path "HKLM:SYSTEMCurrentControlSetServices$ServiceName" -Recurse -Force -ErrorAction SilentlyContinue Write-Host "[+] クリーンアップ完了。"