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地址范围内),因此这里我决定暂时不公布漏洞利用代码。