Проверка подлинности NTLM для приложения на стороне веб-сервера

Мое приложение на базе Windows, написанное на C++ (в основном прокси-сервер HTTP/1.1), прослушивает запросы от разных пользователей. В настоящее время он может отправлять 407 Basic Challenge и обрабатывать ответ из заголовков. Я знаю, что должен изменить заголовки вызовов, чтобы клиентские браузеры давали ответ на основе NTLM для целей аутентификации. Но мой вопрос: как мне сгенерировать правильные токены, одноразовый номер и т. д. для проверки подлинности 407, а затем как проверить правильность полученных ответов? Наконец, я хотел бы записать имя пользователя клиента и другие свойства LDAP/ADS, если это возможно.

Пожалуйста, будьте любезны и перенаправьте меня на правильные сообщения, если уже есть какие-либо темы, в которых обсуждается что-то подобное. Большинство исследований WWW приводит меня только к программированию на стороне клиента, очень мало или почти ничего - к кодированию, которое должно быть выполнено на HTTP-сервере.

Все вы здесь отличные хакеры, БОЛЬШОЕ спасибо заранее.


person mdk    schedule 23.07.2009    source источник


Ответы (5)


Короткий ответ: я думаю, что это Использование SSPI с Windows Образец Sockets Server — это ваша лучшая отправная точка, и он должен продемонстрировать основные вызовы SSPI, которые вам нужны. Он написан для простого TCP-сервера, но данные запроса/ответа передаются по HTTP без особых сложностей.

[MS-N2HT]: протокол HTTP-аутентификации Negotiate и Nego2< /а>

Я поддерживаю рекомендацию просмотреть mod_auth_sspi для кода Apache.

Лично я бы также попробовал подключить низкоуровневый отладчик к IIS и посмотреть, как он вызывает функции SSPI, но это может быть не ваша чашка чая.

После того, как вы зашли так далеко с SSPI, получение имени пользователя должно стать легкой задачей (но спросите, нужна ли вам помощь). С помощью этих API можно запросить свойства LDAP/AD для пользователя.

Длинный ответ предполагает небольшое легкое чтение:

Встроенная аутентификация Windows в Википедии

Аутентификация Kerberos на основе SPNEGO и HTTP-аутентификация NTLM в Microsoft Windows

Кроссплатформенная аутентификация на основе HTTP с помощью протокола согласования (часть 1 из 3)< /а>

Часть 3 также содержит несколько интересных примеров кода.

Надеюсь это поможет!

person Marsh Ray    schedule 30.07.2009

В httpauth есть код, который может вам помочь. Он использует код smbval для разбора сообщений NTLM 1 и 3. См.: http://memberwebs.com/stef/software/httpauth/

person Stef    schedule 08.08.2009
comment
httpauth можно было бы использовать, но, к сожалению, документации недостаточно. Тем не менее, выглядит очень многообещающе. Папка docs в нем содержит протоколы.txt, но требует много взлома! Я все еще играю с ним, и я не знаю, действительно ли это работает. Но если это произойдет, это может заставить парней из картеля кальмаров / самбы выпрыгнуть из своих носков! Я уверен, что есть еще такие люди, как я, которые хотят, чтобы это действительно работало! - person mdk; 25.09.2009
comment
Я проверил httpauth для аутентификации NTLM для версии моего прокси-сервера на базе Linux. Это отличное решение для использования, намного лучше, чем решение ntlm_auth + winbind, и определенно намного более элегантное. Определенно, это решение, которое хотелось бы использовать вместе с многопоточными приложениями. Еще не исследовал идею повторного использования частей кода из httpauth. Предупреждение: httpauth по своей сути не поддерживает заголовки proxy-authenticate, поэтому прокси-приложения должны выполнять дополнительную работу. - person mdk; 06.10.2009

Вы можете найти вдохновение, просмотрев модуль Apache mod_auth_sspi.

person Éric Malenfant    schedule 23.07.2009

После некоторой борьбы мне удалось зайти так далеко: на моем прокси-сервере я могу вызывать клиентов для аутентификации Basic / NTLM. Когда пользователь делает «базовый» ответ, я могу проверить учетные данные с помощью SSPI. Эта документация помогла: http://support.microsoft.com/kb/180548

Однако я просто не могу выполнить задачу и ответы на основе NTLM. По сути, я могу «пощекотать» клиента, чтобы выбрать систему аутентификации на основе NTLM с помощью 407 Proxy-authenicate, для которой в основном требуется 3 сообщения. Первое сообщение должно быть запросом на основе NTLM, отправленным клиентом, второе — запросом от моего сервера, а третье сообщение — от клиента. Теперь проблема заключается в том, «Как мне сгенерировать вызов NTLM, а затем расшифровать или проверить авторизацию NTLM, то есть сообщение 3.

И большое спасибо Маршу и другим хорошим специалистам за все усилия, которые вы предприняли, чтобы дать ответ. Я могу только надеяться, что вы, возможно, захотите поделиться немного больше.

person mdk    schedule 08.08.2009

это реализация Java, которая может оказаться полезной

http://www.luigidragone.com/networking/ntlm.html

и, что более полезно, попытка задокументировать недокументированную схему ntlm

http://www.innovation.ch/personal/ronald/ntlm.html

person opensas    schedule 30.07.2009