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, parentprocessidKako 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, stateJednako 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-ScheduledJobU 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
