Как стать автором
Поиск
Написать публикацию
Обновить

Использование PowerShell для сбора информации об инциденте

Время на прочтение5 мин
Количество просмотров8.2K
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:\Software\Microsoft\Windows\CurrentVersion\Run\"

	$runMachine =  Get-ItemProperty "HKLM:\Software\Microsoft\Windows\CurrentVersion\Run\"

	$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:\Software\Microsoft\Windows\CurrentVersion\Run\"
$runMachine = Get-ItemProperty 
"HKLM:\Software\Microsoft\Windows\CurrentVersion\Run\"

Чтобы вся информация записывалась в разные файлы создаем массив с переменными и массив с именами файлов.


$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 для обогащения информации, необходимой при решении разнообразных задач в своей работе. Добавив скрипт в автозагрузку можно получать некоторую информацию без снятия дампов, образов и т.д.
Теги:
Хабы:
Всего голосов 13: ↑13 и ↓0+13
Комментарии2

Публикации

Ближайшие события