Содержание статьи
info
Редакция благодарит команду «Хакердом» за помощь в подготовке статьи.
Стандартный современный цикл разработки состоит из множества этапов: планирование, анализ, дизайн, разработка, тестирование, интеграция, поддержка... На каждом этапе разработчики, админы, DevSecOps и другие специалисты используют разные инструменты. От грамотности настроек этих инструментов может зависеть безопасность продукта. Часть из них вполне можно раскрутить до уязвимостей.
Я возьму несколько популярных сервисов, которые используются на разных этапах, и покажу на их примере, как такое случается. Большую часть перечисленного я обнаружил в 2019 году, так что не жди, что проделанное мной можно будет повторить на актуальных версиях перечисленных программ. Большинство уязвимостей уже закрыты, но моя цель в данном случае — продемонстрировать, как нужно думать, чтобы их обнаруживать.
warning
Вся информация предоставлена исключительно в ознакомительных целях. Ни редакция, ни автор не несут ответственности за любой возможный вред, причиненный с использованием информации из данной статьи.
Jira
Jira — это мощный таск‑трекер, разработанный компанией Atlassian. Его можно использовать в качестве баг‑трекера, системы распределения задач между сотрудниками и еще много чего, но сейчас не об этом. Jira используется в миллионах организаций — внушительное поле для атак! Само собой, не все админы задумываются о безопасности, а многие вообще считают, что их организации никому не нужны и никто их атаковать не будет. Это обманчивое ощущение!
Находок у меня много, и начнем мы с самого простого, но не такого уж и безобидного.
Data disclosure
Допустим, ты нашел сервис Jira по адресу jira.
. Тогда обращение по урлу https://
вызовет выпадение стектрейса, как на скриншоте ниже.
Чем оно нам может быть интересно? Как минимум тем, что мы можем посмотреть, какие плагины установлены в Jira. А плагины, как ты знаешь, зачастую куда более уязвимы, чем само приложение. Кстати, в Jira тоже частенько попадаются разной степени серьезности баги, так что из логов можно достать версию и проверить, нет ли удобной RCE.
info
Не менее ценны и сами порты Jira (с 8000-го по 8100-й): через них можно непосредственно управлять установленной системой — перезагружать, останавливать, тыкать админку и так далее. В интернете Jira много где торчит наружу.
Как и любая промышленная система, Jira умеет масштабироваться. Делается это за счет плагинов, которые пишут как официальные разработчики — Atlassian, так и сторонние.
Один из достаточно часто используемых таких компонентов — Agile Board.
Agile — это один из подходов к разработке, а Jira Agile Board позволяет выстраивать дашборды для Agile и работать с ними командой или несколькими командами над разными проектами. Идея простая: есть доска, на ней есть тикеты, мы можем смотреть, когда и кем они выполняются, какие на них сроки, какие спринты и тому подобное.
Звучит не особо интересно, но, когда я начал исследовать Jira в нашей компании, заметил, что все это доступно безо всякой авторизации. То есть плагин официального разработчика живет своей жизнью и ни с кем договариваться не обязан, а в нем содержится чувствительная информация. Мы можем просто пройти по URL вида https://
и посмотреть любую доску любого проекта.
IDOR
Здесь даже нашлась уязвимость типа IDOR — небезопасные ссылки на объекты. Она позволяет зайти вообще в любой проект, посмотреть задачи и прогресс их выполнения, и при этом не важно, приватный это проект или публичный.
Само собой, перебирая параметр в URL, можно получить вообще все доски, которые заведены в Jira.
Blind JQL
Еще один довольно интересный баг — слепой JQL. Эксплуатировать его тоже можно без авторизации и читать любые тикеты.
В ядре Jira, очевидно, есть API. Нас интересуют следующие адреса:
https://
jira. company. hack/ jira/ rest/ api/ 2/ mypermissions https://
jira. company. hack/ jira/ rest/ api/ 2/ issue/ 1 https://
jira. company. hack/ jira/ rest/ api/ 2/ search?jql=status%3Dopen and description="12345"
Как ты заметил, на эндпойнте поиска в параметре jql
передается запрос, но интересно не это, а то, что на существующие и несуществующие запросы выдаются разные ответы. Таким образом можно полностью восстанавливать содержимое тикетов, используя те же способы, что и при слепых SQL-инъекциях.
{"startAt":0, "maxResults":50, "total":0, "issues":[]}
Для успешного поиска стоит подобрать поле id
в тексте запроса. Это целое число, которое обозначает номер тикета в Jira. Теперь мы можем полностью восстанавливать содержимое тикета брутфорсом поля description
.
Одна из проблем с ID заключается в том, что идут они не по порядку. Для подбора ID можно использовать такой вот простой скрипт:
for $i in $(seq 10000 11000); do curl https://jira.company.hack/rest/api/2/issue/$i; done;
На скрине ты видишь, что тикеты 10000 и 10001 существуют, но к ним нет доступа, а 10002 не существует, значит, работать с помощью blind JQL мы можем только на 10000-м и на 10001-м тикете.
В некоторых случаях это может не сработать. У Atlassian есть два режима раздачи доступов: персональный и групповой. Групповой применяется сразу к целой группе разработчиков, а персональный — к одному конкретному. Так вот, атаку нельзя воспроизвести при установленном персональном режиме доступа.
Confluence
Confluence — это пространство для командной работы, особенно удобное при удаленке. Здесь можно совместно накапливать знания.
Главное для нас — то, что здесь примерно та же история, что с Jira: первые две проблемы (stack trace и управляющие порты) одинаковые, а об еще одной я сейчас расскажу.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»