首页 > 其他分享 >Nexus Repository Manager 3 未授权目录穿越漏洞(CVE-2024-4956)

Nexus Repository Manager 3 未授权目录穿越漏洞(CVE-2024-4956)

时间:2024-05-26 22:36:05浏览次数:13  
标签:Repository .. Nexus ..% 2024 url 2F 2F% 目录

https://github.com/vulhub/vulhub/blob/master/nexus/CVE-2024-4956/README.zh-cn.md
https://ares-x.com/2020/04/20/IDEA远程调试Docker中程序的方法/
https://t.zsxq.com/MDrfR
漏洞类型:未授权任意文件读取(路径穿越)
POC

GET /%2F%2F%2F%2F%2F%2F%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2Fetc%2Fpasswd

两个问题

  1. 为什么要进行url编码,不能直接传入../../../../../../../etc/passwd吗?
  2. 为什要在路径穿越利用中,需要构造这么多url编码后的/,即%2F?

调试环境

docker ps 
docekr exec -it container_id bash
pwd
docker cp container_id:/opt/sonatype ./sonatype

补丁分析

参考1ue师傅,照猫画虎。

2.1 临时修补措施

https://support.sonatype.com/hc/en-us/articles/29412417068819-Mitigations-for-CVE-2024-4956-Nexus-Repository-3-Vulnerability
Pasted image 20240526122911.png
删除了jetty的资源配置,不再使用jetty去挂载public目录下的资源文件。
在Jetty的配置文件中,

