几多内存马怎么搭建

极客

几多内存马怎么搭建?我踩了三天坑,终于摸透了!

哎,朋友们,说到这个“几多内存马怎么搭建”,我真是又爱又恨啊!你们知道吗,我上周为了这事儿,整整熬了三个通宵,头发都快薅光了!今天必须把这血泪经验分享给你们,免得你们再走弯路。

几多内存马怎么搭建

初识内存马:这玩意儿到底是个啥?

说实话,我第一次接触“内存马”这个概念的时候,整个人都是懵的,啥是内存马?跟普通的Webshell有啥区别?后来我才明白,内存马就像是寄居蟹,它不落地、不写文件,就靠内存活着,你说厉害不厉害?

关键点来了:内存马的搭建可不是简单的上传文件那么简单,它讲究的是“隐身”和“持久”,我刚开始以为跟普通后门一样,结果连最基本的存活都保证不了,那叫一个惨啊!

最基础的内存马搭建方式(亲测有效!)

Filter型内存马

哎呀,这个我得重点说说!最经典的就是Filter型了,它的特点是啥呢?就是沿着Servlet这条线,找个中间节点,然后把自己的逻辑织进去。

我的搭建步骤(绝对干货)

  • 先找到目标的Spring框架(这步简单,看路径就能发现)
  • 动态注册一个Filter(这里要特别注意,必须拿到StandardContext)
  • 用Thread.sleep来避免初始化冲突,不然必炸!

你们知道我第一次试的时候有多狼狈吗?代码写好了,一运行直接报NullPointerException,我当时心里那叫一个崩溃啊!后来才发现,原来是Context没找对,得用while循环遍历ThreadLocal才能拿到。

Listener型内存马

这个我倒是挺喜欢的,因为它的触发机制比较稳定,不过搭建的时候也有坑,最烦的就是必须要绕过默认的SecurityManager安全检查。

我把代码都试了个遍,最后发现一个诀窍:用反射去修改AccessControlContext,这个方法虽然有点黑科技,但确实是能成功的,哈哈!

进阶:自定义ClassLoader注入

这个部分,说真的,我得承认我是备受折磨,自定义ClassLoader注入内存马,说起来简单,做起来简直要命!

我是这样做的:

  • 创建一个恶意的ClassLoader
  • 重写loadClass方法,在加载指定类时插入恶意字节码
  • 利用Thread.contextClassLoader来触发

重点来了,如果你直接new一个ClassLoader,大概率会被识别出来,我可是花了一天多时间才想到,要先改变当前线程的ContextClassLoader引用,然后再触发加载逻辑。

内存马的持久化问题(差点让我崩溃!)

哎呀妈呀,说到持久化这个问题,我是真的想砸电脑!内存马虽然隐蔽,但服务一重启,马儿就没了,这怎么能行?

我的解决方案是:结合计划任务或者注册表启动项,在系统启动的时候自动加载一个loader,然后由这个loader再把马儿拉起来,这样就完美解决了重启失联的问题,真的,当时成功那一刻,我都想唱歌了!

我得提醒你们,这个操作需要一定的系统权限,不然搞不定,而且要注意别把自己的服务器给搞崩了,我有一次就是写错了注册表,结果导致整个系统起不来,郁闷了好一阵子。

实战经验总结(敲黑板!)

好了好了,说到最后,我得把我这些天的经验总结一下,你们可拿小本本记好了:

  1. 环境探测先行:先确认目标环境(Tomcat版本、JDK版本),不同版本注入逻辑有差异
  2. 异常处理要周到:内存马搭建过程中,各种异常随时可能发生,一定要细心处理
  3. 调试工具要备好:我在实践中最常用的就是Arthas,它帮我看了好多JVM内部运行状态
  4. 权限分配控制好:又不是所有操作都需要高权限,合理控制能减少很多报错

防检测的小技巧(不是教坏你们哦)

虽然我前面讲了这么多怎么搭建内存马,但我也得说一句,这只是为了技术研究啊!你要真拿去搞破坏,我可不负责!

不过既然你们想了解,我就说说防检测的常规手段:

  • 混淆类名,别让人一眼看出是恶意类
  • 隐藏网络连接,尽量用Dns或ICMP这种不常见的信道
  • 动态修改类字节码,让安全设备无法静态分析

文章版权声明:除非注明,否则均为极客网安-咸鱼原创文章,转载或复制请以超链接形式并注明出处。

目录[+]