0x01 Intro
Ysomap是一款适配于各类实际复杂环境的Java反序列化利用框架,可动态配置具备不同执行效果的Java反序列化利用链payload。
YsoMap针对ysoserial和marshalsec两款工具解决的痛点:
现存两款工具的payload写死,在面对复杂的实际环境无法灵活、自由拼凑利用链。
e.g.
XStream的LazyValue具备任意调用静态函数的利用效果,很容易想到很多可以利用的静态函数,如javax.naming.InitialContext#doLookup对外发起JNDI请求,java.sql.DriverManager#getConnection连接恶意MySQL服务,但经常会遇到目标环境不出网的情况。一个解决方案是,若目标环境依赖spring框架,可以利用org.springframework.util.SerializationUtils.deserialize来进行二次反序列化,此时原本的XStream的payload就进一步转化为Java原生反序列化的利用了。
对此,ysomap采用模块化的思想,具备动态组合利用链和利用效果的能力。对于遇到的不同环境,根据特定的组合来达成实际利用。
其将利用链分为两个部分payload和bullet:
payload: 利用链的前序部分bullet: 利用链可达成的效果,如命令执行、JNDI连接等
e.g. CommonsCollections1和3的区别是1使用的是
InvokerTransformer而3使用的是TemplatesImpl,提取相同的前序payload,只需写两个不同的bullet,且这两个bullet也同样能被用于其他payload
此外ysomap具备可扩展性,支持用户自己编写的payload、bullet、exploit
0x02 Getting Started
Jar Compilation
Xstream的payload依赖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 | # 配置序列化数据生成后采用base64进行编码 |
- use
1 | use <type> <name> choose a exploit/payload/bullet |
选择对应的exploit/payload/bullet
- session
ysomap中每一个payload或exploit的配置都会生成一个session,session用于维持当前的配置信息和运行状态
1 | clear clear current sessions |
- run
1 | run run current session |
Process
生成特定序列化数据
use payload xxx设置一个payloadshow options获取当前payload配置信息use bullet xxx设置payload的利用效果show options获取当前payload和bullet的配置信息set key value配置一些参数run生成序列化数据
当生成的序列化数据为json或xml时,序列化后的数据将直接打印在终端上
当生成的序列化数据为二进制数据,则会在当前目录生成一个
obj.ser文件利用ysomap进行攻击
use exploit xxx设置一个exploitshow options- 若需要设置payload,参考上面步骤
set key value配置一些参数run执行进行相应攻击
对于第一次的配置,我们可以通过终端模式的提示一步一步配置。在接下来的运行中,我们可以将执行的操作记录成yso文件,然后使用script模式进行载入
1 | use exploit RMIListener |
