Изображение

Введение


В современной цифровой криминалистике расследование инцидентов на Windows системах требует глубокого понимания операционной системы и владения специализированными инструментами. PowerShell, встроенная оболочка командной строки Microsoft, стала одним из самых мощных инструментов для экспертов цифровой форензики, работающих с Windows окружениями. Её возможности выходят далеко за рамки простого управления системой - PowerShell предоставляет доступ к Event Logs, Registry, WMI, COM объектам и многим другим компонентам Windows, которые являются критически важными источниками цифровых улик.

Расследование инцидентов безопасности, анализ вредоносного ПО, восстановление удаленных данных и выявление подозрительной активности требуют эффективных методов сбора и анализа данных. PowerShell, благодаря своей мощной объектно-ориентированной архитектуре и обширной экосистеме модулей, позволяет экспертам автоматизировать сбор доказательств, анализировать большие объемы данных и эффективно документировать находки. Интеграция с .NET Framework и доступ к низкоуровневым API Windows делает PowerShell незаменимым инструментом в арсенале каждого эксперта DFIR (Digital Forensics and Incident Response).

Однако эффективное использование PowerShell в криминалистических целях требует глубокого понимания не только самого языка, но и архитектуры Windows, основ расследования инцидентов и техник злоумышленников. Атаки часто используют PowerShell для выполнения своих задач, что делает его не только инструментом расследования, но и объектом исследования. Понимание техник злоумышленников и методов их обнаружения является ключевым навыком для успешного расследования.

Преимущества PowerShell в криминалистике включают: встроенность в Windows системы, мощную автоматизацию, доступ к широкому спектру данных системы, возможность удаленной работы через PowerShell Remoting, и богатую экосистему специализированных модулей для DFIR. От анализа метаданных файлов до исследования Active Directory - PowerShell предоставляет экспертам все необходимые средства для эффективной работы.

В этом руководстве мы рассмотрим все аспекты использования PowerShell в цифровой криминалистике: от базовых команд до создания собственных скриптов, от автоматизации сбора доказательств до сложного анализа данных. Вы научитесь эффективно использовать этот инструмент для решения реальных задач в расследованиях киберпреступлений и инцидентов безопасности.

Содержание


1. Что такое PowerShell и его роль в DFIR
2. Установка и настройка рабочего окружения
3. Базовые команды для сбора доказательств
4. Работа с Event Logs
5. Анализ Registry (реестра)
6. Работа с WMI (Windows Management Instrumentation)
7. Анализ файлов и метаданных
8. Сетевая диагностика и анализ
9. PowerShell для инцидент-ответа
10. Работа с Active Directory
11. Создание собственных скриптов
12. Продвинутые техники анализа
13. Практические кейсы расследований
14. Этические и правовые аспекты
15. FAQ
16. Заключение

---

1. Что такое PowerShell и его роль в DFIR


Обзор PowerShell


PowerShell - это современная командная оболочка и среда автоматизации от Microsoft, построенная на .NET Framework. Впервые представленный в 2006 году, PowerShell эволюционировал в мощную платформу для управления системой и автоматизации.

**Ключевые особенности:**
- Объектно-ориентированная архитектура
- Интеграция с .NET Framework
- Доступ к COM объектам и WMI
- Мощная система модулей и расширений
- Создание собственных командлетов и скриптов
- Удаленное выполнение через PowerShell Remoting

Почему PowerShell важен в DFIR


PowerShell находит широкое применение в цифровой криминалистике и расследовании инцидентов:

**1. Сбор доказательств:**
- Извлечение информации из Event Logs
- Анализ Registry для поиска артефактов
- Сбор метаданных файлов
- Экстракция данных из системных хранилищ

**2. Расследование инцидентов:**
- Анализ подозрительной активности
- Выявление вредоносного ПО
- Работа с timeline событий
- Корреляция данных из разных источников

**3. Анализ компрометации:**
- Исследование persistence механизмов
- Анализ запущенных процессов
- Изучение сетевых соединений
- Выявление аномалий в поведении системы

**4. Инцидент-ответ:**
- Быстрая оценка ситуации
- Изоляция пораженных систем
- Сбор критически важных данных
- Документирование находок

Преимущества для экспертов


**1. Встроенность в Windows:**
- Не требует установки дополнительного ПО
- Доступен на всех современных версиях Windows
- Нативная интеграция с системой

**2. Мощная автоматизация:**
- Создание скриптов для рутинных задач
- Batch обработка множества систем
- Автоматизация сбора доказательств

**3. Доступ к данным:**
- Event Logs, Registry, WMI
- Метаданные файлов и процессов
- Сетевая информация

**4. Удаленная работа:**
- PowerShell Remoting
- Инцидент-ответ без физического доступа
- Параллельная работа с множеством систем

---

2. Установка и настройка рабочего окружения


