PowerShell er et ganske vanlig automatiseringsverktøy som ofte brukes av både skadevareutviklere og informasjonssikkerhetsspesialister.
Denne artikkelen vil diskutere muligheten for å bruke PowerShell til å eksternt samle inn data fra sluttenheter når du svarer på informasjonssikkerhetshendelser. For å gjøre dette, må du skrive et skript som skal kjøres på sluttenheten, og så vil det være en detaljert beskrivelse av dette skriptet.
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
}
}
}
For å komme i gang, lag en funksjon CSIRT-utvidelse, som vil ta et argument - banen for å lagre de mottatte dataene. På grunn av det faktum at de fleste cmdlets fungerer i Powershell v5, ble PowerShell-versjonen sjekket for korrekt drift.
function CSIRT{
param($path)# при запуске скрипта необходимо указать директорию для сохранения
if ($psversiontable.psversion.major -ge 5)
For enkel navigering gjennom de opprettede filene, initialiseres to variabler: $date og $Computer, som vil bli tildelt datamaskinnavnet og gjeldende 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"
Vi får listen over kjørende prosesser på vegne av gjeldende bruker som følger: lag en $process-variabel, og tilordne den get-ciminstance-cmdleten med win32_process-klassen. Ved å bruke Select-Object-cmdleten kan du legge til flere utdataparametere, i vårt tilfelle vil disse være parentprocessid (overordnet prosess-ID PPID), opprettelsesdato (prosessopprettelsesdato), behandlet (prosess-ID PID), prosessnavn (prosessnavn), kommandolinje ( kjør kommando).
$process = get-ciminstance -classname win32_process | Select-Object creationdate, processname, processid, commandline, parentprocessid
For å få en liste over alle TCP- og UDP-tilkoblinger, lag $netTCP- og $netUDP-variablene ved å tilordne dem henholdsvis Get-NetTCPConnection- og Get-NetTCPConnection-cmdletene.
$netTCP = Get-NetTCPConnection | select-object creationtime, localaddress, localport, remoteaddress, remoteport, owningprocess, state
$netUDP = Get-NetUDPEndpoint | select-object creationtime, localaddress, localport, remoteaddress, remoteport, owningprocess, state
Det vil være viktig å finne ut listen over planlagte oppgaver og oppdrag. For å gjøre dette bruker vi cmdletene get-ScheduledTask og Get-ScheduledJob. La oss tildele dem variablene $task og $job, fordi I utgangspunktet er det mange planlagte oppgaver i systemet, og for å identifisere ondsinnet aktivitet er det verdt å filtrere ut legitime planlagte oppgaver. Select-Object-cmdleten vil hjelpe oss med dette.
$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
I NTFS-filsystemet er det noe slikt som alternative datastrømmer (ADS). Dette betyr at en fil i NTFS valgfritt kan assosieres med flere datastrømmer av vilkårlig størrelse. Ved å bruke ADS kan du skjule data som ikke vil være synlige gjennom standard systemsjekker. Dette gjør det mulig å injisere ondsinnet kode og/eller skjule data.
For å vise alternative datastrømmer i PowerShell, vil vi bruke get-item cmdlet og det innebygde Windows-strømverktøyet med *-symbolet for å se alle mulige strømmer, for dette vil vi lage $ADS-variabelen.
$ADS = get-item * -stream * | where stream –ne ':$Data'
Det vil være nyttig å finne ut listen over brukere som er logget på systemet; for dette vil vi lage en $user-variabel og tilordne den til kjøringen av quser-programmet.
$user = quser
Angripere kan gjøre endringer i autorun for å få fotfeste i systemet. For å vise oppstartsobjekter kan du bruke Get-ItemProperty-cmdleten.
La oss lage to variabler: $runUser - for å vise oppstart på vegne av brukeren og $runMachine - for å vise oppstart på vegne av datamaskinen.
$runUser = Get-ItemProperty
"HKCU:SoftwareMicrosoftWindowsCurrentVersionRun"
$runMachine = Get-ItemProperty
"HKLM:SoftwareMicrosoftWindowsCurrentVersionRun"
For at all informasjon skal skrives til forskjellige filer, lager vi en matrise med variabler og en matrise med filnavn.
$array = $process, $netTCP, $netUDP, $task, $user, $runUser, $runMachine, $job, $ADS
$arrayName = "Processes", "TCPConnect", "UDPConnect" "TaskScheduled", "Users", "RunUser", "RunMachine",
"ScheduledJob", "Alternative Data Stream"
Og ved å bruke en for-løkke, vil de mottatte dataene bli skrevet til filer.
for ($w = 0; $w -lt $array.count; $w++){
$name = $arrayName[$w]
$array[$w] >> $path$name.txt
Etter utførelse av skriptet vil det bli opprettet 9 tekstfiler som inneholder nødvendig informasjon.
I dag kan cybersikkerhetseksperter bruke PowerShell til å berike informasjonen de trenger for å løse en rekke oppgaver i arbeidet. Ved å legge til et skript til oppstart, kan du få litt informasjon uten å fjerne dumps, bilder osv.
Kilde: www.habr.com