日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
從Java源碼來看Native命令執(zhí)行方法

概述

在RASP等安全產(chǎn)品防護嚴(yán)密的現(xiàn)在,普通的尋找Runtime.getRuntime().exec(cmds)的調(diào)用已經(jīng)成為了一件不現(xiàn)實的事情。

成都創(chuàng)新互聯(lián)公司主營市北網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,成都app開發(fā),市北h5成都小程序開發(fā)搭建,市北網(wǎng)站營銷推廣歡迎市北等地區(qū)企業(yè)咨詢

同樣的,在Java中盛行的反序列化漏洞中,如果將RCE的功能簡單的通過Runtime.getRuntime().exec(cmds)這種結(jié)構(gòu)來進行實現(xiàn)可能大概率也不能達到我們的目的,所以探索一下Runtime的底層實現(xiàn),使用更加底層且復(fù)雜的調(diào)用來進行RCE功能的實現(xiàn)相對來說更加的可行。

這里主要是對Java中多種命令執(zhí)行的方式跟蹤源碼進行原理分析、構(gòu)造利用代碼、集成自研工具。

前置

首先需要對Java中的反射機制有著基本的掌握

通過反射的方式,我們可以獲取到任何類的構(gòu)造方法,類方法,成員變量,且能夠獲取對應(yīng)類對象進行對應(yīng)方法的調(diào)用等等目的

  • 獲取Class類對象對于類對象的獲取,主要可以通過Class.forName / loadClass的方式來獲取,值得注意的是,在調(diào)用Class.forName進行類的加載的時候,將會調(diào)用static方法
Class.forName("java.lang.Runtime")

  • 獲取對應(yīng)類的構(gòu)造方法對于獲取類的構(gòu)造方法,主要可以通過getConstructor或者getDeclaredConstructor這兩種方法來進行實現(xiàn)

兩者的區(qū)別主要是前者不能夠反射獲取private修飾的構(gòu)造方法,而后者能夠獲取。

所以通常使用后者進行構(gòu)造函數(shù)的獲取,傳入的參數(shù)就是對應(yīng)構(gòu)造方法的參數(shù)類。

clazz.getDeclaredConstructor(type.class)
clazz.getConstructor(type.class)
  • 反射獲取成員變量和構(gòu)造方法類似的,存在有g(shù)etField和getDeclaredField兩個不同的獲取方法,區(qū)別和構(gòu)造函數(shù)類似。
clazz.getField(name)
clazz.getDeclaredField(name)
  1. 反射獲取類方法同樣具有g(shù)etMethod和getDeclaredMethod兩種。
  2. ...............

一個普通的命令執(zhí)行是

Runtime.getRuntime().exec("calc");

如果使用反射機制可以是

Class.forName("java.lang.Runtime").getMethod("exec", String.class).invoke(runtime, "calc");

或者是其他的一些使用反射機制的變形。

command

跟蹤Runtime

首先我們跟蹤Runtime執(zhí)行命令的過程。

在這里接收一個String類型的參數(shù),調(diào)用exec的另一個重在方法對參數(shù)進行處理,將其通過分隔符,將其封裝成了數(shù)組對象(這里就是一個字符串)。

之后通過參數(shù)是String[]類型的另一個重載方法,通過調(diào)用ProcessBuilder類的方法進行執(zhí)行。

在ProcessBuilder#start方法中,將命令傳遞給了ProcessImpl#start方法進行處理

windows

在windows中主要是在ProcessImpl的構(gòu)造方法中調(diào)用了create方法。

。這個create方法是通過win32的方式創(chuàng)建了一個進程。

linux

在linux下,在ProcessImpl#start的調(diào)用中將會創(chuàng)建一個UNIXProcess對象并返回

在UNIXProcess類的構(gòu)造方法中,調(diào)用了forkAndExec這個native方法

創(chuàng)建了一個一個進程,并返回了對應(yīng)進程的pid

構(gòu)造命令執(zhí)行

ProcessBuilder#start

在上面的流程分析中,知道了在Runtime.getRuntime().exec()方法調(diào)用的下一層就是使用ProcessBuilder#start方法。

如果hook掉了我們可以通過使用ProcessBuilder類來進行命令執(zhí)行的構(gòu)造。

new ProcessBuilder("calc").start();

或者使用反射的思路構(gòu)造

//method_1
        Class pro = Class.forName("java.lang.ProcessBuilder");
        ((ProcessBuilder) pro.getConstructor(List.class).newInstance(Arrays.asList("calc.exe"))).start();

        //method_2
        Class pro = Class.forName("java.lang.ProcessBuilder");
        pro.getMethod("start").invoke(pro.getConstructor(List.class).newInstance(Arrays.asList("calc.exe")));

        //method_3
        Class pro = Class.forName("java.lang.ProcessBuilder");
        ((ProcessBuilder) pro.getConstructor(String[].class).newInstance(new String[][]{{"calc.exe"}})).start();

        //method_4
        Class pro = Class.forName("java.lang.ProcessBuilder");
        pro.getMethod("start").invoke(pro.getConstructor(String[].class).newInstance(new String[][]{{"calc.exe"}}));

ProcessImpl

從上面的分析可以知道,在windows環(huán)境下的JDK。

ProcessImpl類的構(gòu)造方法將會調(diào)用create方法執(zhí)行native方法進行命令執(zhí)行。

所以我們只需要反射獲取ProcessImpl類的構(gòu)造方法并實例化就會執(zhí)行我們的惡意邏輯。

UNIXProcess

上面是針對windows的方式

針對linux,在前面的分析中知道主要是在其start方法中調(diào)用了UNIXProcess類的構(gòu)造方法。

執(zhí)行forkAndExec這個native方法進行命令執(zhí)行。

other

甚至于,我們知道最后主要是在create方法(windows)、forkAndExec方法(linux)中執(zhí)行命令,我們同樣可以通過反射這兩個方法進行命令執(zhí)行。

本文作者:superLeeH, 轉(zhuǎn)載請注明來自


文章標(biāo)題:從Java源碼來看Native命令執(zhí)行方法
轉(zhuǎn)載來于:http://www.5511xx.com/article/cooooss.html