Використання 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

Додати коментар або відгук