SonicWall SRA和SMA的漏洞
去年,Orange Tsai做了一系列很棒的研究,发现了多个SSL VPN产品中的漏洞,可让攻击者通过这些本该保护网络安全的设备进入内部网络。涉及的厂商有:
Palo Alto
Fortinet
Pulse Secure
我认为,在和安全相关的设备中的发现漏洞总是特别具有讽刺意味,多年以来,我们也发现一些安全设备的漏洞。
而在阅读Orange的博客文章时,我注意到一条读者评论,他询问是否有其他VPN厂商受到了影响。虽然我再也找不到这条评论了(那是几个月前的事了),但当时我想,也许我可以去找找其他VPN产品的漏洞。于是我很随意地选择了SonicWall。值得一提的是,他们最近写了一篇文章,指出他们的产品不容易受到Palo Alto漏洞的影响。¯\ (ツ) /¯
由于对SonicWall的产品了解不多,我想搜索找到一个类似SSL-VPN的设备,并最终发现了SRA(Secure Remote Access)。值得庆幸的是,我可以下载这个设备的试用虚拟机,于是我开始集中研究它。以下所有研究分析都基于设备的8.1.0.7-22sv
版本,虽然这个版本看起来有点过时,但是我也找不到更新的版本了。我认为这个特殊的设备实际上已经被或者正在被SMA产品所替换,不过SMA(SonicWall Secure Mobile Access)设备在一定程度上也受到以下漏洞影响。
我首先查看了其中的Web接口。这个接口涉及在cgi-bin
文件夹中一定数量的CGI文件。它们可以被远程调用,是运行在Linux上的32位ELF二进制文件。我通过它们来了解身份验证是如何进行的,以便找到身份验证系统的漏洞,同时也为了确定哪些文件可以在未经身份验证的情况下调用。
其中一个CGI文件是supportLogin
,它用于处理某些类型的身份验证。我在这里发现了两个漏洞,不需要帐户即可利用,不过它们需要设备上“虚拟协助”模块启用才能利用。说实话,我不知道这是否是一个常用的模块。
我发现的第一个漏洞是一个名为customerTID
的参数中存在SQL注入。设备的Web应用使用一个SQLite数据库,并通过printf
函数使用用户的输入构造查询语句。在大多数情况下,它都会使用%q
来适当地转义引号。但是在某些情况下,如下所示,它使用了%s
。由于它不会执行任何转义,因此存在一个简单的SQL注入。
以上是一个可以远程利用的盲SQL注入漏洞。而在这个特定的SQLite数据库中存储的最有趣的数据似乎是在一个名为Sessions
的表中所包含的经过身份验证的用户的session标识。显而易见,如果在适当的时候进行攻击,攻击者可获得不同级别的设备访问权。
第一个漏洞的CVE编号为:
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-7481
在同一个CGI文件中,还发现了第二个任意代码执行漏洞。由于对浏览器user-agent
的解析存在缺陷,导致会产生缓冲区溢出。具体来说,如果user-agent
被伪装成Safari,则会发生溢出,因为这会调用libSys.so
库中的getSafariVersion
函数。
而getSafariVersion
函数如下所示。
这里可以使用memcpy
函数来溢出本地缓冲区。而在SRA中,没有堆栈监视器,所以覆盖EIP并使用rop链来实现命令执行就变得非常简单。不过在SMA中已经有了漏洞防御措施,利用这个漏洞可能需要从其他地方入手。
当然,你可以用以下请求让这个CGI崩溃:
GET /cgi-bin/supportLogin HTTP/1.1
Host: 10.1.0.100
User-Agent: plop Mac OS X Safari Version/12345678901234567890123456789012345678901234AAAABBBBCCCC lol Accept: text/html,application/xhtml+xm l,application/xm l;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
处理程序将自动重新启动,这样你就可以多次发起攻击,暴力破解出libc的基址。在具体实践中,在100次左右的尝试后,通常可以在设备上以nobody
权限执行任意命令。
第二个漏洞的CVE编号为:
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-7482
第三个无需认证的漏洞是一个用途较少的目录遍历,因为它只能测试文件是否存在。理论上如果文件匹配某个结构,就可以读取其中的部分内容。它的CVE编号为:https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-7482
不过在实践中,我认为最后这个漏洞可以很容易地用来确定一个设备是否存在其他两个漏洞,因为它们很可能是一起被修复的。如果一个设备是有缺陷的,也许你可以通过以下请求来进行前期的测试:
/cgi-bin/handleWAFRedirect?repeated=1&hdl=../etc/doesntexist
相比于绝对存在的文件(如下所示),以上请求会花费更多的时间:
/cgi-bin/handleWAFRedirect?repeated=1&hdl=../etc/passwd
在整个分析过程中我还发现了其他三个漏洞,但它们都需要经过身份验证:
- CVE-2019-7484 – Authenticated SQL injection
- CVE-2019-7485 – Authenticated Buffer Overflow
- CVE-2019-7486 – Authenticated Code injection
前两个与上面描述的非常相似,而最后一个是非常直接的命令注入,但我认为它可能需要一个管理员帐户。利用请求如下:
POST /cgi-bin/viewcacert HTTP/1.1
Host: 192.168.200.1
[...]
Content-Length: 67
buttontype=delete&CERT=newcert-3'--'
ping -c 4 192.168.200.123
ls
时间线
我于2019年6月5日向Sonicwall的团队报告了这些问题,而到2019年12月17日,官方安全建议发布。
我最近(在安全更新发布2个月后)快速测试了一下,想看看网络上是否还有未打补丁的设备(只测试了目录遍历问题)。显然,仍然有许多脆弱的设备可被利用,这也就是为什么我没有发布详细的攻击代码。
本文由白帽汇整理并翻译,不代表白帽汇任何观点和立场
来源:https://blog.scrt.ch/2020/02/11/sonicwall-sra-and-sma-vulnerabilties/
最新评论