На странице
apsyleg1 мин
#portswigger #authentication #web-security

Брутфорс stay-logged-in cookie

Лаборатория

Brute-forcing a stay-logged-in cookie · Practitioner

Решение

Дано

This lab allows users to stay logged in even after they close their browser session. The cookie used to provide this functionality is vulnerable to brute-forcing.

To solve the lab, brute-force Carlos's cookie to gain access to his My account page.

Your credentials: wiener:peter
Victim's username: carlos
Candidate passwords

Анализ задания

На сайте есть механизм «stay logged», кука которого уязвима к брутфорсу. У нас есть аккаунт на сайте, поэтому изучим, как работает механизм, и осуществим брутфорс-атаку для пользователя carlos.

Разведка

Заходим на сайт, есть форма входа. Логин и пароль, есть чекбокс «Stay logged in», ставим его. Логинимся, POST-запрос на вход:

Set-Cookie: stay-logged-in=d2llbmVyOjUxZGMzMGRkYzQ3M2Q0M2E2MDExZTllYmJhNmNhNzcw; Expires=Wed, 01 Jan 3000 01:00:00 UTC
Set-Cookie: session=XaXGwGwLG5aeRpAyJZfClJJuAMavi7ll; Secure; HttpOnly; SameSite=None

Мы видим, что кука stay-logged-in хранится бесконечно долго. А ещё она никак не защищена от доступа из JS. Если выделить значение куки, Inspector по умолчанию показывает декодированную строку в Base64, она выглядит как wiener:51dc30ddc473d43a6011e9ebba6ca770.

Очевидно, что первое — это имя пользователя, а вот второе напоминает хэш пароля. Вопрос только от чего, от пароля или что-то ещё. Можем для начала попробовать просто посчитать MD5 от пароля wienerpeter.

В терминале echo -n 'peter' | md5sum:

51dc30ddc473d43a6011e9ebba6ca770

Совпадает! То есть мы можем построить брутфорс-атаку по словарю. Мы можем кидать запросы на GET /my-account?id=carlos, предварительно сконструировав stay-logged-in куку.

Сперва посмотрим, как ведёт себя этот роут, если мы удалим куку session и оставим только stay-logged-in. Вернулось 200, и установилась кука session.

Ок, а теперь без кук совсем — в этом случае возвращает 302 и редиректит на логин. Закидываем запрос в Intruder, удаляем session куку, ставим переменную в значение куки. Какого вида будет значение?

  1. Берём MD5 от пароля-кандидата — нам дали 100 штук.
  2. Формируем строку carlos:MD5_password.
  3. Кодируем полученную строку в Base64.

Напишем bash-скрипт для генерации списка нагрузок:

while read -r pass; do
  hash=$(echo -n "$pass" | md5sum | awk '{print $1}')
  echo -n "carlos:$hash" | base64
done < passwords.txt > payloads.txt

В passwords.txt закидываем пароли-кандидаты от PortSwigger.

Закидываем нагрузки в Intruder. 200 код пришёл для нагрузки:

Cookie: stay-logged-in=Y2FybG9zOjIxYjcyYzBiN2FkYzVjN2I0YTUwZmZjYjkwZDkyZGQ2

Лаба решена!