NETGEAR 79台设备的0天漏洞分析和利用

2020-06-16 21:04:59

NETGEAR R7000经过一天的辛勤研究,放松、放松、轻松地做一些事情,这是一件很有趣的事情。虽然与10-15年前相比,现代软件开发流程极大地提高了商业软件的质量,但消费者网络设备在很大程度上被甩在了后面。因此,当需要一些快速乐趣和良好的信心提升时,我喜欢分析SOHO设备。本博客描述了一个这样的会话,即审核Netkit R7000路由器、分析由此产生的漏洞,以及随后的利用漏洞开发过程。在我们的NotQuite0Day星期五存储库中可以找到这篇博客文章中描述的漏洞的记录和代码。

分析SOHO设备的第一步是获取固件。值得庆幸的是,Netkit的支持网站提供了R7000的所有固件。本博客文章中使用的Netkit R7000版本1.0.9.88固件可从该网站下载。在解压缩固件之后,我们将使用binwalk从固件映像中提取根文件系统:虽然路由器可能有许多值得分析的服务,但Web服务器通常最有可能包含漏洞。在像R7000这样的SOHO设备中,Web服务器必须解析来自网络的用户输入,并运行使用该输入的复杂CGI功能。此外,Web服务器是用C语言编写的,几乎没有经过测试,因此它经常容易受到微不足道的内存损坏错误的攻击。因此,我决定从分析Web服务器httpd开始。由于我们对Web服务器(Mis)如何处理用户输入很感兴趣,因此开始分析Web服务器的逻辑位置是jrecv函数。该函数用于从连接中检索用户输入。因此,通过查看Web服务器中对Recv函数的引用,我们可以看到用户输入从哪里开始。Web服务器具有两个调用RECV的助手函数,一个在HTTP解析器中使用,另一个用于读取从动态DNS请求到oemdns.com的响应。我们将重点介绍前一种用法,如Hex-Rays反编译器中所示:在调用READ_CONTENT函数(crecv_helper函数)之后,解析器会执行一些错误检查,将接收到的内容与之前接收到的任何内容组合在一起,然后在用户输入中查找字符串:name=";mtenFWUpload";和";\r\n\r\n";,然后在用户输入中查找字符串:name=";mtenFWUpload";和";\r\n\r\n";。如果用户输入包含这些字符串,则这些字符串之后的用户输入的其余部分将传递给JabCheckBoardID函数。抓取固件的根文件系统,我们可以看到字符串“mtenFWUpload”是从文件www/upg_upgrade.htm和www/Modem_upgrade.htm中引用的,因此我们可以得出结论,这是路由器升级功能的一部分。

在用户输入之后,我们接下来来看一下AabCheckBoardID函数。此函数如下所示,预期用户输入为R7000的CHK固件文件。它解析用户输入以验证魔术值(字节0-3),获得报头大小(字节4-7)和校验和(字节36-49),然后将报头复制到堆栈缓冲区。此副本通过memcpy函数执行,使用用户输入中指定的大小。因此,堆栈缓冲区溢出是微不足道的。在大多数现代软件中,此漏洞是无法利用的。现代软件通常包含可防止攻击的堆栈cookie。但是,R7000不使用堆栈cookie。事实上,在所有共享公共代码库的Netkit产品中,只有D8500固件版本1.0.3.29和R6300v2固件版本1.0.4.12-1.0.4.20使用堆栈cookie。但是,更高版本的D8500和R6300v2停止使用堆栈Cookie,使得此漏洞再次被利用。与其他现代软件相比,这只是SOHO设备安全性落后的又一个例子。

除了缺少堆栈cookie之外,Web服务器也没有编译为位置无关的可执行文件(PIE),因此不能充分利用ASLR。因此,在.httpd二进制文件中找到一个ROP小工具(如下面显示的那个)很容易,该小工具将使用从溢出堆栈获取的命令调用系统小工具。Grimm的NotQuite0Day星期五资料库中的漏洞利用此小工具以超级用户身份启动telnet守护程序,监听TCP端口8888,不需要密码即可登录。由于该漏洞发生在检查跨站点请求伪造(CSRF)令牌之前,因此也可以通过CSRF攻击来利用此漏洞。如果使用易受攻击的路由器的用户浏览到恶意网站,该网站可能会利用该用户的路由器进行攻击。开发的利用漏洞攻击通过向目标设备提供向目标设备发送包含利用漏洞攻击的AJAX请求的HTML页面来展示此功能。但是,由于CSRF网页无法从目标服务器读取任何响应,因此无法远程对设备进行指纹识别。相反,攻击者必须知道他们正在利用的型号和版本,