Përdorimi i PowerShell për të mbledhur informacione rreth incidentit

PowerShell është një mjet automatizimi mjaft i zakonshëm që përdoret shpesh nga zhvilluesit e malware dhe specialistët e sigurisë së informacionit.
Ky artikull do të diskutojë opsionin e përdorimit të PowerShell për të mbledhur të dhëna nga distanca nga pajisjet fundore kur reagon ndaj incidenteve të sigurisë së informacionit. Për ta bërë këtë, do t'ju duhet të shkruani një skript që do të funksionojë në pajisjen fundore dhe më pas do të ketë një përshkrim të detajuar të këtij skenari.

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
		}

	}

}

Për të filluar, krijoni një funksion Zgjerimi CSIRT, i cili do të marrë një argument - shtegun për të ruajtur të dhënat e marra. Për shkak të faktit se shumica e cmdlet-ve funksionojnë në Powershell v5, versioni PowerShell u kontrollua për funksionimin e saktë.

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

Për lehtësinë e lundrimit nëpër skedarët e krijuar, janë inicializuar dy variabla: $date dhe $Computer, të cilëve do t'u caktohet emri i kompjuterit dhe data 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"

Ne marrim listën e proceseve të ekzekutuara në emër të përdoruesit aktual si më poshtë: krijoni një variabël $process, duke i caktuar asaj cmdlet get-ciminstance me klasën win32_process. Duke përdorur cmdlet Select-Object, ju mund të shtoni parametra shtesë të daljes, në rastin tonë këto do të jenë prindprocessid (ID e procesit prind PPID), data e krijimit (data e krijimit të procesit), e përpunuar (ID e procesit), emri i procesit (emri i procesit), linja e komandës ( komanda e ekzekutimit).

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

Për të marrë një listë të të gjitha lidhjeve TCP dhe UDP, krijoni variablat $netTCP dhe $netUDP duke u caktuar atyre cmdlet Get-NetTCPConnection dhe Get-NetTCPConnection, 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, state

Do të jetë e rëndësishme të zbuloni listën e detyrave dhe detyrave të planifikuara. Për ta bërë këtë, ne përdorim cmdlet get-ScheduledTask dhe Get-ScheduledJob. Le t'u caktojmë atyre variablat $task dhe $job, sepse Fillimisht, ka shumë detyra të planifikuara në sistem, pastaj për të identifikuar aktivitetin me qëllim të keq, ia vlen të filtroni detyrat e planifikuara legjitime. Për këtë do të na ndihmojë cmdlet 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

Në sistemin e skedarëve NTFS ekziston një gjë e tillë si rrjedhat alternative të të dhënave (ADS). Kjo do të thotë që një skedar në NTFS mund të lidhet opsionalisht me rryma të shumta të dhënash me madhësi arbitrare. Duke përdorur ADS, ju mund të fshehni të dhëna që nuk do të ishin të dukshme përmes kontrolleve standarde të sistemit. Kjo bën të mundur injektimin e kodit me qëllim të keq dhe/ose fshehjen e të dhënave.

Për të shfaqur transmetime alternative të të dhënave në PowerShell, do të përdorim cmdlet get-item dhe mjetin e integruar të transmetimit të Windows me simbolin * për të parë të gjitha transmetimet e mundshme, për këtë do të krijojmë variablin $ADS.

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

Do të jetë e dobishme të zbuloni listën e përdoruesve të regjistruar në sistem; për këtë ne do të krijojmë një ndryshore $user dhe do ta caktojmë atë në ekzekutimin e programit quser.

$user = quser

Sulmuesit mund të bëjnë ndryshime në autorun për të fituar një terren në sistem. Për të parë objektet e nisjes, mund të përdorni cmdlet Get-ItemProperty.
Le të krijojmë dy variabla: $runUser - për të parë fillimin në emër të përdoruesit dhe $runMachine - për të parë fillimin në emër të kompjuterit.

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

Në mënyrë që të gjitha informacionet të shkruhen në skedarë të ndryshëm, ne krijojmë një grup me variabla dhe një grup me emra skedarësh.


$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ë lak for, të dhënat e marra do të shkruhen në skedarë.

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

Pas ekzekutimit të skriptit, do të krijohen 9 skedarë teksti që përmbajnë informacionin e nevojshëm.

Sot, profesionistët e sigurisë kibernetike mund të përdorin PowerShell për të pasuruar informacionin që u nevojitet për të zgjidhur një sërë detyrash në punën e tyre. Duke shtuar një skript në nisje, mund të merrni disa informacione pa hequr deponitë, imazhet, etj.

Burimi: www.habr.com

Shto një koment