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

Discussion in 'Статьи' started by begin_end, 28 Feb 2007.

  1. begin_end

    begin_end Green member

    Joined:
    4 Jan 2007
    Messages:
    265
    Likes Received:
    638
    Reputations:
    476
    Вступление

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

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

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



    Функция LogonUser

    скачать пример

    Code:
    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

    скачать пример

    Code:
    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), статья на оригинальность не претендует, служит для ознакомления (и только лишь - автор не несёт ответственности за незаконное применение описываемых методов), написана автором с целью поделиться накопленным в ходе решения проблем авторизации опытом.

    ________________
    Дополнение: Вот обещанное продолжение в виде тестового и только тестового (не использовать злоумышленно!) приложения, осуществляющего последовательный перебор списка паролей к списку имён пользователей по SSPI и LogonUser.

    Исходный код и скомпилированная программа здесь или здесь

    По использованию:
    1. Ввести свой домен, если компьютер локальный, то оставить строчку пустой.
    2. Загрузить список пользователей или из файла, или из указанного домена.
    3. Указать пароли вручную или тоже загрузить из файла.
    4. Выбрать метод (обычно самый рабочий - SSPI).
    5. Нажать на "Начать".
    6. Сохранить результаты, если есть.

    PS: При выяснении неработоспособности как всего приложения, так и его отдельной функции просьба указать на это. По прошествии некоторого пробного периода механизм работы будет подробнее расписан здесь же. Продукт предназначен для локального использования, либо демонстрации недостатков системы авторизации в определённом домене.
     
    _________________________
    #1 begin_end, 28 Feb 2007
    Last edited: 26 Aug 2012
    4 people like this.
  2. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,119
    Reputations:
    1,139
    В тему вот еще: http://www.wasm.ru/article.php?article=1021001
     
    1 person likes this.