0x01 漏洞介绍
在2019年9月,我在D-Link路由器(DAP-1860)上发现了2个漏洞,这些 命令注入导致未经身份验证的远程代码执行和身份验证绕过。存在一些严重漏洞,因为我无需身份验证即可成功进行攻击。如果你的路由器是从D-Link及其DAP-1860购买的,请更新固件或与供应商联系以寻求帮助,因为我发现的漏洞在DAP-1860的最新版本固件中依然存在。
以下是DAP-1860的Web Admin界面:
0x02 CVE 2019-19597(命令注入导致RCE)
当我试图了解如何在DAP-1860的Web Admin上进行身份验证时,当用户发送HNAP请求时,我在此设备的uhttpd服务器中发现了一个问题。用户发送HNAP请求时,如果需要身份验证,则uhttpd服务器将检查HNAP_AUTH header的值。下面是用于验证HNAP_AUTH的代码。
查看第243至246行的代码,我发现了一个命令注入漏洞。用户可以控制HNAP_TIME和SOAPAction的值,在这种情况下,通过HNAP_TIME参数注入命令,以下是在设备上运行命令的请求。
如果你要执行未经身份验证的请求,则必须绕过某些条件,在这篇文章中我无法提供这种方法,因为这对D-Link的客户是危险的。
0x03 CVE 2019-19598(验证绕过)
在为供应商报告了上面的漏洞之后,我还在DAP-1860上发现了另一个漏洞。当用户发送HNAP请求时,服务器会将HNAP_AUTH header分为hnap_code和hnap_timestamp两部分。使用已存储在/ var / hnap / timestamp文件(current_timestamp)中的值来验证Hnap_timestamp值。之后,hnap_timestamp值存储在/ var / hnap / timestamp中。查看下图,如果hnap_timestamp <= current_timestamp并且hnap_timestamp> = current_timestamp – local_3c,变量的值9设置为0。
查看下图中的第241行,如果变量local_3c!= 1,可以通过HNAP_AUTH验证函数。通过这种方式,可以绕过身份验证并访问所有HNAP API。
最后,要绕过身份验证,首先必须发送请求以覆盖服务器的current_timestamp,此后,用hnap_timestamp等于服务器的current_timestamp发出请求,此请求将访问所有HNAP api而无需证书。
0x04 漏洞披露
· 30/09/2019:已将DAP-1860中的漏洞报告给D-Link。
· 2019年2月10日:在2天前再次向D-Link报告了D-Link没有回应。
· 2019年2月10日:D-Link回复电子邮件以通知该漏洞已发送给研发团队进行验证。
· 2019年9月10日:D-Link确认此问题并正在修补。
· 2019年9月10日:向D-Link报告DAP-1860中的其他漏洞。
· 2019年11月10日:D-Link回复电子邮件以通知该漏洞已发送给研发团队进行验证。
· 24/10/2019:D-Link确认2个问题。
· 14/11/2019:D-Link发行版固件已修复并 发布该漏洞
0x05 总结学习
命令注入漏洞:
用户可以控制HNAP_TIME和SOAPAction的值,可以通过HNAP_TIME参数注入命令,可以发现挖掘命令注入漏洞要注意身份验证接口的相关参数。
验证绕过漏洞:
当用户发送HNAP请求时,服务器会将HNAP_AUTH header分为hnap_code和hnap_timestamp两部分。使用已存储在/ var / hnap / timestamp文件(current_timestamp)中的值来验证Hnap_timestamp值。
要绕过身份验证,首先必须发送请求以覆盖服务器的current_timestamp文件,此后,用hnap_timestamp等于服务器的current_timestamp发出请求,此请求将访问所有HNAP api而无需证书。
这两个漏洞组合就可以完成登录验证绕过再实现命令注入攻击。