WinSecHunter 2.1.0 — обновление модуля PowerShell 7.6, который отвечает на один вопрос: что именно делал с вашей сетью конкретный IP-адрес. В версии от 21 октября 2026 года появился отчёт об инциденте в трёх шаблонах (Executive, Technical, Full), готовое письмо в abuse-службу провайдера в формате RFC 5322 .eml, выгрузка индикаторов в STIX 2.1 и проверка целостности собранных доказательств по SHA-256. Для эксплуатации важнее другое: релиз исправляет три дефекта, из-за которых штатный сбор событий падал целиком — без окна времени, без указания компьютера и при недоступном канале журнала.

TL;DR
- Версия
2.1.0опубликована 21 октября 2026 года: 20 командлетов, 6 новых, 156 событий в каталоге, 14 профилей поиска. - Главное — отчётность:
New-WinSecIncidentReport,New-WinSecAbuseReport,Export-WinSecIocListиTest-WinSecEvidenceIntegrity. - Обновление — распаковать
WinSecHunter-2.1.0-module.zipи импортироватьWinSecHunter.psd1; проверка — 20 экспортируемых функций и 156 событий в каталоге. - Риск: нумерация относится к модулю, а не продолжает старый скрипт
v5.0.2; скрипт удалён изmainи остался только файлом в релизе. - Кому обновление не нужно: если вы не собираете события Windows по IP-адресу и не пишете по ним отчёты — это не ваш инструмент.
Что нового
Раньше инструмент умел собрать события и показать их в консоли. В 2.1.0 он доводит работу до документов, которые принимает не админ, а руководитель и провайдер: вердикт, важность, уверенность, хронология, находки, индикаторы, сессии и цепочка хранения доказательств. Отчёт собирается в Markdown и в автономный HTML — один файл, который открывается без сервера и без ваших внутренних ссылок.
Второе изменение — сбор стал устойчивым к неполной инфраструктуре. Отсутствующий журнал Sysmon, RDP или брандмауэра теперь помечается как Skipped, а не валит весь обход: причина по каждому каналу пишется в WinSecHostResult.LogDetails (объект статуса возвращается с -PassHostStatus). Отдельно Get-WinSecLogCoverage отвечает на вопрос, можно ли вообще доказать что-то этими журналами: глубина хранения, размер, риск перезаписи и доступ. На практике это разница между «сбор не удался» и «собрали, чего не хватало — видно в отчёте».
Третье — письмо в abuse. Модуль формирует .eml формата RFC 5322, сам находит abuse-адрес по ASN и PTR источника, прикладывает доказательства в base64 и заменяет имена учётных записей на согласованные псевдонимы, если указан -RedactAccounts. Выгрузка индикаторов идёт в CSV, «грепаемый» текст, JSON и STIX 2.1 — то есть в том числе в формате, который понимают SIEM и TIP.
Что исправлено
- Сбор падал, если не задано окно времени:
[AllowNull()][datetime]не принимает$null. - Любой обход с
-ComputerNameпрерывался на ограничении scriptblock вForEach-Object -Parallel. - Вывод
-PassHostStatusтерялся, когда канал был недоступен. - Исправлен адрес OTX и незаконное имя файла в кэше атрибуции IPv6.
config.jsonпишется атомарно; пустые отметки покрытия больше не ломают экспорт.-RedactAccountsтеперь скрывает имена и внутри приложенных CSV/JSON-доказательств.- Локализованные заголовки
auditpol /rне ломают анализ политики аудита.
Ключевые изменения
| Команда | Назначение |
|---|---|
Show-WinSecHunterHelp |
справка по всему набору, по одной команде или в Markdown |
New-WinSecIncidentReport |
отчёт Executive / Technical / Full в Markdown и автономный HTML |
New-WinSecAbuseReport |
.eml по RFC 5322, Markdown и JSON для сети-источника |
Export-WinSecIocList |
индикаторы в CSV, TXT, JSON и STIX 2.1 |
Test-WinSecEvidenceIntegrity |
проверка хешей: изменённые, отсутствующие и добавленные файлы |
Import-WinSecCase |
повторное открытие комплекта с типизированными событиями |
Остальные четырнадцать командлетов отвечают за сбор, нормализацию, поиск brute force и spraying, восстановление сессий входа и атрибуцию адреса. Полный перечень — в справке модуля и в вики репозитория.
Файлы в релизе
| Файл | Размер | Загрузок |
|---|---|---|
Get-SecurityEventsByIP.ps1 |
41 КБ | 0 |
WinSecHunter-2.1.0-module.zip |
122 КБ | 0 |
Контрольные суммы SHA-256:
| Файл | SHA-256 |
|---|---|
WinSecHunter-2.1.0-module.zip |
6A2490FF93C35D51395C120264BAA798783E4CBC06516CF1E1BAC33F321C00DE |
Get-SecurityEventsByIP.ps1 |
5ECCC009BDF04885E1E36313BEE13EF299942F4A32A3A2339C1C0E42AC1BA375 |
Как обновиться
$version = '2.1.0'
$zip = Join-Path $env:TEMP "WinSecHunter-$version-module.zip"
Invoke-WebRequest "https://github.com/paulmann/Get-Windows-Security-Events-By-IP/releases/download/v$version/WinSecHunter-$version-module.zip" -OutFile $zip -UseBasicParsing
Expand-Archive -LiteralPath $zip -DestinationPath (Join-Path $env:TEMP "WinSecHunter-$version") -Force
Import-Module (Join-Path $env:TEMP "WinSecHunter-$version/WinSecHunter/$version/WinSecHunter.psd1") -Force
(Get-Module WinSecHunter).ExportedFunctions.Count # 20
@(Get-WinSecEventCatalog).Count # 156
Это установка «на один сеанс»: модуль распаковывается во временный каталог и импортируется оттуда. Для постоянной работы скопируйте каталог в $env:USERPROFILEDocumentsPowerShellModulesWinSecHunter2.1.0 — тогда Import-Module WinSecHunter работает без полного пути. Перезапуск служб не нужен, права администратора нужны только на чтение журналов и на удалённый сбор через WinRM/CIM.
Что проверить после обновления
(Get-Module WinSecHunter).ExportedFunctions.Count # ожидается 20
@(Get-WinSecEventCatalog).Count # ожидается 156
Get-WinSecLogCoverage -LogName Security # глубина хранения, размер, риск перезаписи и доступ
Критерий «обновление удалось»: модуль импортируется без ошибок, экспортирует ровно 20 функций, каталог событий содержит 156 записей, а Get-WinSecLogCoverage показывает по журналу глубину хранения и доступ — то есть можно ли вообще доказать что-то этими логами. Если импорт падает на WinSecHunter.psd1, почти всегда виноват не сам модуль, а среда: нужен PowerShell 7.6 или новее.
Совместимость и требования
| Параметр | Значение |
|---|---|
| Проект | Get-Windows-Security-Events-By-IP (продукт WinSecHunter) |
| Язык | PowerShell |
| Лицензия | PolyForm Noncommercial 1.0.0 — так указано в README, точная формулировка в файле LICENSE |
| Версия | v2.1.0 от 2026-10-21 |
| Репозиторий | https://github.com/paulmann/Get-Windows-Security-Events-By-IP |
| Предыдущий релиз | v5.0.2 от 2025-11-27 |
| Между релизами | 11 коммитов, изменено файлов: 94 |
Требуется PowerShell 7.6 или новее и Windows для сбора: журналы событий читаются на месте, а для удалённых хостов нужен доступ по WinRM или CIM. Анализ уже снятых .evtx привязан к Windows меньше, но проверять это стоит на своём файле, а не на предположении. Перед обновлением сохраните рабочий каталог модуля: новый релиз ставится рядом и не переносит старые настройки.
Кому это нужно
Первый сценарий — разбор инцидента с подбором паролей по RDP. Вместо ручного перебора журналов безопасности вы получаете хронологию по адресу источника: когда началось, сколько попыток, какие учётные записи затронуты, дошло ли до успешного входа, и отдельный документ для провайдера, если адрес приходит из его сети.
Второй — регулярная гигиена: раз в месяц прогонять профили поиска по журналам и смотреть, не появились ли в инфраструктуре новые внешние адреса с массовыми неудачными входами. Отчёт в HTML удобно прикладывать к заявке, а выгрузка в STIX — к тикету в SOC.
Подводные камни
- Лицензия PolyForm Noncommercial 1.0.0 запрещает коммерческое использование: для рабочего применения в компании сначала прочитайте
LICENSEи решите вопрос с автором, а не «поставим и разберёмся». Skipped— это не «событий не было». Если канал журнала отключён, отчёт честно скажет, что данных нет, но читать это как «атак не было» нельзя.- Скрипт
Get-SecurityEventsByIP.ps1удалён из веткиmain: он остался только файлом релиза. Свои обёртки и задачи планировщика, которые ссылались на путь в репозитории, надо переписать на модуль. - Нумерация версий не продолжает старую:
2.1.0— версия модуля, аv5.0.2— последняя версия скрипта. Если в инвентаризации у вас записано «5.0.2», формально это другая ветка продукта, и сравнивать «старое и новое» по номерам нельзя.
FAQ
Чем 2.1.0 отличается от 5.0.2?
Это разные вещи с одним назначением. v5.0.2 — одиночный скрипт, который выводил события в консоль. 2.1.0 — модуль из 20 командлетов с отчётностью, атрибуцией и контролем целостности доказательств. Старый скрипт оставлен в релизе как файл для совместимости и удалён из main.
Обязателен ли Sysmon?
Нет. Модуль читает те каналы, которые есть, а отсутствующие помечает Skipped с причиной в LogDetails. Sysmon расширяет картину (сеть, создание процессов), но собственный каталог модуля — 156 событий в шести каналах — это журналы Windows, а не только Sysmon.
Можно ли приложить отчёт к обращению в провайдер?
Для этого есть New-WinSecAbuseReport: он формирует .eml по RFC 5322, сам подставляет abuse-адрес из ASN/PTR и прикладывает доказательства. Отчёт об инциденте — внутренний документ; для внешней переписки используйте именно abuse-письмо.
Заменяет ли Test-WinSecEvidenceIntegrity юридическую фиксацию?
Нет. Это SHA-256-манифест и проверка, что файлы не изменились и не добавились после экспорта. Для процессуальной фиксации нужны процедуры, которых у инструмента нет и быть не может.
Итог
2.1.0 превращает набор для сбора событий в инструмент, который доводит разбор до документа: отчёт для руководства, письмо для провайдера, индикаторы для SIEM и манифест целостности для доказательств. Плюс закрывает три дефекта, из-за которых сбор падал на ровном месте. Если вы уже пользовались скриптом — обновляйтесь осознанно и переносите обёртки на модуль; если только присматриваетесь — начните с Show-WinSecHunterHelp и одного профиля поиска.
Цитата: Ценность форензики не в том, сколько событий вы выгрузили, а в том, сможете ли вы через час объяснить по ним, что произошло, — поэтому отчётность и целостность доказательств важнее ещё одной команды сбора.
Связанные материалы
- WinSecHunter 2.1.0 — релиз на GitHub — заметки к релизу, файлы и контрольные суммы.
- Репозиторий Get-Windows-Security-Events-By-IP — исходники, сборка, AGENTS.md и CHANGELOG.
- Вики проекта — установка, перечень команд и разделы по отчётам.
- RDP Diagnostic Tool: диагностика удалённых рабочих столов — проверка самого стека RDP до разбора событий.
- Справочник по мониторингу RDP-событий Windows — какие события искать и что они означают.
LLM Summary
- Тема: релиз WinSecHunter 2.1.0 — модуль PowerShell для сбора и разбора событий Windows по IP-адресу.
- Версия:
v2.1.0, опубликована 21 октября 2026; репозиторийpaulmann/Get-Windows-Security-Events-By-IP. - Что изменилось: отчёт об инциденте в трёх шаблонах (Markdown + автономный HTML); abuse-письмо
.emlпо RFC 5322 с адресом из ASN/PTR; выгрузка IOC в CSV/TXT/JSON/STIX 2.1; SHA-256-манифест и проверка целостности; повторный импорт комплекта; устойчивый сбор с пометкойSkippedпо недоступным каналам. - Исправлено: падение без окна времени, обрыв при
-ComputerName, потеря вывода-PassHostStatus, адрес OTX, имя файла кэша IPv6, неатомарная записьconfig.json, утечка имён в-RedactAccounts, локализованные заголовкиauditpol /r. - Ключевые команды:
New-WinSecIncidentReport,New-WinSecAbuseReport,Export-WinSecIocList,Test-WinSecEvidenceIntegrity,Import-WinSecCase,Show-WinSecHunterHelp. - Требования: PowerShell 7.6+, Windows для сбора, WinRM/CIM для удалённых хостов; лицензия PolyForm Noncommercial 1.0.0.
- Основные риски: коммерческое использование ограничено лицензией;
Skippedне означает отсутствие событий; скриптv5.0.2удалён изmain; нумерация 2.1.0 относится к модулю, а не к скрипту. - Проверка результата:
(Get-Module WinSecHunter).ExportedFunctions.Count= 20,@(Get-WinSecEventCatalog).Count= 156,Get-WinSecLogCoverageпоказывает глубину хранения и доступ по журналу. - Ссылки: https://github.com/paulmann/Get-Windows-Security-Events-By-IP/releases/tag/v2.1.0, https://github.com/paulmann/Get-Windows-Security-Events-By-IP
Промт для агента (установка)
Готовый промт для AI-агента: скопируйте блок целиком кнопкой и отдайте своему ассистенту. Шаги и команды взяты из файла AGENTS.md в репозитории проекта — это инструкция, которую автор написал для агентов, а не пересказ.
Задача: установить WinSecHunter v2.1.0 и убедиться, что он работает.
Материалы:
- релиз: https://github.com/paulmann/Get-Windows-Security-Events-By-IP/releases/tag/v2.1.0
- репозиторий: https://github.com/paulmann/Get-Windows-Security-Events-By-IP
- инструкция для агентов (прочитать первой): https://github.com/paulmann/Get-Windows-Security-Events-By-IP/blob/main/AGENTS.md
Шаги:
1) Скачать и распаковать:
$version = '2.1.0'
$zip = Join-Path $env:TEMP "WinSecHunter-$version-module.zip"
$dir = Join-Path $env:TEMP "WinSecHunter-$version"
Invoke-WebRequest "https://github.com/paulmann/Get-Windows-Security-Events-By-IP/releases/download/v$version/WinSecHunter-$version-module.zip" -OutFile $zip -UseBasicParsing
Expand-Archive -LiteralPath $zip -DestinationPath $dir -Force
2) Установить:
# Portable: nothing is written outside the working directory
Import-Module (Join-Path $dir "WinSecHunter/$version/WinSecHunter.psd1") -Force
# Per-user (persists)
./build/Install-Dev.ps1 -Force
3) Проверить:
$m = Get-Module WinSecHunter
$m.Version.ToString() # 2.1.0
$m.ExportedFunctions.Count # 20
@(Get-WinSecEventCatalog).Count # 156
Ограничения:
- Выполнять только команды из инструкции выше, ничего не добавлять от себя.
- Работать в отдельном каталоге; не менять системные настройки и не отключать защиту.
- Если команда падает — остановиться и показать команду, вывод и код возврата.
Что считать успехом: все шаги выполнены без ошибок, проверка из инструкции прошла.