热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

分析BelkinSURF路由器中的多个漏洞

 0x00 前言2019年6月,我们发布了一篇文章,介绍如何在Belkin SURF N300路由器上设置硬件调试环境。在本文中,我们将分析由Josep Pi Rodriguez以及Pedro Gui

 

0x00 前言

2019年6月,我们发布了一篇文章,介绍如何在Belkin SURF N300路由器上设置硬件调试环境。在本文中,我们将分析由Josep Pi Rodriguez以及Pedro Guillén Núñez在该平台上发现的十多个漏洞。虽然Belkin已确认我们的报告,但表示该产品已经停产,不再提供支持服务。这些漏洞会影响Belkin SuperTask! RTOS,特别是其中的UPnP功能。这些漏洞包括多个基于栈的缓冲区溢出问题,涉及AddPortMappingGetSpecificPortMappingEntryDeletePortMapping SOAP接口以及upgrade.exednsproxydhcpd中的缓冲区溢出问题。

研究人员最开始通过分析Belkin N150(Model F9K1001)以及Belkin N300(Model F9K1002)固件发现这些问题,我们也在Belkin N300(Model F7D2301v1)路由器上验证了这些漏洞报告。

 

0x01 UPnP问题

UPnP(Universal Plug and Play,通用即插即用)是为了简化一般用户的网络配置过程而提出的一种协议,方便各组件“正常工作”,该协议允许本地客户端配置路由器。然而,这个过程的前提是假设所有本地客户端都是可信的单元,但恶意软件可以轻松利用该功能,在启用UPnP的路由器上打洞穿透防火墙。因此UPnP通常被认为是不安全协议,包括FBI在内的各单位都建议用户禁用并不再使用该功能。

研究人员发现路由器UPnP功能的WANPPPConnection:1Service中存在多个栈缓冲区溢出漏洞。当路由器处理AddPortMapping SOAP请求时,会调用strcpy()将攻击者可控的NewRemoteHost参数拷贝至大小固定为0x20字节的栈缓冲区中,同时没有去验证参数的大小。

图1. 利用恶意UPnP请求触发漏洞

路由器在处理图1中的请求时,会使用strcpy()将过长的NewRemoteHost参数盲目地拷贝到空间不足的栈缓冲区中。因此,strcpy()会超出栈缓冲区执行越界写操作,使用攻击者控制的数据覆盖函数返回地址。存在漏洞的函数返回时,会尝试返回到被覆盖的返回地址(0x41414141),最终串行终端会记录崩溃信息,路由器会重启。

图2. 串行终端崩溃日志

在下图中,我们可以看到存在漏洞的strcpy()函数调用。在0x80178C90地址处,大小固定的栈缓冲区指针存放在$a0寄存器中。在0x80178C98处,攻击者控制的缓冲区指针存放在$a1寄存器中。即便该指令位于jal strcpy指令之后,由于我们目标采用的是MIPS CPU架构,因此也会在该分支后执行这条延迟指令。

图3. 存在漏洞的strcpy()函数调用

这个UPnP服务处理逻辑中存在13个bug,每个bug都存在相似的原因。实际上,在上图中我们可以看到0x80178CCC处由存在漏洞的另一个strcpy()调用。我们还可以在其他if-else分支块中找到更多的strcpy()调用。在图4中,我们使用红色高亮标出了存在漏洞的每个strcpy()调用:

图4. 高亮标记函数中存在漏洞的strcpy()调用

这里我们没有看到目标设备部署了能够缓解栈缓冲区溢出漏洞的措施,例如ASLR以及Stack Canary。因此这些漏洞利用起来非常直接,攻击者只需要简单使用shellcode地址覆盖程序计数器地址就能执行任意代码。

 

0x02 后门账户

除了栈缓冲区漏洞之外,研究人员还发现固件中内置了后门账户凭据。

图5. 固件中硬编码的后门账户

