PowerShell brûke om ynsidintynformaasje te sammeljen

PowerShell is in frij gewoan automatisearringsark dat faak brûkt wurdt troch sawol malware-ûntwikkelders as spesjalisten foar ynformaasjefeiligens.
Dit artikel sil it gebrûk fan PowerShell beskôgje foar it sammeljen fan gegevens op ôfstân fan einapparaten by it reagearjen op ynsidinten fan ynformaasjefeiligens. Om dit te dwaan, moatte jo in skript skriuwe dat sil rinne op it einapparaat, en dan sil d'r in detaillearre beskriuwing fan dit skript wêze.

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
		}

	}

}

Om te begjinnen, meitsje in funksje CSIRT útwreiding, dat sil nimme in argumint - it paad te bewarjen de ûntfongen gegevens. Fanwegen it feit dat de measte cmdlets wurkje yn Powershell v5, is in kontrôle fan 'e PowerShell-ferzje makke foar juste wurking.

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

Foar gemak fan navigaasje troch de oanmakke bestannen wurde twa fariabelen inisjalisearre: $date en $Computer, dy't de kompjûternamme en de aktuele datum wurde tawiisd.

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

Wy krije de list mei rinnende prosessen út namme fan 'e aktuele brûker as folget: meitsje de $ process fariabele troch it tawizen fan de get-ciminstance cmdlet mei de win32_process klasse. Mei de cmdlet Selektearje-Object kinne jo ekstra útfierparameters taheakje, yn ús gefal sille dizze parentprocessid (PPID-âlderproses-ID), skeppingsdatum (proses skeppingsdatum), ferwurke (PID-proses-ID), prosesnamme (prosesnamme), kommandorigel wêze. (begjin kommando).

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

Om in list te krijen fan alle TCP- en UDP-ferbiningen, meitsje de $netTCP- en $netUDP-fariabelen oan troch se respektivelik de Get-NetTCPConnection- en Get-NetTCPConnection-cmdlets te jaan.

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

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

It sil wichtich wêze om de list mei plande taken en taken te kennen. Om dit te dwaan, brûke wy de cmdlets get-ScheduledTask en Get-ScheduledJob. Litte wy har de fariabelen $task en $job tawize, want Yn earste ynstânsje binne d'r in protte plande taken yn it systeem, dan is it wurdich om legitime plande taken te filterjen om kweade aktiviteit te identifisearjen. De cmdlet Select-Object sil ús hjirmei helpe.

$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

Yn it NTFS-bestânsysteem is d'r sa'n ding as alternative gegevensstreamen (Alternate Data Streams, ADS). Dit betsjut dat in bestân op NTFS fierder kin wurde assosjearre mei meardere gegevensstreamen fan willekeurige grutte. Mei ADS kinne jo gegevens ferbergje dy't net sichtber binne troch standert systeemkontrôles. Dit kin kweade koade ynjeksje en/of gegevens ferbergje.

Om alternative gegevensstreamen yn PowerShell wer te jaan, sille wy de get-item cmdlet en it ynboude Windows-stream-ark brûke mei it * symboal om alle mooglike streamen te besjen, dêrfoar sille wy de $ADS-fariabele oanmeitsje.

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

It sil nuttich wêze om de list mei brûkers ynlogd yn it systeem te kennen, hjirfoar sille wy in $ brûkersfariabele meitsje en de útfiering fan it quser-programma dêroan tawize.

$user = quser

Om in foet te krijen yn it systeem, kinne oanfallers wizigingen oanmeitsje oan autorun. Jo kinne de Get-ItemProperty cmdlet brûke om de items yn autoplay te besjen.
Litte wy twa fariabelen oanmeitsje: $runUser - om autoload út namme fan 'e brûker te besjen en $runMachine - om autoload út namme fan 'e kompjûter te besjen.

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

Om alle ynformaasje te skriuwen nei ferskate triemmen, meitsje wy in array mei fariabelen en in array mei bestânsnammen.


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

En, mei in for-loop, wurde de resultearjende gegevens skreaun nei bestannen.

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

Nei it útfieren fan it skript sille 9 tekstbestannen makke wurde mei de nedige ynformaasje.

Tsjintwurdich kinne cybersecurity-professionals PowerShell brûke om de ynformaasje te ferrykjen dy't se nedich binne om in ferskaat oan taken yn har wurk op te lossen. Troch in skript ta te foegjen foar autoload, kinne jo wat ynformaasje krije sûnder dumping, ôfbyldings, ensfh.

Boarne: www.habr.com

Add a comment