补丁也不好使,CVE-2019-1663漏洞利用仍然在继续 - 嘶吼 RoarTalk – 网络安全行业综合服务平台,4hou.com

补丁也不好使,CVE-2019-1663漏洞利用仍然在继续

ang010ela 漏洞 2019-03-05 11:12:59
136136
收藏

导语:目前Cisco已经对CVE-2019-1663(Cisco无线VPN和防火墙路由器web管理接口的高危漏洞)进行了修复,但是修复完就好使吗?

CVE-2019-1663是Cisco无线VPN和防火墙路由器web管理接口的高危漏洞,影响Cisco RV110W Wireless-N VPN防火墙、Cisco RV130W Wireless-N Multifunction VPN路由器和Cisco RV215W Wireless-N VPN路由器。未认证的远程攻击者利用该漏洞可以在受影响的设备上执行任意代码。

根据Cisco的官方声明,该漏洞是由于对web管理接口中用户提供的数据的不适当处理造成的。如果攻击者成功利用该漏洞,就可以发送恶意HTTP请求到目标设备,最终使攻击者以更高权限的用户去执行任意代码。

目前Cisco已经对该漏洞进行了修复,但是修复完就好使吗?

CVE-2019-1663

首先看一下CVE-2019-1663漏洞的起因:

研究人员最早是在RV130路由器上发现该漏洞的,RV130路由器运行的并不是Cisco IOS系统而是嵌入式Linux系统。路由器的主要功能是由一些二进制函数处理的,包括处理用户输入和使路由器正常工作。

大多数的用户输入来自于web接口,受影响的二进制文件是httpd webserver二进制文件。实际上该文件只是处理经过80或443端口的所有数据,它获取通过HTTP传输的用户输入,并转换为系统级的配置。

下面看一下CVE-2019-1663漏洞背后的问题机制:

图1 –RV130固件

如果太长的数据传递到login.cgi终端的pwd参数,就会出现缓冲区溢出。这一步是认证之前发生的,下面看一下正常登陆的过程:

到web接口的登陆请求会发送给login.cgi终端,格式如下:

POST /login.cgi HTTP/1.1
Host: 192.168.1.1
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: https://192.168.1.1/
Content-Type: application/x-www-form-urlencoded
Content-Length: 137
Connection: close
Upgrade-Insecure-Requests: 1
 
submit_button=login&submit_type=&gui_action=&wait_time=0&change_action=&enc=1&user=cisco&pwd=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA&sel_lang=EN

Pwd值实际上是以32字节长的编码密码的形式发送的,该值是在请求发送前通过浏览器中的JS代码计算的。

登陆是由httpd的0x0002C614处的函数处理的。请求参数会从POST请求中进行分析,然后token化之后放在可执行文件的静态数据库(.bss)。

图2 – 从POST请求中取出后内存中的参数

然后,合法编码的密码就会从NVRAM设备中取出,放入内存中。然后,pwd参数的值就会从.bss中取出来,这里使用了标准C调用strcpy将它放入动态分配的内存中。

图3 – *record scratch*.

在正常登陆情况下,每个值都会进行相同的检查。在strcpy将值复制到内存中后,strlen就会计算每个项目的长度,然后strcmp比较两个值。如果所有检查都通过的话,就可以成功登陆。

图4 – 检查长度

那么问题是什么呢?

strcpy

问题就在于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 – A segfault 

在发送下面的请求给RV130时发生的情况就和上面一样:

POST /login.cgi HTTP/1.1
Host: 192.168.22.158
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: https://192.168.22.158/
Connection: close
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Content-Length: 571
 
submit_button=login&submit_type=&gui_action=&default_login=1&wait_time=0&change_action=&enc=1&user=cisco&pwd=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZZZZ&sel_lang=EN

栈中保存的返回指针被“ZZZZ”覆写了,因此执行流会被重定向到0x5A5A5A5A。

研究人员建议使用strlcpy函数,strlcpy是C语言标准库函数,是更加安全版本的strcpy函数,在已知目的地址空间大小的情况下,把从src地址开始且含有'\0'结束符的字符串复制到以dest开始的地址空间,并不会造成缓冲区溢出。

  • 分享至
取消

感谢您的支持,我会继续努力的!

扫码支持

打开微信扫一扫后点击右上角即可分享哟

发表评论

 
本站4hou.com,所使用的字体和图片文字等素材部分来源于原作者或互联网共享平台。如使用任何字体和图片文字有侵犯其版权所有方的,嘶吼将配合联系原作者核实,并做出删除处理。
©2024 北京嘶吼文化传媒有限公司 京ICP备16063439号-1 本站由 提供云计算服务