SonicWall SRA及SMA多个漏洞分析

 

0x00 前言

去年Orange Tsai在常见的SLL VPN产品中找到了一些漏洞,攻击者可以利用这些漏洞渗透本应该被保护的网络,涉及到的厂商包括Palo Alto、Fortinet以及Pulse Secure。

我认为在安全相关设备中找到漏洞特别具有讽刺意味,然而多年以来,研究人员已经在相关领域发现过不少漏洞。

在阅读Orange的研究文章时,我看到有人问其他厂商是否受到影响,因此我觉得可以尝试寻找其他VPN厂商设备的漏洞。当时我随机选择了SonicWall产品,该厂商最近主动表示相关产品不受Palo Alto漏洞影响。

 

0x01 环境配置

我对SonicWall产品并不了解,因此先搜索哪些属于SSL-VPN设备,找到了Secure Remote Access(SRA)解决方案。幸运的是,我们可以下载该设备的虚拟镜像展开研究。我们的研究成果基于8.1.0.7-22sv版,该版本似乎已经过时,但我无法通过公开渠道找到更新版本。我认为这款设备实际上已经被SMA设备替代(或者正逐步被替代中),而后者也存在本文分析的漏洞。

 

0x02 漏洞分析

我首先研究的是SSL-VPN的web接口,该接口在cgi-bin目录中包含多个CGI文件。这些文件可以被远程调用,是运行在Linux系统上的32位ELF程序。我希望能通过分析这些文件,理解设备如何处理身份认证过程,找到身份认证系统中的漏洞,或者澄清是否可以不经过认证调用某些文件。

其中我找到了一个supportLogin程序,该程序用来处理某些类型的身份认证。其中我找到了一些漏洞,攻击者在通过身份认证之前就可以利用这些漏洞,但需要设备启用“Virtual Assist”模块。实话实说,我并不清楚这是否为常用的一个模块。

CVE-2019-7481

第一个漏洞为SQL注入漏洞,位于customerTID参数中。目标Web应用使用的是SQLite数据库,并且使用了sqlite3的printf函数,根据用户提供的输入构造了几个查询语句。在大多数情况下,服务端使用%q格式化符号来转义引号。然而在某些情况下服务端使用的是%s,如下图所示。此时这里不存在任何转义操作,因此存在一个SQL注入点。

这样将导致设备出现SQL盲注漏洞,可以被远程利用。这里最有趣的是,这个SQLite数据库中似乎存放着身份认证用户的会话标识符,表名为Sessions。如果利用时机妥当,攻击者可以获得各种级别的SSL-VPN访问权限。

该漏洞对应的编号为CVE-2019-7481

CVE-2019-7482

我在同一个CGI中找到了第二个漏洞,可以实现任意代码执行。这是一个缓冲区溢出漏洞,位于服务端解析浏览器user-agent信息的过程中。更具体一些,当攻击者将user-agent伪装为Safari时就会触发溢出,此时服务端会调用libSys.so库中的getSafariVersion函数。

getSafariVersion函数代码片段如下所示:

这里攻击者可以使用memcpy函数来溢出本地缓冲区。SRA中并没有部署stack canary(金丝雀)机制,因此攻击者可以轻松覆盖EIP、使用rop链来执行命令。SMA中部署了一些漏洞利用缓解措施,因此如果想利用该漏洞,可能还需要泄露某些信息,或者使用我并不熟练的pwn技巧。

无论如何,我们可以使用如下请求导致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+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 
Accept-Encoding: gzip, deflate

目标程序会自动重启,因此攻击者可以不断重复利用该漏洞,可以用来暴力破解libc的基址。在实际测试中,一般不超过100次尝试,我就能在目标设备上利用nobody权限执行任意命令。

该漏洞对应的编号为CVE-2019-7482

CVE-2019-7483

第3个漏洞较为鸡肋,是一个预身份认证目录遍历漏洞,只能用来测试某个文件是否存在。从理论上讲,如果目标文件遵循某种结构,那么就可以用来读取部分内容。该漏洞对应的编号为CVE-2019-7483

在实际场景中,我认为该漏洞可以用来判断目标设备是否存在前2个漏洞,因为这几个漏洞可能会被同时修复。从本质上讲,如果目标设备需要一定时间才能处理如下请求,则代表该设备存在漏洞:

/cgi-bin/handleWAFRedirect?repeated=1&hdl=../etc/doesntexist

如果请求实际存在的文件,则处理时间应该短一些:

/cgi-bin/handleWAFRedirect?repeated=1&hdl=../etc/passwd

其他漏洞

在研究过程中我还发现了其他3个漏洞,这些漏洞需要攻击者具备有效账户才能利用,分别如下:

  • CVE-2019-7484:SQL注入漏洞
  • CVE-2019-7485:缓冲区溢出漏洞
  • CVE-2019-7486:代码注入漏洞

前两个漏洞与前面描述的漏洞非常相似,最后一个漏洞为比较简单的命令注入漏洞,但需要管理员账户才能利用,利用方式如下:

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

 

0x03 总结

我于2019年6月5日向SonicWall团队反馈了这些漏洞,官方在2019年12月17日公布了安全公告

在关键更新发布2个月后,我快速判断了一下是否还有设备存在漏洞。我测试了目录遍历漏洞,发现互联网上仍有相关设备存在该问题(其中某个设备隶属于SonicWall的IP地址范围内),因此这里我决定暂时不公布漏洞利用代码。

(完)