Paggamit ng PowerShell para Mangalap ng Impormasyon sa Insidente

Ang PowerShell ay isang medyo pangkaraniwang tool sa automation na kadalasang ginagamit ng parehong mga developer ng malware at mga espesyalista sa seguridad ng impormasyon.
Tatalakayin ng artikulong ito ang opsyon ng paggamit ng PowerShell upang malayuang mangolekta ng data mula sa mga end device kapag tumutugon sa mga insidente sa seguridad ng impormasyon. Upang gawin ito, kakailanganin mong magsulat ng script na tatakbo sa end device at pagkatapos ay magkakaroon ng detalyadong paglalarawan ng script na ito.

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
		}

	}

}

Upang makapagsimula, lumikha ng isang function extension ng CSIRT, na kukuha ng argumento - ang landas upang i-save ang natanggap na data. Dahil sa katotohanang gumagana ang karamihan sa mga cmdlet sa Powershell v5, ang bersyon ng PowerShell ay sinuri para sa tamang operasyon.

function CSIRT{
		
param($path)# ΠΏΡ€ΠΈ запускС скрипта Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ для сохранСния
if ($psversiontable.psversion.major -ge 5)

Para sa kadalian ng pag-navigate sa mga nilikhang file, dalawang variable ang sinisimulan: $date at $Computer, na itatalaga sa pangalan ng computer at sa kasalukuyang petsa.

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

Nakukuha namin ang listahan ng mga tumatakbong proseso sa ngalan ng kasalukuyang user gaya ng sumusunod: lumikha ng $process variable, na itinatalaga dito ang get-ciminstance cmdlet kasama ang win32_process class. Gamit ang Select-Object cmdlet, maaari kang magdagdag ng mga karagdagang parameter ng output, sa aming kaso ang mga ito ay magiging parentprocessid (parent process ID PPID), petsa ng paglikha (petsa ng paglikha ng proseso), naproseso (process ID PID), processname (process name), commandline ( run command).

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

Upang makakuha ng listahan ng lahat ng TCP at UDP na koneksyon, lumikha ng $netTCP at $netUDP na mga variable sa pamamagitan ng pagtatalaga sa kanila ng Get-NetTCPConnection at Get-NetTCPConnection cmdlet, ayon sa pagkakabanggit.

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

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

Mahalagang malaman ang listahan ng mga nakaplanong gawain at takdang-aralin. Upang gawin ito, ginagamit namin ang get-ScheduledTask at Get-ScheduledJob cmdlet. Italaga natin sa kanila ang mga variable na $task at $job, dahil Sa una, mayroong maraming mga naka-iskedyul na gawain sa system, pagkatapos ay upang matukoy ang nakakahamak na aktibidad ito ay nagkakahalaga ng pag-filter ng mga lehitimong naka-iskedyul na gawain. Ang Select-Object cmdlet ay makakatulong sa amin dito.

$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

Sa NTFS file system mayroong isang bagay bilang alternatibong data stream (ADS). Nangangahulugan ito na ang isang file sa NTFS ay maaaring opsyonal na iugnay sa maramihang mga stream ng data ng arbitrary na laki. Gamit ang ADS, maaari mong itago ang data na hindi makikita sa pamamagitan ng mga karaniwang pagsusuri ng system. Ginagawa nitong posible na mag-inject ng malisyosong code at/o magtago ng data.

Upang magpakita ng mga alternatibong stream ng data sa PowerShell, gagamitin namin ang get-item cmdlet at ang built-in na Windows stream tool na may simbolo na * upang tingnan ang lahat ng posibleng stream, para dito gagawa kami ng $ADS variable.

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

Magiging kapaki-pakinabang na malaman ang listahan ng mga user na naka-log in sa system; para dito gagawa kami ng $user variable at itatalaga ito sa pagpapatupad ng quser program.

$user = quser

Ang mga umaatake ay maaaring gumawa ng mga pagbabago sa autorun upang makakuha ng isang foothold sa system. Upang tingnan ang mga startup na bagay, maaari mong gamitin ang Get-ItemProperty cmdlet.
Gumawa tayo ng dalawang variable: $runUser - upang tingnan ang startup sa ngalan ng user at $runMachine - upang tingnan ang startup sa ngalan ng computer.

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

Upang ang lahat ng impormasyon ay nakasulat sa iba't ibang mga file, lumikha kami ng isang array na may mga variable at isang array na may mga pangalan ng file.


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

At gamit ang isang for loop, ang natanggap na data ay isusulat sa mga file.

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

Pagkatapos isagawa ang script, 9 na text file ang gagawin na naglalaman ng kinakailangang impormasyon.

Ngayon, magagamit ng mga propesyonal sa cybersecurity ang PowerShell para pagyamanin ang impormasyong kailangan nila para malutas ang iba't ibang gawain sa kanilang trabaho. Sa pamamagitan ng pagdaragdag ng script sa startup, makakakuha ka ng ilang impormasyon nang hindi inaalis ang mga dump, larawan, atbp.

Pinagmulan: www.habr.com

Magdagdag ng komento