欢迎来到 无奈人生 安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

TP-Link TL-R600VPN远程代码执行漏洞分析

来源: 作者: 时间:2019-02-24 19:29 点击: 我要投稿
广告位API接口通信错误,查看德得广告获取帮助


 
一、简介
TP-Link最近修补了TL-R600VPN路由器中的三个漏洞,固件版本1.3.0。在与TP-Link协商后,思科公开披露这些漏洞,并给出解决方案,本篇文章对这些漏洞的内部工作方式进行深入研究,并给出概念验证的方法。
 
二、背景
TL-R600VPN是一款由TP-Link生产的小型办公室/家庭路由器,该路由器在芯片上集成了Realtek RTL8198系统,该芯片使用了Lexra开发的MIPS-1架构的分支版本,除了一些存储和对齐指令不同,其它指令集基本相同。Lexra中并没有LWL, SWL, LWR和SWR等指令的说明,这些专有指令通常在MIPS-1架构编译程序时使用。在Lexra中使用会产生段错误。
有关Lexra MIPS与MIPS-1两者之间更多的比较信息,请参考文章The Lexra Story和MIPS-1 patent filing。
 
三、漏洞细节
当该设备的HTTP服务器处理对/fs/目录的请求时会触发漏洞,该漏洞允许未经身份验证的攻击者远程执行载荷代码。
当访问/fs/目录中的以下任何页面时,应用程序会错误的解析HTTP标头。
http:///fs/helphttp:///fs/imageshttp:///fs/frameshttp:///fs/dynaformhttp:///fs/localiztion (NOTE: this is not a typo)
在函数”httpGetMimeTypeByFileName”中,Web服务器尝试解析所请求页面的文件扩展名以确定mime类型,在这个过程中,服务器会使用strlen()函数计算所请求页面名称的长度,在堆中查找并匹配该字符串末尾,然后读取文件扩展名,遇到字符”.”(0x2e)结束。

在请求页面上应始终包含扩展名,以防止解析错误。下面是相关例子,在/web/dynaform/css_main.css页面的GDB字符串输出中,可以看到解析后的文件扩展名为’css’。

但是,如果我们请求一个易受攻击的页面,如下所示,我们可以看到解析的URI并不包含字符”.”(0x2e),因此,应用程序会继续向后搜索。这导致可以搜索到一些有效负载。

如下所示,在对/fs/help页面的GDB字符串输出中(0x67a170),并没有解析到文件扩展名。

当遇到字符”.”(0x2e)后,会调用toUpper()函数处理提取到的字符串,然后通过存储指令将该操作的结果写入基于堆栈的缓冲区,如下所示:

程序继续执行,在运行httpGetMimeTypeByFileName函数后,堆栈上会保存返回值和5个寄存器的数值,当该漏洞被利用时,这些值会被覆盖。

在该函数的结尾,会将数据复制到缓冲区并覆盖堆栈上的原始数据,通过弹出堆栈,用户可以控制返回地址,也意味着用户能够在HTTPD进程的上下文中执行远程代码。
toUpper()函数分析
在解析HTTP标头时,设备会迭代每个字节,构建缓冲区。直到匹配到0x2e。随后将调用toUpper()函数,并把缓冲区作为参数。该函数是将缓冲区的每个ASCII字符转换为大写。

在用HTTP标头发送shellcode时会产生问题,因为会调用toUpper()函数,导致阻止使用任何小写字符,如下所示:

我们通过查看httpGetMimeTypeByFileName函数结尾处最后一次跳转前寄存器的值,可观察到标头的字符’a’(0x61)已经转换为大写(0x41)。如下图所示:

通过对寄存器的观察,我们可以在toUpper()函数被调用后,找到一些可预测的数据及位置。
虽然会影响httpGetMimeTypeByFileName函数结尾处的最后一次跳转,但我们可以通过检查堆栈上的数据,找到大写的标题数据(包括有效负载)存储位置。

相比之下,如果我们检查寄存器$s5指向的位置所存储的数据,我们会看到原始数据头仍然可访问。

