
Введение
В современной цифровой криминалистике расследование инцидентов на 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">Большие файлы (>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 , но истинное мастерство приходит с опытом и постоянной практикой. Продолжайте изучать новые техники, экспериментировать с инструментами и развивать свои навыки в области цифровой криминалистики.
---
**⚠️ Дисклеймер:** Статья носит информационно-образовательный характер и не содержит инструкций для совершения противоправных действий.