30.11.2019

[Из песочницы] Использование 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:\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 для обогащения информации, необходимой при решении разнообразных задач в своей работе. Добавив скрипт в автозагрузку можно получать некоторую информацию без снятия дампов, образов и т.д.

Let's block ads! (Why?)



Комментарии