<Set name="resourceBase"><Property name="karaf.base"/>/public</Set>`

这一行的作用是将karaf.base目录下的public子目录设置为资源基目录,即从这个目录中提供静态资源。

  1. 移除资源配置:Jetty不再知道public目录的存在,也就无法从这个目录中提供任何静态资源。
  2. 取消挂载public目录下的资源文件不再与任何URL路径关联。客户端请求这些资源时,Jetty将无法找到并提供它们。

简单来说,删除这行配置意味着Jetty不再负责处理和提供public目录中的静态资源文件,可能需要其他方式来管理和提供这些资源(例如,使用不同的Web服务器或将静态资源打包到应用程序中)。

2.2 补丁包进行对比

https://github.com/sonatype/nexus-public
Pasted image 20240526114507.png
在IDEA里面ctrl+D即可进行二进制对比。
Pasted image 20240526114817.png
筛选*.java,可以看出有3个java文件改动。
分别是
WebResourceServicelmpl.java
PublicFilesWebResourceBundle.java
RaptureWebResourceBundle.java
根据师傅们的提示,漏洞代码位于WebResourceServicelmpl.java,看名字是关于web资源的业务逻辑的实现类。
这里1ue师傅说是jetty相关的漏洞,这里意思应该是漏洞与servlet相关,而nexus中托管servlet的容器是jetty。

Jetty是一个纯粹的基于Java的网页服务器和Java Servlet容器。

其中删除了如下代码,直接在此处断点,找调用链。

// 3) third, look into WAR embedded resources  
if (resource == null) {  
  URL url;  
  try {  
    url = servletContext.getResource(path);  
    if (url != null && !isDirectory(url)) {  
      resource = new UrlWebResource(url, path, mimeSupport.guessMimeTypeFromPath(path));  
      log.trace("Found servlet-context resource: {}", resource);  
    }  
  }  
  catch (MalformedURLException e) {  
    throw new RuntimeException(e);  
  }  
}
private boolean isDirectory(final URL url) {  
  if ("file".equals(url.getProtocol())) {  
    File file = new File(url.getFile());  
    return file.isDirectory();  
  }  
  return false;  
}

idea搜索WebResourceServicelmpl定位代码,进行远程调试
路由
image.png

2.3 关键代码调用

WebResourceServlet#doGet
        WebResource resource = webResources.getResource(path); // 获取对应路径的资源
WebResourceServiceImpl#getResource
        url = servletContext.getResource(path);
WebAppContext#getResource
        Resource resource = WebAppContext.this.getResource(path);
            resource = super.getResource(uriInContext);
                Resource resource = _baseResource.addPath(path);	//_baseResource是jetty.xml中配置的public目录
PathResource#addPath	
        if (URIUtil.canonicalPath(subPath) == null) 	//绕过
        return "/".equals(subPath) ? this : new PathResource(this, subPath);
PathResource#PathResource
        this.uri = URIUtil.addPath(parent.uri, childPath);
URIUtil#addPath
        encodePath(buf, path, offset);

POC分析

  1. 直接传入../../../../../../../etc/passwd会怎么样?

image.png
400,1ue师傅说这是正常的,这里暂时存疑。

  1. 传入..%2F..%2F..%2F..%2F..%2F..%2F..%2Fetc%2Fpasswd呢?

image.png
jetty会进行一层解码,但是依旧400。

  1. 双重url编码,传入..%252F..%252F..%252F..%252F..%252F..%252F..%252Fetc%252Fpasswd

依旧不行。

P牛:
image.png

为什么paylaod是这样的?
%2F%2F%2F%2F%2F%2F..%2F..%2F..%2F..%2F..%2F..%2Fetc%2Fpasswd

  1. 首先这个payload可以通过jeety传递到后端,通过编码避免斜线后第一个字符出现..或者../造成400.
  2. 利用多级///绕过canonicalPath的检查。

URIUtil.canonicalPath 函数通常用于规范化 URI 路径。规范化路径的过程包括移除冗余的路径元素(如 . 和 ..),以及处理重复的斜杠 /。

与spring中的cleanPath()函数一样,在处理路径的时候将空的字符串也认为是一个目录。
也就是

canonicalPath("//../etc/passwd")
输出
/etc/passwd

/我是空字符,但是cleanPath()和canonicalPath()认为我是空目录/../etc/passwd
这里的../实际上是跨了一层空目录,通过了canonicalPath的检查。
但系统认为//不是一个目录,会通过../跳到上级目录。
image

至此就导致了路径穿越+任意文件读取。
在后面拼接目录的时候尽管存在多级//(canonicalPath眼中的空目录),但系统选择无视,而且file协议是支持的。注:file://中的//也不是必要的
image.png
image.png
image.png

补丁绕过?

  1. 临时修补措施

image.png
去除掉jetty中public的配置,猜想在这一步由于获取不到_baseResource后直接抛出异常了。

  1. 删除了入口点,提供了别的接口访问。

标签:Repository,..,Nexus,..%,2024,url,2F,2F%,目录
From: https://www.cnblogs.com/Rainy-Day/p/18214409

相关文章

  • FL Studio2024汉化中文终身免费版音乐编曲制作软件
     随着音乐制作技术的发展,越来越多的人开始尝试自己创作音乐。而一个好的音乐制作工具,可以让我们的创作过程更加轻松愉快。今天,我们为大家带来了一款备受专业机构推崇的电音编曲软件——FLStudio2024全能数字编曲音频工作站。FLStudio2024 Win-安装包下载如下:https:/......
  • DragonKnightCTF 2024
    misc签到用stegsolve发现二维码,扫码关注中学生CTF发送DragonKnight2024即可获得flag神秘文字一开始想着埃及文,找了半天发现很多都没有对应的字符,都开始摆了。但是,当我发给gpt后,发现是js混淆类的直接运行就拿到了压缩包密码了,然后解压就是flagcrypto签到分析之后......
  • 20240521考试(1.打印数字字符 2.打印面积(类的继承)3.简单的矩阵加减)
    目录1.打印数字字符2.打印面积(类的继承)3.简单的矩阵加减1.打印数字字符#include<iostream>#include<iomanip>usingnamespacestd;classdatatype{public:datatype(){}datatype(charc):c(c),i(0),f(0){}datatype(inti):c(0),i......
  • 2024电工杯数学建模B题Python代码+结果表数据教学
    2024电工杯B题保姆级分析完整思路+代码+数据教学B题题目:大学生平衡膳食食谱的优化设计及评价 以下仅展示部分,完整版看文末的文章importpandasaspddf1=pd.read_excel('附件1:1名男大学生的一日食谱.xlsx')df1#获取所有工作表名称excel_file=pd.ExcelFile('附件1......
  • 2024 CCPC 全国邀请赛(山东)暨山东省大学生程序设计竞赛题解 A C F I K
    超时就是AC队第一次打ccpc比较菜蒟蒻只能做五题ProblemA.打印机算法:二分思路:二分时间每次check查看当前时间内所有打印机可以打印的个数是否符合条件注意二分的右边界为2e18ProblemC.多彩的线段2算法:组合数思路:将所有线段按照起点从左到右排序枚举线段每次将当......
  • 2024-05-26 英语学习纪要
    今天在bilibili上面看到一个视频链接/slash*asterisk-hypen_underscore:colon';'semicolon&ampersandi.e.e.g.这些似乎都是拉丁语翻译来的。i.e.inotherwords换句话说ATMautomatedtellermachine不认识teller,我猜是出纳员之类的意思,猜对了PDFporta......
  • What You See Is What You Get 所见即所得 20240525~0526 心得记录
    #参访《成都味之道生物科技有限公司》#矿泉水250毫升,不浪费Worth:在生活中寻找和理解真正有价值的事物,关注内在价值和意义。Zest:以热情和积极的态度面对生活,享受生活中的每一个瞬间。Discover:不断探索和发现新的事物,不断学习和成长,丰富人生体验。看见工厂里面横幅里面一句话"......
  • 创新实训2024.05.26日志:落地基于硬盘的数据库服务
    1.需求任务列表以下描述易学大模型软件的web应用的功能。用户注册用户邮箱,密码,验证码开启官方邮箱,用来发验证码(QQ网易都支持开启smtp协议,找教程,用邮箱不用手机号是为了省买发短信云服务的钱)验证码缓存于redis,5min内有效验证密码长度,验证码是否正确新用户信息保存于mysq......
  • 2024 ccpc - gdcpc 游寄
    2024年5月26日我在银河系·太阳系·地球·亚洲·中国·广东省·广州市·南沙区参加了有史以来第二场CCPC这次是中文题目谢天谢地,不像上次是个蛇皮英文。这次比赛和一个6年级巨学和5年级巨学组队。共同拼搏得到了0分+20多次罚时的好成绩。比赛中签到题想的几个做法都假了(都磕了......
  • 整理好了!2024年最常见 20 道 Redis面试题(八)
    上一篇地址:整理好了!2024年最常见20道Redis面试题(七)-CSDN博客十五、Redis的性能调优有哪些方法?Redis的性能调优是一个多方面的工作,涉及到硬件、配置、代码层面的优化等多个方面。以下是一些常见的性能调优方法:硬件优化:内存:确保有足够的内存来存储数据集和工作集,因为Red......