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'
},
第二通过后台配置,并在后台管理页面修改防护规则
在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
修改后台防护规则(命令执行 算法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源码分析吧。今天先到这里