一、声明
我很乐意提供有关渗透测试的信息,但我必须强调,渗透测试是一项合法且专业的活动,必须在适当的授权和监督下进行。渗透测试是为了评估计算机系统、网络或应用程序的安全性,以发现潜在的漏洞和弱点,并提出改进建议。渗透测试需要专业的技能和严格的合规性,以确保不会对系统的安全性造成负面影响。
在进行渗透测试时,请务必遵守以下原则:
合法性:只在获得明确授权的情况下进行渗透测试,不要未经授权地访问、测试或侵入他人的系统。
透明度:在进行渗透测试之前,向相关方明确说明测试的目的、范围、时间和方法,并获得他们的书面同意。
谨慎性:在进行渗透测试时,务必谨慎行事,避免对系统造成不可挽回的损坏或数据泄露。
保密性:在进行渗透测试时,必须严格遵守保密协议,不得将测试结果泄露给未经授权的人员或机构。
遵守法律:在进行渗透测试时,必须遵守当地和国际法律法规,不得从事任何非法活动。
总之,渗透测试是一项高度专业和敏感的活动,必须由经验丰富的专业人士在合适的环境和条件下进行。任何未经授权或违法的渗透测试行为都是不道德且不可接受的。
、靶场介绍
Jenkins 2.441及更早版本,以及LTS 2.426.2及更早版本没有禁用其CLI命令解析器的一个功能,该功能会将参数中’@'字符后跟的文件路径替换为该文件的内容,允许未经身份验证的攻击者读取Jenkins控制器文件系统上的任意文件。
三、关于Jenkins
Jenkins[ˈdʒɛŋkɪnz](百度百科):一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件项目可以进行持续集成。
Jenkins漏洞原理
Jenkins提供了一个命令行的接口,用户可以在下载一个命令行客户端jenkins-cli.jar到本地,并调用该客户端来执行一些Jenkins的功能。本来是一个很常见的功能,但设计中神奇的是,用户使用jenkins-cli.jar时,命令行是传到服务端解析的,而不是在jenkins-cli.jar里解析。
这就导致了一个问题,因为Jenkins服务端解析命令行时使用了一个第三方库args4j,这个库实现了Linux中一个常见的功能——如果一个参数是以@开头,则会被自动认为是一个文件名,文件内容会被读取作为参数。
PHP5.5以前,设置POST参数时,如果传入的参数值是@开头,则也会被认为是文件名,并读取该文件,造成文件读取漏洞。在PHP 5.5以后增加了CURLOPT_SAFE_UPLOAD选项并默认为true,用以杜绝这个问题:https://t.zsxq.com/YVbIYny
回到Jenkins,因为Jenkins是在服务端解析的命令行参数,又支持args4j的这个特性,所以造成文件读取漏洞。
要调试该漏洞,只需在Jenkins启动时设置一个环境变量“DEBUG=1”,即可开启JVM的远程调试端口。如果使用Vulhub环境,直接连接5005端口进行远程调试
转载自:https://cloud.tencent.com/developer/article/2384213
CVE-2024-23897漏洞的利用有下面两个比较核心的限制:
1、是否开启“匿名用户可读”选项 ---> 影响攻击者是否能够读取文件的全文
2、服务端字符集是否兼容读取二进制文件---> 影响攻击者是否能够伪造任意用户的remember-me Cookie
四、靶场解题
1、开启靶场
2、根据前面的知识介绍,这里利用一个比较简便的方法,就是直接下载编译好的二进制 文件,我下载的是Windows版本的(从github上面去获取,其他版本的也有)。
3、下载好解压之后得到如下文件:
4、在文件位置终端,输入命令:
CVE-2024-23897.exe -u http://101.200.139.65:28725/ -a /flag
5、提交Flag。