Событие Windows 4625: как читать неудачный вход
Каждое поле события 4625, значения кодов состояния и способ отличить пользователя, промахнувшегося по клавишам, от ботнета, перебирающего словарь.
Что такое 4625
Событие 4625 — «Учётной записи не удалось выполнить вход в систему» — пишется в журнал безопасности Windows при каждом отклонённом входе, по любой причине: неверный пароль, несуществующая учётная запись, отключённая запись, вход вне разрешённых часов. Успешный аналог — 4624.
Это самое полезное событие на Windows-сервере, смотрящем в интернет, потому что именно здесь брутфорс становится виден до того, как он сработает. Всё, что делает защита на уровне фаервола, начинается с чтения этого потока.
Если на заведомо доступном сервере событий 4625 нет вообще — значит выключен аудит, а не сервер тихий. Проверьте и включите:
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 выше.
Источник. Ваши люди входят с нескольких известных адресов. Атаки приходят с хостинговых диапазонов, с нового адреса каждые несколько сотен попыток, нередко из нескольких стран в течение часа.
Эта команда группирует отказы за сутки по источнику и учётной записи, так что все три признака видны сразу:
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 МБ забиваются быстро при тысячах событий в сутки. Если вы рассчитываете на журнал при разборе инцидента, увеличьте его максимальный размер или пересылайте события за пределы хоста, иначе нужные данные устареют раньше, чем вы в них заглянете.
