How_to_use_tar

before all

在安全中,通过压缩包我们可以实现什么呢?

实现文件穿越目录覆盖

how_to_use

1
2
3
4
5
#Python/3.11.1
import tarfile
import sys
tar = tarfile.open(sys.argv[1], "r")
tar.extractall()#解压缩包

tar解压目录穿越
tar 命令可以在打包的时候把路径也打包进去

那么 对于解压 是不是也可以指定目录解压?(目录穿越)

我在自己的主机上执行:

1
tar -cPzvf end.tar.gz xxx/../../../var/www/html/xxx.xxx

此时在本机生成了自己的end.tar.gz压缩文件

当在其他机器上解压此文件 会不会在/var/www/html/目录下生成xxx.xxx呢?

经过测试,很多场景都存在这种情况

Java:Java.util.zipzt-zip

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package zip;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

public class ZipExtractor {
public static void main(String[] args) throws IOException {
// 要解压的zip文件路径
String zipFilePath = "";
// 解压后的目标文件夹路径
String targetDirectory = "";

File zipFile = new File(zipFilePath);
ZipFile sourceZipFile = null;
try {
sourceZipFile = new ZipFile(zipFile);
} catch (IOException e) {
e.printStackTrace();
System.out.println("无法解压文件: " + zipFilePath);
return;
}

Enumeration<? extends ZipEntry> entries = sourceZipFile.entries();
while(entries.hasMoreElements()) {
ZipEntry zipEntry = entries.nextElement();
File entryFile = new File(targetDirectory + zipEntry.getName());
entryFile.getParentFile().mkdirs();
entryFile.createNewFile();

InputStream inputStream = sourceZipFile.getInputStream(zipEntry);
FileOutputStream outputStream = new FileOutputStream(entryFile);

int bytesRead;
byte[] buffer = new byte[1024];
while ((bytesRead = inputStream.read(buffer, 0, 1024)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}

inputStream.close();
outputStream.close();
}

if (sourceZipFile != null) {
sourceZipFile.close();
}
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//zt-zip组件中的解压功能,是在原生的java.util.zip基础上进行的封装。
//漏洞代码:实际场景下的的zip包是可控的,如通过文件上传等功能。
/*依赖导入
<dependency>
<groupId>org.zeroturnaround</groupId>
<artifactId>zt-zip</artifactId>
<version>1.12</version>xml
</dependency>
*/

package zip;

import org.zeroturnaround.zip.ZipUtil;

import java.io.File;

public class ZipExtractor {
public static void main(String[] args) {
// 定义待解压的zip文件路径
File zipFile = new File("");
// 定义解压后的目标文件夹路径
File targetDirectory = new File("");

// 使用zt-zip组件中的ZipUtil解压文件
ZipUtil.unpack(zipFile, targetDirectory);
}
}

GUN:GNU tar 解压路径绕过漏洞(CVE-2016-6321) 分析

除此之外还有……

示例题目:[NSSRound#7 Team]新的博客

https://blog.csdn.net/qq_64201116/article/details/128922324#t3

什么是软链接

软链接(Symbolic Link)是计算机文件系统中的一种特殊文件类型,它创建了一个指向另一个文件或目录的符号链接。与硬链接不同,软链接不包含指向文件数据的实际内容,而只是指向文件或目录的路径。

软链接允许用户创建一个指向文件系统中任意位置的链接,即使目标文件在不同的文件系统上也可以。它们通常用于简化文件系统的组织、提供便捷的访问方式或者在不同目录之间共享文件。

软链接的特点包括:

  1. 指向路径:软链接包含的是目标文件或目录的路径,而不是实际内容。
  2. 可移植性:软链接可以跨越不同的文件系统,因为它们只是包含路径的引用。
  3. 符号标记:软链接在文件系统中用特殊的符号标记表示,通常在大多数操作系统中是一个箭头或者是特殊的标识。

软链接的创建和使用通常由操作系统提供的特定命令完成,比如在Unix/Linux系统中,常用的软链接创建命令是ln -s

你可以简单理解为Windows中的快捷方式。

特定目录访问实现RCE

怎么利用呢?

一般来说:

  1. 构造软链接:攻击者创建一个软链接,将上传的文件或者上传文件的目录指向目标系统中的一个敏感目录,比如网站根目录。这通常可以通过命令行工具如 ln -s 来完成。
  2. 创建恶意文件:攻击者准备一个恶意文件,比如包含后门或者恶意代码的 PHP 文件。这个文件将被放置在目标系统中通过软链接指向的敏感目录中。
  3. 压缩文件:攻击者将构造好的软链接以及恶意文件压缩成一个 ZIP 文件,确保软链接被正确地包含在压缩文件中。在压缩时,需要确保软链接被正确处理,通常需要使用压缩工具的特定选项(比如 --symlinks)。
  4. 上传压缩文件:攻击者通过目标系统的文件上传功能,上传构造好的 ZIP 文件。上传成功后,目标系统会将 ZIP 文件解压并将其中的文件放置到指定目录。
  5. 触发漏洞:由于目标系统在解压时会按照软链接指向的位置进行文件放置,恶意文件会被放置在目标系统的敏感目录中。攻击者通过上传的恶意文件,触发了目标系统的安全漏洞。
示例题目:【CISCN2023】unzip

【CISCN2023】unzip 详解 - gxngxngxn - 博客园 (cnblogs.com)

其他利用方式???

php利用:一个有趣的任意文件读取 - 先知社区 (aliyun.com)

附录:tar的一些使用方式

tar命令的使用

tar 命令是一个在类 Unix 系统中用于创建归档文件(也称为 tarball)以及从归档文件中提取文件的工具。它通常与压缩程序(如 gzip 或 bzip2)结合使用以创建压缩的归档文件。下面是 tar 命令的一些常用使用方式:

创建归档文件:

1
tar -cvf archive.tar file1 file2 directory
  • -c:创建归档文件。
  • -v:在终端显示详细信息。
  • -f archive.tar:指定归档文件的名称为 archive.tar
  • file1 file2 directory:要添加到归档文件中的文件或目录的列表。

提取归档文件:

1
tar -xvf archive.tar
  • -x:提取归档文件中的内容。
  • -v:在终端显示详细信息。
  • -f archive.tar:指定要提取的归档文件为 archive.tar

创建压缩的归档文件:

1
tar -cvzf archive.tar.gz file1 file2 directory
  • -z:使用 gzip 进行压缩。
  • archive.tar.gz:指定归档文件的名称为 archive.tar.gz

提取压缩的归档文件:

1
tar -xzvf archive.tar.gz
  • -x:提取归档文件中的内容。
  • -z:使用 gzip 进行解压缩。
  • -f archive.tar.gz:指定要提取的压缩归档文件为 archive.tar.gz

查看归档文件内容:

1
tar -tvf archive.tar
  • -t:列出归档文件中的内容。

当然可以!除了基本的创建、提取和压缩归档文件外,tar 命令还有许多其他选项和用法,如下所示:

向归档文件中添加文件:

1
tar -rvf archive.tar newfile
  • -r:向归档文件中追加文件。
  • newfile:要添加到归档文件中的新文件。

提取指定目录下的文件:

1
tar -xvf archive.tar directory/file
  • directory/file:只提取归档文件中指定目录下的文件。

指定归档文件中文件的存储路径:

1
tar -C /path/to/directory -xvf archive.tar
  • -C /path/to/directory:指定提取文件时的存储路径。

列出归档文件中的内容并显示详细信息:

1
tar -tvf archive.tar

只列出归档文件中的文件名:

1
tar -tf archive.tar

压缩文件时排除某些文件或目录:

1
tar --exclude='file1' --exclude='directory2' -cvzf archive.tar.gz directory
  • --exclude='file1':排除文件 file1
  • --exclude='directory2':排除目录 directory2
  • directory:要压缩的目录。

使用其他压缩程序进行压缩:

1
tar -cvjf archive.tar.bz2 file1 file2
  • -j:使用 bzip2 进行压缩。

使用文件列表创建归档文件:

1
tar -cvf archive.tar -T filelist.txt
  • -T filelist.txt:从文件 filelist.txt 中读取文件列表。