登陆 注册

D-Link路由器HNAP协议系列漏洞披露

yjc123 2019-06-19 D-Link路由器HNAP协议漏洞披露

摘要

       当前在“万物互联”的背景下,IoT设备应用日益流行,也频繁爆出高危安全漏洞。从致瘫北美大半个网络DNS服务的Mirai僵尸网络[1]到动辄导致数十万摄像头暴露的安全漏洞[2][3],可见以Wi-Fi路由器、摄像头、智能家居为代表的IoT设备已经俨然成为DDOS攻击、隐私泄漏的重要源头,对互联网安全构成严重威胁。近期,“奇安信技术研究院”团队在IoT安全方面开展了持续研究,选取主流IoT品牌D-Link的多款在用路由器进行漏洞挖掘,开发了自动化测试工具集,在短时间内,高效地发掘了14个高危漏洞,可造成越权访问、DNS劫持、远程命令执行等严重危害。在此基础上,研究人员结合DNS Rebinding技术,实现了穿透攻击处于内网的路由器,更进一步对此类漏洞在常见应用场景下的攻击效果进行评估,结果显示此类安全威胁广泛存在,目前所有漏洞均得到CVE确认,并在第一时间通知相关厂商。


背景

       HNAP协议(Home Network Administration Protocol)是思科公司提出的基于SOAP实现的网络管理协议,用户通过访问该协议的接口可以远程识别、配置、管理网络设备,普遍应用于智能家居、SOHO办公等中小型网络中[4]。HNAP协议在路由器上应用广泛,同时也带来了不少安全问题,早在2014年就爆发了针对Linksys路由器上HNAP协议攻击的“The Moon”蠕虫,影响数十个型号[5];D-Link设备也广泛使用了HNAP协议,历史上也曾爆过认证绕过、远程命令执行等高危安全问题[6][7]。近期,奇安信技术研究院的研究人员选取市场上常见的DIR-823G、DIR-878等D-Link路由器作为分析对象,发现多个新的安全问题。所研究设备对应的固件为最新版本(FW1.02B03、FW1.12B01),其官网的产品和固件最新信息如下所示:

(更新于2019-06-05)

漏洞挖掘与安全披露

挖掘过程:研究人员首先通过逆向分析和动态调试澄清路由器对HNAP协议的实现架构和处理流程,其中DIR-823G在goahead完整实现了全部功能,DIR-878在lighttpd中通过调用librcm.so、rc模块实现。下图所示为DIR-823G处理HNAP的入口函数sub_42383C及功能函数表off_58C560:


LOAD:0058C560off_58C560:.word aSetmultipleact    # DATA XREF: sub_42383C+150↑o

LOAD:0058C560                                                         #"SetMultipleActions"

LOAD:0058C564                 .word sub_433768

LOAD:0058C568                 .word aGetdevicesetti_4    #"GetDeviceSettings"

LOAD:0058C56C                 .word sub_432D28

LOAD:0058C570                 .word aGetoperationmo    #"GetOperationMode"

LOAD:0058C574                 .word sub_433F70

LOAD:0058C578                 .word aGetsmartconnec_4 #"GetSmartconnectSettings"

LOAD:0058C57C                 .word sub_464DD4

LOAD:0058C580                 .word aGetuplinkinter        #"GetUplinkInterface"

LOAD:0058C584                 .word sub_433F48

LOAD:0058C588                 .word aLogin_4                  #"Login"

LOAD:0058C58C                 .word sub_42ACB0

----------------SNIP--------------------------------------------------------

LOAD:0058C880                 .word aGetaccessctlli_1      #"GetAccessCtlList"

LOAD:0058C884                 .word sub_46F988

总共包含101个HNAP接口的API函数

在此基础上,综合使用二进制静态分析和动态Fuzzing技术,发现了DIR-823G、DIR-878存在多个命令注入、越权访问、缓存区溢出漏洞,目前总计申请获得了14个CVE编号。其中DIR-823G没有开启对HNAP API的访问认证,导致大量敏感API暴露,越权问题普遍存在,更严重的是数个API函数使用中存在命令注入,导致攻击者只需内网用户权限即可攻击网关路由器,获取路由器的root shell,攻击门槛低,结合钓鱼式植入攻击即可实现大范围传播的蠕虫病毒;DIR-878虽然开启了HNAP API访问认证,但是API函数普遍存在命令注入问题,进一步的Fuzzing过程中还发现了多处缓存区溢出、拒绝服务等安全问题。

