Хакер - Like a pro. Используем OSINT и цепочки атак в OWASP Juice Shop
hacker_frei
Евгений Грязнов
Содержание статьи
- Увлекательный OSINT
- Visual Geo Stalking
- Meta Geo Stalking
- Login MC SafeSearch
- Цепочки атак
- Скачиваем недоступные файлы
- Пасхалка от разработчиков
- Скачиваем всю базу данных
- Подделываем токены JWT
- Погружаемся в дебри кода
- Подделка кода купона
- Выводы
Сегодня мы будем искать ключ к паролям на фото, вытаскивать скрытые метаданные, внедрять SQL-инъекции и изучать многоходовые атаки. Продолжим разбираться с задачками OWASP и полностью взломаем интернет‑магазин Juice Shop, специально созданный для тестирования уязвимостей и оттачивания хакерского мастерства.
В моей прошлой статье на ту же тему я познакомил тебя с очень уязвимым интернет‑магазином Juice Shop. Мы получили в нем права админа разными способами и добыли себе бесплатный Deluxe. Пришло время как следует погрузиться внутрь этого дырявого приложения и показать, кто здесь на самом деле эксперт! В этой статье я использую версию Juice Shop 12.8.1. Если твоя версия отличается, самое время пойти и обновить ее.
УВЛЕКАТЕЛЬНЫЙ OSINT
Небольшая разминка перед серьезными задачами, которая поможет прокачать английский и получить при этом удовольствие. Надеюсь, ты уже знаешь, что такое OSINT.
INFO
Подробнее об OSINT ты можешь прочесть в статьях «Боевой OSINT. Разбираем современные методы сетевой разведки» и «OSINT по‑русски. Выбираем мощные и бесплатные сервисы для пробива и конкурентной разведки». Отдельно очень рекомендую тебе доклад с последнего PHDays 2021 «Думать — это прикольно. 20 практических приемов OSINT в цифровом мире».
На доске с твоими успехами в Juice Shop есть специальный тег OSINT. Задачи с этим тегом и будут нас интересовать в этом разделе.
- Visual Geo Stalking.
- Meta Geo Stalking.
- Login MC SafeSearch.
Задачек на OSINT там гораздо больше, но эти позволят тебе отточить базовые навыки и с их использованием уже решить оставшиеся!
Visual Geo Stalking
В этой задаче нам требуется угадать пароль Эммы. Для этого придется воспользоваться механизмом восстановления пароля, для чего нужна почта, а почту Эммы можно найти в разделе «Администрирование». Кстати, в прошлой статье я показал тебе три способа проникнуть туда. Секретный вопрос звучит так:
Company you first work for as an adult
Как видишь, для решения этой задачи нам нужно найти название компании, где раньше работала Эмма. Задача кажется слишком сложной, но вспомни: на сайте же есть раздел Photo Wall c фотографиями сотрудников! На последней фотографии ты найдешь белый дом и удивительно похожий на имя Эмма никнейм. Самое время скачать эту фотографию и применить к ней свои аналитические навыки.
Что можно попробовать сделать с этой фотографией:
- Поискать ее в сервисах вроде Google Images. Может оказаться, что это известное здание и есть список расположенных в нем компаний.
- Проверить метаданные изображения. Часто внутри фотографии можно обнаружить GPS-координаты места и найти список компаний, которые арендуют в нем офисы.
- Внимательно рассмотреть фотографию и поискать на ней подсказки вроде таблички с номером дома.
В случае Эммы первые два варианта не дадут никакого результата, но я очень рекомендую проверить это самостоятельно! Разработчики иногда меняют задания и добавляют новые пасхалки.
Я же предлагаю открыть изображение в хорошем редакторе с возможностью большого увеличения и внимательно изучить его. На одном из окон ты найдешь плакат.

