PowerShell erabiltzea Gorabeheren informazioa biltzeko

PowerShell nahiko ohikoa den automatizazio-tresna bat da, malware garatzaileek eta informazioaren segurtasuneko espezialistek askotan erabiltzen dutena.
Artikulu honetan PowerShell-en erabilera kontuan hartuko da amaierako gailuetako datuak urruneko bilketa egiteko, informazioaren segurtasun-intzidenteei erantzuteko orduan. Horretarako, amaierako gailuan exekutatuko den script bat idatzi behar duzu, eta gero script honen deskribapen zehatza egongo da.

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
		}

	}

}

Hasteko, sortu funtzio bat CSIRT luzapena, argumentu bat hartuko duena - jasotako datuak gordetzeko bidea. Cmdlet gehienek Powershell v5-en funtzionatzen dutenez, PowerShell bertsioaren egiaztapena egin da funtzionamendu egokia izateko.

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

Sortutako fitxategietan nabigatzeko erraztasunerako, bi aldagai hasieratzen dira: $data eta $Computer, zeinei ordenagailuaren izena eta uneko data esleituko zaizkie.

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

Uneko erabiltzailearen izenean exekutatzen diren prozesuen zerrenda honela lortzen dugu: sortu $process aldagaia get-ciminstance cmdlet esleituz win32_process klasearekin. Select-Object cmdlet-a erabiliz, irteerako parametro gehigarriak gehi ditzakezu, gure kasuan, hauek izango dira parentprocessid (guraso-prozesuaren ID PPID), creationdate (prozesuaren sorrera-data), prozesatua (PID prozesu-ID), prozesu-izena (prozesuaren izena), komando-lerroa. (hasi komandoa).

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

TCP eta UDP konexio guztien zerrenda lortzeko, sortu $netTCP eta $netUDP aldagaiak Get-NetTCPConnection eta Get-NetTCPConnection cmdlet-ak esleituz, hurrenez hurren.

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

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

Garrantzitsua izango da programatutako zereginen eta zereginen zerrenda ezagutzea. Horretarako, get-ScheduledTask eta Get-ScheduledJob cmdlet-ak erabiltzen ditugu. Esleitu ditzagun $task eta $job aldagaiak, zeren Hasieran, programatutako zeregin asko daude sisteman, eta gero jarduera gaiztoak identifikatzeko, merezi du legezko programatutako zereginak iragaztea. Hautatu-Object cmdlet-ak horretan lagunduko digu.

$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

NTFS fitxategi-sisteman, datu-korronte alternatiboak (Alternate Data Streams, ADS) bezalako gauza bat dago. Horrek esan nahi du NTFS-ko fitxategi bat tamaina arbitrarioko datu-korronte anitzekin gehiago lotu daitekeela. ADS-rekin, sistemaren egiaztapen estandarretan ikusgai egongo ez diren datuak ezkuta ditzakezu. Horrek kode gaiztoa injektatu eta/edo datuak ezkutatu ditzake.

PowerShell-en datu-korronte alternatiboak bistaratzeko, get-item cmdlet-a eta * ikurra duen Windows stream tresna integratua erabiliko dugu korronte posible guztiak ikusteko, horretarako $ADS aldagaia sortuko dugu.

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

Sisteman saioa hasitako erabiltzaileen zerrenda ezagutzea erabilgarria izango da, horretarako $user aldagai bat sortuko dugu eta quser programaren exekuzioa esleituko diogu.

$user = quser

Sisteman toki bat lortzeko, erasotzaileek auto-exekuzioan aldaketak egin ditzakete. Get-ItemProperty cmdlet-a erabil dezakezu erreprodukzio automatikoko elementuak ikusteko.
Sor ditzagun bi aldagai: $runUser - erabiltzailearen izenean karga automatikoa ikusteko eta $runMachine - ordenagailuaren izenean karga automatikoa ikusteko.

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

Informazio guztia fitxategi ezberdinetan idatzi ahal izateko, aldagaiak dituen array bat eta fitxategi izenekin array bat sortzen dugu.


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

Eta, for begizta erabiliz, ondoriozko datuak fitxategietan idatziko dira.

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

Scripta exekutatu ondoren, beharrezko informazioa duten 9 testu fitxategi sortuko dira.

Gaur egun, zibersegurtasuneko profesionalek PowerShell erabil dezakete beren lanean hainbat zeregin konpontzeko behar duten informazioa aberasteko. Karga automatikoari script bat gehituz, informazio batzuk lor ditzakezu dumping, irudi eta abar gabe.

Iturria: www.habr.com

Gehitu iruzkin berria