Jenkins&XStream漏洞调试

Jenkins

Orange打法

懒得写了,总结起来就是,Jenkins有个buildDispatch方法,会在dispatch中加入各种方法解析规则,比如调用getXX(),doXX()等。 而在处理路由的时候,比如传入.com/aa/bb/cc/dd,则会链式调用jenkins.model.Jenkins类的getAA方法,再调用返回的类/对象的getBB方法一直递归下去,而这个调用是调用的继承树中的方法,即可以调用整个继承树中符合规则的方法。

1
2
3
4
5
http://jenkin.local/securityRealm/user/test 会从上倒下依次执行:

jenkins.model.Jenkins
.getSecurityRealm()
.getUser(test)

而具体的get方法等的调用在请求处理的dispatch()方法中,会再调用metaClass.dispatchers中各个node封装好的NameBasedDispatcher类的dispatch方法,再调用之前build时add进去的doDispatch方法来invoke触发。

最后一个比较清晰的调用图

XStream

前置知识

主要是set会调用compareTo,map会调用hashcode,这两个在gadget中起传递作用

EventHandler方式

版本:1.4.5 - 1.4.10
-w597

Groovy的两种

  1. Expando中调用了call,而methodClosure的call可以rce,因此传一个methodClosure进去即可。hashcode通过map来触发。
  2. ConvertedClosure中的invokeCustom调用了call,和Expando一样。但是进入invoke是通过调用compareTo然后动态代理进来的。注意这里的call方法有一个String参数,因此不能processBuilder,需要runtime.exec。compareTo通过set来触发。

-w1345

ImageIO

通过next这个触发点结合invoke打。不写具体的了

BCEL

通过LazyIter的next结合class.forName打。
class.forName参数可控,因此可以指定类名和类加载器。这里直接指定bcel类加载器就能打。这里也能直接打jk2.101-
注意一点bcel的加载过程一些坑,见payload。这里还要熟悉一些javaassist和classloader的原理和使用。

XStream-exp集合

https://github.com/LFYSec/XStream-EXP

Proudly powered by Hexo and Theme by Hacker
© 2021 LFY