研究人员最近发现,Java和Python运行时都存在漏洞,它们未能正确验证FTP URL中的特殊字符,最终导致黑客甚至能够绕过防火墙访问本地网络。
上周六,安全研究员Alexander Klink公布了一种很有趣的攻击方式,他利用Java应用中的XXE(XML External Entity)漏洞发送邮件。XXE漏洞就是欺骗应用去解析构建的XML文件,从而让XML解析器泄露敏感信息如文件、目录列表甚至是服务器上运行的进程。
Klink演示相同类型的漏洞还可以用来欺骗Java runtime向远程服务器发起FTP连接,URL形式是:
- ftp://user:password@host:port/file.ext
结果发现Java FTP客户端并不会过滤特殊的CR和LF字符,而会解析这些字符。CRLF的意思就是回车(CR, ASCII 13, \r) 换行(LF, ASCII 10, \n)。在FTP URL中插入这些字符会导致Java FTP客户端执行这些命令,甚至还可以执行SMTP (Simple Mail Transfer Protocol)命令,因为SMTP与FTP语法很相似。
Klink的演示中,黑客可以利用漏洞强迫Java程序向SMTP服务器发送邮件。
Klink在博客介绍了攻击场景:“当你能从一台能够解析XML的服务器连接到一台无限制(甚至没有垃圾邮件、病毒邮件过滤)的内部邮件服务器时,这个攻击就会非常有意思。” |
Python和Java的新漏洞
看到Klink的攻击后,来自Blindspot Security的研究员Timothy Morgan又公开了一种类似的攻击方式,这种攻击方式能够针对Java和Python的FTP——由于该攻击可被用来绕过防火墙,因此更为严重。
Morgan把攻击称为“通过恶意URL的FTP协议流注入”,这种攻击和利用了缺少CRLF过滤特性注入恶意FTP命令的方法是类似的。
Morgan没有注入SMTP 命令,而是利用了FTP PORT命令让客户端连接FTP服务器的指定TCP端口。
安全人员指出,很多基于Linux的全状态数据包检测型防火墙(SPI),包括商业防火墙,会支持传统模式的FTP,当检测到来自客户端的FTP流量中的PORT命令时就会自动打开TCP端口,并且转发到那个FTP客户端的局域网IP。
这种攻击向量已经存在多年,所以conntrack的开发者们会加入额外的检查步骤,conntrack是一套大部分防火墙都会用到的Linux工具。加入检查之后,端口只会在PORT命令出现在TCP包开始的时候打开,这样就能确保真的是客户端发送了命令。
此处对黑客而言,攻击需要解决两个问题:
1. 发现客户端的内部IP地址,从而伪造PORT命令;
2. 调整客户端与服务器端的TCP包,让PORT命令落到包的开头
Morgan称他已经找到了解决这两个问题的方法,就是通过“通过恶意URL的FTP协议流注入”,并且他已经开发了PoC exp打算在Oracle和Python修复FTP客户端代码后公开。
“整个攻击(包括判断受害者内部IP的请求)是通过三个SSRF(服务器端请求伪造)实现的,这三个攻击打开了TCP端口”,Morgan周一在博客中说到,“每次额外的SSRF攻击都可以打开一个新的TCP端口。” |
利用方法
利用漏洞的方法有很多,包括攻击那些安装了Java的用户。用户甚至都不需要执行恶意Java applet,因为exp可以通过Java Web开始程序传送。
“如果一个安装了Java的桌面用户访问了一个恶意网站,即使Java applet被关闭,还是可以触发Java Web Start解析JNLP文件,文件中可以包含恶意FTP代码,从而触发漏洞。”
攻击者还可以利用中间人或者利用SSRF/XXE漏洞来攻击那些运行Java应用的服务器。
Morgan表示,他成功攻击了运行最新内核的Linux防火墙,而来自Palo Alto Networks和思科的防火墙在默认设置下也未能幸免。虽然只测试了两款商业防火墙,但他预计受此影响的防火墙不在少数。
安全建议
建议防火墙厂商在Java和Python工程师修复漏洞之前关闭传统的FTP转换模式。
用户应该禁用浏览器的Java插件并且取消.jnlp文件与Java Web Start的关联。同时,对Java和Python应用应该审计SSRF和XXE漏洞。
作者:Sphinx
来源:51CTO