Name ︓ Yusuke Kubo Company ︓ NTT Communications Department ︓ Innovation Center (R&D) Role ︓ RedTeam - TeamV Product Manager Additional Info ︓ - Ex-MWS CUP Committee member (2021, 2022) - Ex-MWS CUP Participant(GOTO LOVE, UN頼み) - NTT Group Certified Security Principal - MITRE ATT&CK Contributor(T1562.009 Safe Mode Boot) - Red Team Summit 2023 Speaker - BSides Las Vegas 2023 Speaker - AppSec Village, Cloud Vilage@DEFCON31 Speaker 今⽇の体験談で話すネタ
C2 Attacker Command and Control Pushing malicious Workflow for C2 Attackerʻs own repository Self-Hosted Runner Application Victim l GitHubが提供するRunner ApplicationをC2のエージェントとして悪⽤する攻撃 l CI/CDサービスを介してコマンドの実⾏、実⾏結果の収集を⾏う l CI/CDサービスの機能を使⽤するためC2サーバやエージェントを⽤意する必要がない
Actions C2 l 正規のプロセスと通信先であるため、C2そのものを検知することは困難 l プロセス︓Runner.Worker.exe, Runner.Listener.exe l 通信︓github.com, api.github.com, *.actions.githubusercontent.com… l C2による悪性な振る舞いを検知することは可能 l マルウェアのダウンロード & 実⾏ l 認証情報へのアクセス … l GitHub Actionsが利⽤するプロセスと通信先がアラートのIoCと⼀致した場合に、 TTPとしてGitHub Actions C2が使⽤されていることを疑うことが重要 = 正規のプロセス、通信先であっても信⽤しない(正常性バイアスの回避)
SaaSを悪⽤するC2⼿法は既に多く存在する l SaaS C2のためのツールやフレームワークがGitHubで公開されている l SaaSのAPIを利⽤する独⾃のエージェントを開発していることが⼀般的 ➡GitHub Actions C2の場合はエージェントの開発が不要 https://github.com/WithSecureLabs/C3
l アクションで実⾏したい内容をJavaScriptで実装できる l 実装するJavaScriptコードは純粋なJavaScriptである必要がある https://docs.github.com/ja/actions/creating-actions/creating-a-javascript-action アクションのメタデータ アクションの実態となるJavaScriptコードの例
l JavaScript Actionの動き l Runner.Worker.exeがJavaScriptのランタイムとなるnode.exeを実⾏する l Entry Pointとして定義されたJSファイルがnode.exeに引数として渡される l node.exeはRunner Applicationファイル(zip)に内包されている l ”externals¥node12¥bin¥node.exe” and ”externals¥node16¥bin¥node.exe”に展開される Entry Point アクションメタデータ https://docs.github.com/en/actions /creating-actions/creating-a-javascript-action Runtime Runtime Runner Application Package [binary] node.exe [argument] index.js Runner.Worker.exe
l JScriptの⼀部を変更するだけでAMSI Scan BufferをBypassできる l 今回はGadgetToJScriptというツールによりProcess Injectionを⾏うJSファイルを⽣成 l ツール特有の⼀部の特徴的な⽂字列を変更するだけで検知されなくなる https://twitter.com/an0n_r0/status/1633620693504913408 @an0n_r0によってtwitterで報告された 変更前(検知される)と変更後(検知されない)のdiff
Malicious Custom Actionを思いついたきっかけは︖ JavaScriptがどういうフローで実⾏されているのか疑問に思った. 調べたがUndocumentedな内容なため⾃分で解析をした. Malicious Custom Actionを発⾒(=結果論) Red Team JScriptのコーディング Blue Team 動的解析 JScriptを⽤いた攻撃の経験があったから JavaScript Actionに関⼼を持った マルウェア解析に関して 基本的なスキルセットは有していた とりあえず⼿を動かしてみる
Custom Action l JavaScriptとC/C++ライブラリ間のインタフェースを提供するNode.js C++ addons l Node.js C++ addonsによりJavaScriptからC/C++コードを実⾏できる l C/C++コードであれば任意のTTPがほぼ実装できる = JavaScriptから任意のTTPを実⾏できる l 攻撃に悪⽤可能なMemoryjsというライブラリが既に存在 https://github.com/Rob--/memoryjs/ OpenProcess by memoryjs スクリプトの実⾏結果 DLL InjectionがC++で実装されている 1. VirtualAlloc 2. WriteProcessMemory 3. LoadLibrary 4. CreateRemoteThread injectDLL@memoryjs
JavaScript Custom Action l node.exeのBinary Hijackingを必要としない l node.exeで実⾏するJavaScriptはAMSIのスキャン対象はならない l AMSIをサポートしていないスクリプトエンジンを使うことは AMSI Bypassの有効な⼿段であると⾔われている ➡ JavaScript(C++ addons)で実装された攻撃の検知勝負 l 攻撃の振る舞いを検知できるか︖ l JSファイルやC++ addonsの悪性コードを検知できるか︖ ”AmsiScanBuffer”をOracleとして実験 powershellはアラートがあがる node.jsはアラートがあがらない node.exeは amsi.dllをロードしない
By utilizing the features offered by CI/CD, such as command and script execution, it is possible to launch an attack within the legitimate CI/CD process. l Malicious code may infiltrate the CI/CD pipeline without notice through a publicly available malicious plugin (Malicious Custom Action). l There is a risk of enabling C2 through the legitimate features offered by CI/CD which add user-owned hosts for executing tasks (GitHub Actions C2).