Voqea haqida ma'lumot to'plash uchun PowerShell-dan foydalanish

PowerShell - bu juda keng tarqalgan avtomatlashtirish vositasi bo'lib, u ko'pincha zararli dasturlarni ishlab chiquvchilar va axborot xavfsizligi bo'yicha mutaxassislar tomonidan qo'llaniladi.
Ushbu maqolada axborot xavfsizligi hodisalariga javob berishda oxirgi qurilmalardan ma'lumotlarni masofadan yig'ish uchun PowerShell-dan foydalanish varianti muhokama qilinadi. Buni amalga oshirish uchun siz oxirgi qurilmada ishlaydigan skriptni yozishingiz kerak va keyin ushbu skriptning batafsil tavsifi bo'ladi.

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
		}

	}

}

Boshlash uchun funksiya yarating CSIRT kengaytmasi, bu argumentni oladi - olingan ma'lumotlarni saqlash yo'li. Ko'pgina cmdletlar Powershell v5 da ishlaganligi sababli, PowerShell versiyasi to'g'ri ishlashi tekshirildi.

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

Yaratilgan fayllar bo'ylab harakatlanish qulayligi uchun ikkita o'zgaruvchi ishga tushiriladi: $date va $Computer, ularga kompyuter nomi va joriy sana beriladi.

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

Biz joriy foydalanuvchi nomidan ishlaydigan jarayonlar ro'yxatini quyidagicha olamiz: $process o'zgaruvchisini yarating, unga win32_process klassi bilan get-ciminstance cmdletini tayinlang. Select-Object cmdlet-dan foydalanib, siz qo'shimcha chiqish parametrlarini qo'shishingiz mumkin, bizning holatlarimizda ular ota-processid (ota-ona jarayon identifikatori PPID), yaratilish sanasi (jarayonni yaratish sanasi), qayta ishlangan (jarayon identifikatori PID), jarayon nomi (jarayon nomi), buyruq qatori ( ishga tushirish buyrug'i).

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

Barcha TCP va UDP ulanishlari roʻyxatini olish uchun mos ravishda Get-NetTCPConnection va Get-NetTCPConnection cmdletlarini belgilash orqali $netTCP va $netUDP oʻzgaruvchilarini yarating.

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

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

Rejalashtirilgan vazifalar va topshiriqlar ro'yxatini aniqlash muhim bo'ladi. Buning uchun biz get-ScheduledTask va Get-ScheduledJob cmdletlaridan foydalanamiz. Keling, ularga $task va $job o'zgaruvchilarini tayinlaymiz, chunki Dastlab, tizimda juda ko'p rejalashtirilgan vazifalar mavjud, keyin zararli faoliyatni aniqlash uchun qonuniy rejalashtirilgan vazifalarni filtrlash kerak. Bunda bizga Select-Object cmdleti yordam beradi.

$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 fayl tizimida muqobil ma'lumotlar oqimlari (ADS) kabi narsa mavjud. Bu shuni anglatadiki, NTFS-dagi fayl ixtiyoriy ravishda ixtiyoriy hajmdagi bir nechta ma'lumotlar oqimi bilan bog'lanishi mumkin. ADS-dan foydalanib, siz standart tizim tekshiruvlari orqali ko'rinmaydigan ma'lumotlarni yashirishingiz mumkin. Bu zararli kodni kiritish va/yoki ma'lumotlarni yashirish imkonini beradi.

PowerShell-da muqobil ma'lumotlar oqimlarini ko'rsatish uchun barcha mumkin bo'lgan oqimlarni ko'rish uchun get-item cmdlet va * belgisi bilan o'rnatilgan Windows oqim vositasidan foydalanamiz, buning uchun biz $ADS o'zgaruvchisini yaratamiz.

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

Tizimga kirgan foydalanuvchilar ro'yxatini bilish foydali bo'ladi, buning uchun biz $user o'zgaruvchisini yaratamiz va uni quser dasturining bajarilishiga tayinlaymiz.

$user = quser

Hujumchilar tizimda mustahkam o'rin olish uchun autorunga o'zgartirishlar kiritishlari mumkin. Ishga tushirish ob'ektlarini ko'rish uchun siz Get-ItemProperty cmdletidan foydalanishingiz mumkin.
Keling, ikkita o'zgaruvchi yarataylik: $runUser - foydalanuvchi nomidan ishga tushirishni ko'rish uchun va $runMachine - kompyuter nomidan ishga tushirishni ko'rish uchun.

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

Barcha ma'lumotlar turli fayllarga yozilishi uchun biz o'zgaruvchilarga ega massiv va fayl nomlari bilan massiv yaratamiz.


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

Va for tsiklidan foydalanib, olingan ma'lumotlar fayllarga yoziladi.

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

Skript bajarilgandan so'ng kerakli ma'lumotlarni o'z ichiga olgan 9 ta matnli fayl yaratiladi.

Bugungi kunda kiberxavfsizlik bo'yicha mutaxassislar o'z ishlarida turli vazifalarni hal qilish uchun zarur bo'lgan ma'lumotlarni boyitish uchun PowerShell'dan foydalanishlari mumkin. Ishga tushirish uchun skript qo'shish orqali siz axlatlarni, rasmlarni va hokazolarni olib tashlamasdan ba'zi ma'lumotlarni olishingiz mumkin.

Manba: www.habr.com

a Izoh qo'shish