Ysomap 源码浅析

渗透技巧 2年前 (2021) admin
1,005 0 0

工具运行如下

Ysomap 源码浅析


一、入口类App




1.console.init()

调用Reflections反射库扫描包,初始化了exploits以及payloads,bullets全局变量。exploits以及payloads,bullets为三个Map

Ysomap 源码浅析

ObjectInputFilterManager.setup();

调用jep290反序列化防御机制 配置反序列化白名单 ObjectInputFilter.Config.setSerialFilter。这也是为什么工具需要在较高版本jdk(jep290)上运行原因。

2.console.run()

工具调用jline库提供了一个可交互式shell,run的一开始做了shell的一些初始化工作,通过while(true) 实现REPL (Read-Eval-Print Loop)。

Ysomap 源码浅析

ysomap.cli.Console#dispatch() 方法根据用户输入的命令分发到不同功能

Ysomap 源码浅析


二、Consol与Session类


Ysomap 源码浅析

Session继承于Console,两个类算是ysomap工具核心。

1.Console

Console类代表了整个工具运行时的终端,不仅实现了App入口类的init、run方法,工具运行时终端的任何输入输出不同命令的实现都由这个类来提供。ysomap.cli.Console#dispatch() 方法中的每一个case都对应着Console中的一个方法。具体的方法跟进留在后面功能中具体分析。

Console中的Field

//我的注释 所有可用的的exploit/payload/bulletpublic Map<String, MetaData> exploits;public Map<String, MetaData> payloads;public Map<String, MetaData> bullets;//我的注释 当前活跃sessionprivate Session curSession;//我的注释 当前终端中所有存在sessionprivate Map<String, Session> sessions;//我的注释 用户命令private String command;//我的注释 用户传入命令参数private List<String> args;//我的注释 控制台打印输出的前缀private String prompt;


2.Session

因为工具不同于ysoserial,提供了一个可交的长连接终端,因此引入了Session的概念。当我们使用不同的payload或者exploite时,都会新建一个session,用户可以任意切换session.回到代码角度,一些简单的方法

Ysomap 源码浅析

Field

//当前session的uuidprivate String uuid = UUID.randomUUID().toString();//对应Status类 对应> 前面的数据,选取了相应的payload或者bullet后,会更新>后面关键字public Status status = new Status();public Exploit exploit;public Payload payload;public Bullet bullet;//当前exploit payload 或bullet的配置public Map<String, HashMap<String, Object>> settings = new HashMap<>();private Console console;private boolean isExploit = false;private boolean isEmpty = true;


三、ysomap.core.serializer




首先是ysomap.core.serializer.DefaultSerializer,java ObjectOutputStream的序列化工具类,提供serialize、deserialize方法,提供序列化反序列化功能,OUTPUT 对应了序列化后的二进制数据默认以文件的方式存到工具当前运行目录。

然后时json相关的序列化工具类,通过调用组件自身的序列化以及放序列化方法实现了对Jackson以及FastJson的支持。

工具还支持hessian反序列化数据的生成,和上面一样,也是通过导入hessian.jar 实现此功能。

最后就是xml,支持XStream以及XMLDecode,同上。

ysomap.core.serializer.SerializerFactory 序列化工厂类,用于生产各类序列化器,如FastJson、JackJson等等。


四、Payloads & Bullets Exploit




payload 与 bullets 分开,还是很奈斯

ysomap的存在就是为了解决此类问题,采用模块化的思想,ysomap将具备动态组合利用链和利用效果的能力。对于遇到的不同环境,根据特定的组合来达成实际利用。

为此,我将原本的利用链切分成了两个部分payload和bullet:

payload:指代利用链的前序部分

bullet:指代最终利用链可达成的效果,如命令执行、jndi外链等效果

ysomap.payloads.Payload 接口提供如下方法

Ysomap 源码浅析

提供如下payload

Ysomap 源码浅析

接下来看bullet ysomap.bullets.Bullet,提供了多种利用效果

Ysomap 源码浅析

Exploit

Ysomap 源码浅析


五、一些工具类




1.ysomap.core.util *Helper

  • ysomap.core.util.CipherHelper  Shiro反序列化漏洞利用时的加密工具类

  • ysomap.core.util.ClassFiles  通过javassist,实现动态修改class,根据不同bullet功能,实现序列化数据的构造

  • ysomap.core.util.FileHelper 文件内容读取,只有一个getFileContent方法

  • ysomap.core.util.HTTPHelper 通过okthhp库可开启http服务,发送get post请求

  • ysomap.core.util.PayloadHelper

  • ysomap.core.util.ReflectionHelper 反射相关工具类

  • ysomap.core.util.SocketHelper socket连接工具类,不过好像没地方用到


2.thirdparty

  • echo.SocketEchoPayload 为bullet提供一个小型socket连接shell

  • echo.TomcatEchoPayload 为bullet提供tomcat回显实现功能

  • loader.RemoteFileLoader 为bullet提供远程jar加载功能

  • org.apache.shiro shiro反序列化漏洞攻击相关依赖


六、Other




反序列化攻击时,uid不匹配是个坑,希望作者后期更新可以加上

bullet还可以加上更多的攻击方式 不同框架的回显内存马之类

作者提供的script功能有很大的发挥空间,就拿shiro来说,有时我们不确定那条链能用,可以自己些script来进行初步fuzz


七、参考链接


https://github.com/wh1t3p1g/ysomap



最后作者YYDS Respect


原文始发于微信公众号(赛博少女):Ysomap 源码浅析

版权声明:admin 发表于 2021年12月3日 上午5:57。
转载请注明:Ysomap 源码浅析 | CTF导航

相关文章

暂无评论

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