Проверка версии PowerShell


**Проверка установленной версии:**
powershell
$PSVersionTable

<h2 id="detali-versii">Детали версии</h2>
$PSVersionTable.PSVersion


**PowerShell 5.1 (Windows до 10):**
powershell
<h2 id="proverka">Проверка</h2>
Get-Host | Select-Object Version

<h2 id="esli-nuzhno-obnovit">Если нужно обновить</h2>
<h2 id="skachayte-s-microsoft-update-catalog">Скачайте с Microsoft Update Catalog</h2>


**PowerShell 7+ (Кросс-платформенная):**
powershell
<h2 id="ustanovka-cherez-winget">Установка через winget</h2>
winget install --id Microsoft.Powershell --source winget

<h2 id="proverka">Проверка</h2>
pwsh --version


Выполнение политики


**Текущая политика:**
powershell
Get-ExecutionPolicy

<h2 id="spisok-politik-po-scope">Список политик по scope</h2>
Get-ExecutionPolicy -List


**Установка политики:**
powershell
<h2 id="dlya-tekuschego-polzovatelya">Для текущего пользователя</h2>
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

<h2 id="dlya-vsey-mashiny-trebuet-elevated-privileges">Для всей машины (требует elevated privileges)</h2>
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope LocalMachine


Установка модулей для DFIR


**Kansa - Incident Response Framework:**
powershell
<h2 id="zagruzka-modulya">Загрузка модуля</h2>
Install-Module -Name Kansa -Scope CurrentUser

<h2 id="zapusk-sbora-dannyh">Запуск сбора данных</h2>
.\kansa.ps1 -Target <path> -Pushbin


**PowerForensics:**
powershell
<h2 id="ustanovka-iz-github">Установка из GitHub</h2>
Install-Module -Name PowerForensics -Scope CurrentUser

<h2 id="proverka-ustanovki">Проверка установки</h2>
Get-Command -Module PowerForensics


**PowerSploit (только для легитимных целей):**
powershell
<h2 id="klonirovanie-repozitoriya">Клонирование репозитория</h2>
git clone https://github.com/PowerShellMafia/PowerSploit.git
cd PowerSploit

<h2 id="import-moduley">Импорт модулей</h2>
Import-Module .\PowerSploit.psm1


**Carbon:**
powershell
<h2 id="ustanovka">Установка</h2>
Install-Module -Name Carbon -Scope CurrentUser


Настройка профиля


**Создание профиля:**
powershell
<h2 id="proverka-suschestvovaniya">Проверка существования</h2>
Test-Path $PROFILE

<h2 id="sozdanie-esli-ne-suschestvuet">Создание если не существует</h2>
New-Item -ItemType File -Path $PROFILE -Force

<h2 id="redaktirovanie">Редактирование</h2>
notepad $PROFILE


**Типичное содержимое профиля:**
powershell
<h2 id="nastroyki-po-umolchaniyu">Настройки по умолчанию</h2>
$PSDefaultParameterValues['Out-File:Encoding'] = 'utf8'

<h2 id="import-moduley-pri-starte">Импорт модулей при старте</h2>
Import-Module Posh-Git
Import-Module PSReadLine

<h2 id="psevdonimy">Псевдонимы</h2>
Set-Alias -Name 'dir' -Value 'Get-ChildItem'
Set-Alias -Name 'cat' -Value 'Get-Content'

<h2 id="avtodopolnenie">Автодополнение</h2>
Set-PSReadlineOption -PredictionSource History


Настройка для работы с данными


**Логирование сессии:**
powershell
<h2 id="sozdanie-transkripta">Создание транскрипта</h2>
Start-Transcript -Path "C:\Forensics\analysis_log.txt" -Append

<h2 id="v-kontse-sessii">В конце сессии</h2>
Stop-Transcript


---

3. Базовые команды для сбора доказательств


Сбор системной информации


**Информация о системе:**
powershell
<h2 id="osnovnaya-informatsiya">Основная информация</h2>
Get-ComputerInfo

<h2 id="v-kratkom-vide">В кратком виде</h2>
Get-ComputerInfo | Select-Object WindowsProductName, WindowsVersion, TotalPhysicalMemory


**Информация о процессоре:**
powershell
Get-CimInstance -ClassName Win32_Processor | Format-List


**Оперативная память:**
powershell
Get-CimInstance -ClassName Win32_PhysicalMemory | Select-Object Capacity, Speed, Manufacturer


Процессы и службы


**Список процессов:**
powershell
<h2 id="vse-protsessy">Все процессы</h2>
Get-Process

<h2 id="s-podrobnostyami">С подробностями</h2>
Get-Process | Select-Object Name, Id, Path, StartTime, CPU

<h2 id="protsessy-s-setevymi-soedineniyami">Процессы с сетевыми соединениями</h2>
Get-Process | Where-Object {$_.Path -ne $null} | Select-Object Name, Path, Id


