Git Product home page Git Product logo

ysomap's Introduction

YSOMAP

Platforms Java version License

Ysomap is A helpful Java Deserialization exploit framework.

Ysomap是一款适配于各类实际复杂环境的Java反序列化利用框架,可动态配置具备不同执行效果的Java反序列化利用链payload。

随着利用链的补充,ysomap同样可作为一款Java反序列化利用链教学库。目前,ysomap支持Java原生反序列化利用链、fastjson利用链、hessian利用链、xmldecoder、xstream等等。

另外,ysomap具备exploit模块,用于充分调动反序列化利用链。目前,ysomap已支持RMI、JNDI、JMX、shiro、xmlrpc等exploits。

#1 如何使用

在谈如何使用ysomap之前,假设使用者有一定的Java反序列化利用的前置知识,以及一些常见利用的原理,如rmi、ldap等。

Jar编译

由于XStream的几个payload依赖JDK8的环境,所以后续的使用均在JDK8的环境下编译并运行

mvn clean package -DskipTests

正常编译不出错,可在cli/target目录找到ysomap.jar

当然,你也可以直接下载release,但还是推荐自行clone后编译,因为大版本的更新将积攒一批利用链后才会发布release。

Jar运行

经过几次迭代,目前ysomap支持两种运行模式:终端cli模式和脚本模式

终端模式

java -jar ysomap.jar cli

脚本模式

java -jar ysomap.jar script path/to/script.yso

终端模式更易于选择和配置exploit、payload、bullet,但对于重复性的配置,终端模式显的格外繁琐。所以后续又增加了脚本模式。通过编写特定配置的yso脚本,使用ysomap进行载入调用。脚本模式在正确配置的前提下将极大的节省使用者输入重复配置的工作量,提高使用效率。同时,yso脚本也可以被分享给其他使用者进行快捷使用。

基础使用方法

参见YSOMAP食用指北

#2 当前进度

DONE

  • 支持CommonsCollections系列payload
  • 支持执行效果bullet:远程jar载入、命令执行、代码执行、发起jndi效果、tomcat内存马、延时判断、文件写入、socket shell。
  • 支持现有RMI系列攻击包 原理1 原理2 原理3
  • 支持现有LDAP系列攻击包 原理
  • 支持HTTP服务动态挂载恶意的class文件或jar文件
  • 支持URLDNS
  • 支持现有JMX系列攻击包 原理
  • 支持fastjson JdbcRowSetImpl、TemplatesImpl gadget 原理
  • 支持现有XStream系列payload包 原理
  • 支持weblogic XMLDecoder payloads

TODO

  • 支持weblogic系列攻击包
  • 支持websphere系列攻击包

#3 由来

在实际分析ysoserial的利用链时,有时候会觉得框架写的太死,有以下几个缺点:

  1. 同一个利用链如果想改变一下最后的利用效果,如命令执行改成代码执行,我们需要改写这个利用链或者是重新增加一个利用链。这时,我们其实可以看到利用链的前半部分是不变的,变的只是后续的利用效果。
  2. ysoserial仅实现了常规的序列化利用链,对于类似JSON格式的序列化利用链,以当前的这个框架扩展起来会比较麻烦

所以萌生了开发一个更加灵活的框架来扩展反序列化利用链,也就是当前这个试验品ysomap。

PS:YSOMAP项目为另一个项目的子项目,后续将开源该项目,敬请期待......

#4 原理

我将利用链切分成了两个部分payloadbullet

  1. payload:指代利用链的前序部分
  2. bullet:指代最终利用链可达成的效果

实际案例分析

CommonsCollection1和3,在分析时我们可以看到实际1和3的区别在于1使用的是InvokerTransformer,而3使用的是templatesImpl的方式。那么提取相同的前序payload部分,我们只需写两个不同的bullet即可。而且这两个bullet也同样能被用在其他的payload上。

实际还有就是我在写RMIRegistryExploit时,也有这种可将不变部分重用的地方,而无需2,3之类的出现。

#5 免责申明

未经授权许可使用YSOMAP攻击目标是非法的。 本程序应仅用于授权的安全测试与研究目的。

#6 致谢

@ysoserial: https://github.com/frohoff/ysoserial @marshalsec: https://github.com/mbechler/marshalsec

#7 404星链计划

ysomap现已加入 404星链计划

ysomap's People

Contributors

beichendream avatar celebrate-future avatar lalajun avatar wh1t3p1g avatar whocansee avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ysomap's Issues

Hessian XString deserialisation stack trace

When using several of the Hessian deserialisation payloads against a hessian endpoint, the tomcat server responds with the following stack trace:

