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

<~DarkNode~>

~^M1st3r_Bert0ni^~
Gold Team
19.10.2016
714
2 470
#1
1.PNG

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

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

И как результат получаем все тот же 401 (как и при обычной базовой аутентификации) в случае не прохождении проверки на стороне сервера.
Давайте посмотрим на алгоритм хеширования данных при дайджест аутентификации:
1.PNG
Как видим строка responce (которую мы видели в запросе на веб сервере) получается путем хеширования по
Чтобы видеть этот контент необходимо: Войти или зарегистрироваться
(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'