**Информация о процесс:**
powershell
<h2 id="detalnaya-informatsiya-o-konkretnom-protsesse">Детальная информация о конкретном процессе</h2>
Get-Process -Id <PID> | Format-List *


**Службы:**
powershell
<h2 id="vse-sluzhby">Все службы</h2>
Get-Service

<h2 id="tolko-zapuschennye">Только запущенные</h2>
Get-Service | Where-Object {$_.Status -eq 'Running'}

<h2 id="s-podrobnostyami">С подробностями</h2>
Get-CimInstance -ClassName Win32_Service | Select-Object Name, State, StartMode, PathName


Сетевая информация


**Активные соединения:**
powershell
<h2 id="setevye-soedineniya">Сетевые соединения</h2>
Get-NetTCPConnection

<h2 id="s-detalnoy-informatsiey">С детальной информацией</h2>
Get-NetTCPConnection | Select-Object LocalAddress, LocalPort, RemoteAddress, RemotePort, State

<h2 id="udp-soedineniya">UDP соединения</h2>
Get-NetUDPEndpoint | Select-Object LocalAddress, LocalPort

<h2 id="s-privyazkoy-k-protsessam">С привязкой к процессам</h2>
Get-NetTCPConnection | Select-Object -Property *,@{Name='ProcessName';Expression={(Get-Process -Id $_.OwningProcess).Name}}


**IP конфигурация:**
powershell
<h2 id="vse-setevye-adaptery">Все сетевые адаптеры</h2>
Get-NetIPAddress

<h2 id="tekuschaya-konfiguratsiya">Текущая конфигурация</h2>
Get-NetIPConfiguration


Пользователи и авторизация


**Текущий пользователь:**
powershell
<h2 id="kto-zaloginen">Кто залогинен</h2>
Get-CimInstance -ClassName Win32_ComputerSystem | Select-Object UserName

<h2 id="vse-sessii-polzovateley">Все сессии пользователей</h2>
query user


**Недавно залогиненные пользователи:**
powershell
Get-EventLog -LogName Security -InstanceId 4624 | Select-Object TimeGenerated, Message


---

4. Работа с Event Logs


Обзор Event Logs


Event Logs - это критически важный источник информации в расследованиях.

**Основные логи:**
- Application - события приложений
- System - системные события
- Security - события безопасности
- Setup - установка компонентов

**Получение списка логов:**
powershell
Get-EventLog -List


Чтение логов


**Базовое чтение:**
powershell
<h2 id="chtenie-security-loga">Чтение Security лога</h2>
Get-EventLog -LogName Security

<h2 id="poslednie-10-sobytiy">Последние 10 событий</h2>
Get-EventLog -LogName Security -Newest 10

<h2 id="s-filtrom-po-id-sobytiya">С фильтром по ID события</h2>
Get-EventLog -LogName Security -InstanceId 4624


Критически важные Event IDs


**Успешный вход (4624):**
powershell
<h2 id="uspeshnye-loginy">Успешные логины</h2>
Get-WinEvent -FilterHashtable @{LogName='Security'; ID=4624} | Select-Object TimeCreated, Message

<h2 id="s-filtrom-po-vremeni">С фильтром по времени</h2>
Get-WinEvent -FilterHashtable @{LogName='Security'; ID=4624} -MaxEvents 100 |
Where-Object {$_.TimeCreated -gt (Get-Date).AddDays(-7)}


**Неудачный вход (4625):**
powershell
<h2 id="neudachnye-popytki-vhoda">Неудачные попытки входа</h2>
Get-WinEvent -FilterHashtable @{LogName='Security'; ID=4625} |
Select-Object TimeCreated, Message


**Выход из системы (4634):**
powershell
Get-WinEvent -FilterHashtable @{LogName='Security'; ID=4634}


**Изменение учетной записи (4738):**
powershell
<h2 id="izmeneniya-polzovateley">Изменения пользователей</h2>
Get-WinEvent -FilterHashtable @{LogName='Security'; ID=4738}


**Изменения в группах (4732):**
powershell
Get-WinEvent -FilterHashtable @{LogName='Security'; ID=4732}


**Создание службы (4697):**
powershell
<h2 id="sozdanie-novyh-sluzhb">Создание новых служб</h2>
Get-WinEvent -FilterHashtable @{LogName='Security'; ID=4697}


Поиск подозрительной активности


**Множественные неудачные логины:**
powershell
<h2 id="neudachnye-popytki-s-gruppirovkoy">Неудачные попытки с группировкой</h2>
Get-WinEvent -FilterHashtable @{LogName='Security'; ID=4625} |
Group-Object -Property {$_.Properties[5].Value} |
Where-Object {$_.Count -gt 5}


