RCTF
OpenYourEyesToSeeTheWorld
一题考的是
new InitialDirContext(properties)).search该如何去触发Jndi。这一题指定post传入json,指定searchBase和filter。
1 | POST /index HTTP/1.1 |
其实ldap的search就是lookup的另一个版本,他们都是进行筛选,只不过lookup是直接在url里筛选,search是另外启2个参数。在调试流程不难发现下述过程
我们会进入p_search方法内部,进而进入p_resolveIntermediate
假如我们进入c_resolveIntermediate_nns
那么就会进入c_lookup请求,进入c_lookup请求后
你就会看见熟悉的decodeObject了。这里可以进行反序列化。
而我们想进入c_resolveIntermediate_nns也很简单,Head或者Tail不为空即可,我们随便给searchBase加上个前缀。
最终进行反序列化了,然后就使用POJONODE打一个RCE的gadget就行。
1 | import java.net.*; |
JQCTF
ezjvav
admin/admin 正常登录
访问source
提示不是jsrc用户,猜了一下 jsrc是 jwt key 就没有然后了
黑名单如下
1 | // 弱黑名单 通过bytes比较 |
弱黑名单可以用utf-8-overlong直接绕过,墙黑名单ban了和没ban一样的,没啥区别,直接打jackson的pojonode就行了。exp如下
1 | package com.javasec.pocs.jackson; |
直接sudo读flag就行了。
ezldap
actuator 接口泄露
1 | { |
查看 mappings 发现 source 端点
源码泄露路由
1 |
|
并且题目的环境是jdk17,这里就涉及到一个JDK17环境下的Ldap打法,我们先尽可能的搜集信息。
configprops根据hint去搜索pool,就只能看到Tomcat Connection,这里fuzz了一波发现是tomcat-jdbc依赖。我们可以配合h2去打一个rce就好。但是我们还需要注意一个东西
trustSerialData为false
那么就说明我们无法走ldap的deserialization路线,只能选择走下面的decodeRefence去配合ObjectFacotry打一个组合拳。而我们想走decodeRefence就需要设置javaNamingRefence
我们成功的进入了decodeReference,在这里我们会对我们传入的attrs做一个处理,去new一个Reference对象
我们选择我们的组合拳套餐。我们配合tomcat-jdbc去打h2,但这里还有个问题就是指定h2的jdbcUrl,这里我们需要利用到另一个变量
javaReferenceAddr,我们会取ldapserver给的这个值,然后对他做一个分隔处理。可以看到上图中用@隔开了变量名和值,传入了url为恶意的jdbc字符串。随之我们就会进入DatasourceFactory#getObjectInstance
最终发起H2连接RCE。
恶意LdapServer如下
1 | import java.net.*; |
About this Post
This post is written by Boogipop, licensed under CC BY-NC 4.0.