一直想要把这部分的知识沉淀一下,最近看到井喷式的新内存马后有了一些小想法,所以整了这么个烂活,作为工具的同时也是一个知识框架。如果能方便大家那就更开心了,不好用也欢迎来issue里喷俺,只是喷完要对人家负责(doge,提出建设性建议


先拉一面大旗,从钱老的总体设计部可以看出顶层设计的重要性,抱歉调子起高了

内存马就是在容器本身的执行流程上,额外加上自己的操作逻辑。比如有个自动化工厂门没锁,我们溜进去,给流水线加一个专门贴狗头的机器,就是利用漏洞打内存马的过程。工厂就象征着Web应用服务器。

这个狗头机器是加在流水线开头、中间还是结尾,就对应着内存马打到Web应用服务器的不同组件里,流水线一般就是一次网络请求。

不同工厂的门有圆的有方的有菱形,所以我们的机器为了能偷运进去,就需要适配成不同的外形,但不论外形怎么变,它最终还是一台狗头机器。也就是说内存马要注入进不同的Web应用服务器,需要封装适配成不同的类,但最终还是用于执行某个操作。

我们要是想机器不止能贴狗头,而是能根据指示来决定贴上狗头、猫猫、嘤嘤鹰。外形什么的都不用变,只要升级一下贴纸模块。又或者某些安保好一点的工厂,说猫猫狗狗贴纸不得入内,我们就可以给机器加上一个二维码识别模块,运二维码进去机器内再解码成猫猫狗狗躲避安检。

贴纸模块就对应着执行体(比如执行系统命令、执行蚁剑客户端流量等),二维码模块就对应着解码器,而二维码生成器就是WebShell客户端的流量加密/编码函数。

各模块间能相互兼容,平滑替换为别的模块,在软件工程中叫做解藕。msmap做的事就是解藕组件类、编码器与执行体,把内存马这个大任务,拆分成拿context、注入组件、流量解密、代码执行等小目标。这么干除了方便自由组合外,也可以让新技术(Tomcat迟早要被师傅们插成TomShell)更快地应用在实战上。

同理客户端payload不依赖request等对象,解藕出功能执行部分,提供一个接口让外部自己解决输入输出,单论兼容性方面也会更好一点点

胡说八道完了,扯点踏实点的东西。用Python写主要是相对熟悉一些,但是命令行用着终究还是不太方便,不知道用Qt写GUI怎么样。目前这个选择菜单为了支持回退还费了点心思,本来用了另一种方式实现栈但是太别扭了。马子兼容性方面从beichen大佬的代码里偷师学到了用动态代理兼容javaxjakarta的办法,各种方法和类全部用反射,所以编译时不用依赖Tomcat的API了,但目前WsFilter还没调通所以这个还没能安排上自动编译。。。加载Killer本来准备兼容打包一下,后来想起yzddMr6大佬已经集成进了插件,我也就没必要再画蛇添足了。

最后希望自己能慢慢完善工具,让它支持更多容器组件,也算是作为逐渐成长的一种见证,与各位师傅共勉!