**Создание процессов:**
powershell
<h2 id="id-4688-dlya-sozdaniya-protsessov">ID 4688 для создания процессов</h2>
Get-WinEvent -FilterHashtable @{LogName='Security'; ID=4688} |
Select-Object TimeCreated, Message


**Объекты безопасности:**
powershell
<h2 id="id-4663-dlya-dostupa-k-obektam">ID 4663 для доступа к объектам</h2>
Get-WinEvent -FilterHashtable @{LogName='Security'; ID=4663}


Экспорт логов


**Экспорт в CSV:**
powershell
Get-EventLog -LogName Security | Export-Csv -Path "C:\Forensics\security_logs.csv" -NoTypeInformation


**Экспорт в JSON:**
powershell
Get-EventLog -LogName Security | ConvertTo-Json | Out-File "C:\Forensics\security_logs.json"


**Экспорт в EVTX (nativе формат):**
powershell
<h2 id="eksport-vsego-loga">Экспорт всего лога</h2>
wevtutil epl Security C:\Forensics\security_backup.evtx


---

5. Анализ Registry (реестра)


Обзор Registry


Registry содержит огромное количество информации о системе и пользователях.

**Основные ветки:**
- HKEY_LOCAL_MACHINE (HKLM) - системная информация
- HKEY_CURRENT_USER (HKCU) - текущий пользователь
- HKEY_USERS (HKU) - все пользователи
- HKEY_CLASSES_ROOT (HKCR) - ассоциации файлов
- HKEY_CURRENT_CONFIG (HKCC) - текущая конфигурация

Чтение Registry


**Базовые команды:**
powershell
<h2 id="chtenie-znacheniya">Чтение значения</h2>
Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion" -Name "ProgramFilesPath"

<h2 id="prosmotr-struktury">Просмотр структуры</h2>
Get-ChildItem -Path "HKLM:\SOFTWARE\Microsoft"


Критически важные места в Registry


**1. Автозагрузка:**
powershell
<h2 id="run-klyuchi">Run ключи</h2>
Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run"
Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce"

<h2 id="current-user">Current User</h2>
Get-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run"
Get-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce"


**2. Недавно открытые файлы:**
powershell
<h2 id="recentdocs">RecentDocs</h2>
Get-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\RecentDocs" -ErrorAction SilentlyContinue


**3. Установленное ПО:**
powershell
<h2 id="programmy-v-program-files">Программы в Program Files</h2>
Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*" |
Select-Object DisplayName, DisplayVersion, Publisher


**4. Последнее выключение:**
powershell
Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Windows" -Name "ShutdownTime"


**5. ShellBags (просмотренные папки):**
powershell
Get-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\Shell\Bags" -Recurse -ErrorAction SilentlyContinue


**6. UserAssist (запущенные программы):**
powershell
Get-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\*" -ErrorAction SilentlyContinue


Поиск подозрительных записей


**Поиск по значениям:**
powershell
<h2 id="poisk-po-stroke">Поиск по строке</h2>
Get-ChildItem -Path "HKLM:\SOFTWARE" -Recurse -ErrorAction SilentlyContinue |
Where-Object {$_.Name -like "*malware*"}


**Поиск persistence:**
powershell
<h2 id="vse-run-klyuchi">Все Run ключи</h2>
$runKeys = @(
"HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run",
"HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce",
"HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Run",
"HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run",
"HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce"
)

foreach ($key in $runKeys) {
Get-ItemProperty -Path $key -ErrorAction SilentlyContinue |
Select-Object PSPath, *
}


---

6. Работа с WMI (Windows Management Instrumentation)


Обзор WMI


WMI предоставляет доступ к системным данным через объекты.

**Использование WMI:**
powershell
<h2 id="cherez-cim-sovremennyy-metod">Через CIM (современный метод)</h2>
Get-CimInstance -ClassName Win32_Process

<h2 id="cherez-wmi-legacy">Через WMI (legacy)</h2>
Get-WmiObject -ClassName Win32_Process


Критически важные WMI классы


**1. Win32_Process (процессы):**
powershell
<h2 id="vse-protsessy">Все процессы</h2>
Get-CimInstance -ClassName Win32_Process

<h2 id="s-podrobnostyami">С подробностями</h2>
Get-CimInstance -ClassName Win32_Process |
Select-Object Name, ProcessId, ParentProcessId, CommandLine, CreationDate


**2. Win32_Service (службы):**
powershell
Get-CimInstance -ClassName Win32_Service | 
Select-Object Name, State, StartMode, PathName


**3. Win32_Product (установленное ПО):**
powershell
<h2 id="mozhet-byt-medlennym">Может быть медленным</h2>
Get-WmiObject -Class Win32_Product | Select-Object Name, Version, Vendor


**4. Win32_StartupCommand (автозагрузка):**
powershell
Get-WmiObject -Class Win32_StartupCommand | Select-Object Name, Command, Location


