在日常的渗透测试中,我们直接将metaspolit、CS等工具直接生成的恶意程序或代码发送到目标系统时,通常会遇防病毒和入侵检测系统的查杀。这使得我们的程序被拦截或者运行不稳定。有时候IP还会直接被封杀,增加了我们的攻击难度,这篇文章中,将为大家分享一些自己免杀的学习方法论,一些常用的AV和IDS规避技术,可以用于绕过一些安全软件。
通过一定规律的编码算法,将对metaspolit、CS生成的shellcode进行编码/模糊处理/变形,从原始shellcode中删除所有无效的字符,从而逃避杀毒软件检测。
编码算法
可以使用多种算法对Shellcode进行编码,包括(但不限于):
1、在特定位置添加垃圾字节 2、使用硬编码的单字节密钥对字节进行XOR或者加减法运算 3、将字节移位某些特定位置 4、交换连续字节
或以任何一种或多种技术的复合。
先来一个简单的编码方法,我选择了一个名为加法和减法(ADD,SUB)这是最早的一种加密方式。
77+eb=162 是n = 77是我们加密的密码,原始字节中的的每个字符都与77相加。关于这个加密数,我们需要找从(0-255)个字节中找出一个与代码相加都不是坏字符的数,来作为我们的加密密码。这就需要我们自己去循坏计算,这里不写具体的编成实现代码。
选择它的原因很简单:
这个很容易实现,并且所有初学者都容易理解。最后,我们把解码器放在shellcode之前,每个字都将与指定的字节进行减法运算,最后得到我们的原始的code
在来一个相对复杂一些的,采用多种算法的复合编码。
1、进行NOT操作
2、ADD通过为0x1字节
3、在(0-255)中找一个随机字节,将字节与随机字节进行XOR,并在shellcode默认添加该字节,作为结束标记符
4、在这些字节之间插入随机字节
编写自动化编码工具
解码器的内容很简单,解码器的下方是我们的加密后的代码。每次拿出一个字节与77字节相减,将计算结果存入ESI寄存器。
global _start section .text _start: jmp short call_decoder decoder: pop esi decoder_loop: ;在我们shellcode的末尾,同样放置加密字符,当解码到文件末尾的时候,可以直接跳转到shellcode地方执行 sub byte[esi],77; jz shellcode inc esi jmp short decoder_loop call_decoder: call decoder
首先,我们需要将解码的shellcode放在某个地方,我们使用JMP指令跳转到执行解码器函数的地方,最后使用POP ESI将shellcode地址放在ESI寄存器中间。我们首先要做的就是删除shellcode每个字节中间的随机字节。先来看一下shellcode的规律
A r B r C r D r E r F r G e ESI ESI+2 ESI+4 EDI EDI+1
ESI寄存器每次加2就是shellcode的位置
EDI加1就是运算后存放的位置
首先加密字节应该注意的是,加密字节和加密后的字节都不应该包含坏字符。不是每个字节都手动与指定字节进行运算的。然后处理未编码的shellcode中的每个字节-我创建了一个小的Python脚本,可以帮自动完成这些计算。
在选择加密字节的时候,我们是从0-255中随机便利选择的,这意味着两次对相同的code进行编码可能不会两次产生相同的输出。
我们使用编写器对code进行编码得到
代码
\xeb\x09\x5e\x80\x2e\x9e\x74\x08\x46\xeb\xf8\xe8\xf2\xff\xff\xff\xdf\xe0\xe1\xe2\x9e
通过ollydbg进行调试,code被成功解码
通过msf生成一个一段shellcode,我们对shellcode进行编码加密
使用自动化脚本对shellcode进行加密
检查功能效果
最后通过virScan扫描看一下效果,国内杀软都可以过。
全程录制了个视频,直接上视频来看看这方方法的免杀效果吧。
https://video.kuaishou.com/short-video/3xr4v2423yz48jq
这里只说实现方法,代码准备做以整套的,暂时不公布,有需要的同学,可以联系我