固件中总共有3个后门账户:engineerwlan_config以及wlan_power。这些账户并不能通过Web接口访问,终端用户也没有办法修改或移除这些账户。当攻击者发送如下请求时,路由器会将攻击者IP标记为“logged in”(已登录)。随后攻击者可以通过已授权的IP地址访问高权限页面。

图6. 使用内置的wlan_config凭据发送授权HTTP请求

一旦绕过授权认证,攻击者就可以利用另一个已授权漏洞,即高权限upgrade.exe CGI脚本中的缓冲区溢出漏洞。这个缓冲区溢出漏洞的根本原因在于路由器会使用strcpy()将攻击者可控的multipart HTTP POST请求头部中的boundary字段值拷贝到一个全局变量中。

图7. 带有过长boundary头部值的恶意HTTP POST请求

图8. 存在漏洞的strcpy()调用周围的反汇编代码

在上图中,攻击者可控的数据存放在$a1中,存在漏洞的全局缓冲区位于0x802965CA地址处。当攻击者发送恶意请求时,串行终端中会记录如下崩溃信息,然后路由器会重启。

图9. 串行终端中的崩溃日志

 

0x03 精心构造的DNS报文

这个缓冲区溢出漏洞会影响路由器的DNS代理功能。路由器在处理精心构造的某个DNS报文时,会使用memcpy()将攻击者控制的数据拷贝到大小为80字节的一个栈缓冲区。由于目的缓冲区大小与传递给memcpy()的大小参数不匹配,因此会出现栈缓冲区溢出问题。

图10. 恶意DNS请求

当如上DNS消息发送给存在漏洞的路由器时,串行终端中就会看到如下异常日志,目标设备也会重启:

图11. 串行终端崩溃日志

这里我们可以看到攻击者控制的地址(0x42424242)会成功覆盖程序计数器,存在漏洞的memcpy()调用如下图所示:

图12. 存在漏洞的memcpy()调用附近的反汇编代码

0x80119D48处,代码会执行两个指针的减法操作,计算传递给memcpy()的字节数参数大小。计算出的结果值会大于目标缓冲区大小,因此memcpy()会盲目地在目标缓冲区末尾处执行拷贝操作,导致缓冲区溢出。

 

0x04 总结

这个路由器固件的多个不同组件中存在大量漏洞,而这些漏洞的根本成因都非常相似,这表明厂商在产品开发过程中缺乏安全的软件研发生命周期实践,这很有可能表明固件中可能存在更多漏洞,实际上这一点我们猜测地非常准确。在这些漏洞的披露过程中,研究人员又提交了关于该产品的其他问题。然而,我们发现厂商已经不再为该产品提供补丁支持,因此我们拒绝了这些漏洞提交报告。即便如此,探索这些漏洞对研究人员来说也是非常有趣的一个过程,可以以此类推研究嵌入式系统中的其他问题。

我们建议终端用户升级存在漏洞的路由器,使用目前仍在厂商支持周期内的设备。


推荐阅读
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 本文介绍了RxJava在Android开发中的广泛应用以及其在事件总线(Event Bus)实现中的使用方法。RxJava是一种基于观察者模式的异步java库,可以提高开发效率、降低维护成本。通过RxJava,开发者可以实现事件的异步处理和链式操作。对于已经具备RxJava基础的开发者来说,本文将详细介绍如何利用RxJava实现事件总线,并提供了使用建议。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 基于事件驱动的并发编程及其消息通信机制的同步与异步、阻塞与非阻塞、IO模型的分类
    本文介绍了基于事件驱动的并发编程中的消息通信机制,包括同步和异步的概念及其区别,阻塞和非阻塞的状态,以及IO模型的分类。同步阻塞IO、同步非阻塞IO、异步阻塞IO和异步非阻塞IO等不同的IO模型被详细解释。这些概念和模型对于理解并发编程中的消息通信和IO操作具有重要意义。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文介绍了一个React Native新手在尝试将数据发布到服务器时遇到的问题,以及他的React Native代码和服务器端代码。他使用fetch方法将数据发送到服务器,但无法在服务器端读取/获取发布的数据。 ... [详细]
author-avatar
谢超4444
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有