java.lang.ClassCastException: com.sun.org.apache.xpath.internal.objects.XString cannot be cast to java.lang.String
	javax.naming.ldap.Rdn$RdnEntry.getValueComparable(Rdn.java:481)
	javax.naming.ldap.Rdn$RdnEntry.compareTo(Rdn.java:444)
	javax.naming.ldap.Rdn$RdnEntry.compareTo(Rdn.java:420)
	java.util.TreeMap.put(TreeMap.java:568)
	java.util.TreeSet.add(TreeSet.java:255)
	com.caucho.hessian.io.CollectionDeserializer.readList(CollectionDeserializer.java:78)
	com.caucho.hessian.io.SerializerFactory.readList(SerializerFactory.java:341)
	com.caucho.hessian.io.Hessian2Input.readObject(Hessian2Input.java:1945)
	com.caucho.hessian.server.HessianSkeleton.invoke(HessianSkeleton.java:131)
	com.caucho.hessian.server.HessianSkeleton.invoke(HessianSkeleton.java:109)
	com.caucho.hessian.server.HessianServlet.service(HessianServlet.java:396)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

CommonsCollections3 生成POC时 出现 Bullet Type Not Match 错误

ysomap > use payload CommonsCollections3

You can choose bullets: [TransformerBullet, TransformerWithJNDIBullet, TransformerWithSleepBullet, TransformerWithURLClassLoaderBullet, TransformerWithFileWriteBullet]

ysomap payload(CommonsCollections3) > use bullet TransformerBullet
ysomap payload(CommonsCollections3) bullet(TransformerBullet) > set command whoami
ysomap payload(CommonsCollections3) bullet(TransformerBullet) > run

[+] generate CommonsCollections3 success, plz seepayload.CommonsCollections3.TransformerBullet.ser
[+] generate payload(CommonsCollections3) started!

Bullet Type Not Match; Error TYPE: class [Lorg.apache.commons.collections.Transformer;

使用TransformerWithSleepBullet 和 TransformerBullet 都是提示错误 “Bullet Type Not Match”

image

生成序列化文件失败

ysomap payload(CommonsBeanutils1) bullet(ProcessBuilderBullet) > run
[+] generate payload(CommonsBeanutils1) started!
[+] generate payload(CommonsBeanutils1) done!
[+] generate CommonsBeanutils1 success, plz see obj.ser
java.io.NotSerializableException: java.lang.ProcessBuilder
        at java.io.ObjectOutputStream.writeObject0(Unknown Source)
        at java.io.ObjectOutputStream.writeObject(Unknown Source)
        at java.util.PriorityQueue.writeObject(Unknown Source)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at java.io.ObjectStreamClass.invokeWriteObject(Unknown Source)
        at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
        at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
        at java.io.ObjectOutputStream.writeObject0(Unknown Source)
        at java.io.ObjectOutputStream.writeObject(Unknown Source)
        at ysomap.core.serializer.DefaultSerializer.serialize(DefaultSerializer.java:25)
        at ysomap.core.serializer.SerializerFactory.serialize(SerializerFactory.java:52)
        at ysomap.cli.Session.run(Session.java:213)
        at ysomap.cli.Console.dispatch(Console.java:127)
        at ysomap.cli.Console.run(Console.java:77)
        at ysomap.cli.App.main(App.java:17)
ysomap payload(CommonsBeanutils1) bullet(ProcessBuilderBullet) > show options

show options exception

image
because EvilFileWrapper.getSerializer return null and session.printSessionDetails at line 197 not check

ShiroRCE1 exploit AES过程错误

ysomap-master/core/src/main/java/ysomap/exploits/shiro/ShiroRCE1.java中150行附近
byte[] keyBytes = Strings.base64(key.getBytes());

应该是将key字符串byte后进行base64解码,而单调用的ysomap-master/common/src/main/java/ysomap/common/util/Strings.java中59行附近是base64编码。
public static byte[] base64(byte[] data){
Base64 base64 = new Base64();
return base64.encode(data);
}
导致该ShiroRCE1 exploit失效。

新功能建议

进行批量目标的漏洞验证或者利用, 当然, 爆破也是可以的.

Example:

java -jar ysomap.jar <exploit> [<payload>] [<bullets>] var1=vul1 var2=vul2 var3=vull3

请问一下如何HashMap通过反射修改put方法,put进去的key

我个人根据你的blog复现https://blog.0kami.cn/2020/04/18/java/talk-about-xstream-deserialization/ Groovy Expando这个方式的时候自己写的代码是这样的MethodClosure methodClosure=new MethodClosure("Calc.exe","execute");
Expando expando=new Expando();
expando.setProperty("hashCode",methodClosure);

    HashMap map=new HashMap();
    map.put("test",expando);
    Field key=Class.forName("java.util.HashMap$Node").getDeclaredField("key");
    key.setAccessible(true);
    key.set(map,expando);
    XStream xStream=new XStream();
    String xml=xStream.toXML(map);
    System.out.println(xml);
    xStream.fromXML(xml);
    我发现这个key是无法修改的因为是final类型,但是我发现如果put的时候直接放入expando对象的化会提前触发命令执行,这里我无法解决这个问题看了看你这个项目里的代码我不明白你的makemap 方法为何要如此处理

报错

使用原本的ysoserial.exploit.JRMPListener启动,run后报错,使用CommonsCollections1、CommonsCollections3、CommonsCollections7都报错:
image

infinite loop when run explot

image
not set require options cause first run attempt failed.
exploit status is ysomap.common.util.Status.RUNNING and not been resetted cause next attempt be trapped in infinite loop

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.