Notkun PowerShell til að safna upplýsingum um atvik

PowerShell er nokkuð algengt sjálfvirkniverkfæri sem er oft notað af bæði hugbúnaðarframleiðendum og upplýsingaöryggissérfræðingum.
Þessi grein mun fjalla um möguleikann á því að nota PowerShell til að safna gögnum frá endatækjum í fjarska þegar brugðist er við upplýsingaöryggisatvikum. Til að gera þetta þarftu að skrifa skriftu sem mun keyra á endatækinu og síðan verður nákvæm lýsing á þessu skriftu.

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
		}

	}

}

Til að byrja skaltu búa til aðgerð CSIRT viðbót, sem mun taka rifrildi - leiðin til að vista móttekin gögn. Vegna þess að flestir cmdlets virka í Powershell v5, var PowerShell útgáfan athugað með rétta virkni.

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

Til að auðvelda flakk í gegnum búnar skrár eru tvær breytur frumstilltar: $date og $Computer, sem mun fá úthlutað tölvuheiti og núverandi dagsetningu.

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

Við fáum listann yfir ferla í gangi fyrir hönd núverandi notanda sem hér segir: búðu til $process breytu, úthlutaðu henni get-ciminstance cmdlet með win32_process bekknum. Með því að nota Select-Object cmdlet geturðu bætt við viðbótarúttaksbreytum, í okkar tilviki verða þær parentprocessid (foreldri ferli ID PPID), creationdate (proces sköpunardagur), unnin (proces ID PID), processname (proces name), skipanalína ( keyra skipun).

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

Til að fá lista yfir allar TCP og UDP tengingar skaltu búa til $netTCP og $netUDP breyturnar með því að úthluta þeim Get-NetTCPConnection og Get-NetTCPConnection cmdlets, í sömu röð.

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

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

Það verður mikilvægt að finna út listann yfir fyrirhuguð verkefni og verkefni. Til að gera þetta notum við get-ScheduledTask og Get-ScheduledJob cmdlets. Við skulum úthluta þeim breytunum $task og $job, því Upphaflega er mikið af áætluðum verkefnum í kerfinu, svo til að bera kennsl á illgjarn virkni er þess virði að sía út lögmæt tímasett verkefni. Select-Object cmdlet mun hjálpa okkur með þetta.

$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 skráarkerfinu er til eitthvað sem heitir alternative data streams (ADS). Þetta þýðir að skrá í NTFS getur mögulega tengst mörgum gagnastraumum af handahófskenndri stærð. Með því að nota ADS geturðu falið gögn sem væru ekki sýnileg með venjulegum kerfisskoðunum. Þetta gerir það mögulegt að sprauta skaðlegum kóða og/eða fela gögn.

Til að sýna aðra gagnastrauma í PowerShell munum við nota get-item cmdlet og innbyggt Windows straumverkfæri með * tákninu til að skoða alla mögulega strauma, til þess munum við búa til $ADS breytuna.

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

Það mun vera gagnlegt að finna út listann yfir notendur sem eru skráðir inn í kerfið; til þess munum við búa til $notandabreytu og úthluta henni til að keyra quser forritið.

$user = quser

Árásarmenn geta gert breytingar á sjálfvirkri keyrslu til að ná fótfestu í kerfinu. Til að skoða ræsihluti geturðu notað Get-ItemProperty cmdlet.
Búum til tvær breytur: $runUser - til að skoða ræsingu fyrir hönd notandans og $runMachine - til að skoða ræsingu fyrir hönd tölvunnar.

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

Til að allar upplýsingar séu skrifaðar í mismunandi skrár búum við til fylki með breytum og fylki með skráarheitum.


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

Og með því að nota for lykkju verða mótteknu gögnin skrifuð í skrár.

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

Eftir að handritið hefur verið keyrt verða 9 textaskrár búnar til sem innihalda nauðsynlegar upplýsingar.

Í dag geta netöryggissérfræðingar notað PowerShell til að auðga þær upplýsingar sem þeir þurfa til að leysa margvísleg verkefni í starfi sínu. Með því að bæta handriti við ræsingu geturðu fengið einhverjar upplýsingar án þess að fjarlægja sorp, myndir o.s.frv.

Heimild: www.habr.com

Bæta við athugasemd