Способы авторизации в Windows или как проверить верность пароля для определённого пользователя

В данном случае речь пойдёт об авторизации пользователя в ОС Windows локально либо в домене. Как известно, Windows — многопользовательская
система, позволяющая гибко настраивать права для отдельного пользователя или группы…

Способы авторизации в Windows или как проверить верность пароля для определённого пользователя

     Авторизацией называется процесс идентификации входящего пользователя (обычно путём сопоставления имени пользователя и пароля на определённой базе данных), дающий в результате успеха данному пользователю его возможности (права) в системе и исключающий его анонимность.

     В данном случае речь пойдёт об авторизации пользователя в ОС Windows локально либо в домене. Как известно, Windows — многопользовательская система, позволяющая гибко настраивать права для отдельного пользователя или группы. Процессы могут быть запущенными одновременно разными пользователями. Для запуска процесса от имени другого пользователя нужно применять функцию CreateProcessAsUser передавая ей в качестве одного из параметров hToken типа THandle. Этот hToken мы и получим в результате работы функции авторизации LogonUser. Всего же мне известно 3 способа осуществить проверку соответствия имени пользователя и пароля. Разберу их по порядку.

 

Функция LogonUser скачать пример

function LogonUser( lpszUsername, lpszDomain, lpszPassword: PChar; dwLogonType, dwLogonProvider: DWORD; var phToken: THandle ) : BOOL;

lpszUsernameимя пользователя

lpszDomain — домен

lpszPassword — пароль

dwLogonType — тип входа

dwLogonProvider — провайдер входа

phToken — указатель на переменную для приёма токена

Функция изначально служит именно для авторизации, dwLogonProvider указывают обычно LOGON32_PROVIDER_DEFAULT. Тип входа может быть LOGON32_LOGON_BATCH, LOGON32_LOGON_INTERACTIVE , LOGON32_LOGON_SERVICE , LOGON32_LOGON_NETWORK. При отказе авторизации phToken=0, иначе равен определённому значению типа Cardinal (THandle).

Условия работы функции: работает в Windows NT, но в версиях до Windows XP требует привилегию SE_TCB_NAME, что делает практически невозможным её применение в старших версиях NT.

 

Функция NetUserChangePassword скачать пример

function NetUserChangePassword( Domain: PWideChar; UserName: PWideChar; OldPassword: PWideChar;
NewPassword: PWideChar ) : Longint;

Domainдомен

UserName — имя пользователя

OldPassword — старый пароль

NewPassword — новый пароль

Функция предназначена для смены пароля, если возвращает 0, значит успех. Возможно использование для авторизации, если OldPassword=NewPassword. При отказе возможны следующие значения: ERROR_ACCESS_DENIED, NERR_InvalidComputer, NERR_NotPrimary, NERR_UserNotFound, NERR_PasswordTooShort.

Условия работы функции: отсутствие запрета на изменение пароля, отсутствие ограничения на количество попыток смены пароля, отсутствие запрета на схожесть паролей. Кроме того в ранних версиях Windows NT функция сможет успешно выполняться лишь для имени пользователя, запустившего приложение. Наиболее медленная.

 

Security Support Provider Interface (SSPI) скачать пример SSPI+остальные методы (см. заключение)

Метод авторизации с помощью SSPI основан на NTLM-аутентификации. Исполнение не ограничивается применением одной функции, довольно сложно. Метод не требует особых привилегий, работоспособен для Windows NT и Windows 95-98 (только для серверной авторизации — вход в систему всегда сетевой). Готовая реализация метода находится в модуле SSPIValidatePassword.pas, который разработал Colin Wilson. Вызывать можно как SSPIValidatePassword.SSPLogonUser ( const DomainName, UserName, Password: string ) : boolean;

При успехе авторизации возвращает true. Но true возвращается и при пустых значениях DomainName, UserName, поэтому необходимо вводить дополнительную проверку.

 

Заключение и немного о подборе

     Наиболее надёжным способом авторизации для какойлибо связанной с этим функции приложения, рассчитанного на работу во всех версиях Windows будет применение всех функций последовательно в таком порядке: SSPIValidatePassword.SSPLogonUser, LogonUser, NetUserChangePassword. Но в случае использования таких функций для подбора паролей нужно учесть, что: при неправильном вводе пароля несколько раз подряд происходит блокировка учётной записи, перебор должен происходить быстро. Значит подходящим для этого будет SSPI. Подбирать будем, выяснив разрешённое количество попыток неправильного ввода. Потом берём список всех пользователей с сервера и к каждому из них по очереди пробуем простые пароли (в количестве разрешённых попыток). Через определённое время учётные записи разблокируются и можно пробовать новые пароли. В некоторых учреждениях, где для авторизации используют контроллёр домена, можно таким перебором получить немало учётных записей. Вероятно выйдет продолжение этой статьи в виде тестовой программы (естественно с исходниками и мануалом по применению) для перебора паролей для учётных записей домена таким методом.

     Статья написана 27.02.2007, примеры рассчитаны на Delphi 7. Автор статьи и примеров я (исключая модуль для SSPI от Colin Wilson), статья на оригинальность не претендует, служит для ознакомления, написана автором с целью поделиться накопленным в ходе решения проблем авторизации опытом.