PowerShell është një mjet automatizimi mjaft i njohur, i cili përdoret shpesh nga zhvilluesit e softuerëve të dëmshëm dhe specialistët e sigurisë së informacionit.
Ky artikull do të shqyrtojë një variant të përdorimit të PowerShell për mbledhjen e të dhënave nga pajisjet përfundimtare gjatë reagimit ndaj incidenteve të sigurisë. Për këtë, do t'ju duhet të shkruani një skript që do të ekzekutohet në pajisjen përfundimtare dhe më pas do të jepet një përshkrim i detajuar i këtij skripti.
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
}
}
}Për të filluar, krijohet një funksion CSIRT, i cili do të pranojë një argument – rrugën për ruajtjen e të dhënave të mbledhura. Duke qenë se shumica e komandave punojnë në Powershell v5, është kryer një kontroll i versionit të PowerShell për funksionimin e saktë.
function CSIRT{
param($path)# gjatë ekzekutimit të skriptit duhet të specifikohet direktoria për ruajtje
if ($psversiontable.psversion.major -ge 5)Për lehtësinë e navigimit në skedarët e krijuar, janë inicializuar dy variabla: $date dhe $Computer, të cilëve do t'u caktojnë emrin e kompjuterit dhe datën aktuale.
$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"Lista e proceseve të nisura nga përdoruesi aktual mund të merret si më poshtë: krijoni një variablë $process, duke i caktuar asaj komandën get-ciminstance me klasën win32_process. Duke përdorur komandën Select-Object mund të shtoni parametra të tjerë të daljes, në rastin tonë këto do të jenë parentprocessid (identifikuesi i procesit prind PPID), creationdate (data e krijimit të procesit), processed (identifikuesi i procesit PID), processname (emri i procesit), commandline (komanda e nisjes).
$process = get-ciminstance -classname win32_process | Select-Object creationdate, processname, processid, commandline, parentprocessidPër të marrë listën e të gjitha lidhjeve TCP dhe UDP krijoni variablat $netTCP dhe $netUDP duke u caktuar atyre komandat Get-NetTCPConnection dhe Get-NetUDPEndpoint përkatësisht.
$netTCP = Get-NetTCPConnection | select-object creationtime, localaddress, localport, remoteaddress, remoteport, owningprocess, state
$netUDP = Get-NetUDPEndpoint | select-object creationtime, localaddress, localport, remoteaddress, remoteport, owningprocess, stateNjë tjetër aspekt i rëndësishëm është të dihet lista e detyrave të planifikuara dhe punëve. Për këtë do të përdorim komandat get-ScheduledTask dhe Get-ScheduledJob. Do t'i caktuar variablat $task dhe $job, pasi që në sistem ekzistojnë shumë detyra të planifikuara, për ta përcaktuar aktivitetin e dëmshëm është e rëndësishme të filtrohen detyrat legjitime të planifikuara. Në këtë na ndihmon komanda Select-Object.
$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 përjashton autorët që përmbajnë 'Microsoft', 'Microsoft', '*@%systemroot%*', si dhe autorët 'të zbrazët'
$job = Get-ScheduledJobNë sistemin e skedarëve NTFS ekziston një koncept i tillë si rrjedhat alternative të të dhënave (Alternate Data Streams, ADS). Kjo do të thotë se një skedar në NTFS mund të lidhet për më shumë rrjedha të dhënash me madhësi të rastësishme. Duke përdorur ADS është e mundur të fshihen të dhëna që nuk do të shihen nga verifikimet standarde të sistemit. Kjo mundëson futjen e kodit të dëmshëm dhe/ose fshehjen e të dhënave.
Për të shfaqur rrjedhat alternative të të dhënave në PowerShell do të përdorim komandën get-item dhe mjetin e brendshëm të Windows stream me simbolin * për të parë të gjitha rrjedhat e mundshme, për këtë do të krijojmë një variablë $ADS.
$ADS = get-item * -stream * | where stream -ne ':$Data' Do të ishte e dobishme të dihet edhe lista e përdoruesve të hyrë në sistem, për këtë do të krijojmë një variablë $user dhe t’i caktuar asaj programin quser.
$user = quser Përdoruesit e keq, për të pozicionuar vetveten në sistem, mund të bëjnë ndryshime në autostart. Për të parë objektet në autostart, mund të përdorni komandën Get-ItemProperty.
Do të krijojmë dy variabla: $runUser – për të parë autostart-in në emër të përdoruesit dhe $runMachine – për të parë autostart-in në emër të kompjuterit.
$runUser = Get-ItemProperty
"HKCU:SoftwareMicrosoftWindowsCurrentVersionRun"
$runMachine = Get-ItemProperty
"HKLM:SoftwareMicrosoftWindowsCurrentVersionRun"Për të shkruar të gjitha informacionet në skedare të ndryshme, krijojmë një array me variabla dhe një array me emrat e skedarëve.
$array = $process, $netTCP, $netUDP, $task, $user, $runUser, $runMachine, $job, $ADS
$arrayName = "Processes", "TCPConnect", "UDPConnect", "TaskScheduled", "Users", "RunUser", "RunMachine",
"ScheduledJob", "Alternative Data Stream"Dhe, duke përdorur një cikël for, të dhënat e marra do të shkruhen në skedare.
for ($w = 0; $w -lt $array.count; $w++){
$name = $arrayName[$w]
$array[$w] >> $path$name.txt
Pas përfundimit të skriptit, do të krijohen 9 skedare tekstualë që përmbajnë informacionin e nevojshëm.
Aktualisht, specialistët e sigurisë kibernetike mund të përdorin PowerShell për të pasuruar informacionin e nevojshëm për të zgjidhur lloj-lloj problemesh në punën e tyre. Duke e shtuar skriptin në autostart, mund të merrni disa informacione pa pasur nevojë të nxirrni dump-e, imazhe etj.
Burimi: habr.com
