目录

openrasp扫描器初探

目录

打算写一个rasp拦截器,先学习一下百度的openrasp # 试用openrasp 根据官方文档https://rasp.baidu.com/doc/配置
搭建漏洞环境

@Service
public class RCEServiceImpl implements RCEService {
    @Override
    public String rce1(String data) {
        try {
            Runtime.getRuntime().exec(data);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "ok";
    }
}

@Controller
@RequestMapping("/rce")
public class RCEController {
    @Autowired
    RCEService rceService;


    @RequestMapping("/rce1")
    public String rce1(String data) {
        return rceService.rce1(data);
    }
}

访问
http://127.0.0.1:8088/rce/rce1?data=open+-na+Calculator.app


但是我们执行Calculator.app默认是无法拦截的,我们有两种方式配置
第一我们需要添加插件中的匹配规则,在rasp/plugins/official.js中找到如下,并添加匹配规则

// 命令注入 - 常见命令
command_common: {
    name:    '算法3 - 识别常用渗透命令(探针)',
    action:  'block',
    pattern: 'cat.{1,5}/etc/passwd|nc.{1,30}-e.{1,100}/bin/(?:ba)?sh|bash\\s-.{0,4}i.{1,20}/dev/tcp/|subprocess.call\\(.{0,6}/bin/(?:ba)?sh|fsockopen     \\(.{1,50}/bin/(?:ba)?sh|perl.{1,80}socket.{1,120}open.{1,80}exec\\(.{1,5}/bin/(?:ba)?sh|\\{echo,.{10,400}{base64,-d}|Calculator'
},

第二通过后台配置,并在后台管理页面修改防护规则

  1. 在rasp/conf/openrasp.yml添加后台配置

    cloud.enable: true
    cloud.backend_url: http://127.0.0.1:8086/
    cloud.app_id: 6e3822e400db378aa9ab0809edb81150f49e735d
    cloud.app_secret: AMbqJUCN3CxpFqyEWWKaLFcYLd3UhHKhhyEMcm4NnMJ
    cloud.heartbeat_interval: 90
  2. 修改后台防护规则(命令执行 算法3 - 识别常用渗透命令(探针))

# 写项目 ## 我们启动项目的时候使用的如下命令

java -javaagent:rasp/rasp.jar -jar spring-boot-vulnable-0.0.1-SNAPSHOT.jar

rasp默认以agent-jar的形式,也就是需要我们了解agent如何编写,agent如何拦截用户输入的。
同时漏洞以插件的形式灵活配置,这块也需要额外留意。

根据文章https://www.bmabk.com/index.php/post/65498.html
当Java 虚拟机启动时,在执行 main 函数之前,JVM 会先运行-javaagent所指定 jar 包内 Premain-Class 这个类的 premain 方法。先写个小demo实现以下此功能。

public class PreMain {
    public static void premain(String agentArgs, Instrumentation inst) {
        System.out.println(agentArgs);
        for (int i = 0; i < 5; i++) {
            System.out.println("premain is loading.....");
        }
    }
}
Manifest-Version: 1.0
Premain-Class: com.m4ra7h0n.rasp.PreMain

打包时配置一下pom.xml(详见上文链接)然后在springboot项目里配置一下classpath参数,运行即可使用javaagent


学习一波思路
https://xz.aliyun.com/t/12536
https://www.jianshu.com/p/70154dc5a9ff
https://www.jianshu.com/p/85eba062b9c1
https://www.jianshu.com/p/731bc8293365
https://www.jianshu.com/p/0bbd79661080
https://www.cnblogs.com/stateis0/p/9062201.html

javassist刷官方文档
https://www.javassist.org/tutorial/tutorial.html

先写个小demo,捕获rce1的参数并打印

public static void premain(String agentArgs, Instrumentation inst) {
    inst.addTransformer(new ClassFileTransformer() {
        @Override
        public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
            String target = "com.xjjlearning.hack.service.impl.RCEServiceImpl";

            if (className.equals(target.replace(".", "/"))) {
                System.out.println(className);

                try {
                    CtClass cc = cp.get(target);
                    CtMethod rce1 = cc.getDeclaredMethod("rce1");
                    rce1.insertBefore("" +
                    "System.out.println($1);" +
                    "if ($1.indexOf(\"Calculator\") != -1) {" +
                    "   return \"ok\";" +
                    "}");

                    classBeingRedefined = cc.toClass();

                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            return new byte[0];
        }
    });

}

效果杠杠的,先打印,遇到Calculator则提前返回 后面还有很多问题,开始看openrasp源码分析吧。今天先到这里