Событие Windows 4625: как читать неудачный вход

Каждое поле события 4625, значения кодов состояния и способ отличить пользователя, промахнувшегося по клавишам, от ботнета, перебирающего словарь.

8 мин чтения

Что такое 4625

Событие 4625 — «Учётной записи не удалось выполнить вход в систему» — пишется в журнал безопасности Windows при каждом отклонённом входе, по любой причине: неверный пароль, несуществующая учётная запись, отключённая запись, вход вне разрешённых часов. Успешный аналог — 4624.

Это самое полезное событие на Windows-сервере, смотрящем в интернет, потому что именно здесь брутфорс становится виден до того, как он сработает. Всё, что делает защита на уровне фаервола, начинается с чтения этого потока.

Если на заведомо доступном сервере событий 4625 нет вообще — значит выключен аудит, а не сервер тихий. Проверьте и включите:

cmd
auditpol /get /subcategory:"Logon"
auditpol /set /subcategory:"Logon" /success:enable /failure:enable

Поля, которые имеют значение

Запись 4625 многословна, и большая её часть — шум. Информацию несут пять полей:

  • Имя учётной записи (в блоке «Учётная запись, которой не удалось выполнить вход») — какое имя пробовали. При реальной атаке это парад имён, которых на вашей машине никогда не было.
  • Сетевой адрес источника — IP, откуда пришла попытка. Именно по этому полю вы действуете. Для локального входа с консоли оно пустое.
  • Тип входа — каким способом входили. 10 — RemoteInteractive (RDP), 3 — Network (SMB или RDP за некоторыми шлюзами), 2 — физическая консоль, 5 — служба, 4 — задача планировщика.
  • Причина ошибки и Состояние / Подсостояние — шестнадцатеричный код с объяснением, что было не так. Здесь и живёт полезное различие.
  • Имя рабочей станции — имя хоста, которое сообщил клиент. Атакующие инструменты часто шлют мусор, случайную строку или оставляют поле пустым, что само по себе сигнал.

Расшифровка кодов состояния

Читать нужно поле «Подсостояние»; верхнеуровневое «Состояние» обычно содержит общий 0xC000006D. Запомните эти пять — и сможете классифицировать почти любое 4625 с одного взгляда:

  • 0xC0000064 — учётной записи с таким именем не существует. Почти всегда атака: ваши пользователи знают собственные логины.
  • 0xC000006A — запись существует, но пароль неверный. Либо реальный пользователь ошибся, либо бот угадал существующий логин.
  • 0xC0000234 — учётная запись заблокирована. Если такие идут сериями, вашу политику блокировки используют против вас.
  • 0xC0000072 — учётная запись отключена. Часто это забытая запись, которую атакующий нашёл и продолжает перебирать.
  • 0xC000006F / 0xC0000070 — вход вне разрешённых часов или с запрещённой рабочей станции. Редкость, которую стоит разобрать, а не проигнорировать.

Как отличить атаку от опечатки

Различают три признака, и перед автоматическим действием нужны все три.

Темп и настойчивость. Человек делает две-три попытки в течение минуты, а потом либо входит, либо звонит вам. Бот держит ровный темп часами, всю ночь, без пауз и никому не звонит.

Разнообразие учётных записей. Человек пробует одну запись — свою. Бот идёт по списку: administrator, admin, user, test, sql, backup, scan — и большинства этих записей на вашей машине нет, что и даёт сигнатуру 0xC0000064 выше.

Источник. Ваши люди входят с нескольких известных адресов. Атаки приходят с хостинговых диапазонов, с нового адреса каждые несколько сотен попыток, нередко из нескольких стран в течение часа.

Эта команда группирует отказы за сутки по источнику и учётной записи, так что все три признака видны сразу:

powershell
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4625; StartTime=(Get-Date).AddDays(-1)} |
  ForEach-Object {
    $d = ([xml]$_.ToXml()).Event.EventData.Data
    [pscustomobject]@{
      IP      = ($d | Where-Object Name -eq 'IpAddress')['#text']
      Account = ($d | Where-Object Name -eq 'TargetUserName')['#text']
      Status  = ($d | Where-Object Name -eq 'SubStatus')['#text']
    }
  } |
  Group-Object IP |
  Sort-Object Count -Descending |
  Select-Object -First 15 Count, Name,
    @{n='Accounts'; e={ ($_.Group.Account | Select-Object -Unique) -join ', ' }}

От чтения событий к их блокировке

Читать 4625 руками — это диагностика, а не защита: к моменту, когда вы запустите команду, атака идёт уже неделю. Что-то меняет только непрерывное выполнение этого цикла и превращение порога в правило фаервола.

Наивная версия подписывается на журнал безопасности, считает отказы по источникам и вызывает New-NetFirewallRule, когда источник переходит черту. Она работает — а потом упирается в те же проблемы, что и любой такой скрипт: набор правил разрастается до тысяч и фаервол начинает ползти, журнал под нагрузкой ротируется и события теряются, скрипт тихо умирает после перезагрузки, а одно неудачное совпадение отрезает администратора от единственного входа.

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

FAQ

Чем событие 4625 отличается от 4624?
4624 фиксирует успешный вход, 4625 — неудачный. Оба лежат в журнале безопасности и имеют одинаковую структуру полей, так что команда выше работает для любого из них при смене идентификатора. Серия 4625, за которой следует 4624 с того же адреса, — это последовательность, которую вы никогда не хотите увидеть: подбор сработал.
Что означает тип входа 3 в событии 4625?
Тип входа 3 — сетевой вход: подключение аутентифицируется по сети, а не с консоли. Это доступ к файловым шарам SMB и, в зависимости от шлюза, часть путей RDP. Прямой RDP на хост обычно даёт тип 10 (RemoteInteractive). Большой объём отказов с типом 3 обычно означает, что наружу торчит ещё и SMB.
Почему поле «Сетевой адрес источника» пустое или содержит прочерк?
Так бывает для входов без сетевого происхождения — физическая консоль, часть служебных входов и задач планировщика — и иногда когда попытка провалилась настолько рано, что адрес не успел записаться. Если соседние поля показывают тип входа 2, 4 или 5, пустой адрес ожидаем и ни о чём плохом не говорит.
Сколько журнал безопасности хранит события 4625?
До заполнения и ротации, а под реальной атакой это часы, а не недели: стандартные 20 МБ забиваются быстро при тысячах событий в сутки. Если вы рассчитываете на журнал при разборе инцидента, увеличьте его максимальный размер или пересылайте события за пределы хоста, иначе нужные данные устареют раньше, чем вы в них заглянете.

Хватит читать журнал вручную

Агент непрерывно следит за этим же потоком событий и превращает его в правила фаервола. Один сервер бесплатно навсегда, без карты.