**5. Win32_NTLogEvent (логи):**
powershell
<h2 id="chtenie-logov-cherez-wmi-mozhet-byt-medlennym">Чтение логов через WMI (может быть медленным)</h2>
Get-WmiObject -Class Win32_NTLogEvent -Filter "LogFile='System'" | Select-Object -First 10


**6. Win32_NetworkAdapter (сетевые адаптеры):**
powershell
Get-WmiObject -Class Win32_NetworkAdapter | 
Select-Object Name, AdapterType, MACAddress, DeviceID


**7. Win32_Share (расшаренные ресурсы):**
powershell
Get-WmiObject -Class Win32_Share | Select-Object Name, Path, Type


Поиск подозрительной активности в WMI


**WMI persistence:**
powershell
<h2 id="wmi-podpiski-event-filters">WMI подписки (event filters)</h2>
Get-WmiObject -Namespace root\Subscription -Class __EventFilter
Get-WmiObject -Namespace root\Subscription -Class __EventConsumer
Get-WmiObject -Namespace root\Subscription -Class __FilterToConsumerBinding


**WMI скрипты:**
powershell
<h2 id="komandy-wmi">Команды WMI</h2>
Get-CimInstance -ClassName Win32_ProcessStartup


---

7. Анализ файлов и метаданных


Метаданные файлов


**Базовая информация:**
powershell
<h2 id="informatsiya-o-fayle">Информация о файле</h2>
Get-Item -Path "C:\path\to\file.txt" | Select-Object *

<h2 id="vremya-modifikatsii-sozdaniya-dostupa">Время модификации, создания, доступа</h2>
Get-ItemProperty -Path "C:\path\to\file.txt" |
Select-Object FullName, CreationTime, LastWriteTime, LastAccessTime


**Значимые даты:**
powershell
<h2 id="retsipiennaya-funktsiya-dlya-analiza-fayla">Реципиенная функция для анализа файла</h2>
function Get-FileDetails {
param([string]$FilePath)

$file = Get-Item -Path $FilePath -ErrorAction SilentlyContinue
if ($file) {
return [PSCustomObject]@{
Name = $file.Name
FullPath = $file.FullName
Size = $file.Length
Created = $file.CreationTime
Modified = $file.LastWriteTime
Accessed = $file.LastAccessTime
Attributes = $file.Attributes
MD5 = (Get-FileHash -Path $file.FullName -Algorithm MD5).Hash
SHA256 = (Get-FileHash -Path $file.FullName -Algorithm SHA256).Hash
}
}
}

<h2 id="ispolzovanie">Использование</h2>
Get-FileDetails -FilePath "C:\suspicious.exe"


Поиск файлов


**По имени:**
powershell
<h2 id="vse-exe-fayly">Все .exe файлы</h2>
Get-ChildItem -Path "C:\" -Filter "*.exe" -Recurse -ErrorAction SilentlyContinue

<h2 id="poisk-po-neskolkim-kriteriyam">Поиск по нескольким критериям</h2>
Get-ChildItem -Path "C:\" -Include *.exe,*.dll,*.bat -Recurse -ErrorAction SilentlyContinue


**По дате создания:**
powershell
<h2 id="fayly-sozdannye-za-poslednie-24-chasa">Файлы созданные за последние 24 часа</h2>
Get-ChildItem -Path "C:\" -Recurse -ErrorAction SilentlyContinue |
Where-Object {$_.CreationTime -gt (Get-Date).AddHours(-24)}


**По размеру:**
powershell
<h2 id="bolshie-fayly-100mb">Большие файлы (&gt;100MB)</h2>
Get-ChildItem -Path "C:\" -Recurse -ErrorAction SilentlyContinue |
Where-Object {$_.Length -gt 100MB}


Поиск скрытых файлов


**По атрибутам:**
powershell
<h2 id="fayly-so-skrytym-atributom">Файлы со скрытым атрибутом</h2>
Get-ChildItem -Path "C:\" -Recurse -ErrorAction SilentlyContinue |
Where-Object {$_.Attributes -band [System.IO.FileAttributes]::Hidden}

<h2 id="sistemnye-fayly">Системные файлы</h2>
Get-ChildItem -Path "C:\" -Recurse -ErrorAction SilentlyContinue |
Where-Object {$_.Attributes -band [System.IO.FileAttributes]::System}


Hashing для целостности


**Вычисление хешей:**
powershell
<h2 id="md5">MD5</h2>
Get-FileHash -Path "C:\file.exe" -Algorithm MD5

<h2 id="sha256">SHA256</h2>
Get-FileHash -Path "C:\file.exe" -Algorithm SHA256

<h2 id="vse-algoritmy">Все алгоритмы</h2>
foreach ($file in Get-ChildItem -Path "C:\malware\" -Filter "*.exe") {
Get-FileHash -Path $file.FullName -Algorithm MD5,SHA1,SHA256
}


