.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 格式相关操作ZipFileZipOutputStreamZipEntry
ICSharpCode.SharpZipLib.GZip:GZIP 格式处理
3. 核心类详解
3.1 ZipOutputStream
ZipOutputStream 是用于以流的方式创建 ZIP 压缩文件的核心类,相比 ZipFile.Create 或 System.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"
参数说明:
- 原始目录路径
- 压缩后 zip 文件输出路径
- 排除的子目录名称(多个以英文逗号分隔)
- 排除的文件扩展名(多个以英文逗号分隔)
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 在红队渗透中的典型应用:
- 数据外发:压缩收集到的敏感信息,减少传输体积和告警风险
- 凭据导出:打包导出的凭据文件
- WebShell 部署:压缩多个 WebShell 文件进行批量部署
- 敏感文件收集:从目标系统中收集并压缩敏感文档
- 日志归档:压缩日志文件以减小体积便于传输
6. 进阶功能扩展
基于 SharpZipLib 可以进一步扩展功能:
- 密码保护:
zipStream.Password = "yourpassword";
- 压缩等级控制(0-9):
zipStream.SetLevel(9); // 最高压缩
- 内存压缩:不落地直接压缩内存中的数据
- 分卷压缩:支持大文件分卷压缩
- 加密算法选择:支持 AES 等更强加密方式
7. 注意事项
-
路径处理:
- 始终使用相对路径
- 目录条目必须以
/结尾
-
资源释放:
- 确保正确关闭
ZipOutputStream和各个ZipEntry - 使用
using语句保证资源释放
- 确保正确关闭
-
性能考虑:
- 大文件处理时注意内存使用
- 考虑使用缓冲区流式处理
-
异常处理:
- 处理文件访问权限问题
- 处理路径过长问题
8. 总结
Sharp4ArchiveZip 作为一款基于成熟 SharpZipLib 库的压缩工具,为红队渗透提供了灵活、高效的文件打包解决方案。通过递归压缩、排除规则和压缩控制等功能,能够在不引起告警的情况下高效完成数据收集和外发任务。理解其核心实现原理后,可以根据实际需求进一步扩展功能,满足更复杂的渗透场景需求。