
セキュリティに携わる皆さんのためのPowerShell武器庫
[!IMPORTANT]
このリポジトリはアーカイブされました。楽しい旅ではありましたが、PSArmouryはその有用性を超えたと思います。
PowerShell Armouryは、ペンテスター、さまざまなチームのメンバー、およびエンゲージメント中にさまざまなPowerShellツールを使用するすべての人のために設計されています。これにより、お気に入りのすべてのPowerShellスクリプトを単一の難読化されたファイルにダウンロードして保存できます。
RubeusやPowerViewなどを手動で更新する必要はありません。構成ファイルを一度作成するか、ツールに含まれているデフォルトの構成ファイルを使用するだけです。これからは、次のエンゲージメントに向かう前に"New-PSArmoury"を実行するだけで済みます。
さらに、PSArmouryはコードを難読化し、AMSIバイパスが含まれています。モジュール化された設計により、検出が発生した場合に回避コードや難読化コードを簡単に変更できます。
現在のバージョンのPSArmouryは、モジュール化された設計を採用しています。
New-PSArmoury.ps1
PSArmoury.json
utilities
ConvertTo-Powershell.ps1
Invoke-Shuffle.ps1
modules
evasion.ps1
obfuscation.ps1
コードは、実行するメインの生成スクリプトNew-PSArmoury.ps1に分割されています。回避、難読化、および復号化のコードは、modulesディレクトリ内の別々の.ps1ファイルに保存されています。これらの別々のファイルはメインスクリプトから呼び出され、特定の機能(AMSIバイパスなど)を簡単に変更できるようにしています。
modulesディレクトリに加えて、utilitiesディレクトリもあります。ここには、特定のシナリオで役立つスタンドアロンスクリプトがあります。
modulesディレクトリのデフォルトのパスは.\modulesで、ドットはシェルの現在の作業ディレクトリを指します。New-PSArmouryの-ModulesDirectory引数を使用して、modulesディレクトリのパスを変更できます。ただし、スクリプトファイル自体の名前はメインスクリプトにハードコードされており、常に次のものが期待されます。
これら2つを詳しく見てみましょう。
このスクリプトには、回避したいものをバイパスするためのコードを含める必要があります。デフォルトでは、よく知られたAMSIバイパスが含まれています(thanks amsi.fail)。 以下の点に注意してください。
このスクリプトには、難読化および復号化に使用されるコードを含める必要があります。デフォルトのobfuscation.ps1はRC2暗号化を使用しています。すぐに使用できる例:
TEMPLATE_obfuscation_empty.ps1は実際には何もせず、独自の関数を構築するためのテンプレートとして機能します。
これらのいずれかを使用したい場合は、名前を"obfuscation.ps1"に変更し、デフォルトのファイルを削除してください。
カスタマイズバージョンを作成する場合、難読化に関して次の点に注意してください。
復号化に関して、次の点を忘れないでください。
utilitiesディレクトリには、便利なスタンドアロンスクリプトが含まれています。
構成ファイルは、1つ以上のオブジェクトを持つ単一の配列で構成される有効なJSONである必要があります。各オブジェクトは単一のスクリプトソースとして解釈されます。各オブジェクトには次の属性があります。
Name(必須)
このオブジェクトに含まれるスクリプトを識別するための任意の名前。自分用の参照として意図されています。
URL(必須)
スクリプトの内容を取得する場所。これはWebリソースへのURL(https://)、ローカルパス(C:\)、ネットワークリソース(\...)のいずれかです。URLは、Net.WebclientまたはPowerShellのGet-Itemにそれぞれ渡されます。基本的に、これら2つのデフォルトで処理できる形式であれば機能します。
Type(必須)
アーマリー作成者にスクリプトの場所に関するヒントを提供します。有効なタイプは3つあります。
FileInclusionFilter(オプション)
タイプ"GitHub"のオブジェクトでのみ解釈されます。PowerShellの"like"比較演算子を使用してファイル名全体と照合されるため、ワイルドカードを自分で含める必要があることに注意してください。ファイル名の一部を一致させたい場合は、必ずアスタリスク(*)を含めてください。"*.ps1"は".ps1"で終わるすべてのファイルを意味しますが、".ps1"は単に".ps1"を意味します。
フィルターを含める必要はありませんが、含める場合は使用する必要があります。空のInclusionFilterはファイルなしを意味します。
FileExclusionFilter(オプション)
InclusionFilterと同様ですが、明らかに逆です。除外は優先されます。
詳細については、インラインのPowerShellヘルプ(man -full New-PSArmoury)を参照してください。
-Path
新しいアーマリーファイルへのパス。デフォルトは".\MyArmoury.ps1"です。
-FromFile
PowerShellスクリプトをローカルフォルダーまたはファイルから直接ロードし、構成ファイルを提供する必要はありません。
-Config
JSON構成ファイルへのパス。このスクリプトに付属のサンプルを参照してアイデアを得てください。
-ModulesDirectory
モジュールディレクトリへのパス。デフォルトは".\modules"です。 ModulesDirectoryが使用される場合、EvasionPathおよびObfuscationPathパラメーターは使用できません。
-EvasionPath
回避スクリプトへのパス。EvasionPathとObfuscationPathが使用される場合、ModulesDirectoryパラメーターは使用できません。
-ObfuscationPath
難読化スクリプトへのパス。EvasionPathとObfuscationPathが使用される場合、ModulesDirectoryパラメーターは使用できません。
-ValidateOnly
"-Config"と一緒に使用して、JSON構成ファイルの基本構文を実行せずに検証します。
-GithubCredentials
GitHubユーザー名とアクセストークンを資格情報オブジェクトとして渡すと、スクリプトは入力を求めません。テストのために繰り返しアーマリーを作成する場合に便利です。
次のように使用します。
$c = get-credential
New-PSArmoury -GithubCredentials $c
スクリプトがGitHub APIを適切に使用できるように、有効なGitHubユーザー名と個人アクセストークンを提供する必要があります。MFAが有効になっている場合(有効にするべきです)、ユーザー名/パスワードは機能しないため使用しないでください。また、基本認証を使用したAPIアクセスは非推奨です。
このガイドに従って個人アクセストークンを作成してください。
注意:アクセストークンに必要な権限は、repoセクションのpublic_repoのみです。
これは、大規模なリポジトリ(PowerSploitなど)を解析して.ps1ファイルを含める場合にGitHubがブロックしないようにするためにトークンが必要なためです。
デフォルト設定でアーマリーを作成する場合(注意:Base64エンコード以外の難読化は行われません)、次のように実行します。
. .\New-PSArmoury.ps1
New-PSArmoury
これにより、現在の作業ディレクトリに"MyArmoury.ps1"という.ps1ファイルが作成され、次のものが使用されます。
次のようにアーマリーを現在のセッションにロードできます。
cat -raw .\MyArmoury.ps1 | iex
アーマリーをロードすると、次の手順が実行されます。
その後、アーマリーに含めたすべてのPowerShellコードが利用可能になります。次のようにコマンドレットを通常どおり呼び出します。
Invoke-Rubeus -Command "kerberoast /stats"
Get-DomainGroupMember -Identity "Domain Admins" -Recurse
アーマリーに何を入れたか覚えていない場合は、ロードしてインベントリを呼び出します。
Get-PSArmoury
-EvasionPathおよび-ObfuscationPathパラメーターを指定してNew-PSArmouryを開始します。
New-PSArmoury -Config C:\myarmouryconfig.json -ObfuscationPath .\modules\TEMPLATE_obfuscation_byte_convert.ps1 -EvasionPath .\modules\evasion.ps1
注意:この場合、フォルダーパスを指定するため、フォルダー内のすべての.ps1ファイルが追加されます。単一ファイルのパスを指定すると、そのファイルのみが処理されます。
New-PSArmoury -FromFile C:\myscriptfolder