.NET 红队通过 Sharp4ArchiveZip 批量压缩打包文件
字数 1587 2025-09-01 11:26:17

Sharp4ArchiveZip 工具使用与原理详解

1. 工具概述

Sharp4ArchiveZip 是一款基于 .NET 平台 SharpZipLib 库开发的文件压缩工具,专为红队渗透测试设计。它提供了以下核心功能:

  • 递归压缩整个目录及其子目录
  • 支持排除特定子目录
  • 支持排除特定扩展名的文件
  • 可控制压缩等级
  • 支持简单的密码保护
  • 减少传输体积,降低告警风险

2. SharpZipLib 基础

2.1 组件介绍

SharpZipLib (ICSharpCode.SharpZipLib) 是一个开源的 .NET 压缩与解压缩库,最初由 SharpDevelop 团队维护,现已成为 .NET 生态中流行的压缩处理组件。

支持的压缩格式:

  • ZIP
  • GZIP
  • TAR

2.2 安装方式

通过 NuGet 安装:

Install-Package SharpZipLib

2.3 主要命名空间

  • ICSharpCode.SharpZipLib.Zip:ZIP 格式相关操作
    • ZipFile
    • ZipOutputStream
    • ZipEntry
  • ICSharpCode.SharpZipLib.GZip:GZIP 格式处理

3. 核心类详解

3.1 ZipOutputStream

ZipOutputStream 是用于以流的方式创建 ZIP 压缩文件的核心类,相比 ZipFile.CreateSystem.IO.Compression.ZipArchive,它提供了:

  • 更底层的控制
  • 流式处理能力
  • 自定义压缩等级
  • 密码保护功能

基本使用方法:

using (var zipStream = new ZipOutputStream(File.Create(outputPath)))
{
    // 设置压缩等级(0-9)
    zipStream.SetLevel(compressionLevel);
    
    // 设置密码(可选)
    if (!string.IsNullOrEmpty(password))
    {
        zipStream.Password = password;
    }
    
    // 添加文件到压缩包...
}

3.2 ZipEntry

ZipEntry 表示 ZIP 文件中的一个条目(压缩包中的文件或文件夹的元信息),包含:

  • 文件名
  • 是否是目录
  • 修改时间
  • 原始大小
  • 压缩后大小

