Uporaba PowerShell za zbiranje informacij o incidentih

PowerShell je dokaj pogosto orodje za avtomatizacijo, ki ga pogosto uporabljajo razvijalci zlonamerne programske opreme in strokovnjaki za informacijsko varnost.
Ta članek bo obravnaval možnost uporabe lupine PowerShell za oddaljeno zbiranje podatkov iz končnih naprav pri odzivanju na incidente v zvezi z varnostjo informacij. Če želite to narediti, boste morali napisati skript, ki se bo izvajal na končni napravi, nato pa bo podroben opis tega 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 '*Майкрософт*' | 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 začetek ustvarite funkcijo razširitev CSIRT, ki bo prevzel argument - pot za shranjevanje prejetih podatkov. Ker večina cmdletov deluje v Powershell v5, je bilo preverjeno pravilno delovanje različice PowerShell.

function CSIRT{
		
param($path)# при запуске скрипта необходимо указать директорию для сохранения
if ($psversiontable.psversion.major -ge 5)

Za lažjo navigacijo po ustvarjenih datotekah sta inicializirani dve spremenljivki: $date in $Computer, ki jima bosta dodeljena ime računalnika in 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"

Seznam izvajajočih se procesov v imenu trenutnega uporabnika dobimo na naslednji način: ustvarite spremenljivko $process in ji dodelite cmdlet get-ciminstance z razredom win32_process. Z ukazom cmdlet Select-Object lahko dodate dodatne izhodne parametre, v našem primeru bodo to parentprocessid (ID nadrejenega procesa PPID), creationdate (datum ustvarjanja procesa), processed (ID procesa PID), processname (ime procesa), ukazna vrstica ( ukaz za zagon).

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

Če želite pridobiti seznam vseh povezav TCP in UDP, ustvarite spremenljivki $netTCP in $netUDP tako, da jima dodelite cmdleta Get-NetTCPConnection oziroma Get-NetTCPConnection.

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

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

Pomembno bo izvedeti seznam načrtovanih nalog in zadolžitev. Za to uporabimo ukaza cmdlets get-ScheduledTask in Get-ScheduledJob. Priredimo jim spremenljivki $task in $job, ker Na začetku je v sistemu veliko načrtovanih opravil, nato pa je za prepoznavanje zlonamerne dejavnosti vredno filtrirati zakonita načrtovana opravila. Pri tem nam bo pomagal cmdlet Select-Object.

$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

V datotečnem sistemu NTFS obstaja alternativni podatkovni tok (ADS). To pomeni, da je datoteka v NTFS lahko po želji povezana z več podatkovnimi tokovi poljubne velikosti. Z ADS lahko skrijete podatke, ki ne bi bili vidni s standardnimi sistemskimi pregledi. To omogoča vstavljanje zlonamerne kode in/ali skrivanje podatkov.

Za prikaz alternativnih tokov podatkov v lupini PowerShell bomo uporabili cmdlet get-item in vgrajeno orodje za tok Windows s simbolom * za ogled vseh možnih tokov, za to bomo ustvarili spremenljivko $ADS.

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

Koristno bo izvedeti seznam uporabnikov, prijavljenih v sistem, za to bomo ustvarili spremenljivko $user in jo dodelili izvajanju programa quser.

$user = quser

Napadalci lahko spremenijo samodejni zagon, da se uveljavijo v sistemu. Za ogled zagonskih objektov lahko uporabite cmdlet Get-ItemProperty.
Ustvarimo dve spremenljivki: $runUser - za ogled zagona v imenu uporabnika in $runMachine - za ogled zagona v imenu računalnika.

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

Da so vse informacije zapisane v različne datoteke, ustvarimo polje s spremenljivkami in polje z imeni datotek.


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

Z uporabo zanke for bodo prejeti podatki zapisani v datoteke.

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

Po izvedbi skripta bo ustvarjenih 9 besedilnih datotek s potrebnimi informacijami.

Danes lahko strokovnjaki za kibernetsko varnost uporabljajo PowerShell za obogatitev informacij, ki jih potrebujejo za reševanje različnih nalog pri svojem delu. Če dodate skript v zagon, lahko dobite nekaj informacij, ne da bi odstranili odlagališča, slike itd.

Vir: www.habr.com

Dodaj komentar