Java和Python FTP攻击可以穿过防火墙打孔
Java和Python运行时无法正确验证FTP URL,这可能允许攻击者通过防火墙打孔来访问本地网络。
周六,安全研究员Alexander Klink披露了一个有趣的攻击,其中利用XXE(XML外部实体)漏洞在Java应用程序中可用于发送电子邮件。
XXE漏洞可以通过欺骗应用程序来解析要强制XML解析器揭示文件,目录列表等敏感信息(如服务器上运行的进程)的敏感信息的特制XML文件。
klink显示相同类型的漏洞可用于欺骗Java运行时,通过以FTP:// User:Password @ Host @ Host:Port / File.ext的形式给出FTP URL来启动到远程服务器的FTP连接。
但是,事实证明,Java中的FTP客户端的内置实现不会从URL中过滤出特殊的CR(回车返回)和LF(行馈送)字符,并且实际解释它们。
通过在UTP的用户或密码部分中插入此类字符,可以欺骗Java FTP客户端以执行Rogue命令,甚至可以欺骗才能说SMTP(简单邮件传输协议),因为SMTP和FTP的语法类似。
Klink显示,通过利用XXE漏洞和Java的FTP客户端实现中的Quirk,攻击者可以强制Java应用程序向SMTP服务器发送电子邮件。
“这种攻击在一个场景中特别有趣,您可以从中达到(不受限制,可能不会垃圾邮件或恶意软件过滤)内部邮件服务器,从而从执行XML解析的机器中,”Klink在博客文章中表示。
在查看Klink的Exploit之后,Dimothy Morgan是一名盲目安全的研究人员,决定披露类似于Java和Python的FTP实现的类似攻击。但他的攻击更严重,因为它可以用来穿过防火墙拳击漏洞。
摩根通过恶意URL调用攻击“FTP协议流注入”,它还涉及通过利用CRLF过滤的缺失来注入流氓FTP命令。
但是,而不是注入SMTP命令,摩根滥用FTP端口命令,以欺骗客户端将数据通道打开到特定TCP端口上的远程FTP服务器。
正如研究人员所指出的那样,许多基于Linux的有状态数据包检查(SPI)防火墙(包括商业),支持FTP翻译的经典模式,并将自动打开TCP端口,然后将其转发到FTP客户端的LAN IP,如果它们检测到来自该客户端的FTP流量中的端口命令。
此次攻击矢量已知多年来,这就是为什么Conntrack的开发人员,大多数防火墙使用的Linux组工具集添加了额外的检查。仅在TCP数据包的开始时端口命令出现端口命令,才会打开端口,以确保客户端实际发送命令。
这会带来一个有两个问题的攻击者:首先,发现客户端的内部IP地址,以便能够欺骗端口命令,然后,将客户端和服务器之间的TCP数据包对齐,以便欺骗端口命令落在数据包的开头。
摩根已经通过他的FTP协议流注入攻击和声称凭证开发了一种方式来做这两种事情,并宣布他不打算公开发布,直到Oracle和Python纠正他们的FTP客户端代码。
“整个攻击(包括用于确定受害者内部IP的请求)通常只用三个SSRF(服务器端请求伪造)攻击来开辟一个TCP端口,”他在星期一的博客文章中说。“每个额外的SSRF攻击都可以打开一个额外的TCP端口。”
有多种方法可以利用此问题,包括使用计算机上安装的Java的用户使用它。用户甚至需要执行恶意Java applet,因为可以通过Java Web Start应用程序传递漏洞。
“如果桌面用户可以相信在安装Java时访问恶意网站,即使Java applet被禁用,它们仍然可以触发Java Web Start以解析JNLP文件,”摩根说。“这些文件可能包含触发此错误的恶意FTP URL。”
攻击者还可以通过滥用网络上的中间位置或通过利用这些应用程序的SSRF或XXE漏洞来实现Java应用程序的服务器。
摩根表示,他对运行最近内核的自定义Linux防火墙测试了这次攻击,以及从帕洛阿尔托网络和思科系统的防火墙,证明在默认设置下易受攻击。
“在这一点上的商用防火墙测试的虽然这一点非常有限,但似乎很可能是世界上的大量生产防火墙易于通过FTP协议流注入攻击,”他说。
java和python开发人员已通知此问题,但在修复其FTP客户端实现之前,研究人员默认建议防火墙供应商禁用Classic Mode FTP转换。
用户应该从其系统中卸载Java,或者至少禁用浏览器插件并将.jnlp文件扩展名从Java Web开始二进制。同时,Java和Python应用程序应审核SSRF和XXE缺陷。但是,Java中的XML解析当前默认易受攻击,在该平台上使XXE漏洞非常常见,摩根说。