安全披露流程:研究人员在发现漏洞的第一时间通过厂商官网、安全服务邮箱报告了相关漏洞情况,并积极沟通修复方法。目前DIR-823G的漏洞披露已经收到厂商的明确回复,具体的更新固件尚未发布。基于此,出于安全考虑,研究人员在披露过程中并未公布完整利用代码,技术讨论与申报CVE的截图中也均掩盖高危漏洞利用时的敏感路径和参数信息,希望厂商及时修复并更新发布固件。


结合DNS Rebinding的漏洞危害效果评估(附视频链接)

由于路由器通常应用在局域网中,在以往的攻防对抗中,其安全漏洞的攻击面很难直接暴露在公网上,因此,攻击者越来越多的通过钓鱼植入等方式诱导内网用户下载执行攻击代码,从而从内部控制路由器,反向连接到公网上的攻击者服务器,实现穿透攻击。其中DNS Rebinding技术即可以很好的达到这种打入局域网内部的攻击效果,近年越来越受到攻击者的青睐,接下来我们结合这项技术展示上述路由器漏洞可能带来的安全危害。


第一步,选取上述漏洞中的DIR-823G漏洞(CVE-2019-7297),结合DNS Rebinding技术演示漏洞利用过程:

       该命令注入漏洞的攻击门槛低,只需要利用代码在WLAN中运行即可。攻击者可通过发送内嵌恶意代码的网页URL链接给WLAN网内用户,网页中恶意代码将多次请求攻击者的远程DNS服务器解析主机名,触发DNS Rebinding,重定向攻击控制网关路由器。由此实现,只需要一个URL链接即可拿下路由器的攻击效果,具体过程如下图所示:

Step1:攻击者发送恶意URL链接 http://dnsrebind.smilehacker.net/dns_hijacking.html;

Step2:受害者点击链接,受害者浏览恶意网页,网页JS代码攻击篡改路由器上的DNS服务配置;

Step3:内网其他主机用户访问重要网站(例如login.taobao.com)被劫持。


测试环境下攻击视频演示:

https://research.qianxin.com/wp-content/uploads/2019/06/dns_rebind.mp4


攻击原理解析:

1、攻击者发送恶意URL链接 http://dnsrebind.smilehacker.net/dns_hijacking.html;

2、受害者点击该链接,此时DNS server 将主机名解析为攻击者的web服务器IP;

3、网页中视频播放一分钟左右,JS脚本会POST请求http://dnsrebind.smilehacker.net/HNAP1/;

4、此时DNS server将响应客户端的第二次对dnsrebind.smilehacker.net的解析请求,返回地址为路由器网关IP192.168.0.1, 漏洞攻击数据包将送达到路由器, 攻击成功,且不会触发浏览器跨域限制;

5、视频中的攻击载荷修改了路由器的DNS服务配置,将淘宝登陆域名login.taobao.com指向了攻击者的仿冒网站,达到了DNS劫持的目的。

(DIR-878的命令注入漏洞类似,但是需要破解路由器web管理员的登陆密码,利用难度更高)


第二步,危害影响效果评估:

上述攻击中,两次DNS请求的间隔时间取决于浏览器中DNS记录缓存刷新时间,只要在这个攻击潜伏的窗口期内,用户没有关闭浏览器,即可攻击成功!为了尽可能缩小这个时间窗口期,在攻击者控制的DNS server中设置DNS记录的生命周期 TTL值为0,并挑选常见的个人用户主机浏览器配置结合下载执行的攻击负载,进行攻击窗口期测试,结果如下(系统、浏览器均为默认配置):

       首先,以Windows 10 + Chrome举例说明,如下攻击者web服务器Apache日志记录显示:



受害用户的IP地址222.76.49.153第一次访问了仿冒网站的钓鱼网页exec_wget.html(内嵌有执行下载木马命令的攻击负载),日志显示,间隔102秒之后内网中的攻击生效,路由器执行wget命令,访问并下载了恶意后门backdoor。由此可见,虽然DNS服务器中解析记录的TTL设置为0,但是由于浏览器、操作系统、本地路由器DNS Server等存在不同程度的DNS记录缓存,所以导致攻击不能立即生效,需要一个时间窗口。

        接下来,研究人员挑选常见操作系统、浏览器、路由器DNS设置等组合的应用场景,对攻击生效的时间窗口进行多次测试,结果如下:

操作系统浏览器

路由

器DNS Server

TTL 攻击所需的时间窗口
Windows 10Chrome8.8.8.801~2min
Windows 10Firefox8.8.8.801~2min
Windows 10IE8.8.8.80缓存不刷新,无法攻击成功
CentOSFirefox8.8.8.801 min
Mac OSChrome8.8.8.801~2 min
Mac OSSafari8.8.8.801~2 min


