Ослын талаарх мэдээллийг цуглуулахын тулд 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 хувьсагч үүсгэж, түүнд win32_process ангитай get-ciminstance командлетыг онооно. Select-Object командыг ашиглан та нэмэлт гаралтын параметрүүдийг нэмж болно, бидний тохиолдолд эдгээр нь parentprocessid (эцэг процессын ID PPID), үүсгэсэн огноо (процесс үүсгэсэн огноо), боловсруулсан (процессын ID PID), процессын нэр (процессын нэр), тушаалын мөр ( командыг ажиллуулах).

$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 файлын системд өөр мэдээллийн урсгал (ADS) гэх зүйл байдаг. Энэ нь NTFS дахь файлыг дурын хэмжээтэй олон өгөгдлийн урсгалтай холбох боломжтой гэсэн үг юм. ADS-ийг ашигласнаар та стандарт системийн шалгалтаар харагдахгүй өгөгдлийг нуух боломжтой. Энэ нь хортой код оруулах ба/эсвэл өгөгдлийг нуух боломжтой болгодог.

PowerShell-д өөр өгөгдлийн урсгалыг харуулахын тулд бид get-item команд болон * тэмдэгт бүхий Windows дамжуулалтын хэрэгслийг ашиглан бүх боломжит урсгалуудыг үзэх бөгөөд үүний тулд бид $ADS хувьсагчийг үүсгэнэ.

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

Системд нэвтэрсэн хэрэглэгчдийн жагсаалтыг олж мэдэх нь ашигтай байх болно, үүний тулд бид $user хувьсагчийг үүсгэж, түүнийг quser програмын гүйцэтгэлд хуваарилах болно.

$user = quser

Халдагчид системд байр сууриа олж авахын тулд autorun-д өөрчлөлт оруулж болно. Эхлүүлэх объектуудыг үзэхийн тулд 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-ийг ашиглан ажилдаа янз бүрийн даалгавруудыг шийдвэрлэхэд шаардлагатай мэдээллээ баяжуулах боломжтой. Эхлүүлэхэд скрипт нэмснээр та хогийн цэг, зураг гэх мэт зүйлийг арилгахгүйгээр зарим мэдээллийг авах боломжтой.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх