介绍:
RASP是一种安全技术,旨在通过在应用程序运行时实施保护机制来增强应用程序的安全性。它使得应用程序能够实时监控和防御潜在的攻击,而不依赖于外部的安全设备或控制措施。因为从 JDK 1.5 开始,Java 提供了一种动态代理机制,允许代理检测在 JVM 中运行的服务,通过插桩的方式修改方法的字节码,而 RASP 实际上就是通过 hook 系统的关键函数实现防护。
下面介绍两种 hook 函数机制。
java Agent
Java Agent 是一种特定于 Java 编程语言的工具,用于在 Java 虚拟机(JVM)启动时或运行中对 Java 应用程序进行监控、修改和增强。Java Agent 的功能主要依赖于 Java Instrumentation API,该 API 允许开发人员在字节码级别对 Java 类进行操作和修改。
Java Agent 的使用场景
1.
性能监控:通过跟踪方法调用、执行时间和资源使用情况,提高应用程序的性能分析能力。
2.
安全性增强:在方法调用过程中插入安全检查,确保访问控制和输入验证。
3.
日志记录和审计:自动捕捉方法入口、出口和异常信息,减少显式日志记录的需求。
4.
测试与调试:为测试工具提供支持,允许自定义行为的动态插入。
5.
静态分析:在类被加载时进行静态分析,提供编译时无法发现的错误和警告。、
attach 机制
该机制用于在 jvm 已经启动,但还需要对 jvm 中的类做一些修改。jdk1.6之后在Instrumentation中添加了一种agentmain的代理方法,可以在main函数执行之后再运行。
RASP绕过
1.WebShell通过底层类实现代码执行
1.
rasp会判断请求url是否为空来判断是否校验,判断条件需要一个环境上下文(请求线程)
我们只要开启一个新的线程,由子线程去调用
,Rasp判断并不是用户请求线程触发了hook函数,就会放行命令执行操作
但假如我们使用线程来执行命令
2. OpenRASP针对Java命令执行,只拦截到了java.lang.UNIXProcess.这一层,对更加底层的方法没有拦截
所以构造Webshell时会放弃 上层的代码,选择底层未被Hook的代码进行绕过执行命令
比较多的坑我直接贴入代码
2.通过 JNI 绕过
JNI 实现
该图是实现JNI编程的具体路
其实利用思路很简单就是利用 c 语言生成 dll 文件,然后利用 System.loadLibrar 来加载执行就行了。
本地实现 JNI
先编写写一个命令执行的 java 类
然后利用 javac 生成 h 文件
然后编写对应的 c 语言代码
然后执行下面命令编写为 dll 文件,
Win:
Linux:
最后编写一个 java 类加载 dll 文件进行命令执行
这样执行命令的时候就不是执行 Runtime 等方法了,可以绕过 RASP 了。
参考:https://cloud.tencent.com/developer/article/1958488
将恶意的对象打包为JAR包:
配置好清单,然后调用工件构造
参考文章:
https://www.freebuf.com/articles/web/337498.html
https://cloud.tencent.com/developer/article/1958488
java本地命令执行 - Longlone's Blog
原文始发于微信公众号(T3Ysec):JAVA绕过RASP限制
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论