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

WinSecHunter 2.1.0 — обложка релиза: модуль PowerShell для разбора событий Windows по IP-адресу
WinSecHunter 2.1.0: сбор, атрибуция и отчётность по одному IP-адресу атакующего.

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 и одного профиля поиска.

Цитата: Ценность форензики не в том, сколько событий вы выгрузили, а в том, сможете ли вы через час объяснить по ним, что произошло, — поэтому отчётность и целостность доказательств важнее ещё одной команды сбора.

Связанные материалы

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

Ограничения:
- Выполнять только команды из инструкции выше, ничего не добавлять от себя.
- Работать в отдельном каталоге; не менять системные настройки и не отключать защиту.
- Если команда падает — остановиться и показать команду, вывод и код возврата.

Что считать успехом: все шаги выполнены без ошибок, проверка из инструкции прошла.