前言
Weblogic_cmd是一款用于webloigc命令执行的工具,和ysoserial一样,当时是因为自己搭建的webloigc靶场用的是jdk8u202,版本比较高,工具默认的链子是CC1,打不通,所以自己小改了一下CC6,并且分析了一下Payload生成流程;之后用Weblogic结合RMI回显又需要改一下,踩得坑还挺多的,总结一下
Weblogic_cmd各模块讲解
Main
1 | package com.supeream; |
main方法就是程序启动类,它获取了你输入的cmdline的一系列参数,然后送往其他模块进行处理,其中的invokeRmi
就是我说的官方自带的rmi回显策略,效果是一样,但是构造起来可能小偏差有一点,其他的就没什么好说的了,都是些通俗易懂的
Payload
Payload模块就是官方自带的Weblogic和RMI结合回显的策略
1 | package com.supeream.payload; |
这是官方自己构造的恶意远程类,和我们接下来要说的一样,都是构造了继承了ClusterMasterRemote
,八九不离十
serial
这个包里面包含序列化的工具类
BytesOperation:
这个类内涵多种进制转换工具
1 | package com.supeream.serial; |
可以看到里面有十六进制转换有关的,由于最后t3协议发过去是16进制,因此需要用到这个工具类
Reflection:
1 | package com.supeream.serial; |
这个类就是反射修改东西的类,挺好用的
SerialDataGenerator
1 | package com.supeream.serial; |
初步看一眼就是生成CC链的地方,里面包含多种chaintransformer,比如defineAndLoadPayloadTransformerChain、uploadTransformerChain、blindExecutePayloadTransformerChain
,其中我们经常用的就是普通的blindExecutePayloadTransformerChain
,执行完这个方法就进入对应的serial方法
那对标上面那么几种transformer,那肯定也有serial
因此这一块就是生成payload的地方
serializables:
1 | package com.supeream.serial; |
就是进行一系列序列化和反序列化的工具类,简单易懂
ssl
SSL(Secure Socket Layer),这里面对应的就是进行socket通讯的地方
1 | package com.supeream.ssl; |
假如是https请求,就进行有关SSL协议的处理发送过去,否则就直接正常http处理
另外两个类都是接口
weblogic
这个地方就是进行T3协议处理和payload选择的地方
BypassPayloadSelector:
1 | package com.supeream.weblogic; |
进行bypass方法的选择
T3ProtocolOperation:
1 | package com.supeream.weblogic; |
最好用的地方,这个类用来发送t3协议,可以拿来当个工具类,基本的东西就这么多
WeblogicOption:
1 | package com.supeream.weblogic; |
对应上文,进行payload选择处理的地方,就上面的upload bind ...
几种选择
CVE-2016-0638小改
起因
当时是在研究T3反序列化里用StreamMessageImpl
去绕过黑名单进行二次反序列化发现的问题,因为搭建环境的时候自己十分的铸币,导致我用的jdk版本是8u202,一个比较高的版本,这个版本是用不了CC1的,而weblogic_cmd默认又是只能用CC1的,当时让我懵逼了一阵子
小改造
调试一下流程就知道了
获取一系列的cmdline
然后executeBlind(host, port)
获取一下命令
进入blindExecute主要生成payload逻辑
serialBlindDatas开始搭链子
就这里本来是
1 | final Map lazyMap = LazyMap.decorate(innerMap, transformerChain); |
我改成了:
1 | final Transformer transformerChain = new ChainedTransformer(transformers); |
就简单的改CC1改为CC6就好了。。
RMI与Weblogic结合回显策略
昨天学了一种通过RMI回显Weblogic反序列化的方式,这个方法适用于目标不出网,往常我们都是直接内存马,但是RMI这个思路也很不错,通过让Weblogic服务端加载一个恶意的远程接口类并且同时将其绑定在RMI上,这样我们就可以通过请求这个远程接口,然后输出运行结果就好了
遇到的问题
我们一般都适用Weblogic_cmd工具去给他嗦一把的,但是这个东西说实在的,你说这个工具有吧,它确实有类似的,但不是我想要的demo
因此就涉及到一个如何拓展一个属于自己的工具包了
1 | E:. |
树状图如上,其实东西很少就是个简单的小工具,其中boogipop和supeream就是2个工具包,supeream是原版的,另外一个就是我说的自定义的,那在这之前就得先解析一下都是做什么的,在一开始就解析完了,那假如想要创建一个自己的类,首先你的Main方法就得和它一样,对输入的cmdline进行处理,否则会抛出空指针异常的(踩坑了)
1 | package com.boogipop; |
bytes属性那里就是我们自己定义的远程恶意类的字节码
1 | package com.boogipop.payload; |
这是我们自己构造的,其实和官方的差不多,主要就是试试改造这个工具,除此之外,记得把其他工具包里有关import Main的地方都改为com.boogipop.Main
,否则还是会调用superame包里的Main方法,导致一系列的错误~
About this Post
This post is written by Boogipop, licensed under CC BY-NC 4.0.