CD's second night

RASP对抗

type
status
date
slug
summary
tags
category
icon
password
 

📝 RASP对抗

RASP攻防实战

 
介绍:
Runtime Application Self-Protection (RASP) 是一种在应用程序运行时保护应用程序安全的技术。与传统的安全解决方案不同,如Web应用程序防火墙(WAF)或静态代码分析(SAST),RASP是一种内部安全控制机制,直接集成到应用程序或应用程序的运行时环境中。RASP技术能够监视应用程序的行为,实时检测和防御恶意攻击,并提供实时的安全保护措施,以确保应用程序的安全性和稳定性。
摘要:
RASP技术的实战攻防涉及多个方面,包括配置和部署RASP解决方案、模拟和测试攻击场景、以及响应和应对安全事件。在部署RASP时,需要根据应用程序的特点和安全需求进行定制化配置,包括监控的安全事件类型、防御策略和警报机制等。随后,通过模拟各种攻击场景,如SQL注入、跨站脚本(XSS)和文件包含等,来评估RASP的有效性和性能。一旦检测到安全事件,RASP会触发相应的防御机制,如拦截恶意请求、记录日志和发送警报,同时尽快采取修复措施,以减少攻击的影响和损失。通过实战攻防的训练和演练,可以提高团队对RASP技术的理解和应用能力,增强应用程序的安全防护能力,有效应对不断演变的安全威胁。
 