上述结果中,在不同的浏览器和操作系统配置下,攻击所需要的时间窗口大小不同,多数情况下只要一分钟左右,可见此类漏洞结合DNS Rebinding的钓鱼攻击方式存在较高的成功概率。

上述MACOS + Safari应用环境下的测试日志:

视频演示:


https://research.qianxin.com/wp-content/uploads/2019/06/rebinding_Mac.mp4


漏洞详情

      研究人员共发现DIR-823G上6个安全漏洞,其中包含4个越权访问类型、2个命令注入类型漏洞,内网攻击者或者被钓鱼的正常用户,可直接越权修改DNS配置、开启Guest Wi-Fi网络、嗅探连接Wi-Fi的用户设备信息、重置路由器,直至远程执行任意代码;在DIR-878上共发现了8个命令注入漏洞,具备登陆权限下可以远程执行命令。具体漏洞详情如下:


越权访问类型漏洞(CVE-2019-7388~7390,CVE-2019-8392)

      

此类漏洞存在于DIR-823G中,在实际测试访问上述HNAP API接口函数时,我们发现接入WLAN的用户无需认证可以远程调用上述API接口函数,所以,攻击者通过调用其中的一些敏感函数如GetClientInfo、SetWanSettings、SetFactoryDefault、SetWLanRadioSettings,能够达到信息窃取、DNS劫持、重置出厂设置、开启Guest Wi-Fi等越权访问类漏洞攻击,详细漏洞原理参见https://github.com/leonW7/D-Link,如下以其中典型的CVE-2019-7390举例说明:

CVE-2019-7390:越权修改DNS配置,实现DNS劫持

通过调用HNAP接口的SetWanSettings函数,可以直接修改DNS设置,如下图所示,攻击前的DNS设置:


图中可见其中的静态DNS设置并没有开启。未授权的攻击者远程访问SetWanSettings函数修改该配置,发送HNAP请求,具体数据报文格式如下:

POST请求头:

图中可见其中的静态DNS设置并没有开启。未授权的攻击者远程访问SetWanSettings函数修改该配置,发送HNAP请求,具体数据报文格式如下:

POST请求头:

Body以及返回结果:


返回结果显示设置成功,路由器对应的功能界面显示攻击请求后的DNS服务器已被修改为192.168.3.1:


命令注入类型漏洞(CVE-2019-7297~7298、CVE-2019-8312~8319)   


此类漏洞在两款路由器中均存在,多处HNAP功能函数在调用系统shell执行相关命令时,没有严格过滤外部输入参数,导致命令注入漏洞,漏洞详细信息可参见https://github.com/leonW7/D-Link、https://github.com/lieanu/vuls/tree/master/dlink/DIR-878,现以CVE-2019-7297举例说明:

漏洞原理:该漏洞位于DIR-823G的/bin/goahead,GetNetworkTomographyResult函数对应的处理流程sub_442260,该函数的具体代码如下:


在调用system之前,Ping操作shell命令经过了多次字符串格式化处理和拼接,相关伪代码摘取出来如下所示:

int32_t str = &v5;

memset(str, 0, 256);

 

snprintf(str, 6, (int32_t)"ping ");

strncat(str, str2, strlen(str2));

 

strcat(str, (int32_t)"-c");

int32_t str4 = &v3;

sprintf(str4, (int32_t)"%d -w %d", v6);

strncat(str, str4, strlen(str4));

 

strcat(str, (int32_t)"-s");

int32_t str5 = &v4; // 0x442598

sprintf(str5, (int32_t)"%d", v7);

strncat(str, str5, strlen(str5));

strcat(str, (int32_t)"> /tmp/ping.txt  2>>/tmp/ping.txt");

puts(str);

system(str);

可以得到该str变量在给system函数执行之前的pattern如下:

ping str2 -c %d -w %d -s %d  > /tmp/ping.txt 2>>/tmp/ping.txt

其中的str2来自域名字段,其他的占位符由具体的变量值代替。


利用方法:需要先调用HNAP接口SetNetworkTomographySettings设置对应的域名字段,然后调用GetNetworkTomographyResult触发漏洞:

第一步:

通过发送POST请求,调用HNAP协议的SOAP接口SetNetworkTomographySettings;

通过在Headers中包含对应的SOAPAction字段指明对应的方法名称:

  Body如下:其中将分隔符和ps命令直接写入到address字段,即<Address>;ps</Address>

第二步:

通过发送POST请求来远程调用API接口GetNetworkTomographyResult,请求和返回如下,得到ps命令执行的回显,验证该漏洞利用成功:

漏洞列表

研究人员选取高危的命令注入漏洞和部分带来严重后果的越权漏洞上报了CVE组织,并获得了相应的CVE ID号,详细列表如下:

产品型号

CVE ID