Как видишь, компания явно связана с безопасностью в IT, но ее точного названия мы не знаем, поэтому придется перебрать разные варианты. Предлагаю взять скрипт подбора ответа из предыдущей статьи, тем более что он нам еще пригодится.
import requests
answers = ['IT Security','IT Sec','ITsec','ITSEC', 'itsec']
for answer in answers:
data = {'email':'emma@juice-sh.op','answer':answer,'new':'111111','repeat':'111111'}
r = requests.post('http://localhost:3000/rest/user/reset-password',json=data)
if r.status_code == 200:
print("Password changed! Answer: ", answer)
break
print("That's all... ")
Запускаем и узнаем решение задачи с Эммой!
Meta Geo Stalking
Надеюсь, тебе понравилось искать скрытую информацию. Эта задача будет несколько сложнее предыдущей. Тебе нужно угадать ответ на секретный вопрос Джона:
What’s your favorite place to go hiking?
То есть «Назови твое любимое место для пеших походов». В разделе Photo Wall тебя ждет очень информативное фото с освежающим стаканом сока. Скачай его и попробуй пройтись по списку из задачи с Эммой.
Существует несколько вариантов посмотреть метаданные изображения, я рекомендую Jeffrey’s Image Metadata Viewer. Загрузи туда изображение и внимательно изучи его данные.

Как видишь, тут есть координаты места! Открой их в любимом сервисе, я обычно использую для этого Google Maps.

Теперь нужно попробовать подобрать правильное название места. Внимательно изучи карту, и можешь использовать скрипт для сброса пароля из предыдущей задачи.
import requests
answers = ['Scuttlehole Trailhead','Rockcastle Campground','Dutch Branch','Laurel County']
for answer in answers:
data = {'email':'john@juice-sh.op','answer':answer,'new':'111111','repeat':'111111'}
r = requests.post('http://localhost:3000/rest/user/reset-password',json=data)
if r.status_code == 200:
print("Password changed! Answer: ", answer)
break
print("That's all... ")
К сожалению, все эти варианты не дали результата. We need to go deeper! Попробуем поискать более подробную информацию о Scuttlehole Trailhead.

На этой странице уже достаточно географических названий, которые Джон мог использовать в качестве фразы для сброса пароля. Я оставлю это решение тебе в качестве домашнего задания. Если застрянешь, спрашивай в комментариях, и я дам подсказку!
Login MC SafeSearch
Я надеюсь, ты уже достаточно размялся для этого задания. Здесь у тебя уже нет никаких подсказок. Наверняка ты задался вопросом, а кто вообще такой этот MC SafeSearch? Пришло время пробить его в интернете!
К сожалению, большая часть ссылок будет решением этой задачи, но это же не наш метод! Поэтому я дам тебе прямую ссылку на вот такое отличное видео: Protect Ya Passwordz. Тут пригодится знание английского. В этом задании не нужно использовать механизм восстановления пароля, поскольку MC сам рассказал тебе свой пароль в песне, нужно просто внимательно прослушать ее несколько раз и обратить внимание на его логин и — внезапно — кличку любимой собаки. Чтобы тебе было проще, есть полный текст песни.
Я дам тебе пару подсказок: логин будет mc.safesearch@juice-sh.op, а собаку зовут Mr. Noodles. Однако он опытный пользователь, поэтому сделал некоторую замену в имени собаки, о чем тоже радостно пропел в песне. Тут подсказки заканчиваются, дальше сам!
ЦЕПОЧКИ АТАК
В Juice Shop многие задания требуют решения некоторых предыдущих. Поэтому сейчас мы с тобой попробуем решить задачку с пасхалкой, а заодно научимся обходить защиту файлов от скачивания и подберем себе много интересной информации для дальнейших атак и заданий.
WARNING
Даже не думай использовать подобные техники в реальных интернет‑магазинах! Это уголовно наказуемо, если, конечно, у тебя нет подписанного договора на проведение пентеста. Если очень хочется попрактиковаться и поискать реальные ошибки в приложениях, регистрируйся на специальных платформах — например, на HackerOne или BugCrowd.
Скачиваем недоступные файлы
Я всегда рекомендую не забывать поискать скрытые директории на сайтах. Сделать это можно при помощи утилиты dirb.
dirb http://localhost:3000

Заметил очень интересную директорию ftp? Если ты внимательно посмотришь внутрь robots.txt, то убедишься, что мы просто обязаны ее посетить.

