• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Находим 0day: Microweber

grozdniyandy

White-Hat
Premium
Регистрация
11.08.2023
Сообщения
522
Реакции
677
Гарант сделки
2

Руки и глаза​

Эта серия статей посвящена поиску нулевых дней в проектах с открытым исходным кодом. Я продолжу писать на эту тему, если не буду пить слишком много кофе и не перестану ходить в кофейню.

Для кого эта статья: Для всех
Кто может извлечь из нее больше пользы: Новички

Remediation - устранение проблемы каким либо образом. Скажем есть уязвимость XSS, самой простой защитой является “Output Encoding”
Impact - влияние которое уязвимость даёт. Типо чем оно нам угрожает, что можно этиим сделать. Влияниe может быть от DDoS-а до RCE.

Содержание​

  • История
  • Что такое ZeroDay?
  • Цель
  • Microweber
  • Microweber отключился: TextPattern
  • Вернемся к Microweber
  • С нуля
  • Итог

История​

Как всегда, я сижу в кофейне и размышляю о возможности дисквалификации со стороны участников, если я продолжу разрабатывать больше инструментов (LOL). Поэтому я решил сделать перерыв на некоторое время. Наслаждаясь песней "Возле дома твоего" – да, я молод, и песня перекликается с моими чувствами к девушке – я подумал, что, возможно, сейчас самое подходящее время чекнуть huntr.dev.

Существует множество способов репортить нулевые дни, и один из самых простых методов, или, возможно, самый легкий, - это через hunt.dev. Посетив их веб-сайт, я обнаружил, что они получили финансирование от "Project AI", а хранилища (repo), которые они в настоящее время поддерживают, в основном ориентированы на машинное обучение и искусственный интеллект. Мда, как сильно я не люблю искусственный интеллект... В любом случае, я пришел к осознанию того, что больше не смогу отправлять заявки оттуда, поэтому я решил отправить их непосредственно в MITRE.

Теперь вопрос в том, что мне следует протестировать? После некоторых размышлений я решил изучить CMS с открытым исходным кодом.

Что такое ZeroDay?​

Нулевой день - ZeroDay - это уязвимость, которая еще не известна поставщику или общественности. Термин "нулевой день" происходит от того факта, что у поставщика было ноль дней для подготовки защиты от этого.

Что такое CVE?
CVE ( Common Vulnerabilities and Exposures / Pаспространенные Уязвимости и Bоздействия) - это система для уникальной идентификации и отслеживания публично раскрытых уязвимостей. Каждой записи CVE присваивается уникальный идентификатор.

Нулевые дни могут иметь CVE, если они будут публично раскрыты через некоторое время, но это не делает каждый CVE нулевым днем.

Итак, что мы делаем?
То, что мы делаем, - это поиск уязвимостей, которые еще не были публично раскрыты. Не имеет значения, знает о них кто-то еще или нет, важно то, что нам нужно их найти.

Цель​

Давайте поищем репозитории, которые никому не известны, и найдем N уязвимостей... Нет, Нееет. Люди делают это, когда ищут RCE, я не планирую искать неизвестные продукты только для того, чтобы загрузить файл или поставить acunetix, дабы получить RCE. Я хочу стремиться к чему-то, что люди действительно используют. Итак, мы должны найти что-нибудь немного известное, возможно, у то у чего есть страница в Википедии.

1.png

Изображение [1]​

Мы проверим microweber и textpattern. Почему именно они? Потому что у них есть демонстрационный веб-сайт, а мне лень запускать docker на моем основном компьютере, и время работы сервера истекло. Они немного известны, у обоих есть страница в Википедии и политика безопасности.

https://en.wikipedia.org/wiki/Textpattern

https://en.wikipedia.org/wiki/Microweber

Мы видим, что Textpattern более известен, чем Microweber. В любом случае, ближе к работе.

Microweber​

Честно говоря, я начал с Microweber, потому что видел отчеты на huntr.dev. К сожалению, я в то время не знал, что создание новых отчетов было уже невозможно. Когда я писал эту статью, я выявил только одну уязвимость, но уверен, что по мере продолжения исследования обнаружу еще больше.

Итак, я открыл микровебер. Вот и все, вход в систему осуществляется через GET запрос. Вы можете спросить меня: "Вы действительно собираетесь тестировать какой-то бесполезный продукт с запросом GET в качестве логина?", "Для чего они используют политику безопасности?".

