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

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
Всем спасибо)
Продолжение следует)
 

Вложения

  • 3.PNG
    3.PNG
    57,8 КБ · Просмотры: 563
  • 5.PNG
    5.PNG
    34,3 КБ · Просмотры: 452
  • WAP_HTTP-Digest-Auth.pdf
    WAP_HTTP-Digest-Auth.pdf
    472,2 КБ · Просмотры: 181
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'
 
А какая версия python?
Если питон версии 3.x
То попробуйте запустить на версии 2.x
 
  • Нравится
Реакции: sdfsd
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!