520你们都在谈恋爱而我在审0day

渗透技巧 1年前 (2023) admin
294 0 0

Nevado JMS 反序列化审计  


简介

520你们都在谈恋爱而我在审0day

http://nevado.skyscreamer.org/    

Nevado JMS 是Amazon SQS 的 JMS驱动程序    



流程分析     

520你们都在谈恋爱而我在审0day

按照文档写一个消息接收    

public class App {    public static void main(String[] args) throws Exception {        new ClassPathXmlApplicationContext("applicationContext.xml");        NevadoConnectionFactory connectionFactory = new NevadoConnectionFactory();        NevadoConnection connection = connectionFactory.createConnection();        NevadoSession session = connection.createSession(false, NevadoSession.AUTO_ACKNOWLEDGE);        NevadoQueue queue = session.createQueue("test");        NevadoMessageConsumer consumer = session.createConsumer(queue);        NevadoMessage message = consumer.receive();        //        if (message instanceof TextMessage) {        //            TextMessage textMessage = (TextMessage) message;        //            System.out.println("Received message: " + textMessage.getText());        //        }                connection.close();    }

在上面的流程中,会创建一个test队列传到receive方法,具体为:   

队列“test”传进createConsumer方法,在createConsumer方法时被传递进了NevadoMessageConsumer对象    

520你们都在谈恋爱而我在审0day    

在构造函数NevadoMessageConsumer中,因为传进的时queque类型,所以会进入else,此时_destination就是队列test    

520你们都在谈恋爱而我在审0day    

回到消息接收中,receive()方法会监听队列,从队列中接收消息    

520你们都在谈恋爱而我在审0day    

继续跟进getUnfilteredMessage方法查看实现流程    

520你们都在谈恋爱而我在审0day    

getUnfilteredMessage方法是过滤被消费的消息,如果接收模式是2,就会先从缓存读取    

520你们都在谈恋爱而我在审0day    

当不满足条件时就会调用this._connection.getSQSConnector().receiveMessage来接收队列消息,然后再将被接收过的消息添加到缓存中    

520你们都在谈恋爱而我在审0day    

具体为:   

已知初始化时_connection是NevadoConnection对象    

520你们都在谈恋爱而我在审0day    

520你们都在谈恋爱而我在审0day    

getSQSConnector方法返回的是SQSConnector    

520你们都在谈恋爱而我在审0day    

520你们都在谈恋爱而我在审0day    

这个接口封装了Amazon SQS 相关的API 调用,receiveMessage方法是接收消息    

520你们都在谈恋爱而我在审0day    

所以从代码分析,当不满足条件时,就会接收从Amazon SQS发送的队列消息    

520你们都在谈恋爱而我在审0day    

跟进实现receiveMessage方法的实现类    

在receiveMessage方法中,会将取出的队列传进receiveSQSMessage方法进一步接收队列中的消息    

520你们都在谈恋爱而我在审0day    

跟进receiveSQSMessage方法    

520你们都在谈恋爱而我在审0day    

此时receiveSQSMessage方法返回的就是test里面的消息,返回receiveMessage    

520你们都在谈恋爱而我在审0day    

接收到队列消息后,将消息等参数传进convertSqsMessage方法    

520你们都在谈恋爱而我在审0day    

在convertSqsMessage方法中,会根据传进的destination类型来做不同的消息取出动作    

520你们都在谈恋爱而我在审0day    

随后将取出的消息传进deserializeMessage方法做反序列化    

520你们都在谈恋爱而我在审0day    

跟进deserializeFromString    

520你们都在谈恋爱而我在审0day    

在deserializeFromString方法中,会对传进的消息做一次base64解码操作,然后再使用Hessian2Input对象进行反序列化。   

根据代码的流程,如果要进行漏洞利用,acknowledgeMode就必须不等于2且transacted是false才能进入else走到反序列化功能,如开头所写,NevadoSession的模式分为4种:   

int AUTO_ACKNOWLEDGE = 1;int CLIENT_ACKNOWLEDGE = 2;int DUPS_OK_ACKNOWLEDGE = 3;int SESSION_TRANSACTED = 0;

 

且因为反序列化使用的是Hessian2Input,所以得知序列化的数据得是Hessian格式    

该组件提供了一个反序列化工具类SerializeUtil.class,可以直接用来序列化恶意数据    

public static String serializeToString(Serializable serializable) throws IOException {    byte[] data = serialize(serializable);    return new String(Base64.encodeBase64(data));}
public static byte[] serialize(Serializable serializable) throws IOException { ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); Hessian2Output hessian2Output = new Hessian2Output(byteArrayOutputStream); hessian2Output.setSerializerFactory(new SerializerFactory(SerializeUtil.class.getClassLoader())); hessian2Output.startMessage(); if (serializable instanceof Character) { serializable = new CharWrapper((Character)serializable); }
hessian2Output.writeObject(serializable); hessian2Output.completeMessage(); hessian2Output.close();

   

漏洞验证  

520你们都在谈恋爱而我在审0day

方式一:本地部署验证    


发送消息的客户端,destination类型是queque    

public class Appclient {    public static void main(String[] args) throws JMSException {        new ClassPathXmlApplicationContext("applicationContext.xml");        NevadoConnectionFactory connectionFactory = new NevadoConnectionFactory();        NevadoConnection connection = connectionFactory.createConnection();//false和1        NevadoSession session = connection.createSession(false, NevadoSession.AUTO_ACKNOWLEDGE);        NevadoQueue queue = session.createQueue("test");        NevadoMessageProducer producer = session.createProducer(queue);//如果destination类型是topic,那就是{"Message":"base64编码后的恶意数据"}        NevadoMessage message = session.createTextMessage("base64编码后的恶意数据");        producer.send(message);        connection.close();
}

接收消息:   

520你们都在谈恋爱而我在审0day    

方式二:搭配amazon sqs 使用验证

    

注册一个amazon,使用sqs服务    

520你们都在谈恋爱而我在审0day    

然后发送消息    

520你们都在谈恋爱而我在审0day    

或者    

520你们都在谈恋爱而我在审0day    

集群在接收消息后就会触发    

结尾    

520你们都在谈恋爱而我在审0day

亚马逊接收消息有一个getObject,应该也是个反序列化的点,网上有文章,属于是nday这里就不继续说了    

Maven依赖  

<dependency>  <groupId>com.amazonaws</groupId>  <artifactId>aws-java-sdk</artifactId>  <version>1.11.31</version></dependency><dependency>  <groupId>org.skyscreamer</groupId>  <artifactId>nevado-jms</artifactId>  <version>1.3.2</version></dependency>

   520你们都在谈恋爱而我在审0day


520你们都在谈恋爱而我在审0day

END


520你们都在谈恋爱而我在审0day


关于Lambda小队

520你们都在谈恋爱而我在审0day

Lambda小队经过多年的一线红队磨炼,取得了众多辉煌的战绩,篇幅限制列出部分荣誉。

520你们都在谈恋爱而我在审0day


520你们都在谈恋爱而我在审0day520你们都在谈恋爱而我在审0day


520你们都在谈恋爱而我在审0day520你们都在谈恋爱而我在审0day


同时希望将这些实战经验分享出去,为了方便知识分享成立了“匿名函数”知识星球,由于该星球尚处在成立初期,故转发该公众号文章集齐20个点赞截图和留下微信私信后台,前十名可获得免费加入星球机会。关于星球介绍扫描下方二维码。


520你们都在谈恋爱而我在审0day

       


520你们都在谈恋爱而我在审0day










原文始发于微信公众号(Lambda小队):520你们都在谈恋爱而我在审0day

版权声明:admin 发表于 2023年5月22日 下午2:34。
转载请注明:520你们都在谈恋爱而我在审0day | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...