使用注意事项:

  • Name 属性必须使用相对路径
  • 添加目录时,路径应以 / 结尾(如 "images/"

基本使用方法:

var entry = new ZipEntry(entryName)
{
    DateTime = DateTime.Now,
    Size = fileBytes.Length
};

zipStream.PutNextEntry(entry);
zipStream.Write(fileBytes, 0, fileBytes.Length);
zipStream.CloseEntry();

4. Sharp4ArchiveZip 实现解析

4.1 工具用法

Sharp4ArchiveZip.exe <源目录> <输出zip路径> [排除子目录] [排除扩展名]

示例:

Sharp4ArchiveZip.exe Sharp4AOT 123.zip "obj,.git" ".user,.pdb"

参数说明:

  1. 原始目录路径
  2. 压缩后 zip 文件输出路径
  3. 排除的子目录名称(多个以英文逗号分隔)
  4. 排除的文件扩展名(多个以英文逗号分隔)

4.2 递归压缩实现

核心递归压缩代码:

private static void AddDirectoryToZip(string path, ZipOutputStream zipStream, string rootPath, 
    string[] excludeDirs, string[] excludeExtensions)
{
    foreach (var file in Directory.GetFiles(path))
    {
        if (ShouldExcludeFile(file, excludeExtensions))
            continue;
            
        var relativePath = GetRelativePath(file, rootPath);
        AddFileToZip(file, relativePath, zipStream);
    }

    foreach (var directory in Directory.GetDirectories(path))
    {
        if (ShouldExcludeDirectory(directory, excludeDirs))
            continue;
            
        AddDirectoryToZip(directory, zipStream, rootPath, excludeDirs, excludeExtensions);
        
        // 添加空目录
        if (!Directory.EnumerateFileSystemEntries(directory).Any())
        {
            var relativePath = GetRelativePath(directory, rootPath) + "/";
            zipStream.PutNextEntry(new ZipEntry(relativePath));
            zipStream.CloseEntry();
        }
    }
}

4.3 排除逻辑实现

排除子目录判断:

private static bool ShouldExcludeDirectory(string directoryPath, string[] excludeDirs)
{
    if (excludeDirs == null || excludeDirs.Length == 0)
        return false;
        
    var dirName = Path.GetFileName(directoryPath);
    return excludeDirs.Contains(dirName, StringComparer.OrdinalIgnoreCase);
}

排除文件扩展名判断:

private static bool ShouldExcludeFile(string filePath, string[] excludeExtensions)
{
    if (excludeExtensions == null || excludeExtensions.Length == 0)
        return false;
        
    var extension = Path.GetExtension(filePath);
    return excludeExtensions.Contains(extension, StringComparer.OrdinalIgnoreCase);
}

4.4 文件添加实现

添加单个文件到压缩包:

private static void AddFileToZip(string filePath, string entryName, ZipOutputStream zipStream)
{
    var fileBytes = File.ReadAllBytes(filePath);
    
    var entry = new ZipEntry(entryName)
    {
        DateTime = DateTime.Now,
        Size = fileBytes.Length
    };

    zipStream.PutNextEntry(entry);
    zipStream.Write(fileBytes, 0, fileBytes.Length);
    zipStream.CloseEntry();
}

5. 红队应用场景

Sharp4ArchiveZip 在红队渗透中的典型应用:

  1. 数据外发:压缩收集到的敏感信息,减少传输体积和告警风险
  2. 凭据导出:打包导出的凭据文件
  3. WebShell 部署:压缩多个 WebShell 文件进行批量部署
  4. 敏感文件收集:从目标系统中收集并压缩敏感文档
  5. 日志归档:压缩日志文件以减小体积便于传输

6. 进阶功能扩展

基于 SharpZipLib 可以进一步扩展功能:

  1. 密码保护
zipStream.Password = "yourpassword";
  1. 压缩等级控制(0-9):
zipStream.SetLevel(9); // 最高压缩
  1. 内存压缩:不落地直接压缩内存中的数据
  2. 分卷压缩:支持大文件分卷压缩
  3. 加密算法选择:支持 AES 等更强加密方式

7. 注意事项

  1. 路径处理:

    • 始终使用相对路径
    • 目录条目必须以 / 结尾
  2. 资源释放:

    • 确保正确关闭 ZipOutputStream 和各个 ZipEntry
    • 使用 using 语句保证资源释放
  3. 性能考虑:

    • 大文件处理时注意内存使用
    • 考虑使用缓冲区流式处理
  4. 异常处理:

    • 处理文件访问权限问题
    • 处理路径过长问题

8. 总结

Sharp4ArchiveZip 作为一款基于成熟 SharpZipLib 库的压缩工具,为红队渗透提供了灵活、高效的文件打包解决方案。通过递归压缩、排除规则和压缩控制等功能,能够在不引起告警的情况下高效完成数据收集和外发任务。理解其核心实现原理后,可以根据实际需求进一步扩展功能,满足更复杂的渗透场景需求。

Sharp4ArchiveZip 工具使用与原理详解 1. 工具概述 Sharp4ArchiveZip 是一款基于 .NET 平台 SharpZipLib 库开发的文件压缩工具,专为红队渗透测试设计。它提供了以下核心功能: 递归压缩整个目录及其子目录 支持排除特定子目录 支持排除特定扩展名的文件 可控制压缩等级 支持简单的密码保护 减少传输体积,降低告警风险 2. SharpZipLib 基础 2.1 组件介绍 SharpZipLib (ICSharpCode.SharpZipLib) 是一个开源的 .NET 压缩与解压缩库,最初由 SharpDevelop 团队维护,现已成为 .NET 生态中流行的压缩处理组件。 支持的压缩格式: ZIP GZIP TAR 2.2 安装方式 通过 NuGet 安装: 2.3 主要命名空间 ICSharpCode.SharpZipLib.Zip :ZIP 格式相关操作 ZipFile ZipOutputStream ZipEntry ICSharpCode.SharpZipLib.GZip :GZIP 格式处理 3. 核心类详解 3.1 ZipOutputStream ZipOutputStream 是用于以流的方式创建 ZIP 压缩文件的核心类,相比 ZipFile.Create 或 System.IO.Compression.ZipArchive ,它提供了: 更底层的控制 流式处理能力 自定义压缩等级 密码保护功能 基本使用方法: 3.2 ZipEntry ZipEntry 表示 ZIP 文件中的一个条目(压缩包中的文件或文件夹的元信息),包含: 文件名 是否是目录 修改时间 原始大小 压缩后大小 使用注意事项: Name 属性必须使用相对路径 添加目录时,路径应以 / 结尾(如 "images/" ) 基本使用方法: 4. Sharp4ArchiveZip 实现解析 4.1 工具用法 示例: 参数说明: 原始目录路径 压缩后 zip 文件输出路径 排除的子目录名称(多个以英文逗号分隔) 排除的文件扩展名(多个以英文逗号分隔) 4.2 递归压缩实现 核心递归压缩代码: 4.3 排除逻辑实现 排除子目录判断: 排除文件扩展名判断: 4.4 文件添加实现 添加单个文件到压缩包: 5. 红队应用场景 Sharp4ArchiveZip 在红队渗透中的典型应用: 数据外发 :压缩收集到的敏感信息,减少传输体积和告警风险 凭据导出 :打包导出的凭据文件 WebShell 部署 :压缩多个 WebShell 文件进行批量部署 敏感文件收集 :从目标系统中收集并压缩敏感文档 日志归档 :压缩日志文件以减小体积便于传输 6. 进阶功能扩展 基于 SharpZipLib 可以进一步扩展功能: 密码保护 : 压缩等级控制 (0-9): 内存压缩 :不落地直接压缩内存中的数据 分卷压缩 :支持大文件分卷压缩 加密算法选择 :支持 AES 等更强加密方式 7. 注意事项 路径处理: 始终使用相对路径 目录条目必须以 / 结尾 资源释放: 确保正确关闭 ZipOutputStream 和各个 ZipEntry 使用 using 语句保证资源释放 性能考虑: 大文件处理时注意内存使用 考虑使用缓冲区流式处理 异常处理: 处理文件访问权限问题 处理路径过长问题 8. 总结 Sharp4ArchiveZip 作为一款基于成熟 SharpZipLib 库的压缩工具,为红队渗透提供了灵活、高效的文件打包解决方案。通过递归压缩、排除规则和压缩控制等功能,能够在不引起告警的情况下高效完成数据收集和外发任务。理解其核心实现原理后,可以根据实际需求进一步扩展功能,满足更复杂的渗透场景需求。