Как видишь, тут очень много интересного! Однако стоит начать скачивать файлы, как ты узнаешь, что разрешено это делать, только если они имеют расширение .md или .pdf. Тем не менее эти файлы очень нужны нам для выполнения следующих заданий. Поэтому придется пойти в Google и найти там множество статей о техниках обхода фильтров по расширению файла. Мне, например, приглянулся список на сайте HackTricks.
Одна из техник называется null byte и заключается в добавлении к имени скачиваемого файла специального «нулевого байта» — %00. Например, можно запросить файл вот так:
http://localhost:3000/ftp/eastere.gg%00.md
Не забывай только, что такой URL содержит запрещенные символы и должен быть специальным способом закодирован перед использованием. Для этого существует огромное количество сервисов, можешь использовать, например, CyberChef (мы о нем как‑то писали).
Скачай теперь все файлы в папке FTP, и давай отправимся искать пасхалку!
Пасхалка от разработчиков
Одно из заданий на четыре звездочки называется Find the hidden easter egg. Для его решения нам понадобится содержимое файла eastere.gg.
Внутри файла ты найдешь шутливое поздравление от разработчиков и интересную строчку:
ci9xcmlmL25lci9mYi9zaGFhbC9ndXJsL3V2cS9uYS9ybmZncmUvcnR0L2p2Z3V2YS9ndXIvcm5mZ3JlL3J0dA==
В ней легко угадывается кодировка Base64, поэтому воспользуйся любым подходящим инструментом (например, тем же CyberChef) и преврати это в осмысленный текст.
Вот как выглядит результат:
/gur/qrif/ner/fb/shaal/gurl/uvq/na/rnfgre/rtt/jvguva/gur/rnfgre/rtt
Как видишь, он не отличается осмысленностью. Можно попробовать добавить его к http://localhost:3000, но в ответ нас ждет пустота. Эта строчка явно требует дальнейшего декодирования.
Для работы с неизвестными шифрами я обычно использую Cipher Identifier на dcode.fr. Передай в него нашу строку и найди шифр.
Это оказался очень известный ROT 13! Можешь декодировать его на том же сайте и насладиться пасхалкой. Кстати, решая это задание, мы заодно прошли два других!
Скачиваем всю базу данных
Как ты помнишь, в прошлой статье мы уже использовали SQL-инъекцию, чтобы получить права администратора. Настало время поискать что‑нибудь интересное в базе данных этого приложения.
Например, решить задание Exfiltrate the entire DB schema definition via SQL Injection. Для этого нам нужно перейти в любой раздел, где возможна инъекция. В Juice Shop это раздел поиска товаров. Здесь я для удобства воспользуюсь sqlmap, но ты можешь попробовать найти и использовать инъекцию вручную, поскольку на доске с заданиями есть пример уязвимого кода.
Однако напрямую задача не решается. Если ты попробуешь выполнить вот такую команду, то успеха не добьешься:
sqlmap -url="http://localhost:3000/search?q=1
Дело в том, что все опасные символы фильтруются на уровне фронтенда, что часто бывает в подобных приложениях. Значит, нужно запустить Burp и найти, какой адрес в действительности вызывается для поиска товаров. Если ты внимательно посмотришь на запросы, то обнаружишь интересный запрос к REST API:
/rest/products/search?q=apple
Давай воспользуемся этими новыми данными и попробуем еще раз.
sqlmap -url="http://localhost:3000/rest/products/search?q=apple
Этот вариант работает! Теперь добавь нужные параметры, и вся база данных в твоих руках.
sqlmap -url="http://localhost:3000/rest/products/search?q=apple" -T Users --dump --threads=10
Вот эта команда позволит получить тебе всю базу данных пользователей и хеши их паролей.

Подделываем токены JWT
В предыдущей статье мы уже сталкивались с JWT — смотри раздел «Открываем админку»).
На доске задач есть два задания, связанных с подделкой JWT:
- Forge an essentially unsigned JWT token that impersonates the (non-existing) user jwtn3d@juice-sh.op
- Forge an almost properly RSA-signed JWT token that impersonates the (non-existing) user rsa_lord@juice-sh.op
Поскольку у нас нет нужных ключей для правильной подписи токена, попробуем подделать неподписанный токен.
Для начала нам нужно получить любой действующий токен пользователя. Войди в магазин от имени любого пользователя, перехвати пакеты обмена и достань оттуда заголовок авторизации Bearer.

