HackPluto's Blog

Netgear路由器ZDI-20-712栈溢出漏洞复现

字数统计: 803阅读时长: 2 min
2020/12/13 Share

Netgear R7000路由器ZDI-20-712栈溢出漏洞复现

前言

本文将分析Netgear R7000路由器ZDI-20-712漏洞,分析其产生的漏洞以及随后的漏洞利用开发过程。

固件分析与提取

固件分析

有关netgear固件header详细说明以及校验算法,可以看我的另一篇博客

固件提取

Netgear的官网提供了R7000的所有固件。可以从该网站下载此博客文章中使用的Netgear R7000版本1.0.9.88固件。 解压固件后,我们将使用binwalk从固件映像中提取root文件系统:

尽管路由器可能具有许多值得分析的服务,但Web服务器通常最有可能包含漏洞。在R7000之类的SOHO设备中,Web服务器必须解析来自网络的用户输入,并运行一些复杂的CGI函数,其中要用到这些输入。此外,Web服务器是用C编写的,并且几乎没有经过测试,因此经常容易受到很简单的内存破坏bug的影响。因此,首先分析Web服务器httpd。

1
_R7000-V1.0.9.88_10.2.88.chk.extracted/squashfs-root/usr/sbin/httpd

可以看到这是一个32位的ARM程序

漏洞分析

静态分析

使用IDA分析httpd文件

首先定位到recv()函数

recv()函数有两处引用,分别查看
第一处的引用是read_content()

再查看该函数的引用,可以看到该函数是在一个http解析器中使用

第二处recv()函数的引用是在一个动态DNS解析中

我们将重点分析第一处的引用
在http解析器中接受了用户的输入后,将输入存在recv_buff中,返回了用户输入长度

接下来将用户输入转存到user_input数组中,并且找到字符串
name=”mtenFWUpload”
\r\n\r\n 的起始位置

接着将将这些字符串之后的其余用户输入传递给abCheckBoardID函数
通过查找字符串,可以确定mtenFWUpload与路由器的固件升级功能相关

abCheckBoardID函数内首先是检查上传的文件开头是不是这四个字节,这个正好就是所有netgear固件的前四个字节

接着就是获取一些文件中特定偏移上的内容
,问题就出在在memcpy函数处,size参数由用户输入中的大小指定。因此,进行栈缓冲区溢出很容易

漏洞利用

首先是看这个程序开了什么保护

1
2
3
4
5
6
➜  checksec httpd
Arch: arm-32-little
RELRO: No RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (0x8000)

可以看到只开了NX,所以我们攻击采用的方法是ROP

qemu调试

如果本地没有路由器实体设备可以采用qemu进行调试,调试环境的配置参考我的另一篇博客

首先在Binwalk解包的目录下执行

1
cp $(whereis qemu-arm-static) .

将qemu-arm-static拷贝一份移动到当前目录

接着看运行环境有没有问题,通常的做法是启动一个shell

1
sudo chroot . ./qemu-arm-static ./bin/sh

可以看到没有问题,接下来就是运行需要调试的程序

CATALOG
  1. 1. Netgear R7000路由器ZDI-20-712栈溢出漏洞复现
  2. 2. 前言
  3. 3. 固件分析与提取
    1. 3.1. 固件分析
    2. 3.2. 固件提取
  4. 4. 漏洞分析
    1. 4.1. 静态分析
  5. 5. 漏洞利用
    1. 5.1. qemu调试