[Web Application Pentesting] HTTP Digest Аутентитфикация

[Web Application Pentesting] HTTP Digest Аутентитфикация

Life-Hack

Привет коллеги.

В этой статье мы с вами поговорим о:

И так напомню вам что в прошлой статье мы познакомились с вами с HTTP Basic Аутентификацией и способами атаки на ее.

Сегодня же речь пойдет о еще одном виде HTTP Аутентификации - Дайджест Аутентификация.

Дайджест-аутентификация доступа — один из общепринятых методов, используемых веб-сервером для обработки учетных данных пользователя веб-браузера. Этот метод использует шифрование для отправки пароля через сеть, что является более защищённым способом, чем обычная проверка подлинности доступа, при которой данные посылаются открытым текстом.

Вы спросите "Зачем же нужна такая аутентификация когда у нас есть уже Базовая Аутентификая?"

Ответ совсем очевиден:

Дело в том , что Базовая Аутентификация отсылает на сервер логин и пароль в открытом виде.(Да они посылаются в base64 кодировке,но кодировка - это не шифрования!!!) А в силу того , что время не стоит на месте и с развитием WiFi технологий , да и в прочем и в Ethernet сетях , довольно часто развиваются все новые векторы MITM атак и логин и пароль с легкостью можно похитить посредством таких атак.(Речь сейчас идет конкретно про протокол HTTP не проHTTPS)

Так же алгоритм Дайджест Аутентификации описан в RFC 2069 . Еще не знаешь что такое RFC ? )) Ну друг мой - тебе рано или поздно придется с ним знакомится, если ты выбрал путь пентестера

Простыми словами RFC (Request For Comments)- все стандарты Глобальной сети существующие в виде опубликованных заявок RFC)

И так давайте глянем на запрос ответ сервера на HTTP Дайджест аутентификацию:

Обращаем на заголовок запроса:

Authorization и его значения:

Digest - Указывает на то что используется Дайджест Аутентификация

Username - имя пользователя запрашиваемое веб сервером

realm - слово-фраза установленная администратором сервера 

nonce - рандомный(случайный) набор символов в хекс виде.

uri - путь к приложению 

responce - захешированая по алгоритму строка необходимая для проверки на стороне сервера

opaque - то же что и realm , но в нашем случае она пустая(так же задается в настройках веб сервера).


И как результат получаем все тот же 401 (как и при обычной базовой аутентификации) в случае не прохождении проверки на стороне сервера.

Давайте посмотрим на алгоритм хеширования данных при дайджест аутентификации:

Как видим строка responce (которую мы видели в запросе на веб сервере) получается путем хеширования по MD5 шифрованию (Hash1 строки Nonce(так же передаваемая в запросе) и Hash2)

А Hash1 получаем путем хеширования (логина : строки realm(которая так же передается в запросе) : пароля) и Hash2 получаем в результате хеширования (передаваемого метода (GET|POST : URI(также передаваемого в запросе)


В ваершарк это выглядит примерно так:

Теперь давайте попробуем шаг за шагом выполнить этот алгоритм хеширования

(От себя скажу , что это очень немаловажный момент - понимания алгоритма хеширования , так как мы не раз будем сталкиваться с написанием собственных брутилок по определенных алгоритмах)

Для этого нам всего лишь понадобится использовать MD5 шифрования.

Сделать это можно во многих ЯП (Языках Программирования) , но я все же отдаю предпочтения Python:

Запустим для наглядности интерактивный режим Python:

Первым делам импортируем библиотеку hashlib

И создадим переменную hash1 в которую положим необходимое хешированое значение трех составляющих (login:realm:password):

python
Python 2.7.12+ (default, Sep  1 2016, 20:27:38)
[GCC 6.2.0 20160927] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import hashlib
>>> hash1=hashlib.md5('admin:Pentester Academy:asdss').hexdigest()
>>> hash1
'a524e9245a8bf88560d2bb74a02a8779'

Получили hash1

Давайте получим hash2:

hash2=hashlib.md5('GET:/lab/webapp/digest/1').hexdigest()
>>> hash2
'51b79aa2c26cf4bb3cc8d74c90dc8c22'

И теперь давайте получим responce:

Как видим наши responce совпадают) Я Вас поздравляю - теперь вы знаете как работает алгоритм хеширования дайджест аутентификации.


Что касается атаки - атакуется она так же как и Basic HTTP Auth. Единственное отличие - это то что мы не сможем перехватить логин пароль в чистом виде при МИТМ атаках.


Для примера атаки возьмем как и в прошлой статье брут с помощью утилиты Hydra:

Видео к статье

Вот код скрипта который использовал ввидео для демонстрации алгоритма:[hidepl="3,1"]

#!/usr/bin/env python
import hashlib
realm=raw_input("Enter the realm: ")
login=raw_input("Enter the login: ")
password=raw_input("Enter the password: ")
hash1=hashlib.md5("%s:%s:%s" %(login,realm,password)).hexdigest()
method=raw_input("Enter the method: ")
URI=raw_input("Enter the URI: ")
hash2=hashlib.md5("%s:%s" %(method,URI)).hexdigest()
nonce=raw_input("Enter the Nonce: ")
responce=hashlib.md5("%s:%s:%s" %(hash1,nonce,hash2)).hexdigest()
print responce

Источник