PowerShell er et forholdsvis udbredt automatiseringsværktøj, der ofte anvendes af både ondsindede udviklere og informationssikkerhedsspecialister.
I denne artikel vil vi se på, hvordan man bruger PowerShell til fjernindsamling af data fra slutbrugerenheder i forbindelse med hændelsesrespons i cybersikkerhed. Dette kræver, at man skriver et skript, der skal køre på slutbrugerenheden, og nedenfor er en detaljeret beskrivelse af dette skript.
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
}
}
}For at begynde arbejdet oprettes der en funktion CSIRT, som tager et argument - en sti til at gemme de indsamlede data. Da de fleste cmdlets fungerer i PowerShell v5, er der lavet en versionskontrol for korrekt drift.
function CSIRT{
param($path)# når skriptet køres, skal der angives en mappe til at gemme
if ($psversiontable.psversion.major -ge 5)For at gøre navigationen i de oprettede filer lettere, er der initialiseret to variabler: $date og $Computer, som vil få tildelt computerens navn og den aktuelle dato.
$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"Listen over aktiverede processer i den nuværende brugers navn kan vi få på følgende måde: vi opretter en variabel $process og tildeler den cmdleten get-ciminstance med klassen win32_process. Ved at bruge cmdleten Select-Object kan vi tilføje ekstra outputparametre; i vores tilfælde vil disse være parentprocessid (identifikator for forældreprocessen PPID), creationdate (processens oprettelsesdato), processed (identifikator for processen PID), processname (processens navn), commandline (startkommando).
$process = get-ciminstance -classname win32_process | Select-Object creationdate, processname, processid, commandline, parentprocessidFor at få en liste over alle TCP- og UDP-forbindelser opretter vi variablerne $netTCP og $netUDP og tildeler dem cmdlet'erne Get-NetTCPConnection og Get-NetUDPEndpoint henholdsvis.
$netTCP = Get-NetTCPConnection | select-object creationtime, localaddress, localport, remoteaddress, remoteport, owningprocess, state
$netUDP = Get-NetUDPEndpoint | select-object creationtime, localaddress, localport, remoteaddress, remoteport, owningprocess, stateDet vil også være vigtigt at få en liste over planlagte opgaver og job. Til dette bruger vi cmdlet'erne get-ScheduledTask og Get-ScheduledJob. Vi tildeler dem variablerne $task og $job, og da der i systemet allerede findes mange planlagte opgaver, vil vi for at identificere ondsindet aktivitet filtrere legitime planlagte opgaver. Det vil cmdleten Select-Object hjælpe os med.
$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 udelukker forfattere, der indeholder “Microsoft”, “*@%systemroot%*” samt “null” forfattere
$job = Get-ScheduledJobI NTFS-filsystemet findes der et begreb kaldet alternative datastreams (Alternate Data Streams, ADS). Det betyder, at en fil i NTFS kan være yderligere knyttet til flere datastreams af vilkårlig størrelse. Gennem ADS kan man skjule data, som ikke vil være synlige ved standard systemtjek. Dette muliggør indsættelse af ondsindet kode og/eller skjulte data.
For at vise alternative datastreams i PowerShell vil vi bruge cmdleten get-item og det indbyggede Windows-værktøj stream med symbolet * for at se alle mulige streams, til dette opretter vi variablen $ADS.
$ADS = get-item * -stream * | where stream -ne ':$Data' Det vil også være nyttigt at få en liste over brugere, der er logget ind i systemet; til dette opretter vi variablen $user og tildeler den udførelsen af programmet quser.
$user = quser Angribere kan foretage ændringer i autostart for at få fodfæste i systemet. For at se objekter i autostart kan man bruge cmdleten Get-ItemProperty.
Lad os oprette to variabler: $runUser – til at se autostart fra brugerens perspektiv og $runMachine – til at se autostart fra maskinens perspektiv.
$runUser = Get-ItemProperty
"HKCU:SoftwareMicrosoftWindowsCurrentVersionRun"
$runMachine = Get-ItemProperty
"HKLM:SoftwareMicrosoftWindowsCurrentVersionRun"For at gemme al information i forskellige filer opretter vi et array med variabler og et array med filnavne.
$array = $process, $netTCP, $netUDP, $task, $user, $runUser, $runMachine, $job, $ADS
$arrayName = "Processes", "TCPConnect", "UDPConnect", "TaskScheduled", "Users", "RunUser", "RunMachine",
"ScheduledJob", "Alternative Data Stream"Og ved hjælp af en for-løkke vil de indsamlede data blive gemt i filer.
for ($w = 0; $w -lt $array.count; $w++){
$name = $arrayName[$w]
$array[$w] >> $path$name.txt
Efter scriptets udførelse vil der blive oprettet 9 tekstfiler, der indeholder de nødvendige oplysninger.
I dag kan cybersikkerhedsspecialister bruge PowerShell til at berige de oplysninger, der er nødvendige for at løse forskellige opgaver i deres arbejde. Ved at tilføje scriptet til autostart kan man indhente visse oplysninger uden at tage dumps, billeder osv.
Kilde: habr.com