Ну, на самом деле это проблема перенаправления, а не входа в систему. Это уязвимость, которая, возможно, была упущена из виду.

2.png

Изображение [2]​

Что такое CWE?
CWE - Common Weakness Enumeration / Перечисление Oбщих Уязвимостей (слабостей) - это список распространенных типов уязвимостей программного и аппаратного обеспечения, используемый для описания и идентификации уязвимостей. У CWE тоже есть идентификаторы.

Мы составим простой отчет, используя идентификатор CWE. Все, что вам нужно сделать, это описать то, что вы нашли, и написать после этого "CWE". Я использовал 2 ключевых слова "GET", "CWE"

3.png

Изображение [3]
4.png

Изображение [4]​

Теперь у нас есть ID и описание "CWE-598". Обычно также требуется воздействие (impact) и восстановление (remediation). В таком случае у нас есть 3 варианта. Первый - написать impact/remediation, основываясь на наших собственных знаниях. Во-вторых, проверить MITRE (или погуглить это), иногда влияние и восстановление подробно объясняются. Третье - объяснить уязвимость ChatGPT и пусть сам пишет какой impact/remediation.

Итак, уязвимость проста, утечка данных происходит в GET-запросе. Но нам также нужно выяснить, как это происходит. Глобальной переменной для GET в PHP является $_GET.

Сначала я искал "where_to", потому что это был один из параметров в redirect. Мы видим, что ключом к этому значению в одном из файлов является "admin_content". Это то же самое, что и в нашем запросе. Так что, вероятно, именно в этой части кода выполняется это перенаправление.

5.png

Изображение [5]
6.png

Изображение [6]​

Теперь, возможно, это часть после перенаправления, и вход в систему осуществляется не через запрос GET, поэтому на всякий случай я решил проверить URL перенаправления с неверными учетными данными.

7.png

Изображение [7]​

Все круто.

Microweber отключился: TextPattern​

Внезапно перестал открываться microweber, а у меня осталось немного кофе. Итак, я решил проверить Textpattern. Прежде чем искать уязвимости, мой совет - ознакомтесь с их политикой безопасности, если она у них есть.

У них странная политика: https://textpattern.com/weblog/security-considerations-and-user-privileges-in-textpattern - так что было бы забавно, если бы я нашел XSS, сообщил об этом, и они бы это приняли. Потому что в соответствии с их политикой "1. Содержимое статьи может содержать полезную нагрузку XSS" "Если пользователь нарушает это доверие, администратор может немедленно понизить или отозвать его разрешения, запретив дальнейшую публикацию.". Таким образом, они говорят, что администратор в принципе не должен давать разрешения ненадежным людям на написание контента. Что я думаю по этому поводу? Худшая политика безопасности из когда-либо существовавших, это CMS, а не семейная система управления.

Я открываю их приложение и нацеливаюсь на XSS. Как не быть нубом? Делайте то, чего делать не следует, и, очевидно, извлекайте из этого уроки.