漏洞危害

威胁等级CVSS

CVE-Reference

 

DIR-823G

CVE-2019-7297

远程命令注入

HIGH

https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-7297

CVE-2019-7298

远程命令注入

HIGH

https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-7298


CVE-2019-7388

远程信息泄露

HIGH

https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-7388


CVE-2019-7389

远程拒绝服务

HIGH

https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-7389


CVE-2019-7390

局域网DNS劫持

HIGH

https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-7390


CVE-2019-8392

   越权开启Guest Wi-Fi

HIGH

https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-8392


 

DIR-878

CVE-2019-8312

远程命令注入

HIGH

https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-8312

CVE-2019-8313

远程命令注入

HIGH

https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-8313


CVE-2019-8314

远程命令注入

HIGH

https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-8314


CVE-2019-8315

远程命令注入

HIGH

https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-8315


CVE-2019-8316

远程命令注入

HIGH

https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-8316


CVE-2019-8317

远程命令注入

HIGH

https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-8317


CVE-2019-8318

远程命令注入

HIGH

https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-8318


CVE-2019-8319

远程命令注入

HIGH

https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-8319



修补建议    

针对上述安全漏洞的修补建议主要分为两个方面:

        第一,开启HNAP接口的登陆认证,尤其需要保护针对敏感功能函数的远程使用;

        第二,HNAP协议在管理设备时,需要经常调用系统shell执行命令,在使用外部输入作为命令输入参数时,可以通过黑名单的方式过滤掉参数中存在的当前设备支持的shell命令。

结论

HNAP作为一种运行于HTTP上的网络设备管理协议,广泛应用于各类中小型网络设备中,然而该协议却屡次暴露出严重的安全问题,其根本原因还是在于厂商实现协议时没有遵循基本的软件安全开发与设计规范。尤其近年在物联网的迅速兴起下,网络设备的低成本、功能快速迭代需求导致厂商往往更加无暇顾及安全问题,在我方披露的上述安全漏洞中可以看出,该协议在主流路由器厂商的实现中仍然存在大量高危安全漏洞,其中部分高危漏洞利用条件非常低,结合DNS Rebinding等利用方法,极容易被用于大范围钓鱼攻击,控制大量终端形成僵尸网络,大范围影响互联网安全。此次安全问题的披露希望引起相关厂商对类似问题的重视,我方研究人员也在其他厂商上发现了类似安全问题,后续将继续跟踪研究,予以及时披露和预警。


关于我们

        奇安信技术研究院(Qi An Xin GroupTechnology Research Institute)是奇安信集团旗下专注于网络空间安全相关技术的研究机构,在“产、学、研”融合的背景下,结合奇安信集团和清华大学、中科院等高校院所在产业服务和学术研究中的各自优势,面向世界学术和技术前沿开展创新性和实践性的技术研究,服务于国家和社会对网络空间安全的战略需求。研究团队在网络协议安全、漏洞挖掘、恶意代码分析等领域有丰富的经验,团队成员在国际四大顶级安全会议中发表多篇论文,并多次在GeekPwn、天府杯、强网杯、中国网络安全技术对抗赛等黑客大赛上获奖,在世界学术和工业界都具有广泛的影响力。


参考文献


【1】Mirai (malware) From Wikipedia, the free encyclopedia[EB/OL].[2019-05-26].

https://en.wikipedia.org/wiki/Mirai_(malware)

【2】国内某P2P软件存在关键漏洞,200万物联网设备易受远程入侵[EB/OL].[2019-04-28].

https://www.easyaq.com/news/2147306972.shtml

【3】20 万中国产 WiFi 摄像头曝漏洞,后门大开任由黑客进入[EB/OL].[2017-03-10]. 

https://www.leiphone.com/news/201703/CNmKdhZ1Frg33Ryu.html

【4】Home Network Administration Protocol[EB/OL].[2017-06-14].

https://en.wikipedia.org/wiki/Home_Network_Administration_Protocol

【5】Bizarre attack infects Linksys routers with self-replicating malware[EB/OL].[2014-02-14].

https://arstechnica.com/information-technology/2014/02/bizarre-attack-infects-linksys-routers-with-self-replicating-malware/

【6】Dlink DIR路由器HNAP登录函数的多个漏洞[EB/OL].[2016-11-15]. 

https://www.anquanke.com/post/id/84912

【7】Hacking the D-Link DIR-890L[EB/OL].[2015-08-10]. 

http://www.devttys0.com/2015/04/hacking-the-d-link-dir-890l/

文由微信公众号奇安信威胁情报中心

生成海报
请发表您的评论
请关注微信公众号
微信二维码
不容错过
Powered By SangYun.Net