Home

Awesome

PPPRASP

By. Whoopsunix

why jvm-sandbox?

发现 jvm-sandbox 从 1.4.0 开始支持 Native 的增强,正好写一个简单的 RASP Demo 来熟悉这个 AOP 框架(其实是懒得用从头用 ASM 写)。

RASP 真的很适合用来学 Java,复现、分析、防护,连贯性的学习会加深对 Java 的理解。

关于项目

🚩 陆续同步 JavaRce 项目实现基础漏洞的 HOOK,已实现的 CVE 触发检测可从 PPPVULNS 项目获取靶场

⭐️ 只有来自外部的请求才会进入 HOOK 点检测

🛰️ 目前定位为实验性质辅助 hook 研究,暂不考虑实际应用场景,性能问题、数据交互问题均不考虑

数据交互

关于 module 的长连接数据交互不考虑,具体原因可以看这个 issue,在实际的测试中也确实发现 jetty 存在不少的意料之外的问题(还算不上 bug)


0x00 Start

  1. 打包 ppprasp-agent

pom.xml 报错是正常的,不影响打包

mvn clean package -Dmaven.test.skip=true -Dmaven.javadoc.skip=true
  1. 下载 jvm-sandbox 二进制包
  2. 将打包好的项目移动到 sandbox/sandbox-module 文件夹下
  3. 启动

-javaagent

-javaagent:sandbox/lib/sandbox-agent.jar

或者 attach

# 进入沙箱执行脚本
cd sandbox/bin

# 挂载 目标JVM进程33342
./sandbox.sh -p 33342

# 卸载
./sandbox.sh -p 33342 -S

sandbox 其他

-d 可以向 Module 发送命令,eg. -d 'sandbox-info/version'

-P 开启 Jetty 接口,./sandbox.sh -p 80258 -P 1234

接口开启后可以通过 http 发送 -d 中的命令,eg. /sandbox/default/module/http/sandbox-info/version

这部分内容没有文档可以参考 sandbox-mgr-module 来自行构建

0x01 基本漏洞检测类型

暂时通过 rasp.yml 配置文件来配置漏洞检测

反序列化

漏洞名称Hook 点REST API备注
原生反序列化java.io.ObjectInputStream#resolveClass()/deserialization/case1
XML 反序列化org.springframework.context.support.AbstractXmlApplicationContext.<init>

内存马

内存马类型Hook 点REST API备注
Spring Controllerorg.springframework.web.servlet.handler.AbstractHandlerMethodMapping.MappingRegistry#register()见 JavaRce 项目
Tomcat Executororg.apache.tomcat.util.net.AbstractEndpoint#setExecutor()
Tomcat Listenerorg.apache.catalina.core.StandardContext#addApplicationEventListener()
Tomcat Servletorg.apache.catalina.core.ContainerBase#addChildInternal()
Tomcat Filterorg.apache.catalina.core.StandardContext#addFilterDef()

表达式注入

OGNL

Hook 点REST API备注
ognl.Ognl#getValue()/ognl/case1
ognl.Ognl#setValue()/ognl/case2

SPEL

Hook 点REST API备注
org.springframework.expression.MethodExecutor#execute()/spel/case1 /spel/case2 /spel/case3

JNDI 注入

Hook 点REST API备注
javax.naming.Context#lookup()/jndi/case1

JNI 注入

Hook 点REST API备注
java.lang.System#load()/jni/case1

命令执行

漏洞名称Hook 点REST API备注
命令执行java.lang.ProcessBuilder.start()/exec/case1 /exec/case4processBuilder
命令执行线程注入/exec/case2参考 jrasp 实现
命令执行java.lang.UNIXProcess.forkAndExec()/exec/case3 /exec/case5 /exec/case6processImpl processImplUnixProcess processImplUnixProcessByUnsafeNative

SQL注入

Hook 点REST API备注
com.mysql.cj.jdbc.StatementImpl 类查询语句/sql/mysql/case1

文件上传

漏洞名称Hook 点REST API备注
文件上传org.apache.tomcat.util.http.fileupload.FileItem.write()/file/upload/case2 /file/upload/case4
文件上传org.apache.commons.fileupload.FileItem#write()/file/upload/case3

路径遍历

漏洞名称Hook 点REST API备注
路径遍历java.io.File#listFiles()/file/directory/case1
路径遍历java.io.File#list()/file/directory/case2https://github.com/baidu/openrasp/issues/274

0x02 CVE漏洞触发检测

CVE 漏洞分成两类

支持漏洞

反序列化漏洞需要准确识别到调用了相关黑名单函数才会拦截,目前没有针对此补全,所以实际 CVE 检测时可能上报其他漏洞检测类型。

基本漏洞类型组件CVE
SPELSpring-messagingCVE-2018-1270, CVE-2018-1275
DeserializationApache DubboCVE-2019-17564
DeserializationApache DubboCVE-2020-1948