简介

接上篇 渗透利器Cobalt Strike - 第1篇 功能及使用 - 先知社区

本文主要讲解,模拟APT手法对Cobalt Strike生成的程序进行全面免杀,实现了 完全不被检测 FUD(Fully undetectable)。

最终stager在以下方面实现了成功躲避:

  • 文件查杀(Signatured Static Scanning)
  • 内存扫描(Run-time Analysis)
  • 流量分析(NIPS/NIDS)
  • 行为分析(behavior Monitoring)

这是对victim进行稳定控制的基础。

免杀的多个维度

免杀就是逃避查杀的意思。通常需要多个维度进行免杀,概览免杀技术如下:

  • 对抗-静态扫描
    • 1.shellcode加密
      • 逃避原理:避免被杀软直接获取到真正shellcode(因为性能等原因 杀软不会暴力枚举以解密内容)
      • 局限:使用了加解密函数 文件size可能会变大
    • 2.文件不落地
      • 逃避原理:文件不落地 难以被捕获样本
      • 局限:不落地方案的任何操作都被提示。如Powershell的任何操作都会被杀软提示“是否允许执行”。另外微软为Powershell等程序提供了扫描接口Antimalware Scan Interface (AMSI)以便对接受的数据进行扫描。
    • 3.源码级修改
      • 逃避原理:自主开发程序,源码级的修改较容易实现"变种",避免杀软报毒(因为从未被捕获分析 应该不会被杀 所以建议一个样本仅对某一目标攻击)
      • 局限:彻底改写源码难度大
    • 其他
  • 对抗-内存扫描
    • 1.DLL加载
      • 逃避原理:杀软为了不影响系统性能,通常对DLL加载的审查宽松(加载途径:自己编程实现dll加载器 或 进行"dll hijacking")
      • 局限:文件落地
    • 2.自定义加载器(Customer Loader)
      • 逃避原理:使用不同编程语言实现的shellcode Loader,运行机制较不同,杀软可能没有足够精力跟进各种形式的加载器(如C#使用虚拟机解释后运行 Golang编译运行 等)
      • 局限:文件落地
    • 其他
  • 对抗-流量分析
    • 1.白域名方法 - Domain Fronting
      • 逃避原理:借用CDN实现"隐藏"C2服务器的真实ip 避免溯源分析 C2流量 -> CDN ip -> C2 Server ip
      • 局限:使用CDN,可能需要实名认证(可考虑以其他身份注册)
    • 2.白域名方法 - 借用知名网站
      • 逃避原理:将"命令数据"加密处理发布在知名网站 即可实现被控端通过知名域名获取C2命令 避免流量特征告警 避免溯源分析
        • 国内 可被公开访问的页面 weibo.com users.qzone.qq.com
        • 国外 可被公开访问的页面 google、twitter、pastbin、telegram ...
      • 局限:使用知名站点,可能需要实名认证(可考虑以其他身份注册)
    • 3.DGA域名 - DGA域名生成算法
      • 逃避原理:使用dga可以试图连接多个C2域名 从而避免"单一C2域名/ip特征被当作IoC后引发报警"这一报警机制(黑名单) 大大增加了C2架构稳定性
      • 局限:dga生成的域名可能被机器学习识别为恶意的. dga需要注册不止一个域名. 可被持续追溯得到多个C2服务器ip.
    • 其他
  • 对抗-行为分析
    • 1.指定特定的运行条件
      • 逃避原理:即符合一定的条件才会进行"恶意的"操作行为。从而避免该程序在VM、沙箱、逆向人员的眼皮底下进行恶意操作
      • 局限:可能会限制运行环境,导致缩小可运行的目标范围(如只能在某个指定域中计算机才能运行该程序)
    • 其他
  • 对抗-逆向分析
    • 1.加壳
      • 逃避原理:通过加壳等方式延长被逆向分析人员彻底分析的时间
      • 局限:没有绝对的反逆向保护,只能增加逆向分析难度
    • 其他
  • 对抗-机器学习
    • client ML - 杀软客户端内置的轻量级机器学习模型
    • Cloud ML - 相关ML技术及训练数据不得而知

注意:逃避技术是和杀软技术的长期对抗。所有高超的逃避技巧都迟早被威胁检测技术发现。因为他们有尖端的技术和人才。

对抗-流量分析

这里使用Cobalt Strike的C2配置文件,来将C2流量伪装成正常流量。以尽量避免被NIDS报警、SOC系统安全运营人员等发现流量异常。

Cobalt Strike的C2配置文件,定义了 victim 与 团队服务器 之间的C2通信流量的“通信格式规范和方式”,通常安全人员就是从C2通信流量中寻找“流量特征”的。

我这里考虑使用jQuery作为C2配置文件,也就是victim和团队服务器之间的C2流量是伪装成了“某用户系统的浏览器与某web服务器之间正常交互的WEB流量”,具体就是,通常很常见的“从浏览器获取jQuery这一JavaScript文件”有关的web流量。

为此,我写了个C2配置文件1135-CobaltStrike-ToolKit/malleable_C2_jQuery_c2.3.11_CN_cdn.bootcss.com.txt

通过查看文件可以发现,我把伪装成某终端浏览器与国内这个jQuery的CDN站点cdn.bootcss.com的web流量(http协议),更详细的见配置文件。

团队服务器

本次测试中,团队服务器ip为10.211.55.5
在这里指定 定制的C2配置文件

启动团队服务器 命令如下:
sudo ./teamserver 10.211.55.5 U9assw0rd '/home/yourname/Desktop/malleable_C2_jQuery_c2.3.11_CN_cdn.bootcss.com.txt'

多种上线方式介绍

从团队服务器可以看到,本次测试使用了ip上线。

一些可选的其他上线方式,及其优劣 参考如下:

  • ip上线
    • 缺点:如果被分析到ip地址,很容易提取到IoC,从而被检测,C2通信被阻断
  • 域名上线(使用一个域名做C2)
    • 优点:使用C2域名的DNS A记录,域名解析到自己的C2服务器的ip,ip可随时更改。
    • 缺点:如果被分析到域名,很容易提取到IoC,从而被检测,C2通信被阻断。
  • DGA域名上线 (使用若干个域名 很大程度上保证C2通信)
    • 优点:如果能够自写远控(这样的自定义程度最高),使用dga上线,可以避免“C2域名被拉黑”导致的无法通信。
    • 缺点:DGA域名也可能被机器学习模型检测到。

可以发现不同上线方式具有不同的C2通信的稳定性,本次只做演示,就使用最简单的ip上线方式。

生成payload

打开Cobalt Strike客户端,进行常规操作:

  • 创建一个http监听器
  • 生成payload

Attacks -> Packages -> Payload Generator

生成了一段payload \xfc\xe8\x89...
(如果在某个不安装杀软的系统中,只要有stager执行了本段payload,则可实现对这个系统的控制。)

为了避免stager被企业的终端安全软件查杀,接下来,要对这段payload进行文件免杀。

对抗-终端安全

注意:关注文件免杀的原理、方法,而不是工具使用,工具只是辅助完成我们的免杀目的。
本次具体使用Veil进行文件免杀。

Veil搭建与概览

Veil 在Docker使用即可:
拉取镜像
docker pull mattiasohlsson/veil
启动容器
docker run -it -v /tmp/veil-output:/var/lib/veil/output:Z mattiasohlsson/veil
其中/tmp/veil-output为我物理机Mac系统的路径,Docker中的Veil将生成的17yes.exe等文件(见下文),存储在这个目录中。

Veil自动启动,主要分为两个功能:

[*] Available Tools:
    1)  Evasion
    2)  Ordnance

