На странице
Брутфорс 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 от пароля wiener — peter.
В терминале echo -n 'peter' | md5sum:
51dc30ddc473d43a6011e9ebba6ca770
Совпадает! То есть мы можем построить брутфорс-атаку по словарю. Мы можем кидать запросы на GET /my-account?id=carlos, предварительно сконструировав stay-logged-in куку.
Сперва посмотрим, как ведёт себя этот роут, если мы удалим куку session и оставим только stay-logged-in. Вернулось 200, и установилась кука session.
Ок, а теперь без кук совсем — в этом случае возвращает 302 и редиректит на логин. Закидываем запрос в Intruder, удаляем session куку, ставим переменную в значение куки. Какого вида будет значение?
- Берём MD5 от пароля-кандидата — нам дали 100 штук.
- Формируем строку
carlos:MD5_password. - Кодируем полученную строку в 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
Лаба решена!
Ещё в этой категории
Web Shell Upload через обход блек-листа расширений (PortSwigger Lab)
.php в блек-листе, но .htaccess заливается без вопросов — подсовываем свой конфиг Apache и заставляем сервер исполнять shell.bug как PHP.
Web Shell Upload через обфускацию расширения (PortSwigger Lab)
Блек-лист расширений не пускает .php, двойное расширение shell.php.jpg отдаётся как картинка — null-byte shell.php%00.jpg обходит обе проверки.
Remote Code Execution через загрузку web shell (PortSwigger Lab)
Загрузка аватарки без валидации — заливаем PHP web shell и читаем /home/carlos/secret.