OpenRASP攻防之内存马防御

    “Gartner在2014年提出了应用自我保护技术(RASP)的概念,即将防护引擎嵌入到应用内部,不再依赖外部防护设备。OpenRASP是该技术的开源实现,可以在不依赖请求特征的情况下,准确的识别代码注入、反序列化等应用异常,很好的弥补了传统设备防护滞后的问题。”但是OpenRASP仍有其不足之处。根据测试,OpenRasp无法对内存马进行检测,所以便想对OpenRasp进行二次开发来检测内存马。
    根据OpenRasp官网的说明文档,要对OpenRASP二次开发,为Java服务器添加新的hook点大致分为三步,第一步为添加hook点,根据自己的hook点在com.baidu.openrasp.hook包中欧给添加一个继承自AbstractClassHook的类,并实现getType和isClassMatched两个方法进行hook点的匹配,并在hookMethod方法中的内部类的onMethodEnte方法和onMethodExit方法进行hook点前后的逻辑插入,并实现的hook点加入com.baidu.openrasp.transformer.CustomClassTransformer的构造方法中,实现字节码的转换;第二步添加检测类型,在 com.baidu.openrasp.plugin.checker.CheckParameter 中添加相应的检测类型;第三步为构造参数并进入checker,编写hook点中调用的方法,来实现具体的检测逻辑,检测逻辑中可以调用js插件。
    通过分析网上weblogic filter内存马的注入代码,发现关键函数为registerFilter,因此可以定义一个hook类,hookMethod匹配该函数,并且该函数的第一、第二、第三个参数分别为filter名称、filter类名、filter的访问url,所以可以将这三个参数传递到要插入到hook点前的代码中,检测代码将这些参数给第三步的自定义checker,checker主要根据这些参数创建详细的告警日志,方便网络安全运维人员后期查看分析、溯源等。
    通过分析哥斯拉webshell管理工具的tomcat servlet内存马注入代码和逻辑,发现关键函数为调用addWrapper,tomcat目前的主要版本为6-10,由于该函数在不同的版本中函数签名信息不同,所以需要针对不同的版本进行hook。经过分析该函数的签名可分为三类,分别为6,7,8-10,故在hook前先利用ServerInfo类的getServerInfo函数获取到tomcat版本号。addWrapper函数的第二、第三个参数分别为servlet的访问url、要填的servlet封装类wrapper,所以可以将这两个参数传递到要插入到hook点前的代码中,通过依次反射调用wrapper的getServletName和getServletClass可获取servlet的名称和servlet的类名,检测代码将这些信息传递给第三步的自定义checker,checker主要根据这些参数创建详细的告警日志。
    通过分析网上SpringBoot controller内存马的注入代码,发现关键函数为registerMapping,因此可定义一个hook类,hookMethod匹配该函数,并且该函数的第一、第二参数分别为http请求的封装类requestMappingInfo、controller类,所以可以将这两个参数传递到要插入到hook点前的代码中,通过依次反射调用getPatternsCondition、getPatterns可获取controller的访问url和controller的类名,检测代码将这些参数传递给第三步的自定义checker,checker主要根据这些参数创建详细的告警日志。
    下面为weblogic内存马的检测效果截图
    
    
    tomcat内存马的检测效果截图

    SpringBoot内存马的检测效果截图

    插件检测哥斯拉

评论

此博客中的热门博文

Cobalt Strike automigrate自动迁移进程脚本

菜刀连接php一句话木马返回200的原因及解决方法

vultr安装kali linux 折腾笔记