撕开防线:从 RASP 常规绕过到 ASM 动态擦除 Hook 的进阶之路

 

📝 RASP对抗

RASP攻防实战

 
介绍:
Runtime Application Self-Protection (RASP) 是一种在应用程序运行时保护应用程序安全的技术。与传统的安全解决方案不同,如Web应用程序防火墙(WAF)或静态代码分析(SAST),RASP是一种内部安全控制机制,直接集成到应用程序或应用程序的运行时环境中。RASP技术能够监视应用程序的行为,实时检测和防御恶意攻击,并提供实时的安全保护措施,以确保应用程序的安全性和稳定性。
摘要:
RASP技术的实战攻防涉及多个方面,包括配置和部署RASP解决方案、模拟和测试攻击场景、以及响应和应对安全事件。在部署RASP时,需要根据应用程序的特点和安全需求进行定制化配置,包括监控的安全事件类型、防御策略和警报机制等。随后,通过模拟各种攻击场景,如SQL注入、跨站脚本(XSS)和文件包含等,来评估RASP的有效性和性能。一旦检测到安全事件,RASP会触发相应的防御机制,如拦截恶意请求、记录日志和发送警报,同时尽快采取修复措施,以减少攻击的影响和损失。通过实战攻防的训练和演练,可以提高团队对RASP技术的理解和应用能力,增强应用程序的安全防护能力,有效应对不断演变的安全威胁。
 
以下是一些RASP绕过的手段:

JNI调用bypass-rasp

其底层逻辑还是直接调用java-native去调用c++-lib进而执行命令, 而rasp-hook只能hook住java利用链,难以去捕捉jni最后的使用逻辑。

实现:

我们从哥斯拉源码入手 关键词 loadLibrary native
BehinderClientSource\src\main\java\net\rebeyond\behinder\payload\java\LoadNativeLibrary.java
notion image
  1. 定义jni.h头 使用头文件的jni创建一个CommandExecution_exec 将两个文件编译成linuxlib或者windows-dll
  1. 定义一个classloader装载
  1. 使用classloader装载命令执行类
  1. invoke执行或者反射加载classloader 命令执行类 c++lib
 
 

ASM-agent 致盲 javassist-rasp

 
最近在开发ASM-RASP(完成了openrasp一半的内容 缺只需要600kb的大小,而openrasp-engine需要30M)的时候,想到并测试了这个点
原理:采用ASM-agent→attch→java_web的方式.直接致盲javassist-rasp,其原理是因为ASM提供了对字节码的低级操作,使得用户可以精确地控制类的结构和行为,而javassist是抽象层次的操作字节码,直接使用java代码片段来修改类.说到底就是ASM比javassist更底层,而市面上一部分rasp,参考百度openrasp等都是采用的javassist-rasp(hook-web-操作→check→修改字节码).所以我们使用ASM-agent可以再javassist-rasp→hook前执行我们的去操作字节码.从而致盲它,且不会使javassist-rasp掉线,甚至只致盲一部分操作,使其大部分功能得到保留.
实战场景: 当我们bypass-rasp后获取web机器权限,又担心这个bypass技巧遭到排查修复. 那么我们可以写入我们自己的ASM-agent去致盲javassist-rasp
具体实现:检查hook→http类→检测到我们的攻击流量(比如我们在request包中自定义头ATTCK:yes)→mothodvisitor不修改字节码.
相关图片: 1.采用传统openrasp-premain方式实现rasp,能够执行拦截
notion image
notion image
notion image
notion image
notion image
会拦截并跳转到我二开openrasp测试用的自定义拦截界面(ip临时测试手动修改的)
  1. 使用我们的asm-bypass-agent 进行attach
notion image
notion image
此时再次访问测试漏洞靶场
notion image
成功bypass-openrasp
 
 
相关项目Link:
 
 
 
💡
有关RASP对抗指导或者使用上的问题,欢迎您在底部评论区留言,一起交流~
Loading...