以下是一些RASP绕过的手段:
Title
shiro绕过流量检测(rememberme里添加非base64字符如$,!)
原理:org.apache.shiro.codec.Base64;中的实现base64Data = discardNonBase64(base64Data);里面的解码有去除垃圾字符的作用
绕过内存检测和静态检测
https://www.t00ls.com/articles-70842.html
SSRF-CRLF 注入攻击redis
https://www.cnblogs.com/-chenxs/p/11749367.html
SSRF-通过【curl命令】 注入攻击redis
https://www.cnblogs.com/-chenxs/p/11749367.html
SSRF-通过【gopher协议】 注入攻击redis
https://www.cnblogs.com/-chenxs/p/11749367.html
SSRF-使用dict协议向Redis数据库写shell
https://www.cnblogs.com/-chenxs/p/11749367.html
SSRF-通过【curl命令】和【gopher协议】对有【SSRF漏洞】的网站远程伪造post请求反弹shell
https://www.cnblogs.com/-chenxs/p/11749367.html
SSRF-gopher攻击MySQL
https://www.cnblogs.com/-chenxs/p/11749367.html
SSRF-gopher攻击fastcgi
https://www.cnblogs.com/-chenxs/p/11749367.html
部署使用jni的jsp webshell -> 进而执行命令来绕过rasp
https://cloud.tencent.com/developer/article/1541566 https://github.com/sry309/jniwebshell
针对百度openrasp-java反射hook修改变量值
反射的方式。修改rasp的HookHandler类的变量enableHook设置为false https://www.anquanke.com/post/id/195016#h2-2 绕过方式2二 https://paper.seebug.org/1785/
SQL注入绕过 - 新增无意义的参数
操作:新增一个参数(参数名为一个无意义的参数名即可),注意该参数需要在被注入参数的前面,以保证rasp先检测该参数。被注入参数中添加一段注释如下,新增参数值为注释的一部分(长度大于等于8即可)。 https://cloud.tencent.com/developer/article/1755588
PHP中在GOT表存放shellcode并执行绕过rasp
https://github.com/Mr-xn/Penetration_Testing_POC/blob/master/books/%E9%92%88%E5%AF%B9%E5%AE%9D%E5%A1%94%E7%9A%84RASP%E5%8F%8A%E5%85%B6disable_functions%E7%9A%84%E7%BB%95%E8%BF%87.pdf
Jni调用UnSafe的allocateInstance函数
目前大部分RASP产品都把命令执行功能的检测放到了UNIXProcess的构造方法上。 而像一些绕过方式如forkAndExec函数反射调用还是需要使用UNIXProcess去创建实例,最终造成rasp的拦截。 但是UnSafe的allocateInstance函数可以在不调用UNIXProcess构造方法的前提下生成实例,并且由于allocateInstance本身也是native函数,那么实际上我们整个命令执行的关键点上都是通过JNI来完成了,可以完美避开RASP的防御 https://paper.seebug.org/1785/ https://tech.meituan.com/2019/02/14/talk-about-java-magic-class-unsafe.html https://github.com/turn1tup/JvmRaspBypass
VM Anonymous Class 型内存码
https://paper.seebug.org/1785/
针对字节hidsderasp模块-通过反射机制修改检测规则
https://www.angelwhu.com/paper/2022/02/03/Java_MemoryShell_Elkeid_RASP_Protection/#0x03-Elkeid-RASP%E7%BB%95%E8%BF%87
通过Class重加载绕过Rasp
https://paper.vulsee.com/KCon/2021/%E9%AB%98%E7%BA%A7%E6%94%BB%E9%98%B2%E6%BC%94%E7%BB%83%E4%B8%8B%E7%9A%84Webshell.pdf
Tomcat-JNI 攻击方式
一般手法需要加载.so 的动态链接库才能进行调用,因此通常需要配合目标的文件上传漏洞和代码执行漏洞来调用已经上传的链接库,这种方式大大增加了漏洞利用的成本。而冰蝎作者提出了一种新的思路,通过已经有的 tomcatjni.jar 包 (在 Tomcat 环境中默认存在) 进行利用。 https://www.wangan.com/p/7fy786f60b67bd2c#4.2Tomcat-JNI%E6%94%BB%E5%87%BB%E6%96%B9%E5%BC%8F 4.2
熔断开关机制的利用-增大载荷-使rasp熔断
https://www.wangan.com/p/7fy786f60b67bd2c#4.4%E7%86%94%E6%96%AD%E5%BC%80%E5%85%B3%E6%9C%BA%E5%88%B6%E7%9A%84%E5%88%A9%E7%94%A8 4.4
Behinder/Godzilla 伪装恶意类
https://www.wangan.com/p/7fy786f60b67bd2c#4.4%E7%86%94%E6%96%AD%E5%BC%80%E5%85%B3%E6%9C%BA%E5%88%B6%E7%9A%84%E5%88%A9%E7%94%A8 4.5
SSRF 绕过- 解析绕过
利用的原理:解析URL时的规则问题。http://[email protected]与http://10.10.10.10请求是相同的。 payload:http://[email protected]:8080
SSRF 绕过-本地回环地址的其他表现形式
测试结果 http://127.255.255.254:8080/ http://127.1:8080 http://127.0.1:8080 http://0:8080
SSRF 绕过-IP的进制转换(钓鱼邮件常用于绕过检测)
未测试: • 点分十进制IP地址:http://216.58.199.78 • 八进制IP地址:http://0330.0072.0307.0116(将每个十进制数字转换为八进制) • 十六进制IP地址:http://0xD83AC74E或者http://0xD8.0x3A.0xC7.0x4E(将每个十进制数字转换为十六进制) • 整数或DWORD IP地址:http://3627730766(将十六进制IP转换为整数)
SSRF 绕过-封闭式字母数字 (Enclosed Alphanumerics)字符
经测试 rasp 无法解析 List: ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑪ ⑫ ⑬ ⑭ ⑮ ⑯ ⑰ ⑱ ⑲ ⑳ ⑴ ⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⑾ ⑿ ⒀ ⒁ ⒂ ⒃ ⒄ ⒅ ⒆ ⒇ ⒈ ⒉ ⒊ ⒋ ⒌ ⒍ ⒎ ⒏ ⒐ ⒑ ⒒ ⒓ ⒔ ⒕ ⒖ ⒗ ⒘ ⒙ ⒚ ⒛ ⒜ ⒝ ⒞ ⒟ ⒠ ⒡ ⒢ ⒣ ⒤ ⒥ ⒦ ⒧ ⒨ ⒩ ⒪ ⒫ ⒬ ⒭ ⒮ ⒯ ⒰ ⒱ ⒲ ⒳ ⒴ ⒵ Ⓐ Ⓑ Ⓒ Ⓓ Ⓔ Ⓕ Ⓖ Ⓗ Ⓘ Ⓙ Ⓚ Ⓛ Ⓜ Ⓝ Ⓞ Ⓟ Ⓠ Ⓡ Ⓢ Ⓣ Ⓤ Ⓥ Ⓦ Ⓧ Ⓨ Ⓩ ⓐ ⓑ ⓒ ⓓ ⓔ ⓕ ⓖ ⓗ ⓘ ⓙ ⓚ ⓛ ⓜ ⓝ ⓞ ⓟ ⓠ ⓡ ⓢ ⓣ ⓤ ⓥ ⓦ ⓧ ⓨ ⓩ ⓪ ⓫ ⓬ ⓭ ⓮ ⓯ ⓰ ⓱ ⓲ ⓳ ⓴ ⓵ ⓶ ⓷ ⓸ ⓹ ⓺ ⓻ ⓼ ⓽ ⓾ ⓿
SSRF 绕过-URL十六进制编码
http://%77%77%77%2e%62%61%69%64%75%2e%63%6f%6d
SSRF 绕过-利用30X重定向
测试结果如下: 需要服务端开启代码: from http.server import BaseHTTPRequestHandler, HTTPServer class RedirectHandler(BaseHTTPRequestHandler): def do_GET(self): self.send_response(302) self.send_header('Location', 'http://10.100.12.40:8080/') self.end_headers() if __name__ == '__main__': server_address = ('', 8000) httpd = HTTPServer(server_address, RedirectHandler) print('Server running at http://0.0.0.0:8000') httpd.serve_forever() ssrf访问: http://10.100.12.35:8000
SSRF 绕过-DNS解析
未测试 配置域名的DNS解析到目标地址(A、cname等),这里有几个配置解析到任意的地址的域名: nslookup 127.0.0.1.nip.io nslookup owasp.org.127.0.0.1.nip.io
SSRF 绕过-DNS重绑定
未测试: http://www.bendawang.site/2017/05/31/%E5%85%B3%E4%BA%8EDNS-rebinding%E7%9A%84%E6%80%BB%E7%BB%93/ https://cloud.tencent.com/developer/article/1942119
远程文件下载
起新线程绕过
https://www.wangan.com/p/7fy786f60b67bd2c#4.6%E9%80%9A%E8%BF%87%E6%96%B0%E5%BB%BA%E7%BA%BF%E7%A8%8B%E6%89%A7%E8%A1%8C%E7%BB%95%E8%BF%87 4.6
通过 WindowsVirtualMachine 注入 ShellCode 加载
https://www.wangan.com/p/7fy786f60b67bd2c#4.6%E9%80%9A%E8%BF%87%E6%96%B0%E5%BB%BA%E7%BA%BF%E7%A8%8B%E6%89%A7%E8%A1%8C%E7%BB%95%E8%BF%87 4.10
弱引用 GC
https://www.wangan.com/p/7fy786f60b67bd2c#4.11Java%E8%B7%A8%E5%B9%B3%E5%8F%B0%E4%BB%BB%E6%84%8FNative%E4%BB%A3%E7%A0%81%E6%89%A7%E8%A1%8C 4.12
高权限场景卸载 RASP
https://www.wangan.com/p/7fy786f60b67bd2c#4.13%E9%AB%98%E6%9D%83%E9%99%90%E5%9C%BA%E6%99%AF%E5%8D%B8%E8%BD%BDRASP 4.13
命令执行绕过-cp命令
使用cp命令将/etc/passwd复制到/tmp/passwd,然后再查看/tmp/passwd 同理可以测试其他命令如/bin/nc、/bin/wget等 可以调研测试一下

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...