Menggunakan PowerShell untuk Mengumpul Maklumat Insiden

PowerShell ialah alat automasi yang agak biasa yang sering digunakan oleh kedua-dua pembangun perisian hasad dan pakar keselamatan maklumat.
Artikel ini akan membincangkan pilihan menggunakan PowerShell untuk mengumpul data dari jauh dari peranti akhir apabila bertindak balas kepada insiden keselamatan maklumat. Untuk melakukan ini, anda perlu menulis skrip yang akan dijalankan pada peranti akhir dan kemudian akan terdapat penerangan terperinci tentang skrip ini.

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
		}

	}

}

Untuk bermula, buat fungsi sambungan CSIRT, yang akan mengambil hujah - laluan untuk menyimpan data yang diterima. Disebabkan fakta bahawa kebanyakan cmdlet berfungsi dalam Powershell v5, versi PowerShell telah diperiksa untuk operasi yang betul.

function CSIRT{
		
param($path)# ΠΏΡ€ΠΈ запускС скрипта Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ для сохранСния
if ($psversiontable.psversion.major -ge 5)

Untuk memudahkan navigasi melalui fail yang dibuat, dua pembolehubah dimulakan: $date dan $Computer, yang akan diberikan nama komputer dan tarikh semasa.

$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"

Kami mendapat senarai proses yang dijalankan bagi pihak pengguna semasa seperti berikut: buat pembolehubah $proses, berikannya cmdlet get-ciminstance dengan kelas win32_process. Menggunakan cmdlet Select-Object, anda boleh menambah parameter output tambahan, dalam kes kami ini akan menjadi parentprocessid (PPID ID proses induk), tarikh penciptaan (tarikh penciptaan proses), diproses (ID proses PID), nama proses (nama proses), baris arahan ( jalankan arahan).

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

Untuk mendapatkan senarai semua sambungan TCP dan UDP, cipta pembolehubah $netTCP dan $netUDP dengan memberikan mereka cmdlet Get-NetTCPConnection dan 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

Adalah penting untuk mengetahui senarai tugas dan tugasan yang dirancang. Untuk melakukan ini, kami menggunakan cmdlet get-ScheduledTask dan Get-ScheduledJob. Mari kita berikan mereka pembolehubah $task dan $job, kerana Pada mulanya, terdapat banyak tugas berjadual dalam sistem, maka untuk mengenal pasti aktiviti berniat jahat adalah bernilai menapis tugas berjadual yang sah. Cmdlet Select-Object akan membantu kami dengan ini.

$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

Dalam sistem fail NTFS terdapat perkara seperti aliran data alternatif (ADS). Ini bermakna bahawa fail dalam NTFS secara pilihan boleh dikaitkan dengan berbilang aliran data saiz sewenang-wenangnya. Menggunakan ADS, anda boleh menyembunyikan data yang tidak akan kelihatan melalui semakan sistem standard. Ini memungkinkan untuk menyuntik kod hasad dan/atau menyembunyikan data.

Untuk memaparkan strim data alternatif dalam PowerShell, kami akan menggunakan cmdlet get-item dan alat strim Windows terbina dalam dengan simbol * untuk melihat semua strim yang mungkin, untuk ini kami akan mencipta pembolehubah $ADS.

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

Adalah berguna untuk mengetahui senarai pengguna yang log masuk ke sistem; untuk ini kami akan mencipta pembolehubah $user dan menetapkannya kepada pelaksanaan program quser.

$user = quser

Penyerang boleh membuat perubahan pada autorun untuk bertapak dalam sistem. Untuk melihat objek permulaan, anda boleh menggunakan cmdlet Get-ItemProperty.
Mari kita cipta dua pembolehubah: $runUser - untuk melihat permulaan bagi pihak pengguna dan $runMachine - untuk melihat permulaan bagi pihak komputer.

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

Supaya semua maklumat ditulis ke fail yang berbeza, kami mencipta tatasusunan dengan pembolehubah dan tatasusunan dengan nama fail.


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

Dan menggunakan gelung for, data yang diterima akan ditulis ke fail.

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

Selepas melaksanakan skrip, 9 fail teks akan dibuat yang mengandungi maklumat yang diperlukan.

Hari ini, profesional keselamatan siber boleh menggunakan PowerShell untuk memperkayakan maklumat yang mereka perlukan untuk menyelesaikan pelbagai tugas dalam kerja mereka. Dengan menambahkan skrip pada permulaan, anda boleh mendapatkan beberapa maklumat tanpa mengalih keluar dump, imej, dsb.

Sumber: www.habr.com

Tambah komen