Korištenje PowerShell-a za prikupljanje informacija o incidentu

PowerShell je prilično rašireno sredstvo za automatizaciju koje se često koristi kako od strane programera zlonamernog softvera, tako i od stručnjaka za informatičku sigurnost.
U ovom članku razmotrićemo način korišćenja PowerShell-a za udaljeno prikupljanje podataka sa krajnjih uređaja prilikom reagovanja na incidentne situacije IT sigurnosti. Za to će biti potrebno napisati skript koji će se pokretati na krajnjem uređaju, a zatim će biti detaljan opis tog skripta.

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
		}

	}

}

Za početak rada kreira se funkcija CSIRT, koja će prihvatiti argument – putanju za čuvanje prikupljenih podataka. S obzirom na to da većina cmdleta radi u PowerShell v5, napravljena je provera verzije PowerShell-a radi ispravnog funkcionisanja.

function CSIRT{
		
param($path)# prilikom pokretanja skripta potrebno je navesti direktorijum za čuvanje
if ($psversiontable.psversion.major -ge 5)

Za lakšu navigaciju kroz kreirane datoteke inicijalizovane su dve promenljive: $date i $Computer, kojima će biti dodeljena imena računara i trenutni datum.

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

Popis aktivnih procesa pod trenutnim korisnikom možemo dobiti na sljedeći način: kreirajmo varijablu $process dodavanjem komandleta get-ciminstance s klasom win32_process. Koristeći komandlet Select-Object, možemo dodati dodatne izlazne parametre, u našem slučaju to će biti parentprocessid (identifikator roditeljskog procesa PPID), creationdate (datum kreiranja procesa), processed (identifikator procesa PID), processname (ime procesa), commandline (komanda za pokretanje).

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

Kako bismo dobili popis svih TCP i UDP veza, kreirat ćemo varijable $netTCP i $netUDP dodjeljujući im komandlete Get-NetTCPConnection i Get-NetUDPEndpoint, redom.

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

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

Jednako važno je znati i popis zakazanih zadataka. Za to koristimo komandlete get-ScheduledTask i Get-ScheduledJob. Dodijelit ćemo im varijable $task i $job, a kako već postoji mnogo zakazanih zadataka u sustavu, za prepoznavanje zlonamjerne aktivnosti, važno je filtrirati legitimne zakazane zadatke. U tome nam može pomoći komandlet 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 isključuje autore koji sadrže 'Microsoft', 'Microsoft', '*@%systemroot%*', kao i 'prazne' autore
$job = Get-ScheduledJob

U datotečnom sustavu NTFS postoji pojam koji se naziva alternativni tokovi podataka (Alternate Data Streams, ADS). To znači da se datoteka u NTFS može dodatno povezati s nekoliko tokova podataka proizvoljne veličine. Pomoću ADS-a može se sakriti podataka koji neće biti vidljivi standardnim provjerama sustava. Na taj način moguće je implantirati zloćudni kod i/ili sakriti podatke.

Za ispis alternativnih tokova podataka u PowerShellu koristit ćemo komandlet get-item i ugrađeni alat Windows stream s simbolom * za pregled svih mogućih tokova, zbog čega ćemo kreirati varijablu $ADS.

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

Također će biti korisno znati i popis korisnika koji su prijavljeni u sustav, a za to ćemo kreirati varijablu $user i dodijeliti joj izvršavanje programa quser.

$user = quser

Napadači, kako bi se učvrstili u sustavu, mogu promijeniti postavke za automatsko pokretanje. Da biste pregledali objekte u automatskom pokretanju, možete koristiti cmdlet Get-ItemProperty.
Kreirajmo dvije varijable: $runUser – za pregled automatskog pokretanja u ime korisnika i $runMachine – za pregled automatskog pokretanja u ime računala.

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

Da bi sve informacije bile pohranjene u različitim datotekama, kreiramo niz s varijablama i niz s imenima datoteka.


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

I, koristeći for petlju, prikupljeni podaci bit će zapisani u datoteke.

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

Nakon izvršenja skripte, bit će stvoreno 9 tekstualnih datoteka koje sadrže potrebne informacije.

Trenutno, stručnjaci za cybersigurnost mogu koristiti PowerShell za obogaćivanje informacija potrebnih za rješavanje raznih zadataka u svom radu. Dodavanjem skripte u automatsko pokretanje, moguće je prikupiti određene informacije bez potrebe za stvaranjem dumpova, slika itd.

Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster