Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

java-sec/SimpleRasp-code-reading

Folders and files

NameName
Last commit message
Last commit date

Latest commit

History

8 Commits

Repository files navigation

SimpleRasp



Simple Java Rasp

基于 Java Instrumentation + Javaassist

使用

@RaspHandler 标记一个用于处理的 Handler 类, 参数用于定位被 Hook 的方法或构造函数

  • className: 类名
  • methodName: 方法名 (可选)
  • isConstructor: 是否为构造函数 (默认为 false)
  • parameterTypes: 方法/构造函数的参数类型

@RaspBefore 标记一个在目标方法刚开始调用时进行处理的方法, 对应 Javaassist 中的 insertBefore

方法签名: public static Object[] handleBefore(Object obj, Object[] params)

  • obj: 当目标方法为非静态方法时, 该值为目标对象本身 (this), 为静态方法时该值为 null
  • params: 目标方法的参数列表
  • 返回值: 默认为 params, 用于替代目标方法原来的参数

@RaspAfter 标记一个在目标方法 return 之前进行处理的方法, 对应 Javaassist 中的 insertAfter

方法签名: public static Object handleAfter(Object obj, Object result)

  • obj: 同上
  • result: 目标方法 return 的值, 如果方法返回类型为 void, 则该值为 null
  • 返回值: 默认为 result, 用于替代目标方法原来的返回值

Demo

拦截 Runtime.exec 方法

package com.simplerasp.handlers;
import com.simplerasp.annotations.RaspAfter;
import com.simplerasp.annotations.RaspBefore;
import com.simplerasp.annotations.RaspHandler;
import com.simplerasp.exceptions.RaspException;
import sun.misc.IOUtils;
@RaspHandler(className = "java.lang.Runtime", methodName = "exec", parameterTypes = {String.class})
public class RuntimeExecHandler {
 @RaspBefore
 public static Object[] handleBefore(Object obj, Object[] params) {
 System.out.println("before");
 String cmd = (String) params[0];
 System.out.println("try to exec: " + cmd);
 if (cmd.contains("Calculator")) {
 throw new RaspException("Reject malicious command execution attempts");
 }
 return params;
 }
 @RaspAfter
 public static Object handleAfter(Object obj, Object result) throws Exception{
 System.out.println("after");
 Process p = (Process) result;
 String output = new String(IOUtils.readAllBytes(p.getInputStream()));
 if (output.contains("uid=")) {
 throw new RaspException("Reject malicious command execution output");
 }
 return result;
 }
}

拦截 ProcessBuilder 构造函数

package com.simplerasp.handlers;
import com.simplerasp.annotations.RaspBefore;
import com.simplerasp.annotations.RaspHandler;
import com.simplerasp.exceptions.RaspException;
@RaspHandler(className = "java.lang.ProcessBuilder", isConstructor = true, parameterTypes = {String[].class})
public class ProcessBuilderHandler {
 @RaspBefore
 public static Object[] handleBefore(Object obj, Object[] params) {
 System.out.println("before");
 String cmd = String.join(" ", (String[])params[0]);
 System.out.println("try to exec: " + cmd);
 if (cmd.contains("Calculator")) {
 throw new RaspException("Reject malicious command execution attempts");
 }
 return params;
 }
}

拦截 Log4j2 JNDI 注入

package com.simplerasp.handlers;
import com.simplerasp.annotations.RaspBefore;
import com.simplerasp.annotations.RaspHandler;
import com.simplerasp.exceptions.RaspException;
@RaspHandler(className = "org.apache.logging.log4j.core.net.JndiManager", methodName = "lookup", parameterTypes = {String.class})
public class JndiManagerLookupHandler {
 @RaspBefore
 public static Object[] handleBefore(Object obj, Object[] params) {
 System.out.println("before");
 String name = (String) params[0];
 String[] blacklist = new String[]{"ldap", "jndi"};
 for (String s : blacklist) {
 if (name.toLowerCase().contains(s)) {
 throw new RaspException("Reject malicious jndi lookup attempt");
 }
 }
 return params;
 }
}

License

Modified some code from the following repos

ronmamo/reflections

About

Simple Java Rasp

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

AltStyle によって変換されたページ (->オリジナル) /