PowerShell を使用してインシデント情報を収集する

PowerShell は、マルウェア開発者と情報セキュリティ専門家の両方によってよく使用される、かなり一般的な自動化ツールです。
この記事では、情報セキュリティ インシデントに対応する際に、PowerShell を使用してエンド デバイスからデータをリモート収集するオプションについて説明します。 これを行うには、エンドデバイスで実行されるスクリプトを作成する必要があります。その後、このスクリプトの詳細な説明が記載されます。

function CSIRT{
param($path)
if ($psversiontable.psversion.major -ge 5)
	{
	$date = Get-Date -Format dd.MM.yyyy_hh_mm
	$Computer = $env:COMPUTERNAME
	New-Item -Path $path$computer$date -ItemType 'Directory' -Force | Out-Null
	$path = "$path$computer$date"

	$process = get-ciminstance -classname win32_process | Select-Object creationdate, processname,
	processid, commandline, parentprocessid

	$netTCP = Get-NetTCPConnection | select-object creationtime, localaddress,
	localport, remoteaddress, remoteport, owningprocess, state
	
	$netUDP = Get-NetUDPEndpoint | select-object creationtime, localaddress,
	localport, remoteaddress, remoteport, owningprocess, state

	$task = get-ScheduledTask | Select-Object author, actions, triggers, state, description, taskname|
	where author -notlike '*Майкрософт*' | where author -ne $null |
	where author -notlike '*@%systemroot%*' | where author -notlike '*microsoft*'

	$job = Get-ScheduledJob

	$ADS =  get-item * -stream * | where stream -ne ':$Data'

	$user = quser

	$runUser = Get-ItemProperty "HKCU:SoftwareMicrosoftWindowsCurrentVersionRun"

	$runMachine =  Get-ItemProperty "HKLM:SoftwareMicrosoftWindowsCurrentVersionRun"

	$array = $process, $netTCP, $netUDP, $task, $user, $runUser, $runMachine, $job, $ADS
	$arrayName = "Processes", "TCPConnect", "UDPConnect", "TaskScheduled", "Users", "RunUser", "RunMachine",
	"ScheduledJob", "AlternativeDataStream"


	for ($w = 0; $w -lt $array.count; $w++){
		$name = $arrayName[$w]
		$array[$w] >> $path$name.txt
		}

	}

}

まず関数を作成します CSIRT エクステンション、これは引数、つまり受信したデータを保存するパスを受け取ります。 ほとんどのコマンドレットは Powershell v5 で動作するため、PowerShell のバージョンが正しく動作するかどうかがチェックされました。

function CSIRT{
		
param($path)# при запуске скрипта необходимо указать директорию для сохранения
if ($psversiontable.psversion.major -ge 5)

作成されたファイル内のナビゲーションを容易にするために、$date と $Computer という XNUMX つの変数が初期化され、コンピューター名と現在の日付が割り当てられます。

$date = Get-Date -Format dd.MM.yyyy_hh_mm
$Computer = $env:COMPUTERNAME
New-Item -Path $path$computer$date –ItemType 'Directory' -Force | Out-Null 
$path = "$path$computer$date"

次のように、現在のユーザーに代わって実行中のプロセスのリストを取得します。 $process 変数を作成し、それに win32_process クラスの get-ciminstance コマンドレットを割り当てます。 Select-Object コマンドレットを使用すると、追加の出力パラメータを追加できます。この例では、parentprocessid (親プロセス ID PPID)、creationdate (プロセス作成日)、processed (プロセス ID PID)、processname (プロセス名)、commandline (コマンドを実行します)。

$process = get-ciminstance -classname win32_process | Select-Object creationdate, processname, processid, commandline, parentprocessid

すべての TCP 接続と UDP 接続のリストを取得するには、$netTCP 変数と $netUDP 変数を作成し、それぞれに Get-NetTCPConnection および Get-NetTCPConnection コマンドレットを割り当てます。

$netTCP = Get-NetTCPConnection | select-object creationtime, localaddress, localport, remoteaddress, remoteport, owningprocess, state

$netUDP = Get-NetUDPEndpoint | select-object creationtime, localaddress, localport, remoteaddress, remoteport, owningprocess, state

計画されているタスクと割り当てのリストを確認することが重要です。 これを行うには、get-ScheduledTask および Get-ScheduledJob コマンドレットを使用します。 これらに変数 $task と $job を割り当てましょう。 当初、システムにはスケジュールされたタスクが多数存在しますが、その後、悪意のあるアクティビティを特定するには、正当なスケジュールされたタスクをフィルタリングして除外する価値があります。 これには、Select-Object コマンドレットが役立ちます。

$task = get-ScheduledTask | Select-Object author, actions, triggers, state, description, taskname| where author -notlike '*Майкрософт*' | where author -ne $null | where author -notlike '*@%systemroot%*' | where author -notlike '*microsoft*' # $task исключает авторов, содержащих “Майкрософт”, “Microsoft”, “*@%systemroot%*”, а также «пустых» авторов
$job = Get-ScheduledJob

NTFS ファイル システムには、代替データ ストリーム (ADS) のようなものがあります。 これは、NTFS 内のファイルを任意のサイズの複数のデータ ストリームにオプションで関連付けることができることを意味します。 ADS を使用すると、標準のシステム チェックでは表示されないデータを非表示にすることができます。 これにより、悪意のあるコードの挿入やデータの隠蔽が可能になります。

PowerShell で代替データ ストリームを表示するには、get-item コマンドレットと、* 記号が付いた組み込みの Windows ストリーム ツールを使用して、考えられるすべてのストリームを表示します。このために、$ADS 変数を作成します。

$ADS = get-item * -stream * | where stream –ne ':$Data' 

システムにログインしているユーザーのリストを確認すると便利です。このために $user 変数を作成し、それを quser プログラムの実行に割り当てます。

$user = quser

攻撃者は自動実行に変更を加えてシステムへの足がかりを得る可能性があります。 スタートアップ オブジェクトを表示するには、Get-ItemProperty コマンドレットを使用できます。
XNUMX つの変数を作成しましょう。$runUser - ユーザーに代わってスタートアップを表示し、$runMachine - コンピューターに代わってスタートアップを表示します。

$runUser = Get-ItemProperty 
"HKCU:SoftwareMicrosoftWindowsCurrentVersionRun"
$runMachine = Get-ItemProperty 
"HKLM:SoftwareMicrosoftWindowsCurrentVersionRun"

すべての情報が異なるファイルに書き込まれるように、変数を含む配列とファイル名を含む配列を作成します。


$array = $process, $netTCP, $netUDP, $task, $user, $runUser, $runMachine, $job, $ADS
$arrayName = "Processes", "TCPConnect", "UDPConnect" "TaskScheduled", "Users", "RunUser", "RunMachine",
"ScheduledJob", "Alternative Data Stream"

そして、for ループを使用して、受信したデータをファイルに書き込みます。

for ($w = 0; $w -lt $array.count; $w++){
	$name = $arrayName[$w]
	$array[$w] >> $path$name.txt

スクリプトを実行すると、必要な情報を含む 9 つのテキスト ファイルが作成されます。

現在、サイバーセキュリティの専門家は PowerShell を使用して、仕事のさまざまなタスクを解決するために必要な情報を充実させることができます。 起動にスクリプトを追加すると、ダンプやイメージなどを削除せずに情報を取得できます。

出所: habr.com

コメントを追加します