Выкарыстанне PowerShell для збору інфармацыі аб інцыдэнце

PowerShell досыць распаўсюджанае сродак аўтаматызацыі, якое часта выкарыстоўваецца, як распрацоўшчыкамі шкоднасных праграм, так і спецыялістамі па інфармацыйнай бяспецы.
У дадзеным артыкуле будзе разгледжаны варыянт выкарыстання PowerShell для выдаленага збору дадзеных з канчатковых прылад пры рэагаванні на інцыдэнты ИБ. Для гэтага запатрабуецца напісаць скрыпт, які будзе запускацца на канчатковай прыладзе і далей будзе падрабязнае апісанне дадзенага скрыпту.

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
		}

	}

}

Для пачатку працы ствараецца функцыя Пашырэнне CSIRT, Якая будзе прымаць аргумент - шлях для захавання атрыманых дадзеных. У сілу таго, што большасць камандлетаў працуюць у Powershell v5, то для карэктнай працы зроблена праверка версіі PowerShell.

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

Для зручнасці навігацыі па створаных файлах ініцыялізаваны дзве зменныя: $date і $Computer, якім будуць прысвоены імя кампутара і бягучая дата.

$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 з класам win32_process. Выкарыстоўваючы камандлет Select-Object можна дадаць дадатковыя выводныя параметры, у нашым выпадку гэта будуць parentprocessid (ідэнтыфікатар бацькоўскага працэсу PPID), creationdate (дата стварэння працэсу), processed (ідэнтыфікатар працэсу PID), processname (імя працэсу), commandline (каманда запуску).

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

Каб атрымаць спіс усіх TCP і UDP злучэнняў створым зменныя $netTCP і $netUDP прысвоіўшы ім камандлеты Get-NetTCPConnection і 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

Немалаважным будзе даведацца пра спіс запланаваных задач і заданняў. Для гэтага выкарыстоўваем камандлеты get-ScheduledTask і Get-ScheduledJob. Прысвоім ім зменныя $task і $job, т.я. першапачаткова ў сістэме існуе маса запланаваных задач, то для таго, каб вызначыць шкодную актыўнасць варта адфільтраваць легітымныя запланаваныя задачы. У гэтым нам дапаможа камандлет 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

У файлавай сістэме NTFS існуе такое паняцце, як альтэрнатыўныя плыні дадзеных (Alternate Data Streams, ADS). Гэта азначае, што файл у NTFS можа быць дадаткова злучаны з некалькімі струменямі дадзеных адвольнага памеру. З дапамогай ADS можна схаваць дадзеныя, якія не будуць бачныя стандартнымі праверкамі сістэмы. Дзякуючы гэтаму можна ўкараніць шкоднасны код і/ці схаваць дадзеныя.

Для вываду альтэрнатыўных патокаў дадзеных у PowerShell будзем выкарыстоўваць камандлет get-item і ўбудаваная прылада Windows stream c знакам * для прагляду ўсіх магчымых струменяў, для гэтага створым зменную $ADS.

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

Карысна будзе пазнаць і спіс карыстачоў, якія ўвайшлі ў сістэму, для гэтага створым зменную $user і прысвоім ёй выкананне праграмы quser.

$user = quser

Зламыснікі, каб замацавацца ў сістэме могуць унесці змены ў аўтазапуск. Каб прагледзець аб'екты ў аўтазапуску можна скарыстацца камандлетам Get-ItemProperty.
Створым дзве зменныя: $runUser - для прагляду аўтазагрузкі ад імя карыстальніка і $runMachine - для прагляду аўтазагрузкі ад імя кампутара.

$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", "Alternative Data Stream"

І, выкарыстоўваючы цыкл for, атрыманыя дадзеныя будуць запісаны ў файлы.

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

Пасля выканання скрыпту, будуць створаны 9 тэкставых файлаў, якія змяшчаюць неабходную інфармацыю.

У наш час адмыслоўцы па кібербяспецы могуць выкарыстаць PowerShell для ўзбагачэння інфармацыі, неабходнай пры рашэнні разнастайных задач у сваёй працы. Дадаўшы скрыпт у аўтазагрузку можна атрымліваць некаторую інфармацыю без зняцця дампаў, вобразаў і г.д.

Крыніца: habr.com

Дадаць каментар