登录后更精彩...O(∩_∩)O...
您需要 登录 才可以下载或查看,没有账号?立即注册
×
本帖最后由 mind 于 2021-10-20 23:48 编辑
原文地址:http://drops.wooyun.org/papers/5601
0x00 简介
之前的6个月,D-Link都不断使坏,把我整的晕头转向。今天我想找些乐子,登陆他们的网站,结果就看到了惨不忍睹的一幕: D-Link’s $300 DIR-890L router 这个路由器上运行的固件有很多bug,而最变态的地方在于,它居然跟D-link多年来在各种路由器上使用的固件一模一样。点我看小视频 0x01 开始分析
貌似这是个非常标准的linux固件镜像。只要你在过去的几年里分析过任何一个D-Link的固件,没准就会知道以下的目录结构:
和HTTP/UPnP/HNAP有关的所有文件都存放在htdocs目录下。其中cgibin文件最有意思,这是一个ARM ELF格式的二进制文件,将被WEB服务器执行,所有CGI,UPnP和HNAP的功能都通过软连接指向这个程序。
这玩意错综复杂,不过没关系,有了字符串就可以找到每个功能对应的函数了。
程序首先会把argv[0]参数和软连接的名称作比较,来决定要执行什么样的动作。(argv[0]是由软链接的名称来决定的,比如WEB服务器执行htdocs/web/captcha.cgi -> /htdocs/cgibin的话,cgibin获得到的argv[0]就会包含catpcha.cgi,那么程序就可以跳到catpcha的功能函数当中执行)
这样一来, 我们很容易就可以通过符号链接的名称来找到对应的函数功能代码,然后给它重新起个合适的名字: 其他的一些D-Link设备,同样也运行这个固件,他们的HTTP和UPnP接口已经被发现存在漏洞。然而,HNAP接口(存在于cgibin中的hnap_main函数)似乎一直被忽视。 HNAP(家庭网络管理协议)是一个基于SOAP的协议,类似UPnP,它广泛应用于D-Link的"EZ"安装模块,用来对路由器进行初始化配置。然而和UPnP不同的是,除了GetDeviceInfo(基本没用的函数)之外,所有的HNAP功能,都需要HTTP基础认证:
SOAPAction头在HNAP请求中特别重要,因为它指定了HNAP所要进行的操作。(以上这个请求执行的是AddPortMapping这个功能)
由于web服务器将cgibin作为CGI来执行,所以hnap_main函数可以通过环境变量访问到HNAP的请求数据,比如SOAPAction头:
在接近函数末尾的部分,程序使用了sprintf函数动态构造一条shell命令,这条命令将被传入system函数执行:
很明显,hnap_main使用了请求头中的SOAPAction头作为系统命令的一部分!如果SOAPAction头没有被过滤,而且进入的这段函数不需要认证,那么这很有可能是一个命令注入的bug。
上图代码会解析出Action名(类似GetDeviceSettings),它将被带入sprintf函数,构造出被system执行的命令。
以下的C语言代码可以帮助大家进一步了解程序中的逻辑错误:
将reboot命令替换成telnetd,就可以开启路由器的telnet服务,获得一个无需认证的root权限shell:
如果开启了远程管理功能,HNAP请求将向WAN开放,这就使远程利用成为可能。当然,路由器的防火墙将阻断来自WAN的telnet连接。有一个简单的解决办法,就是结束HTTP服务器进程,将telnet服务器的端口设置成和HTTP服务器相同:
wget请求将会被挂起,因为cgibin会等待telnetd返回。下面是用Python写的一个利用程序:
0x02 结语
我已经在v1.00和v1.03版本的固件上进行了测试(v1.03版本的固件为截至目前的最新版本),都存在漏洞。那么其他设备是否也存在同样的漏洞呢?
分析所有设备固件很乏味,所以我将这个漏洞交给Centrifuge团队,这个团队拥有一套自动分析系统。他们发现至少以下这些设备存在漏洞: - DAP-1522 revB
- DAP-1650 revB
- DIR-880L
- DIR-865L
- DIR-860L revA
- DIR-860L revB
- DIR-815 revB
- DIR-300 revB
- DIR-600 revB
- DIR-645
- TEW-751DR
- TEW-733GR
据我所知,HNAP协议在任何设备上都无法被禁用。 更新:
这个漏洞似乎在今年早些时候被Samuel Huntly发现,但是只在DIR-645被报告和修复。这个补丁看起来很傻比,所以我们还是期待后续吧。
|