[1] [2]  下一页


 
一、简介
TP-Link最近修补了TL-R600VPN路由器中的三个漏洞,固件版本1.3.0。在与TP-Link协商后,思科公开披露这些漏洞,并给出解决方案,本篇文章对这些漏洞的内部工作方式进行深入研究,并给出概念验证的方法。
 
二、背景
TL-R600VPN是一款由TP-Link生产的小型办公室/家庭路由器,该路由器在芯片上集成了Realtek RTL8198系统,该芯片使用了Lexra开发的MIPS-1架构的分支版本,除了一些存储和对齐指令不同,其它指令集基本相同。Lexra中并没有LWL, SWL, LWR和SWR等指令的说明,这些专有指令通常在MIPS-1架构编译程序时使用。在Lexra中使用会产生段错误。
有关Lexra MIPS与MIPS-1两者之间更多的比较信息,请参考文章The Lexra Story和MIPS-1 patent filing。
 
三、漏洞细节
当该设备的HTTP服务器处理对/fs/目录的请求时会触发漏洞,该漏洞允许未经身份验证的攻击者远程执行载荷代码。 copyright 无奈人生
当访问/fs/目录中的以下任何页面时,应用程序会错误的解析HTTP标头。
http:///fs/helphttp:///fs/imageshttp:///fs/frameshttp:///fs/dynaformhttp:///fs/localiztion (NOTE: this is not a typo)
在函数”httpGetMimeTypeByFileName”中,Web服务器尝试解析所请求页面的文件扩展名以确定mime类型,在这个过程中,服务器会使用strlen()函数计算所请求页面名称的长度,在堆中查找并匹配该字符串末尾,然后读取文件扩展名,遇到字符”.”(0x2e)结束。

在请求页面上应始终包含扩展名,以防止解析错误。下面是相关例子,在/web/dynaform/css_main.css页面的GDB字符串输出中,可以看到解析后的文件扩展名为’css’。
本文来自无奈人生安全网
但是,如果我们请求一个易受攻击的页面,如下所示,我们可以看到解析的URI并不包含字符”.”(0x2e),因此,应用程序会继续向后搜索。这导致可以搜索到一些有效负载。

如下所示,在对/fs/help页面的GDB字符串输出中(0x67a170),并没有解析到文件扩展名。

当遇到字符”.”(0x2e)后,会调用toUpper()函数处理提取到的字符串,然后通过存储指令将该操作的结果写入基于堆栈的缓冲区,如下所示:

程序继续执行,在运行httpGetMimeTypeByFileName函数后,堆栈上会保存返回值和5个寄存器的数值,当该漏洞被利用时,这些值会被覆盖。

copyright 无奈人生


在该函数的结尾,会将数据复制到缓冲区并覆盖堆栈上的原始数据,通过弹出堆栈,用户可以控制返回地址,也意味着用户能够在HTTPD进程的上下文中执行远程代码。
toUpper()函数分析
在解析HTTP标头时,设备会迭代每个字节,构建缓冲区。直到匹配到0x2e。随后将调用toUpper()函数,并把缓冲区作为参数。该函数是将缓冲区的每个ASCII字符转换为大写。

在用HTTP标头发送shellcode时会产生问题,因为会调用toUpper()函数,导致阻止使用任何小写字符,如下所示:

我们通过查看httpGetMimeTypeByFileName函数结尾处最后一次跳转前寄存器的值,可观察到标头的字符’a’(0x61)已经转换为大写(0x41)。如下图所示: www.wnhack.com

通过对寄存器的观察,我们可以在toUpper()函数被调用后,找到一些可预测的数据及位置。
虽然会影响httpGetMimeTypeByFileName函数结尾处的最后一次跳转,但我们可以通过检查堆栈上的数据,找到大写的标题数据(包括有效负载)存储位置。

相比之下,如果我们检查寄存器$s5指向的位置所存储的数据,我们会看到原始数据头仍然可访问。
www.wnhack.com

[1] [2]  下一页 本文来自无奈人生安全网

。 (责任编辑:admin)
【声明】:无奈人生安全网(http://www.wnhack.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱472701013@qq.com,我们会在最短的时间内进行处理。