**Баtch hashing:**
powershell
Get-ChildItem -Path "C:\samples\" -Recurse | 
ForEach-Object {
Get-FileHash -Path $_.FullName -Algorithm SHA256 |
Export-Csv -Path "C:\hashes.csv" -Append
}


---

8. Сетевая диагностика и анализ


Сетевые соединения


**Активные TCP соединения:**
powershell
<h2 id="vsyo">Всё</h2>
Get-NetTCPConnection

<h2 id="s-detalyami">С деталями</h2>
Get-NetTCPConnection | Select-Object LocalAddress, LocalPort, RemoteAddress, RemotePort, State, OwningProcess |
ForEach-Object {
[PSCustomObject]@{
LocalAddress = $_.LocalAddress
LocalPort = $_.LocalPort
RemoteAddress = $_.RemoteAddress
RemotePort = $_.RemotePort
State = $_.State
ProcessID = $_.OwningProcess
ProcessName = (Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue).Name
}
}


**UDP соединения:**
powershell
Get-NetUDPEndpoint | Select-Object LocalAddress, LocalPort, OwningProcess


Сетевые адаптеры


**Конфигурация:**
powershell
Get-NetIPAddress | 
Select-Object InterfaceAlias, IPAddress, AddressFamily, PrefixLength


**Мак адреса:**
powershell
Get-NetAdapter | Select-Object Name, InterfaceDescription, LinkSpeed, MACAddress


DNS кэш


**История DNS запросов:**
powershell
Get-DnsClientCache | Select-Object Entry, Name, DataLength, Status

<h2 id="ochistka-kesha">Очистка кэша</h2>
Clear-DnsClientCache


Поиск подозрительных соединений


**Внешние соединения:**
powershell
Get-NetTCPConnection | 
Where-Object {
$_.RemoteAddress -notlike "192.168.*" -and
$_.RemoteAddress -notlike "10.*" -and
$_.RemoteAddress -notlike "127.*" -and
$_.State -eq "Established"
}


---

9. PowerShell для инцидент-ответа


Быстрая оценка


**Скрипт быстрого triage:**
powershell
function Get-QuickTriage {
$timestamp = Get-Date -Format "yyyyMMdd_HHmmss"
$outputDir = "C:\Forensics\Triage_$timestamp"
New-Item -ItemType Directory -Path $outputDir -Force | Out-Null

Write-Host "Collecting system information..."
Get-ComputerInfo | Export-Csv -Path "$outputDir\system_info.csv" -NoTypeInformation

Write-Host "Collecting processes..."
Get-Process | Select-Object Name, Id, Path, StartTime, CPU, WorkingSet |
Export-Csv -Path "$outputDir\processes.csv" -NoTypeInformation

Write-Host "Collecting services..."
Get-Service | Export-Csv -Path "$outputDir\services.csv" -NoTypeInformation

Write-Host "Collecting network connections..."
Get-NetTCPConnection | Export-Csv -Path "$outputDir\tcp_connections.csv" -NoTypeInformation

Write-Host "Collecting autostart items..."
$runKeys = @(
"HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run",
"HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run"
)

$autostart = @()
foreach ($key in $runKeys) {
try {
$items = Get-ItemProperty -Path $key -ErrorAction Stop
foreach ($prop in $items.PSObject.Properties) {
if ($prop.Name -match "^[a-zA-Z]") {
$autostart += [PSCustomObject]@{
RegistryKey = $key
Name = $prop.Name
Value = $prop.Value
}
}
}
} catch {}
}
$autostart | Export-Csv -Path "$outputDir\autostart.csv" -NoTypeInformation

Write-Host "Collection complete. Output: $outputDir"
}

Get-QuickTriage


Работа с дампами памяти


**Создание minidump процесса:**
powershell
<h2 id="trebuet-debugging-tools-for-windows">Требует Debugging Tools for Windows</h2>
<h2 id="download-debugdiag-exe">download debugdiag.exe</h2>
<h2 id="zapusk-dampa">Запуск дампа</h2>
debugdiag.exe -CrashDump <PID>


Изоляция системы


**Изменение сетевого профиля:**
powershell
<h2 id="ustanovit-profil-public">Установить профиль Public</h2>
Set-NetConnectionProfile -InterfaceAlias "Ethernet" -NetworkCategory Public


---

10. Работа с Active Directory


Информация о домене


**Базовая информация:**
powershell
<h2 id="tekuschiy-domen">Текущий домен</h2>
Get-ADDomain | Select-Object DNSRoot, DistinguishedName, DomainMode

<h2 id="kontrollery-domena">Контроллеры домена</h2>
Get-ADDomainController | Select-Object Name, IPv4Address, Site


Работа с пользователями


