PowerShell-dan insident məlumatlarının toplanması

PowerShell, zərərli proqram inkişaf etdiriciləri və informasiya təhlükəsizliyi mütəxəssisləri tərəfindən tez-tez istifadə olunan yaygın bir avtomatlaşdırma vasitəsidir.
Bu məqalədə PowerShell-in informasiya təhlükəsizliyi insidentlərinə cavab verərkən son cihazlardan uzaqdan məlumatları toplama yolu müzakirə ediləcək. Bunun üçün son cihazda icra olunacaq skript yazmaq lazımdır və bu skriptin detalları aşağıda veriləcək.

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 '*Microsoft*' | 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
		}

	}

}

İşə başlamaq üçün bir funksiya yaradılır CSIRT, hansı ki, alınan məlumatların saxlanması üçün yol argümentini qəbul edəcək. Çoxlu komanda zəncirləri PowerShell v5-də işlədiyi üçün düzgün fəaliyyət göstərməsi üçün PowerShell versiyasını yoxlamaq edilib.

function CSIRT{
		
param($path)# skriptin işə salınmasında saxlanma üçün direktoriyanı göstərmək lazımdır
if ($psversiontable.psversion.major -ge 5)

Yaradılan faylların idarə edilməsində rahatlıq üçün iki dəyişən: $date və $Computer, hansı ki, kompüterin adı və cari tarixi alacaq şəkildə təyin edilir.

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

Cari istifadəçi adına olan bütün proseslərin siyahısını əldə etmək üçün: $process dəyişənini yaradaraq ona get-ciminstance komanda zəncirindən win32_process sinfini verəcəyik. Select-Object komanda zənciri ilə əlavə çıxış parametrləri əlavə etmək mümkündür, bizim halımızda bunlar parentprocessid (öz ana prosesinin identifikatoru PPID), creationdate (proses yaradılma tarixi), processed (prosesin identifikatoru PID), processname (prosesin adı), commandline (işə salma əmri) olacaq.

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

Bütün TCP və UDP əlaqələrinin siyahısını əldə etmək üçün $netTCP və $netUDP dəyişənlərini yaradaraq Get-NetTCPConnection və Get-NetUDPEndpoint komandalarını onlara verəcəyik.

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

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

Vaciblərin və tapşırıqların planı haqqında məlumat əldə etmək də önəmlidir. Bunun üçün get-ScheduledTask və Get-ScheduledJob cmdlet-lərindən istifadə edəcəyik. Onlara $task və $job adlı dəyişənlər təyin edəcəyik, çünki sistemdə çoxlu sayda planlaşdırılmış tapşırıq olduğuna görə zərərli fəaliyyətləri müəyyənləşdirmək üçün qanuni planlaşdırılmış tapşırıqları filtrləmək lazımdır. Bunda bizə Select-Object cmdlet-i kömək edəcək.

$task = get-ScheduledTask | Select-Object author, actions, triggers, state, description, taskname| where author -notlike '*Microsoft*' | where author -ne $null | where author -notlike '*@%systemroot%*' | where author -notlike '*microsoft*' # $task, “Microsoft” daxil edən müəllifləri, “*@%systemroot%*”, eləcə də «boş» müəllifləri istisna edir
$job = Get-ScheduledJob

NTFS fayl sistemində alternativ məlumat axınları (Alternative Data Streams, ADS) anlayışı mövcuddur. Bu, NTFS-də bir faylın əlavə olaraq müxtəlif ölçülü bir neçə məlumat axını ilə əlaqələndirilə biləcəyi deməkdir. ADS vasitəsilə sistemin standart yoxlamaları ilə görünməyəcək məlumatları gizlətmək mümkündür. Bunun sayəsində zərərli kodu daxil etmək və ya məlumatları gizlətmək mümkündür.

Alternativ məlumat axınlarını PowerShell-də çıxarmaq üçün get-item cmdlet-i və bütün mümkün axınları görmək üçün *, simvolu ilə Windows stream-in daxili alətindən istifadə edəcəyik, bunun üçün $ADS adlı dəyişən yaradacağıq.

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

Sistemdə daxil olmuş istifadəçilərin siyahısını öyrənmək də faydalıdır, bunun üçün $user adlı dəyişən yaradacağıq və ona quser proqramının icrasını təyin edəcəyik.

$user = quser

Kiber cinayətkarlar sistemdə qalmaq üçün avtostartda dəyişikliklər edə bilərlər. Avtostartdakı obyektləri görmək üçün Get-ItemProperty cmdlet-indən istifadə edə bilərik.
İki dəyişən yaradacağıq: $runUser – istifadəçi adı ilə avtostartı görmək üçün və $runMachine – kompüter adı ilə avtostartı görmək üçün.

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

Bütün məlumatların müxtəlif fayllara yazılması üçün dəyişənlərdən ibarət bir massiv və fayl adlarından ibarət bir massiv yaradacağıq.


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

Və, for dövründən istifadə edərək, əldə edilmiş məlumatlar fayllara yazılacaq.

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

Skripti icra etdikdən sonra, zəruri məlumatları ehtiva edən 9 mətndən ibarət fayl yaradılacaq.

Hazırda kiber təhlükəsizlik uzmanları PowerShell-dən müxtəlif vəzifələrin icrasında lazım olan məlumatları zənginləşdirmək üçün istifadə edə bilərlər. Skripti avtostarta əlavə etməklə, dump, görüntü və s. çıxarmadan müəyyən məlumatları əldə etmək mümkündür.

Mənbə: habr.com

DDoS qoruması olan saytlara etibarlı hosting satın alın, VPS VDS serverlər 🔥 DDoS qoruması olan saytlara etibarlı hosting satın alın, VPS VDS serverlər | ProHoster