Using PowerShell to collect incident information

PowerShell ir diezgan izplatīts automatizācijas rīks, ko bieži izmanto gan kaitīgu programmu izstrādātāji, gan kiberdrošības speciālisti.
Šajā rakstā tiks izskatīts, kā izmantot PowerShell, lai attālināti vāk dati no galvenajām ierīcēm, reaģējot uz kiberdrošības incidentiem. Šim nolūkam būs jāuzraksta skripts, kas tiks palaists galvenajā ierīcē, un tālāk seko detalizēts šī skripta apraksts.

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
		}

	}

}

Sākotnēji tiek izveidota funkcija CSIRT, kurai būs jāsagatavo arguments – ceļš, kur glabāt iegūtos datus. Ņemot vērā, ka lielākā daļa komandu funkcionē PowerShell v5, tad, lai nodrošinātu pareizu darbību, tiek veikta PowerShell versijas pārbaude.

function CSIRT{
		
param($path)# Palaidot skriptu, ir jānorāda direktorija, kur glabāt
if ($psversiontable.psversion.major -ge 5)

Lai vienkāršotu navigāciju pa izveidotajām failām, tiek inicializētas divas mainīgās: $date un $Computer, kuriem tiks piešķirts datora nosaukums un pašreizējā datums.

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

Saraksts par pašreizējā lietotāja palaižamajiem procesiem tiks iegūts šādi: izveidosim mainīgo $process, piešķirot tai komandu get-ciminstance ar klasi win32_process. Izmantojot komandu Select-Object, varam pievienot papildu izvades parametrus, mūsu gadījumā tie būs parentprocessid (vecāku procesi identifikators PPID), creationdate (procesa izveides datums), processed (procesa identifikators PID), processname (procesa nosaukums), commandline (palaišanas komanda).

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

Lai iegūtu visu TCP un UDP savienojumu sarakstu, izveidosim mainīgos $netTCP un $netUDP, piešķirot tiem komandas Get-NetTCPConnection un Get-NetUDPEndpoint attiecīgi.

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

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

Ne mazāk svarīgi būs uzzināt plānotajiem uzdevumiem un darbiem. Tam izmatosim komandas get-ScheduledTask un Get-ScheduledJob. Piešķirsim tiem mainīgos $task un $job; ņemot vērā, ka sistēmā eksistē daudz plānoto uzdevumu, lai noteiktu ļaunprātīgu aktivitāti, jāfiltrē legitiem plānotiem uzdevumiem. Šajā procesā mums palīdzēs komanda 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 izslēdz autorus, kas satur “Microsoft”, “*@%systemroot%*” un arī “tukšos” autorus
$job = Get-ScheduledJob

NTFS failu sistēmā pastāv tāda jēdziena kā alternatīvie datu plūsmas (Alternate Data Streams, ADS). Tas nozīmē, ka NTFS fails var būt papildu saistīts ar vairākiem datu plūsmām pēc izvēles lieluma. Izmantojot ADS, var slēpt datus, kas nebūs redzami standarta sistēmas pārbaudēs. Tas ļauj ievietot ļaunprātīgu kodu un/vai slēpt datus.

Lai parādītu alternatīvos datu plūsmas PowerShell, izmantosim komandu get-item un iebūvēto Windows rīku stream ar simbolu * visām iespējām plūsmām; tāpēc izveidosim mainīgo $ADS.

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

Būs noderīgi uzzināt arī sarakstu ar lietotājiem, kas ir pieteikušies sistēmā; tam izveidosim mainīgo $user un piešķirsim tai komandas veikšanu quser.

$user = quser

Uzbrucēji, lai nostiprinātos sistēmā, var veikt izmaiņas automātiskajā palaišanā. Lai apskatītu objektus automātiskajā palaišanā, var izmantot komandu Get-ItemProperty.
Izveidosim divas mainīgās: $runUser – lietotāja automātiskās ielādēšanas pārbaudei un $runMachine – datora automātiskās ielādēšanas pārbaudei.

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

Lai visa informācija tiktu ierakstīta dažādos failos, izveidojam masīvu ar mainīgajiem un masīvu ar failu nosaukumiem.


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

Un, izmantojot for cilpu, iegūtie dati tiks ierakstīti failos.

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

Pēc skripta izpildes tiks izveidoti 9 teksta faili, kas satur nepieciešamo informāciju.

Pašlaik kiberdrošības speciālisti var izmantot PowerShell, lai bagātinātu informāciju, kas nepieciešama dažādu uzdevumu risināšanai viņu darbā. Pievienojot skriptu automātiskajai palaišanai, var iegūt noteiktu informāciju bez izgāztēm, attēliem utt.

Avots: habr.com

Iegādājieties uzticamu tīmekļa hostingu ar DDoS aizsardzību, VPS VDS serveriem 🔥 Iegādājieties uzticamu tīmekļa hostingu ar DDoS aizsardzību, VPS VDS serveriem | ProHoster