**Поиск пользователей:**
powershell
<h2 id="vse-polzovateli">Все пользователи</h2>
Get-ADUser -Filter *

<h2 id="polzovatel-po-imeni">Пользователь по имени</h2>
Get-ADUser -Identity "john.doe"

<h2 id="poisk-administratorov">Поиск администраторов</h2>
Get-ADGroupMember -Identity "Domain Admins" | Select-Object Name, SamAccountName


**Последний вход:**
powershell
Get-ADUser -Filter * -Properties LastLogonDate | 
Where-Object {$_.LastLogonDate -gt (Get-Date).AddDays(-30)} |
Select-Object Name, LastLogonDate


Олицестпники и события


**Аудит логинов:**
powershell
<h2 id="loginy-za-poslednie-30-dney">Логины за последние 30 дней</h2>
Get-EventLog -LogName Security -After (Get-Date).AddDays(-30) -InstanceId 4624


---

11. Создание собственных скриптов


Структура скрипта


**Базовый шаблон:**
powershell
<h2 id="trebuet-zapusk-s-pravami-administratora">Требует запуск с правами администратора</h2>
#Requires -RunAsAdministrator

param(
[Parameter(Mandatory=$false)]
[string]$OutputPath = "C:\Forensics\Analysis"
)

<h2 id="funktsiya-logirovaniya">Функция логирования</h2>
function Write-Log {
param([string]$Message)
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
Write-Host "[$timestamp] $Message"
}

<h2 id="funktsiya-sozdaniya-direktorii">Функция создания директории</h2>
function Initialize-OutputDirectory {
if (-not (Test-Path -Path $OutputPath)) {
New-Item -ItemType Directory -Path $OutputPath -Force | Out-Null
Write-Log "Created output directory: $OutputPath"
}
}

<h2 id="osnovnaya-logika">Основная логика</h2>
try {
Write-Log "Starting analysis..."
Initialize-OutputDirectory

# Сбор данных
Write-Log "Collecting system information..."

Write-Log "Analysis complete!"
} catch {
Write-Log "Error occurred: $_"
throw
}


Рекомендации по скриптам


**1. Используйте try-catch:**
powershell
try {
# Код
} catch {
Write-Error "Error: $_"
}


**2. Валидация входных параметров:**
powershell
if (-not (Test-Path -Path $OutputPath)) {
throw "Path does not exist: $OutputPath"
}


**3. Логирование:**
powershell
function Write-Log {
param([string]$Message)
Add-Content -Path "C:\log.txt" -Value "[$(Get-Date)] $Message"
}


---

12. Продвинутые техники анализа


Timeline анализ


**Создание timeline:**
powershell
function Get-TimelineEvents {
param([string]$StartDate, [string]$EndDate)

# Event Logs
Get-WinEvent -FilterHashtable @{LogName='Security'} |
Select-Object TimeCreated, Id, Message

# Registry changes
# Filesystem changes
# ...
}

Get-TimelineEvents -StartDate "2026-01-01" -EndDate "2026-01-31" |
Export-Csv -Path "C:\timeline.csv"


Корреляция данных


**Связывание событий:**
powershell
<h2 id="svyaz-protsessov-s-setevoy-aktivnostyu">Связь процессов с сетевой активностью</h2>
$processes = Get-Process | Select-Object Id, Name, Path
$connections = Get-NetTCPConnection

$correlation = $connections |
ForEach-Object {
$proc = $processes | Where-Object {$_.Id -eq $_.OwningProcess}
[PSCustomObject]@{
ProcessName = $proc.Name
ProcessPath = $proc.Path
LocalAddress = $_.LocalAddress
RemoteAddress = $_.RemoteAddress
}
}


---

13. Практические кейсы расследований


Кейс 1: Обнаружение persistence механизма


**Ситуация:** Подозрение на установку malware.

**Анализ:**
powershell
<h2 id="1-proverka-autostart">1. Проверка autostart</h2>
$runKeys = @(
"HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run",
"HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run"
)

foreach ($key in $runKeys) {
Get-ItemProperty -Path $key
}

<h2 id="2-proverka-sluzhb">2. Проверка служб</h2>
Get-Service | Where-Object {$_.Status -eq 'Running'} | Select-Object Name, DisplayName, PathName

<h2 id="3-poisk-podozritelnyh-protsessov">3. Поиск подозрительных процессов</h2>
Get-Process | Where-Object {
$_.Path -notlike "C:\Windows\*" -and
$_.Path -notlike "C:\Program Files*"
} | Select-Object Name, Path, StartTime


**Результат:** Обнаружен неизвестный процесс в автозагрузке.

Кейс 2: Анализ несанкционированного доступа


**Ситуация:** Подозрение на несанкционированный доступ к системе.

