思科RV110W/RV130W/RV215W路由器曝远程代码执行漏洞

发表于:2019-3-07 10:00

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:黑客视界    来源:今日头条

#
漏洞
  上周三(2月27日),思科官方针对一个影响到旗下Cisco RV110W Wireless-N VPN防火墙路由器、Cisco RV130W Wireless-N多功能VPN路由器和Cisco RV215W Wireless-N VPN路由器的远程代码执行漏洞发布了一份安全公告,漏洞编号CVE-2019-1663。
  公告指出,CVE-2019-1663存在于RV110W、RV130W 和RV215W路由器Web 管理接口,是由于受影响路由器没有对登录表单的“pwd ”字段做严格检查导致的。成功利用该漏洞,攻击者可以在受该漏洞影响的路由器上远程执行任意代码,且无需身份验证。
  更确切地说,由于受影响路由器没有对登录表单的 pwd 字段做严格过滤,后台在使用strcpy函数时会引起堆栈溢出,而远程攻击者则可以通过发送恶意HTTP请求到目标路由器,最终以更高权限用户的身份去执行任意代码。
  受影响版本
  Cisco RV110W Wireless-N VPN Firewall < 1.2.2.1
  Cisco RV130W Wireless-N Multifunction VPN Router < 1.0.3.45
  Cisco RV215W Wireless-N VPN Router < 1.3.1.1
  CVE-2019-1663漏洞分析
  从相关资料来看,该漏洞最早是由Pen Test Partners的研究人员在RV130路由器上发现的。需要指出的是,RV130路由器运行的并不是Cisco IOS系统,而是嵌入式Linux系统。与大多数类似的路由器一样,它的主要功能是由一些二进制文件来负责处理的,包括解析用户输入和维持路由器的正常工作。
  大多数的用户输入都来自于Web接口,这也是研究人员发现CVE-2019-1663的地方。存在问题的二进制文件是“httpd”webserver二进制文件,而它原本只是负责处理经过80或443端口的所有数据——首先获取通过HTTP传输的用户输入,然后转换为系统级的配置。
  接下来,让我们来看一下导致CVE-2019-1663产生的原因:
  图1.RV130固件
  如果一个过长的值被传递到login.cgi终端的“pwd”参数,则会引起缓冲区溢出。需要指出的是,这一步是在身份认证之前发生的。下面,就让我们来看一下正常登陆的过程:
  对Web接口的登陆请求会被发送给login.cgi终端,格式如下:
  
  “pwd”参数的值实际上是以32字节长的编码密码形式发送的,该值是在请求发送之前通过浏览器中的JavaScript代码计算的。
  登陆是由“httpd”的0x0002C614处的函数负责处理的,而请求参数则会从POST请求中进行分析,经token化之后放在可执行文件的静态数据库(.bss)中。
  
  图2 .从POST请求中取出后内存中的参数
  然后,合法编码的密码就会从NVRAM设备中取出并放入内存中。然后,“pwd”参数的值就会从.bss中取出来,这里使用了标准C调用strcpy函数将它放入动态分配的内存中。
  
  图3.*record scratch*.
  在正常登陆情况下,每个值都会接受相同的检查。在strcpy函数将值复制到内存中后,strlen函数就会计算每个项目的长度,然后strcmp函数会对这两个值进行对比。如果所有检查都通过的话,就可以成功登陆。
 
  图4.检查长度
  研究人员表示,CVE-2019-1663的产生就来源于被普遍使用的strcpy函数,那么这是为什么呢?
  
  图5.被普遍使用的strcpy函数
  研究人员提醒,C语言编程开发人员和安全人员需要注意:strcpy实际上是一个非常危险的函数。
  在标准的C语言中,strcpy定义如下:
  #include <string.h>
  char *strcpy(char * restrict s1, const char * restrict s2);
  […]
  strcpy函数会复制s2指向的字符串到s1指向的数组中。如果复制在交叉的对象间发生,这种情况是没有预先定义的。也就是说可能会发生一些意料之外的事情。为什么说strcpy有威胁呢?是因为它会复制s2字符串到s1指向的内存。但是该函数不传递长度,也就是说strcpy函数不关心字符串的长度。对strcpy来说,字符串的长度一点也不重要。复制的过程中可能会产生覆写的情况,而攻击者也正是利用这一潜在漏洞发起攻击,可以覆写栈内保存的返回指针,然后重定向进程的执行流。
  无论如何,如果你使用strcpy,下面这种情况就有可能会发生:
  
  图6. Segfault错误
  事实上,如果你将如下请求发送给RV130,情况也是如此:
 
  栈中保存的返回指针会被“ZZZZ”覆写,因此执行流会被重定向到0x5A5A5A5A。
  研究人员建议,开发人员和安全人员应该谨慎使用strcpy函数。在已知目的地址空间大小的情况下,把从src地址开始且含有''结束符的字符串复制到以dest开始的地址空间,则不会引起缓冲区溢出。

      上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号