浅谈RASP技术攻防之RASP技术的其他方面应用(3) 老男孩网络安全周末班

    /    2019-07-10

六、举“栗子”

1.如何在Java中实现RASP技术

目前笔者我参与研究&研发了JAVA版本的RASP技术,下面给大家简单的进行讲解。

在jdk1.5之后,java提供一个名为Instrumentation的API接口,Instrumentation 的最大作用,就是类定义动态改变和操作。开发者可以在一个普通Java程序(带有 main 函数的 Java 类)运行时,通过 – javaagent参数指定一个特定的 jar 文件(包含 Instrumentation 代理)来启动 Instrumentation 的代理程序。

关于premain的介绍,大家可以去我博客看一下:java Agent简单学习

关于ASM的介绍以及使用,大家可以看一下下面的介绍:ASM官方操作手册AOP的利器:ASM3.0介绍关于ASM的时序图,我这边引用一下IBM上的一张图: 

1.jpg

正文开始

首先编写一个premain函数,然后在premain中添加一个我们自定义的Transformer。 

2.jpg

我们的Transformer需要实现ClassFileTransformer接口中的transform方法,我这边就简单的先进行一个打印包名的操作。 

3.jpg

在编译以后,运行结果如下: 

4.jpg

由此可见我们的transform已经生效了。 我们来简单的类比一下加入agent以及未加入agent的过程。 

5.jpg

由此可见,在使用了transform以后,可以对jvm中的未加载的类进行重写。已经加载过的类可以使用retransform去进行重写。 在java中有个比较方便的字节码操作库,ASM(ASM是一个比较方便的字节码操作框架,可以借助ASM对字节码进行修改,这样就可以实现动态修改字节码的操作了。ASM介绍

ClassVisitor接口,定义了一系列的visit方法,而这些visit方法。

下面这段代码是对方法进行重写的一个过程。

首先定义一个ClassVisitor,重写visitMethod方法。 

6.jpg

可以看到该方法返回的对象为MethodVisitor(后面简称mv),我们如果要修改其中的逻辑过程,需要对mv进行操作,下面展示一个简单的修改代码的过程。 

7.jpg

上面visitCode中代码的大概意思为,插入一个调用TestInsert类中的hello方法,并且将一个数字8压入进去。 TestInsert类的代码如下:

8.jpg

如果不出意外,运行jar包以后将输出类似下面这样的信息:

9.jpg

可以看一下加入agent运行以后的类有什么变化。

源代码:

10.jpg

加入Agent运行以后的源代码:

11.jpg

可以看到代码:

System.out.println(TestInsert.hello(8));

成功在:

System.out.println("Hello,This is TestAgent Program!");

之前运行,而调用TestInsert.hello这个方法在源代码中原来是没有的,我们是通过java的agent配合asm对运行的字节码进行了修改,这样就达到了埋点hook的目的。

在了解了上面的技术以后,就可以其他对关键的点进行hook了,hook的方法大同小异,这里仅仅是抛砖引玉,大家自行发挥。可以给大家推荐一个园长师傅写的一个简单例子: javaweb-codereview

笔者展示的该例子项目地址为:javaagent

2.如何在PHP中实现RASP技术

关于php中的rasp技术实现,笔者我还没有进行深入研究,大家可以参考以下两个开源的扩展进行研究,笔者接下来也准备研究php方面的rasp技术实现,欢迎大家一起讨论。

(1)xmark
(2)taint

七、RASP技术的其他方面应用场景

在RASP技术实现的过程中,我横向了遐想一些其他的用法以及参考了一下其他rasp产品的功能点,比如:

代码审计

对于rasp中运用到的技术,换一种思维方式,可以不进行拦截,而进行记录,对所有记录的日志结合上下文进行代码审计。

0day防御

对已经hook的关键点进行告警通知并且要拦截攻击行为,然后在公网部署多种不同cms的web蜜罐。如若已经触发到了告警通知,那么已经证明攻击已经成功。且拦截到的漏洞可能为0day。

攻击溯源

对所有攻击ip以及攻击的文件进行聚合,用时间轴进行展示。这样就可以定位到黑客是从上面时候开始进行攻击的,攻击中访问了哪些文件,触发了哪些攻击拦截。然后对所有大致相同的ip进行归类,可以引出来一个专业用于攻击溯源的产品。

DevOps

对所有事件详细信息提供完整的执行路径,包括代码行,应用程序中使用的完整上下文查询以及丰富的属性详细信息。

其他方面

当然Rasp技术的应用场景肯定不止这么多,还有其他很多方面的一些应用场景,大家可以发散思维去想。本文章仅用于抛砖引玉。

八、RASP技术有什么缺陷

● 不同的编程语言可能编译语言和应用程序的版本不一致都导致RASP产品无法通用,甚至导致网站挂掉;

● 如果RASP技术中对底层拦截点不熟悉,可能导致漏掉重要hook点,导致绕过;

● 对于csrf、ssrf、sql语句解析等问题目前还是基于部分正则进行防护(对于sql语句的解析问题可以使用AST语法树进行解析)。

……

九、总结

目前RASP还处于一个发展的阶段,尚未像防火墙等常见的安全产品一样有非常明确的功能边界(scope),此文仅抛砖引玉,更多由RASP防御技术的用法可以发挥想象,比如日志监控、管理会话、安全过滤、请求管理等。 在研究RASP技术的时候,我发现RASP与APM有着部分相同的技术,APM本意是用于监控应用程序的,反转思路,在APM中监控应用程序的时候加入漏洞防护功能,即可形成了一个简单的RASP demo。在APM这方面,大家参考的对象可就很多了,比如:skywalkingnewrelic等,skywalking是开源产品,在github上就可以直接查看其源代码,而且是Apache的项目,而newrelic的所有agent都没有进行任何代码混淆,官方安装文档也很丰富,这些都是可以进行参考的。 由此可见,有时候技术换个平台、换个想法,就是一个完全不一样的东西了。所以对于任何技术都可以发散性的去想象一下其他的应用场景,万一恰到好处呢? 不论研究的技术是什么样的,可能大家实现的方式不一样,使用的技术不一样,使用的名称不一样,不过最终的目的就是为了保护应用程序安全,防止攻击者入侵成功。

十、参考

https://searchsecurity.techtarget.com/opinion/McGraw-on-why-DAST-and-RASP-arent-enterprise-scale

http://www.cnblogs.com/kingreatwill/p/9756222.html

https://techbeacon.com/security/it-time-take-rasp-seriously

https://www.gartner.com/doc/2856020/maverick-research-stop-protecting-apps

https://github.com/anbai-inc/javaweb-codereview/tree/master/javaweb-codereview-agent

https://www.03sec.com/3232.shtml


*本文作者:安百科技,文章转载来自于:FreeBuf.COM


(0)

分享至