Итак, я вошел в систему и начал везде писать "1111", "2222" и так далее. Я сделал это, чтобы определить, что где отражается. Прямое написание полезных нагрузок - не лучший способ. Например, XSS, найденный "Bablo", не был бы просто идентифицирован путем копирования-вставки полиглота, мы были бы заблокированы. (https://xss.pro/threads/101947/)

8.png

Изображение [8]​

Я понимаю, что если я найду XSS в части блога, они это не засчитают. Это означает, что я должен стремиться к панели администратора. Не первая, но одна из вещей, которую я заметил, - это функция "Preview".

9.png

Изображение [9]
10.png

Изображение [10]​

Бац, 2 XSS. Теперь я должен сообщить об этом так, чтобы они приняли это и не стали со мной спорить. Часть их политики гласит: “Права автора присваиваются администратором сайта, выполняющим свои функции ‘Издателя’ или ‘Главного редактора’. Администраторам рекомендуется не назначать привилегии ‘Штатный автор’ ненадежным авторам”. Насколько я понимаю, существует несколько групп, и они могут использовать функцию "Preview", чтобы завладеть учетной записью администратора, при помощи XSS.

Какой ответ я получил от них?
"Хотя мы явно делегируем администраторам всю проверку контента, здесь трудно спорить. "
https://github.com/textpattern/textpattern/issues/1889

Теперь давайте будем реалистами, учетная запись администратора также может быть передана через XSS в блоге. Но я не хочу спорить с ними об их политике безопасности. Я уверен, что многие люди говорили им об этом.

Вернемся к Microweber​

Я ленив, поэтому просто использовал Docker для запуска Microweber: https://hub.docker.com/r/microweber/microweber

И я искал файлы с некоторыми расширениями, которые могут привести к утечке данных, одно из них - .txt. Могу ли я открыть этот файл без входа в систему? Я могу. Должен ли я? Нет. Из этого файла происходит утечка информации во время установки, и его следует либо удалить, либо ограничить доступ к нему. На скриншоте ниже нет конфиденциальной информации, но во время установки дебаг есть и он там хранит инфу. Я добавлю это в качестве доказательства концепции и размещу ссылки после того, как все это будет закончено. Мне может потребоваться некоторое время, чтобы написать отчет.

11.png

Изображение [11]
12.png

Изображение [12]​

С нуля​

Выше одна из проблем, которые возникают при установке, вероятно, есть и другие проблемы. Итак, я скачал ubuntu server и запустил оттуда последнюю версию microweber.
Код:
docker run -d -p 80:80 microweber/microweber:latest
Какие уязвимости могут быть на странице настройки? Из того, что я вижу, у нас есть входные данные, которые будут отражены, поэтому я бы сказал, что XSS и введенные данные будут сохранены в базе данных, поэтому SQL-инъекция и, возможно, включение файла (File Inclusion) и открытое перенаправление (Open Redirect).

13.png

Изображение [13]​

Я попробовал удачу с открытым перенаправлением, но оно не сработало. Вероятно, оно не уязвимо.

14.png

Изображение [14]​

Итак, я перепробовал множество вещей, начиная с загрузки файлов, например, проверки того, удаляются данные exif или нет, заканчивая полезными загрузками svg xss. Я заметил, что можно загружать фотографии с URL. Я обнюхиваю SSRF. Прежде чем начать, отметим, что само по себе это может быть проблемой, потому что такой опции нет, но в запросе мы можем просто добавить URL, и он будет каждый раз отправлять запрос туда, чтобы получить изображение. Таким образом, мы можем логировать IP-адреса пользователей, если введем URL-адрес, который принадлежит нам.

15.png

Изображение [15]
16.png

Изображение [16]
17.png

Изображение [17]
18.png

Изображение [18]

Чтобы это был SSRF, запрос должен быть отправлен с сервера. В нашем случае пользователь, открывающий изображение, может отправить запрос. Хм, так что я думал, что это может быть низко и даже бесполезно, пока не понял, что мы можем заставить администратора отправить любой запрос, просто просмотрев профиль пользователя. Значит Администратор просматривает профиль пользователя, и запрос на получение “фотки” будет отправлен. URL-адрес, который мы должны использовать, должен заканчиваться расширением типа .jpg - но нам это не нужно. Давайте представим, что можно выполнить какое-то привилегированное действие с запросом GET, например, можно сделать пользователя администратором с 1 запросом GET, в этом случае этот запрос наверняка не будет заканчиваться расширением .jpg. Поэтому я добавил хэштег перед .jpg, чтобы это был комментарий, и я могу добавить любой URL, который захочу, перед этим, и запрос будет отправлен, даже если это не изображение. Это может быть сложно понять, поэтому давайте разберем это на части:
1. Пользователь опубликовал изображение как "https://microweber.local/admin?somepriveleged=action#a.jpg"
2. Администратор просматривает профиль пользователя, и запрос отправляется от администратора "https://microweber.local/admin?somepriveleged=action"
3. Мы заставили администратора отправить запрос без его ведома.

Как вы можете видеть, запрос, отправленный привилегированным пользователем, не содержал файла .jpg, потому что он был прокомментирован.

19.png

Изображение [19]
20.png

Изображение [20]
21.png

Изображение [21]

Хорошая и в то же время плохая сторона пентестинга заключается в том, что речь идет не о найденной вами уязвимости, а о том, что вы можете сделать. Представьте себе 2 уязвимости SQL-инъекции. Одна база данных полна ненужных логов, в которых нет никакой личной информации, другая - профили пользователей. Очевидно, что второй вариант более критичен. Это то, что я пытался сделать выше, получать IP-адреса, круто, заставлять администратора отправлять запросы, не замечая этого - круче.

Выше я сообщал об уязвимости, которая позволяла войти в систему в GET-запросе, это может привести к захвату учетной записи. Теперь у нас последняя версия microweber, и, по словам сотрудников microweber, это должно быть исправлено в этой версии. Я запустил новый docker, чтобы протестировать его.

Раньше мы использовали "user_login", сейчас это не сработало, поэтому я просто использовал "login", и данные добавились сами собой, у меня возник вопрос, есть ли тогда XSS? Что ж, внедрение HTML возможно, как мы внедрили ">, и это каким-то образом влияет на целостность, но мы все знаем, что вероятность использования здесь очень мала.

22.png

Изображение [22]
23.png

Изображение [23]​

Допил кофе. Уже вероятность использования не мала =D Давайте посмотрим, где отражается то, что мы ввели. Итак, это конец входного тега между кавычками "value", мы ввели ">aaa. Поэтому я подумал, что вместо того, чтобы пытаться избежать тега "input", я должен найти полезную нагрузку, которая работает внутри тега input, что то вместо ааа в изображении номером 25.

24.png

Изображение [24]
26.png

Изображение [25]​

Атрибут autofocus используется для указания того, что определенный элемент формы (в нашем случае поле ввода) должен автоматически находиться в фокусе при загрузке страницы.
Атрибут onfocus - определяет сценарий для запуска кода (в нашем случаи
alert), когда элемент получает фокус.

Я решил попробовать старый добрый пэйлоад для таких случаев:
Код:
<input onfocus=javascript:alert(1) autofocus>

27.png

Изображение [26]​

Как вы можете видеть на скриншоте, "javascript" заменяется на "удалено", это означает, что пришло время для N обходов, поэтому мы используем "JavaScript" или jsfuck и т.д., верно? Нет, мы просто удаляем "javascript", я не мазахист.

28.png

Изображение [27]
29.png

Изображение [28]​

Это можно сделать с помощью параметра "password" тоже.

30.png

Изображение [29]​

Ну круто, одна уязвимость высокого уровня есть, это unauthenticated reflected xss.

Невозможно нацелиться на все уязвимости, вы должны позволить им найти вас. Моя любимая уязвимость - нарушенный контроль доступа, поэтому я тестировал каждый запрос, который я вижу для этого, у меня есть 2 пользователя, администратор и обычный пользователь, а также посетители (они же гости). Существует POST-запрос /module, который отправляется, и данные внутри него добавляются внутрь div.

31.png

Изображение [30]​

Как вы можете видеть из запроса, я, пользователь, можем добавить атрибут. Первое, что приходит на ум, - это onblur, onload, on… У них есть фильтр, который удалит это, и, честно говоря, в данный момент я хочу проверить что-то новое. Поэтому я решил проверить внедрение CSS. Есть хорошая шпаргалка от hack tricks - https://book.hacktricks.xyz/пентестинг-веб/xs-поиск/css-внедрение. Мы можем создать фоновое изображение, которое будет загружаться клиентом, и поместить любой URL-адрес, который мы хотим, в качестве фонового изображения. Итак, я запустил interactsh и взял URL. Затем я добавил атрибут "style" и ввел свой css-код.

Что такое Interactsh?
Interactsh - это инструмент с открытым исходным кодом для обнаружения внеполосных взаимодействий. Он перехватывает DNS- и HTTP-запросы, которые отправляются в данный домен (домен задается ими). Это похоже на BurpSuite collaborator (на самом деле это одно и то же).

32.png

Изображение [31]
33.png

Изображение [32]
34.png

Изображение [33]
35.png

Изображение [34]
36.png

Изображение [35]​

Как вы можете видеть на изображениях 35 и 36, запрос был отправлен и ответ получен. Этого достаточно, чтобы обеспечить хорошее доказательство концепции. Кстати, я сделал это как гость (без входа в систему). Кстати, здесь тоже нарушен контроль доступа. Если бы не это, мы бы не смогли ввести css-код в качестве гостя.

Я продолжаю проверять настройки электронной почты в приложении. Я решил еще раз проверить параметры для внедрения. Как вы можете видеть, данные, которые я добавил, находятся внутри "value", поэтому я попытался ввести "><h1>test, но он выдал странный результат, и тег был закодирован.

37.png

Изображение [36]
38.png

Изображение [37]
39.png

Изображение [38]
40.png

Изображение [39]​

Поэтому я подумал, что могу добавить еще один <h1>, чтобы первый снова перешел в <h1="", а второй был добавлен как обычный <h1>. Также обратите внимание, что я не закрыл тег <input, потому что если я это сделаю, все, что находится за его пределами, будет закодировано в html. Итак, я открываю эти теги внутри тега input.

41.png

Изображение [40]
42.png

Изображение [41]
43.png

Изображение [42]​

И одна HTML-инъекция

Ребята, я проверяю последнюю функцию на сегодня. Здесь много функций, а значит, много уязвимостей. Я еще не тестировал их и, возможно, сделаю это через некоторое время, но не сегодня. Поэтому я решил создать категорию, и там был способ выбрать изображение. Мы можем загрузить его, добавить URL, проверить уже загруженные изображения или воспользоваться медиатекой. Медиатека извлекает изображения из unsplash. Я решил проверить загруженные изображения, и есть запрос, который показывает сохраненные изображения. Просматривая сохраненные изображения в качестве гостя и проверяя номера подряд, я наткнулся на номер 46, которое было загружено админом, но нигде не использовалось. Это означает, что гость может просматривать загруженные изображения, которые еще не использовались. Это еще один случай нарушения контроля доступа.

44.png

Изображение [43]

45.png

Изображение [44]
46.png

Изображение [45]

Итог​

Отчет будет загружен в мою учетную запись на GitHub: https://github.com/grozdniyandy. Я не могу назвать точную дату, но это должно быть в течение одного месяца (я надеюсь). Вы сможете просмотреть его в разделе "недавние действия". Я надеюсь, вам понравилась эта статья,она начало серии статей о поиске базовых нулевых дней.

Что касается вопроса о том, почему я не использовал Acunetix/Burp Suite Pro, есть определенные вещи, которые, я сомневаюсь, Acunetix смог бы раскрыть. Например, файл log, который Google индексирует и приводит к утечке информации. Он может служить отпечатком пальца для определения того, используется ли Microweber. Существует также внедрение HTML в самом начале при настройке Microweber или не прошедший проверку подлинности XSS, который мы обнаружили во время входа в систему, хотя я не совсем уверен в последнем. Acunetix лишает нас острых ощущений, и его использование может повлиять на наше мышление, делая нас ленивыми. Что касается Burp Suite Professional edition, то, хотя он потенциально может раскрыть SQL-инъекции и многое другое, меня это не интересует. Это уязвимости, которые может найти каждый, но не все будут нацелены на нарушенный контроль доступа. По этому поводу есть забавный мем.


meme.jpg

Изображение [46]​


IDOR является частью нарушенного контроля доступа.

Кстати, у меня зарезервирован CVE - CVE-2023-48122 . На данный момент я сообщил только об 1 уязвимости в MITRE, потому что я не знаком с самим процессом, так как раньше я использовал только huntr.dev.

Screenshot 2023-11-19 at 16.42.58.png

Изображение [47]​

Автор grozdniyandy

Источник https://xss.pro/​

 
Последнее редактирование:
Познавательная статья. Хотелось бы еще уточнить, как дойти до такого мышления, что бы понимать, где что вставить, в голове визуализировать что оно может +- так сработать как нужно, перебрать еще варианты и т.д. и т.п.? Может есть вариант какой то схемы, по какой идти и искать?
 
Познавательная статья. Хотелось бы еще уточнить, как дойти до такого мышления, что бы понимать, где что вставить, в голове визуализировать что оно может +- так сработать как нужно, перебрать еще варианты и т.д. и т.п.? Может есть вариант какой то схемы, по какой идти и искать?
Со временем понимаешь что где будет рефлектиться. Типо скажем страница входа, данные идут в бд, значит ишешь там скулю. Страница регистрации, твой ник будет где то рефлектиться, ищешь хсс, снова данные идут в бд, чекаешь скулю и тп.

Чеклист одновременно хорошая и плохая вещь. Хорошая, потому что не забывашь что нужно чекать, плохая потому что твоё мышелние остаётся внутри коробки. Я вот слежу за некоторыми багбаунтерами, у них своя техника для одной специфической уязвимости и они везде находят её. А эксперты превращают теретическую уязвимость, в техническую и находят её в больших компаниях. Например cache poisoning.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх