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

<~DarkNode~>

~^M1st3r_Bert0ni^~
Gold Team
19.10.2016
736
2 676
#1
1.PNG

Привет колеги.
Добро пожаловать на курс Web Application Pentesting.
В этой статье мы с вами поговорим о:
И так напомню вам что в прошлой статье мы познакомились с вами с HTTP Basic Аутентификацией и способами атаки на ее.
Сегодня же речь пойдет о еще одном виде HTTP Аутентификации - Дайджест Аутентификация.
Wikipedia сказал(а):
Дайджест-аутентификация доступа — один из общепринятых методов, используемых веб-сервером для обработки учетных данных пользователя веб-браузера. Этот метод использует шифрование для отправки пароля через сеть, что является более защищённым способом, чем обычная проверка подлинности доступа, при которой данные посылаются открытым текстом.
2.PNG

Вы спросите "Зачем же нужна такая аутентификация когда у нас есть уже Базовая Аутентификая?"
Ответ совсем очевиден:
Дело в том , что Базовая Аутентификация отсылает на сервер логин и пароль в открытом виде.(Да они посылаются в base64 кодировке,но кодировка - это не шифрования!!!) А в силу того , что время не стоит на месте и с развитием WiFi технологий , да и в прочем и в Ethernet сетях , довольно часто развиваются все новые векторы MITM атак и логин и пароль с легкостью можно похитить посредством таких атак.(Речь сейчас идет конкретно про протокол HTTP не про HTTPS)
Так же алгоритм Дайджест Аутентификации описан в
Для просмотра контента необходимо: Войти или зарегистрироваться
. Еще не знаешь что такое RFC ? )) Ну друг мой - тебе рано или поздно придется с ним знакомится, если ты выбрал путь пентестера ;)
Простыми словами RFC (Request For Comments)- все стандарты Глобальной сети существующие в виде опубликованных заявок RFC)
И так давайте глянем на запрос ответ сервера на HTTP Дайджест аутентификацию:
4.PNG
Обращаем на заголовок запроса:
Authorization и его значения:
Digest - Указывает на то что используется Дайджест Аутентификация
Username - имя пользователя запрашиваемое веб сервером
realm - слово-фраза установленная администратором сервера
nonce - рандомный(случайный) набор символов в хекс виде.
uri - путь к приложению
responce - захешированая по алгоритму строка необходимая для проверки на стороне сервера
opaque - то же что и realm , но в нашем случае она пустая(так же задается в настройках веб сервера).

И как результат получаем все тот же 401 (как и при обычной базовой аутентификации) в случае не прохождении проверки на стороне сервера.
Давайте посмотрим на алгоритм хеширования данных при дайджест аутентификации:
1.PNG
Как видим строка responce (которую мы видели в запросе на веб сервере) получается путем хеширования по MD5 шифрованию (Hash1 строки Nonce(так же передаваемая в запросе) и Hash2)
А Hash1 получаем путем хеширования (логина : строки realm(которая так же передается в запросе) : пароля) и Hash2 получаем в результате хеширования (передаваемого метода (GET|POST : URI(также передаваемого в запросе)

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

Теперь давайте попробуем шаг за шагом выполнить этот алгоритм хеширования
~~DarkNode~~ сказал(а):
(От себя скажу , что это очень немаловажный момент - понимания алгоритма хеширования , так как мы не раз будем сталкиваться с написанием собственных брутилок по определенных алгоритмах)
Для этого нам всего лишь понадобится использовать MD5 шифрования.
Сделать это можно во многих ЯП (Языках Программирования) , но я все же отдаю предпочтения Python:
Запустим для наглядности интерактивный режим Python:
Первым делам импортируем библиотеку hashlib
И создадим переменную hash1 в которую положим необходимое хешированое значение трех составляющих (login:realm:password):
7.PNG

Код:
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:
8.PNG
Код:
hash2=hashlib.md5('GET:/lab/webapp/digest/1').hexdigest()
>>> hash2
'51b79aa2c26cf4bb3cc8d74c90dc8c22'
И теперь давайте получим responce:
9.PNG
Как видим наши responce совпадают) Я Вас поздравляю - теперь вы знаете как работает алгоритм хеширования дайджест аутентификации.

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

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

Видео к статье:
Вот код скрипта который использовал ввидео для демонстрации алгоритма:[hidepl="3,1"]
Python:
#!/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
[/hidepl]

Презенташка со слайдами будет в загруженных файлах
В следующей статье мы поговорим о Cookie
Всем спасибо)
Продолжение следует)
 

Вложения

sdfsd

Active member
26.12.2016
30
7
#2
hi!
не получаетсо
Код:
>>> responce=hashlib.md5("%s:%s:%s" %(hash1,nonce,hash2)).hexdigest()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Unicode-objects must be encoded before hashing
с hash1 сделал так:
Код:
>>> hash1=hashlib.md5('admin:Pentester Academy:asdss'.encode('utf-8')).hexdigest()
с hash2 также а вот responce не могу сформировать команду
И скрипт не хочет воркать
Код:
bash-4.2# python http_digest_ayth.py
  File "http_digest_ayth.py", line 13
    print  responce
                  ^
SyntaxError: Missing parentheses in call to 'print'