使用 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 擴展,它將接受一個參數 - 保存接收到的資料的路徑。 由於大多數 cmdlet 在 Powershell v5 中運行,因此檢查了 PowerShell 版本是否可以正確運行。

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

為了方便瀏覽已建立的文件,初始化了兩個變數:$date 和 $Computer,它們將被分配電腦名稱和目前日期。

$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 cmdlet。 使用Select-Object cmdlet,您可以新增其他輸出參數,在我們的範例中,這些參數將是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 cmdlet 來建立它們。

$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 cmdlet。 讓我們為它們分配變數 $task 和 $job,因為最初,系統中有很多計劃任務,那麼為了識別惡意活動,有必要過濾掉合法的計劃任務。 Select-Object cmdlet 將幫助我們完成此任務。

$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 cmdlet 和帶有 * 符號的內建 Windows 流工具來查看所有可能的流,為此我們將建立 $ADS 變數。

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

找出登入系統的使用者清單將很有用;為此,我們將建立一個 $user 變數並將其指派給 quser 程式的執行。

$user = quser

攻擊者可以更改自動運行以在系統中獲得立足點。 若要查看啟動對象,您可以使用 Get-ItemProperty cmdlet。
讓我們建立兩個變數:$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 來豐富他們解決工作中的各種任務所需的資訊。 透過在啟動中新增腳本,您可以在不刪除轉儲、影像等的情況下取得一些資訊。

來源: www.habr.com

添加評論