0x01 漏洞背景
我在D-Link DSL-2640B DSL网关中发现了几个漏洞,由于设备是EoL状态,因此这些漏洞可能不会被打补丁。在EoL设备中发现的漏洞通常具有无限寿命,尽管Shodan仅扫描出两个设备,但不应忽略这些漏洞的影响。
https://eu.dlink.com/uk/en/products/dsl-2640b-adsl-2-wireless-g-router-with-4-port-10-100-switch
https://www.shodan.io/
DNSChanger恶意软件2018年将目标设备定为DSL-2640B。Bad Packets分析发现,设备数量很大,超过了14,000个设备。
对于EoL超过7年的设备,设备总体规模可能令人惊讶,控制如此大的设备数量可进行大规模攻击,例如在DDoS攻击中贡献大量带宽。
https://en.wikipedia.org/wiki/DNSChanger
https://badpackets.net/
0x02 漏洞总览
下面我会分析描述这些漏洞的技术细节,在深入探讨技术细节之前,必须注意以下几点:
· 所有漏洞适用于D-Link DSL-2640B(硬件修订版B2,固件版本:EU_4.01B)
· 所有漏洞均适用于最新的可用固件(截至27/03/2020)
· 所有漏洞均已报告给D-Link
· 我没发现D-Link发布的安全修复程序
· 由于设备是EoL,因此按照D-Link的政策,可能漏洞永远无法修复
这篇文章中描述的漏洞可能适用于其他硬件版本,其他固件版本,甚至是完全不同的型号。我没有对此进行进一步调查,D-Link也未提供任何其他细节。
这篇文章中描述了以下漏洞:
· CVE-2020-9275 – D-Link DSL-2640B-远程凭证泄漏
· CVE-2020-9279 – D-Link DSL-2640B-硬编码特权帐户
· CVE-2020-9278 – D-Link DSL-2640B-未验证的配置重置
· CVE-2020-9277 – D-Link DSL-2640B-CGI身份验证绕过
· CVE-2020-9276 – D-Link DSL-2640B-do_cgi缓冲区溢出
0x03 CVE-2020-9275 – D-Link DSL-2640B-远程凭证泄漏
此漏洞允许通过将特定的UDP数据包发送到设备的端口65002来检索管理密码。
https://raelize.com/advisories/CVE-2020-9275_D-Link-DSL-2640B_Remote-Credentials-Exfiltration_v1.0.txt
连接到WiFi或本地LAN的攻击者,或者能够以任何其他方式访问内部设备接口的攻击者,都可以通过一个UDP请求来获取设备密码。
设备的大多数函数,包括管理面板和Web服务器,都在名为cfm启动时执行的单个过程中实现。该cfm过程侦听UDP端口65002。可能支持来自专用应用程序的设备配置。下面的截图显示了实现通信协议的函数,函数名称pcApplication直接从二进制符号获取。
使用D-Link的专有协议进行通信,该协议没有公开的信息,逆向cfm二进制将为协议数据包提供以下结构。
通过在2个字节的cmd字段中指定命令代码,可以支持和访问多个命令。通信为纯文本未经身份验证,对于某些命令,该代码仅检查提供的MAC地址是否与设备MAC地址匹配。
该命令\x00\x01允许从设备检索系统信息,包括以明文形式返回的设备管理密码,例如:
python -c 'print("\x00\x01"* 5)' | nc -u 192.168.1.1 65002
####MAC_ADDRESS####
对该\x00\x01命令不执行前面提到的MAC地址检查 ,任何其他字节都将被忽略,这使我能够以非常简单的方式识别漏洞。
实际上,我是使用Fuzzing发现了此漏洞。首先,我只是通过管道连接/dev/urandom到UDPport 65002。显然,这种方法不会以任何方式产生漏洞,尤其是因为没有流量监控,没有有效负载选择和目标调试都没有到位。但是,令人惊讶的是,该设备在几分钟之内就返回了管理密码。
time cat /dev/urandom | nc -u 192.168.1.1 65002
&ZLM�•�� ^C
real 2m53.240s
user 0m0.599s
sys 0m21.439s
任何位于正确位置的UDP数据包\x00\x01都将返回管理密码,即使是使用我最初的方法,也可以在几分钟内拿到管理密码。
我的初步测试确定该漏洞可通过LAN加以利用,尽管如此,该服务似乎正在所有接口上进行侦听。
不幸的是,由于缺少合适的DSL连接,我无法在WAN端验证漏洞,使用我拥有的信息,我不能排除该漏洞也可以在WAN端被利用。
0x04 CVE-2020-9279 – D-Link DSL-2640B-硬编码特权帐户
对于此漏洞,我发现是一个硬编码的用户帐户,攻击者可能使用这些凭据登录设备以执行管理任务。
https://raelize.com/advisories/CVE-2020-9279_D-Link-DSL-2640B_Hard-coded-privileged-account_v1.0.txt
通过分析可通过Web界面访问的身份验证过程来识别该漏洞。当cfm过程提供通信“管道”时,将实际身份验证委派给外部库libpsi.so,该库使用面向对象的方法来处理身份验证凭据和传入的身份验证请求。
对该cfm过程的分析揭示了一个支持user的用户的身份验证的代码路径。
default用于身份验证的密码硬编码在libpsi.so二进制文件中。
对该库进行逆向发现,以下default凭证可用于登录设备的Web界面。
Username: user
Password: 00202b004720
尽管user可以更改用户密码,但未提供用于修改它的Web界面控件。因此,此密码将在设备的整个使用寿命内设置为默认状态。需要注意的是,账户有效的验证服务是很重要的,如ftp,telnet和ssh。据我所知,用户user具有与admin帐户类似的功能。
有趣的是,即使libpsi.so仅以二进制格式发布,凭据也可以在设备的GPL源代码中清晰可见(请参见下图)。
同样,有趣的是,这些凭据称为ASUS_USER_ACCOUNT,有人可能想知道ASUS相关帐户如何最终存入D-Link设备。
源代码本身并未透露任何信息,该凭据似乎也对其他ASUS设备有效,在某些旧页面中华硕将它们称为ASUS Super account。
可以说这基本上是一台ASUS feature中的漏洞,由于某种未知的原因而最终出现在D-Link设备中。物联网设备的供应链绝对不容忽视,我认为,这可能是某种供应链问题产生的结果。
我要说的最后一句话是,可以通过浏览器来利用此漏洞,使用连接到WiFi / LAN的任何设备访问的恶意网站可能会向网关执行精心设计的请求。
0x05 CVE-2020-9278 – D-Link DSL-2640B-未验证的配置重置
利用此漏洞,攻击者可以通过访问特定的URL将设备重置为其默认配置,无需身份验证。
https://raelize.com/advisories/CVE-2020-9278_D-Link-DSL-2640B_Unauthenticated-configuration-reset_v1.0.txt
实际上,无需身份验证即可访问以下URL。
· rebootinfo.cgi
· ppppasswordinfo.cgi
· qosqueue.cmd?action=savReboot
· restoreinfo.cgi
具体而言,只需请求以下URL,即可将设备重置为默认出厂配置:
http:///restoreinfo.cgi
攻击者可能会将管理密码重置为其默认值admin,登录并在设备上执行任何管理任务,例如上传恶意固件或配置恶意DNS服务器。
利用此漏洞需要访问设备LAN接口,但也可以通过浏览器透视图远程利用此漏洞,控制恶意网站的攻击者可能会盲目地重置设备的配置,并在某些情况下完全控制设备。
0x06 CVE-2020-9277 – D-Link DSL-2640B-CGI身份验证绕过
CVE-2020-9277 漏洞允许绕过通过身份验证的资源的身份验证过程,攻击者可能可以直接访问Web界面的管理功能,而无需提供有效的凭据。
https://raelize.com/advisories/CVE-2020-9277_D-Link-DSL-2640B_CGI-Authentication-bypass_v1.0.txt
Web服务器首先识别请求的是否URL需要身份验证。检查通过分析请求的文件扩展名,位于end上的URL。例如,访问管理cgi模块需要身份验证。
然后,代码将识别不需要身份验证的资源。例如图像或Javascript程序,该代码使用函数strncmp()将start和URL匹配到特定的字符串(例如:/images/,utils.js)。如果找到匹配项,则不管结果如何,都不会执行身份验证。由于请求已成功通过身份验证,因此将进一步处理该请求。
最后,被请求的cgi模块的do_cgi()函数通过搜索模块名称来执行strstr() 函数。
然后,攻击者可以制作恶意URL,以绕过cgi模块的身份验证,下面的攻击URL 无需任何身份验证即可将设备管理员密码更改为newpass:
Original URL: http:///redpass.cgi?sysPassword=newpass
Attack URL: http:///images/redpass.cgi?sysPassword=newpass
此漏洞为攻击者提供了完全的设备控制,并允许执行未经身份验证的管理函数。此漏洞需要访问设备的LAN接口,但可以通过浏览器web进行利用,从而可以通过Internet进行远程攻击。
0x07 CVE-2020-9276 – D-Link DSL-2640B-do_cgi缓冲区溢出
此漏洞是do_cgi()在解析请求的cgi模块名称时函数中发生的缓冲区溢出,攻击者可以通过cgi在URL中提供恶意模块名称,以具有管理特权的方式在设备上执行任意代码。
https://raelize.com/advisories/CVE-2020-9276_D-Link-DSL-2640B_do_cgi-buffer-overflow_v1.0.txt
do_cgi为了识别要执行的模块,该函数将模块名称复制到堆栈中,但是,它不会检查提供的模块名称的长度是否适合分配的缓冲区。
较长的cgi模块名称将覆盖保存在堆栈上的返回地址,从而导致易于利用的堆栈缓冲区溢出。
do_cgi()原则上只能在身份验证之后才能访问该函数。但是,通过将其与CVE-2020-9277结合使用,可能会未经身份验证利用此漏洞。在下图中,我无需身份验证即可利用此漏洞,执行反向Shell Payload。
https://raelize.com/posts/d-link-dsl-2640b-security-advisories/#cve-2020-9277----d-link-dsl-2640b---cgi-authentication-bypass
虽然可以通过浏览器来利用此漏洞,但由于在将传出请求上应用URL编码时浏览器引入了URL处理问题,因此利用漏洞可能并不容易。
0x08 分析总结
每年会有越来越多的设备成为EoL,无论安全性建议如何,用户都将继续使用它们。这种情况很难解决,例如,制造商实施的终止更新,可能的措施可能会将设备的EoL状态及其风险告知用户,从而可能加剧设备的更换。
我认为,提供足够的方法来发现EoL设备的设备数量也是至关重要的,Shodan和BinaryEdge之类的服务绝对有用,但是我已经展示了它们如何数据的,可能导致错误的结论。
参考及来源:
· https://raelize.com/posts/security-impact-of-eol-devices/
· https://nullcon.net/website/archives/pdf/goa-2020/PwdLess%20Exploitation%20Tales%20from%20RouterLand%20by%20Christofaro%20Mune.pdf