**Анализ:**
powershell
<h2 id="logi-loginov">Логи логинов</h2>
Get-WinEvent -FilterHashtable @{LogName='Security'; ID=4624} |
Where-Object {$_.TimeCreated -gt (Get-Date).AddDays(-7)} |
Select-Object TimeCreated, Message

<h2 id="neudachnye-popytki">Неудачные попытки</h2>
Get-WinEvent -FilterHashtable @{LogName='Security'; ID=4625} |
Group-Object -Property {$_.Properties[5].Value} |
Where-Object {$_.Count -gt 5}


**Результат:** Найдены множественные неудачные попытки входа с одного IP.

---

14. Этические и правовые аспекты


Юридические требования


**Получение прав:**
- Ордер на обыск
- Согласие владельца
- Корпоративная политика

Цепочка доказательств


**Документирование:**
powershell
<h2 id="logirovanie-vseh-deystviy">Логирование всех действий</h2>
Start-Transcript -Path "C:\Forensics\session.log"

<h2 id="heshirovanie-dannyh">Хеширование данных</h2>
Get-FileHash -Path "C:\evidence.csv" -Algorithm SHA256

Stop-Transcript


Ответственное использование


**Правила:**
1. Минимальное вмешательство
2. Документирование всего
3. Сохранение оригиналов
4. Безопасное хранение

---

15. FAQ


1. Нужны ли права администратора для PowerShell?


**Ответ:** Зависит от задачи. Многие команды требуют повышенных прав, но базовый анализ может выполняться с обычными правами.

2. Как безопасно сохранить результаты анализа?


**Ответ:** Используйте хеширование и шифрование: `Get-FileHash -Path $file` и шифрование дисков.

3. Можно ли использовать PowerShell для удаленной работы?


**Ответ:** Да, через PowerShell Remoting: `Enter-PSSession -ComputerName target`.

4. Как работать с шифрованными данными?


**Ответ:** PowerShell может работать с BitLocker и EFS, но нужны соответствующие права.

5. Совместим ли PowerShell с другими инструментами DFIR?


**Ответ:** Да, PowerShell может экспортировать данные в форматы, понятные Wireshark, Autopsy, и другим.

6. Можно ли автоматизировать сбор доказательств?


**Ответ:** Да, создавайте скрипты для автоматизации рутинных задач сбора доказательств.

7. Как работать с дампами памяти?


**Ответ:** PowerShell ограничен в работе с полными дампами памяти. Используйте специализированные инструменты.

8. Защищен ли PowerShell от обхода антивируса?


**Ответ:** Не всегда. Используйте AMSI (Anti-Malware Scan Interface) и мониторинг выполнения скриптов.

9. Можно ли использовать PowerShell на Linux?


**Ответ:** PowerShell Core (7+) работает на Linux, но функциональность ограничена по сравнению с Windows.

10. Как обеспечить целостность собранных данных?


**Ответ:** Используйте хеширование, логирование, и работайте с копиями данных.

11. Какие версии PowerShell существуют?


**Ответ:** PowerShell 5.1 (Windows), PowerShell 7+ (кросс-платформенная).

12. Как детектировать PowerShell-based атаки?


**Ответ:** Мониторинг выполнения скриптов, анализ Event Logs, проверка WMI subscriptions.

13. Можно ли использовать PowerShell в суде?


**Ответ:** Да, при правильной документации, хешировании и соблюдении цепочки доказательств.

14. Какие модули наиболее полезны для DFIR?


**Ответ:** PowerForensics, Kansa, Carbon, Posh-SSH, и другие специализированные модули.

15. Как обучпредить использование PowerShell злоумышленниками?


**Ответ:** Ограничить execution policy, мониторить выполнение, использовать Microsoft Defender, применять наименьшие привилегии.

---

16. Заключение


PowerShell представляет собой мощный и незаменимый инструмент для работы в области цифровой криминалистики и расследования инцидентов на Windows системах. Его встроенность в операционную систему, мощная автоматизация и доступ к широкому спектру системных данных делают его критически важным в арсенале каждого эксперта DFIR.

От сбора базовых доказательств до сложного анализа событий и создания timeline - PowerShell предоставляет все необходимые инструменты для эффективного расследования. Постоянное изучение новых методов, практика и понимание как злоумышленники используют PowerShell является ключевым для успешной работы в этой области.

Важно помнить об этических и правовых аспектах работы с данными. Всегда соблюдайте законодательство, документируйте все действия и обеспечивайте целостность собранных доказательств. Ваша цель - помочь правосудию путем честного и компетентного анализа.

Данное руководство охватывает основы использования PowerShell , но истинное мастерство приходит с опытом и постоянной практикой. Продолжайте изучать новые техники, экспериментировать с инструментами и развивать свои навыки в области цифровой криминалистики.

---

**⚠️ Дисклеймер:** Статья носит информационно-образовательный характер и не содержит инструкций для совершения противоправных действий.