Протокол MS-CHAPV2

Как уже было сказано, MS-CHAPv2 применяется для аутентификации пользователей. Происходит она в несколько этапов:
•клиент посылает запрос на аутентификацию серверу, открыто передавая свой login;
•сервер возвращает клиенту 16-байтовый случайный отклик lAuthenticator Challenge);
•клиент генерирует 16-байтовый РАС (Peer Authenticator Challenge - равный отклик аутентификации);
•клиент объединяет РАС, отклик сервера и свое user name в одну строку;
•с полученной строки снимается 8-байтовый хеш по алгоритму 5НА - 1 и посылается серверу;
•сервер извлекает из своей базы хеш данного клиента и расшифровываете ответ;
•если результат расшифровки совпадете исходным откликом, все ОК, и наоборот;
•впоследствии сервер берет РАС клиента и на основе хеша генерирует 20-байтовый AR (Authenticator Response - аутентификационный ответ), передавая его клиенту;
•клиент проделывает ту же самую операцию и сравнивает полученный AR с ответом сервера;
•если все совпадает, клиент аутентифицируется сервером.
На первый взгляд протокол кажется излишне сложным - куча хешей, шифрование, случайные challenge. На самом деле все не так уж и сложно. Если присмотреться внимательней, то можно заметить, что во всем протоколе остается неизвестной только одна вещь - MDA-хеш пароля пользователя, на основании которого строятся три DES-ключа. Остальные же параметры либо передаются в открытом виде, либо могут быть получены из того, что передается в открытом виде.
Так как почти все параметры известны, то мы можем их не рассматривать, а остановить свое пристальное внимание на том, что неизвестно, и выяснить, что это нам дает.
Итак, что мы имеем: неизвестный пароль, неизвестный MD4-xeш этого пароля, известный открытый текст и известный шифртекст. При более детальном рассмотрении можно заметить, что пароль пользователя нам не важен, а важен его хеш, так как на сервере проверяется именно он. Таким образом, для успешной аутентификации от имени пользователя, а также для расшифровки его трафика нам необходимо знать всего лишь хеш его пароля.
Имея на руках перехваченный трафик, можно попробовать его расшифровать. Есть несколько инструментов (например, asleap - bit.ly/BcUAN), которые позволяют подобрать пароль пользователя через атаку по словарю. Недостаток этих инструментов в том, что они не дают стопроцентной гарантии результата, а успех напрямую зависит от выбранного словаря. Подбирать же пароль простым брутфорсом тоже не очень эффективно - например, в случае с PPTPVPN сервисом riseup.net, который принудительно устанавливает пароли длиной в 21 символ, придется перебирать 96 вариантов символа для каждого из 21 символов. Это в результате дает 96А21 вариантов, что чуть больше, чем 2А138. Иными словами, надо подобрать 138-битный ключ. В ситуации же, когда длина пароля неизвестна, имеет смысл подбирать MD4-xeш пароля. Учитывая, что его длина равна 128 бит, получаем 2А128 вариантов - на данный момент это просто нереально вычислить.