Для просмотра и кодирования JWT я использую сайт jwt.io, однако он не позволит сделать нам токен без подписи. Для начала скопируй весь код токена в файл. Токен, как ты уже прочитал, состоит из трех частей Base64, которые нужно декодировать, изменить и закодировать обратно. Проделаем это с первой и второй частью, поскольку третья часть — это ненужная нам подпись.

Теперь изменим в заголовке алгоритм на none и в теле токена почту на jwtn3d@juice-sh.op. Проделай это и закодируй все обратно в Base64, соедини их точкой и обязательно добавь еще одну точку в самом конце! При кодировании не забудь включить опцию URL-safe, поскольку JWT использует именно этот стандарт кодирования. В итоге у меня получился вот такой токен.

Теперь подделай в Burp любой запрос с этим токеном, и можешь радоваться решенной задаче. Помни, токен имеет ограниченный срок жизни, так что не затягивай!
Погружаемся в дебри кода
Среди скачанных тобой файлов есть крайне интересный файл package.json.bak. Если ты не знаешь, что это такое и зачем нужно, то самое время узнать. Если вкратце, этот файл показывает, какие пакеты и компоненты использовались для создания Juice Shop. Очень часто среди этих компонентов можно найти уязвимые и проэксплуатировать это. Давай подробно изучим содержимое этого файла.
На доске заданий есть еще одно интересное задание в разделе криптографии: Inform the shop about an algorithm or library it should definitely not use the way it does. А в файле package.json есть три библиотеки, подходящие под нужное описание: hashids, jsonwebtoken и z85.

Если посмотреть внимательно описание этих пакетов в интернете, то можно определить, что пакет Z85 отвечает за кодирование, а не шифрование. Поэтому можно попробовать сдать его в качестве решения задачи. Кстати, если ты внимательно смотрел на хеши пользователей из предыдущего задания, то они очень похожи на MD5, а этот алгоритм тоже давно небезопасен. Можешь попробовать информировать магазин и об этой уязвимости.
Знание о том, что магазин использует Z85, позволит нам подобраться к следующей очень сложной задаче.
Подделка кода купона
На доске задач есть задача на шесть звездочек, предлагающая нам подделать купон и создать купон со скидкой не менее 80%: Forge a coupon code that gives you a discount of at least 80%.
Как ты помнишь, среди найденных нами файлов в папке ftp был очень интересный файл с резервной копией разных купонов. К сожалению, они безнадежно устарели... Однако если отправить их в анализатор шифров, о котором я писал выше, то он покажет, что все эти коды очень похожи на коды ROT, то есть не являются настоящим шифрованием, а просто используют смещение букв на определенную величину. К сожалению, точный вариант такого преобразования он установить не сможет.
Тут надо вспомнить, что проект реализован на Node.js, а разработчики обычно ленивы и используют одну и ту же библиотеку для разных вещей. Еще помнишь о Z85? У нее есть консольная версия Z85-cli — самое время установить ее и попробовать в деле. Перейди в папку Juice Shop и выполни следующую команду:
npm install -g z85-cli
Теперь можно попробовать декодировать купон:
z85 --decode "q:<IqgC7sn"
Результат — SEP13-10! То есть это купон на сентябрь 2013 года на 10%. Отлично, теперь ты знаешь, как сделать актуальный купон и применить его. Для примера вот мой купон на 99%.

ВЫВОДЫ
Надеюсь, эта статья позволила тебе еще под одним углом взглянуть на безопасность веб‑приложений и освоить новые техники. В Juice Shop осталось много интересных задач, так что ты всегда можешь на них попрактиковаться. Заодно узнаешь, как не допускать таких уязвимостей при разработке своих приложений!
Читайте ещё больше платных статей бесплатно: https://t.me/hacker_frei