#1 Evasion功能 用来做文件免杀(就选这个)

#2 Ordnance功能 用来快速生成MSF stager shellcode的工具(类似msfvenom)。
    可以生成6种payload:
    1)  bind_tcp          => Bind TCP Stager (Stage 1)
    2)  rev_http          => Reverse HTTP Stager (Stage 1)
    3)  rev_https         => Reverse HTTPS Stager (Stage 1)
    4)  rev_tcp           => Reverse TCP Stager (Stage 1)
    5)  rev_tcp_all_ports => Reverse TCP All Ports Stager (Stage 1)
    6)  rev_tcp_dns       => Reverse TCP DNS Stager (Stage 1)

我们现在需要文件免杀,所以选1。
use 1

在此暂停下,先介绍“原理 - Veil的文件免杀原理”,然后再看实操“实操 - 文件免杀”。

原理 - Veil的文件免杀原理

Veil使用以下方法实现文件免杀:

  • 将payload以加密形式保存
    • aes
    • des
    • ...
  • 判断运行环境是否是目标的运行环境(反沙箱 反虚拟机)
    • 进程数量
    • cpu核数
    • 当前计算机加入的域的名称
    • 当前计算机的计算机名
    • 当前系统的用户名
    • 当前running的进程数
    • ...
  • 混淆
    • 对源代码中的变量名进行混淆(见对17yes.go源代码的讲解部分)
  • 内存申请方式
    • stager以RW权限申请内存 -> 将shellcode写入这部分内存 -> 将内存权限从RW更改为RX -> 调用CreateThread和WaitForSingleObject

内存申请方式

传统内存申请方式:stager程序使用RWX(读,写和执行)权限申请内存,将shellcode写入这部分内存,创建一个线程来执行shellcode,等待shellcode完成运行(即退出Meterpreter或Beacon)即可退出stager程序。

“传统内存申请方式”可能被反病毒引擎、沙箱引擎视为恶意的。

其实为了内存免杀效果,Veil 从3.1版本开始,shellcode_inject几乎不会使用“传统内存申请方式”申请内存空间。而是使用“渐进的内存申请方式”。

渐进的内存申请方式:stager程序以RW(读,写)权限申请内存内存,此时stager程序能够将shellcode写入这部分内存。stager将调用[VirtualProtect]函数(https://docs.microsoft.com/zh-cn/windows/desktop/api/memoryapi/nf-memoryapi-virtualprotect)将内存权限从RW更改为RX(读,执行),然后stager将继续正常调用CreateThread和WaitForSingleObject。

具体分析见下文,以本次生成的17yes.go为例讲解“渐进的内存申请方式”。

实操 - 文件免杀

打开Veil use 1之后,使用list 看到到41种stager:

[*] Available Payloads:

    1)  autoit/shellcode_inject/flat.py

    2)  auxiliary/coldwar_wrapper.py
    3)  auxiliary/macro_converter.py
    4)  auxiliary/pyinstaller_wrapper.py

    5)  c/meterpreter/rev_http.py
    6)  c/meterpreter/rev_http_service.py
    7)  c/meterpreter/rev_tcp.py
    8)  c/meterpreter/rev_tcp_service.py

    9)  cs/meterpreter/rev_http.py
    10) cs/meterpreter/rev_https.py
DownloadFiles.zip (0.213 MB) 下载附件
点击收藏 | 19 关注 | 7
登录 后跟帖