macOSの暗号化zipファイルはパスワード無しで解凍できる

macOSの暗号化zipファイルはパスワード無しで解凍できる

はじめに 介绍

こんにちは。事業推進部でOffensive Teamを担当する永井です。
你好。我叫永井,是业务推进部进攻组的负责人。

先日のApple発表会では新型のiPhoneApple Watchなど心躍る製品が色々と発表されましたね。筆者は特に新型iPad miniが心に刺さっています。
在前几天的苹果发布会上,发布了多款令人兴奋的产品,包括新款 iPhone 和 Apple Watch。新的 iPad mini 对我来说特别有吸引力。

さて、今回はApple関連の話としてmacOSの暗号化zipファイルはパスワード無しで解凍できる」というネタについて書いていきます。
现在,这次我将写一个与 Apple 相关的主题:“macOS 加密的 zip 文件无需密码即可解压缩。”

解凍できる条件 解冻条件

何を言っているんだと思われるかもしれませんが、macOSで作られた暗号化zipファイルは以下の2つの条件を満たす場合にパスワード無しで容易に解凍が可能です。
您可能想知道我在说什么,但如果满足以下两个条件,则无需密码即可轻松解压使用 macOS 创建的加密 zip 文件。

  1. zipの暗号化方式がzipcryptoである (通常の暗号化zipファイルは基本的にzipcryptoが利用されています)
    zip的加密方式是zipcrypto(一般加密的zip文件基本都是使用zipcrypto)
  2. zip内のいずれかのディレクトリの中身が.DS_Storeファイルおよび何らかのファイル1つである
    zip 中的目录之一的内容是 .DS_Store 文件和一些其他文件。

このうち1.は基本的に満たしているので、2.の条件についてもう少し詳しく説明します。
其中,条件1基本满足,所以我稍微详细地解释一下条件2。

2.の条件を満たすzipファイルとは、例えば以下のような構成です。
例如,满足条件2.的zip文件具有以下结构。

.
├── .DS_Store
├── abc.txt
└── sample
    ├── .DS_Store
    └── secret.txt

上記はsampleディレクトリの中身が.DS_Storeファイルとsecret.txtのみであるため、2. の条件を満たしています。
上面满足条件2,因为样本目录的内容只有.DS_Store文件和secret.txt。

もしzipファイルの中身にディレクトリが存在しない場合は、ルートディレクトリが.DS_Storeおよび1つのファイルのみであれば条件を満たします。
如果 zip 文件内没有目录,则根目录仅包含 .DS_Store 和一个文件,则满足条件。

.DS_Storeファイルとは? 什么是 .DS_Store 文件?

ここで、macOSユーザではない方向けに.DS_Storeファイルについて簡単に解説しておきます。
在这里,我将为非 macOS 用户简要解释一下 .DS_Store 文件。

簡単に言えば、.DS_StoreファイルとはWindowsのdesktop.iniに相当するファイルであり、ディレクトリ内のどこにファイルが置かれているのか、どのような順番で表示するべきか、といった情報が格納されているファイルです。
简单来说,.DS_Store文件是一个相当于Windows的desktop.ini的文件,它存储了诸如文件放在目录中的什么位置、显示顺序等信息,就是这个文件。

この.DS_StoreファイルはOS側で自動的に作成され、かつ隠しファイルになっているため、macOSディレクトリごとzipにしたり、zip -er output.zip .のようなコマンドでzipを作成した場合には、.DS_Storeファイルが気づかないうちに自動的に同梱されることになります。
这个 .DS_Store 文件是在操作系统端自动创建的,并且是一个隐藏文件,因此如果您在 macOS 上压缩整个目录或使用 zip -er output.zip . 这样的命令创建 zip,那么 .DS_Store 文件将自动包含在内在您不知情的情况下。

.DS_Storeファイルがzipファイルに同梱されていても、単純に邪魔なだけで基本的に問題は無いのですが、.DS_Storeファイルには「ディレクトリ内にファイルが自分を除いて1つしか無い場合、そのファイル名が判明していれば、65536 (216) パターンしかバイナリとしての組み合わせが存在しない」という仕様があります。
即使.DS_Store文件包含在zip文件中,也只是一个麻烦,基本上没有问题。,有一个规范说,“如果文件名已知,则只有65536(2 16 )可以组合为二进制的模式。”

これはどういうことかというと、「mac端末Aで作られた.DS_Storeファイルとmac端末Bで作られた.DS_Storeファイルは、.DS_Storeファイルが管理するファイルが1つであり、かつファイル名が一致している場合、ディレクトリのどこにファイルがあるのか、という情報を表す箇所以外は完全に一致する」ということです。
这意味着在mac终端A上创建的.DS_Store文件和在mac终端B上创建的.DS_Store文件由一个文件管理,并且文件名相同,如果匹配,则除了指示文件在目录中的位置的部分。

macOSの暗号化zipファイルはパスワード無しで解凍できる
.DS_Storeファイルの比較 比较 .DS_Store 文件

.DS_Storeの中で位置情報を表す領域はX座標用とY座標用にそれぞれ4バイトずつあるため、最大では264パターンまで表すことが可能ですが、通常用途では意図的にディレクトリの右下にファイルを置かない限りは、X座標1バイト、Y座標1バイトの範囲に収まるため、基本的には65536 (216) 通りしか無いことになります。ディレクトリの右下にファイルを置くようなパターンを想定したとしても220通りで収まります。
.DS_Store 的 X 和 Y 坐标各有 4 个字节来表示位置信息,因此最多可以表示 2 个 64 模式,但在正常使用中除非将文件放在右下角目录中,它将适合 X 坐标 1 个字节和 Y 坐标 1 个字节的范围,所以基本上只有 65536 (2 16 ) 种方式。即使您假设文件放置在目录右下角的模式,它也会以 2 20 的方式适合。

これが、パスワード無しで暗号化zipを解凍する際の肝となります。
这是在没有密码的情况下解压缩加密 zip 的关键。

パスワード無しでの解凍手法 没有密码如何解压

さて、ここまでの話で察している読者の方もいるかもしれませんが、
现在,正如一些读者可能已经从故事中猜测到的那样,

パスワード無しで解凍を行うための手法を一言で表すと以下になります。
无密码解压的方法可以总结如下。

「zipファイル内の.DS_Storeを既知平文として利用する既知平文攻撃」
“已知明文攻击,使用 zip 文件中的 .DS_Store 作为已知明文”

既知平文攻撃とは「暗号化される前の平文の一部をあらかじめ知っている場合、その平文を利用して暗号化を解除することができる攻撃手法」のことで、zipの暗号化に使用されているzipcryptoは、この既知平文攻撃に脆弱であるということが広く知られています。
已知明文攻击是一种如果事先知道加密前明文的一部分就可以解密加密的攻击方法,用于加密zip文件,众所周知,zipcrypto容易受到这种已知明文的攻击攻击。

また、先ほど.DS_Storeファイルはフォルダの中にファイルが1つしか存在しない場合、ファイル名を揃えれば基本的に65536通りしか無い、ということを述べました。
另外,正如我之前提到的,如果文件夹中只有一个 .DS_Store 文件,那么如果文件名对齐的话,基本上只有 65,536 个可能的名称。

はい、後は簡単ですね。 是的,剩下的就很简单了。
全パターンの.DS_Storeファイルを用いて既知平文攻撃を行えば、zipファイル内の.DS_Storeファイルと一致したタイミングで暗号化zipファイルの解凍に成功します。
如果使用.DS_Store 文件的所有模式执行已知的明文攻击,则加密的zip 文件将在与zip 文件中的.DS_Store 文件匹配的时间成功解压缩。

パスワード無しで解凍してみる 尝试无密码解压

既知平文攻撃を行うためのツールとしてはpkcrackやbkcrackが有名です。
pkcrack 和 bkcrack 是用于执行已知明文攻击的著名工具。

今回はbkcrackを使用し、実際に.DS_Storeを使って解凍をしてみます。
这次,我将使用 bkcrack 来实际解压使用 .DS_Store 的文件。

(GitHubhttps://github.com/kimci86/bkcrack )
(GitHub:https://github.com/kimci86/bkcrack)

検証では「解凍できる条件」の項目に記載した例と同じ以下の構成のディレクトリをpoc.zipとして暗号化zipにしたものを使用し、手元にsampleディレクトリ内の.DS_Storeがある前提で解凍を試みます。
为了进行验证,我们使用了目录中名为 poc.zip 的加密 zip 文件,其配置如下,与“解压条件”部分中描述的示例相同,并假设示例目录中的 .DS_Store 为手头有货。马苏。

.
├── .DS_Store
├── abc.txt
└── sample
    ├── .DS_Store
    └── secret.txt

bkcrackの使い方は簡単で、以下のように使います。
bkcrack使用起来很简单,使用方法如下。

bkcrack -C <解凍したい暗号化zip> -c <暗号化zip内の既知平文のフルパス> -P <既知平文ファイルが含まれる平文zip> -p <平文zip内の既知平文ファイルのフルパス> -U <出力先zip名> <出力されるzipを暗号化するためのパスワード>

暗号化を解除した平文のzipが手に入るのではなく、新しいパスワードで暗号化されたzipが手に入るというのが少し特殊です。
有点特别的是,您得到的不是已解密的纯文本 zip,而是已使用新密码加密的 zip。

手元で実際に動かしてみた際の画面が以下になります。
下面是我实际尝试时的屏幕。

macOSの暗号化zipファイルはパスワード無しで解凍できる
bkcrackを用いた解凍の様子 使用bkcrack解压

このようにpoc.zipのパスワードを入力することなく、.DS_Storeファイルを使って既知平文攻撃を行い、中身のsecret.txtのメッセージを読み取ることができました。
这样,在不输入poc.zip密码的情况下,我们就能够使用.DS_Store文件执行已知的明文攻击并读取其中的secret.txt消息。

今回は最初から正解の.DS_Storeファイルを使ってbkcrackを実行しましたが、実際には.DS_Storeファイルが正解するまでX座標とY座標の値を変えながらbkcrackを実行していくことになります。
这次,我从一开始就使用正确的.DS_Store文件执行bkcrack,但实际上,bkcrack将在更改X和Y坐标值的同时执行,直到.DS_Store文件正确为止。

パスワードブルートフォースとの比較 密码比较与暴力破解

さて、実際にmacOSで作成された暗号化zipをパスワード無しで解凍できることがわかりましたが、この手法では.DS_Storeの総当たりが必要であり、かつ既知平文攻撃にも時間がかかります。そのため、パスワードを単純にブルートフォースするのと比べて有効なのかが気になります。
现在,我发现实际上可以在没有密码的情况下解压在 macOS 上创建的加密 zip,但这种方法需要对 .DS_Store 进行暴力破解,并且执行已知的明文攻击也需要时间。因此,我想知道它是否比简单地暴力破解密码更有效。

今回の手法で全パターン(65536通り) を総当たりするのにかかる時間は、以下のようになります。 (先程のスクショを取得したのと同じ端末の場合)
使用此方法暴力破解所有模式(65536)所需的时间如下。 (如果您使用的是之前截取屏幕截图的同一设备)

.DS_Store 1パターンあたりにかかる時間 (85秒) * 65536 = 5570560秒 = 92842分 = 1547時間 = 64日
.DS_Store 每个模式花费的时间(85 秒)* 65536 = 5570560 秒 = 92842 分钟 = 1547 小时 = 64 天

また、同端末のhashcatのベンチマーク結果 (m=17200) は85915.0 kH/sでした。
此外,同一终端的 hashcat 基准测试结果 (m=17200) 为 85915.0 kH/s 。

この結果から、英数字+記号の8文字のパスワードをブルートフォースするためにはおよそ以下の時間がかかることがわかります。
从这个结果可以看出,暴力破解由字母数字字符和符号组成的 8 个字符的密码大约需要以下时间。

948 / 85915000 = 70950234秒 = 1182503分 = 19708時間 = 821日

つまり、単純なパスワードの総当たりと比べ、今回の手法は8文字の段階で10倍以上高速であることがわかります。
换句话说,与简单的暴力破解密码方法相比,我们的方法在 8 字符阶段快了 10 倍以上。

また、今回の手法はパスワードの長さに解凍時間が依存しないことから、パスワードが10文字でも15文字でも解凍までに要する時間は変わりません。パスワードブルートフォースでは、パスワードが1文字増えるたびに94倍ずつ時間が増えていくため、今回の手法の方がより優位になっていきます。
另外,采用这种方法,解压时间不依赖于密码的长度,因此无论密码是10个字符还是15个字符,解压密码所需的时间都是相同的。使用密码暴力破解时,密码中每增加一个字符,时间就会增加 94 倍,使得这种方法更具优势。

手元のへっぽこ端末では本手法を使用して解凍までに最大64日かかってしまいますが、クラウド上に複数台のインスタンスを立ててbkcrackを回せば1日足らずで解凍することは容易でしょう。
使用这种方法,解压你手头的 Heppoko 终端最多需要 64 天,但如果你在云端设置多个实例并运行 bkcrack,你可以在不到一天的时间内轻松解压。

パスワードの取得 获取密码

話の主旨からは少し逸れますが、bkcrackを使用して暗号化zipを解凍した場合、暗号化に使用されていたパスワードを直接取得することはできません。
这有点题外话,但是如果你使用 bkcrack 解压加密的 zip,你无法直接检索用于加密的密码。

その代わり、パスワードを元に生成される、暗号化用の鍵 (Master Key) を取得することができます。
相反,您可以获得根据您的密码生成的加密密钥(主密钥)。

このMaster Keyがあれば、通常のパスワードブルートフォースよりも50倍程度高速にパスワードの総当たりが可能です。
使用此主密钥,您可以比普通密码暴力破解快约 50 倍。

(先ほどのbkcrackの実行画面では、0917ed61 cfc8f696 5d3e9072と表示されているものがMaster Keyになります)
(在前面显示的 bkcrack 执行屏幕上,主密钥显示为 0917ed61 cfc8f696 5d3e9072)

hashcatの公式Twitterでは2019年5月に、GPU (RTX2080Ti) が4枚あればMaster Keyを用いて15時間以内に15文字以内のパスワードの総当たりが可能であることをアナウンスしています。
2019年5月,hashcat官方推特宣布,如果你有四块GPU(RTX2080Ti),可以使用Master Key在15小时内暴力破解最多15个字符的密码。

(参考: https://twitter.com/hashcat/status/1129441728761610242 )
(参考:https://twitter.com/hashcat/status/1129441728761610242)

まとめ 概括

今回の記事では、macOSで作られた暗号化zipが特定条件を満たす場合にパスワード無しで解凍できることを示しました。
在本文中,我们展示了如果满足某些条件,则可以在没有密码的情况下解压缩使用 macOS 创建的加密 zip 文件。

また、その際に得られるMaster Keyを用いてパスワードの復元も短時間で可能であることを述べました。
我还提到,使用当时获得的主密钥可以在短时间内恢复您的密码。

解凍条件を満たさないようにするためには、以下のいずれかの方法が考えられます。
为了避免满足减压条件,可以考虑以下方法之一。

  • .DS_Storeファイルがzip内に含まれないように気をつける
    请注意不要在 zip 中包含 .DS_Store 文件。
  • ファイルが1つだけのフォルダを含めないように気をつける
    注意不要包含只有一个文件的文件夹
  • .DS_Storeファイルが生成されないように設定する (副作用あり)
    防止生成 .DS_Store 文件(副作用)
  • 暗号化方式でzipcryptoではなくAESを使用する (Windowsの標準機能では解凍できなくなります)
    使用 AES 而不是 zipcrypto 作为加密方法(您将无法使用标准 Windows 功能解压)

そもそも共有すべき相手以外に暗号化zipが渡らなければ気にする必要はありませんが、
如果加密的 zip 没有传递给最初打算共享的人以外的任何人,则无需担心。

万が一の誤送付に備え、macOSをお使いの方はくれぐれもご注意ください。
如果您使用的是 macOS,请小心,以免收到错误的货件。

原文始发于NFLabs:macOSの暗号化zipファイルはパスワード無しで解凍できる

版权声明:admin 发表于 2024年3月7日 上午10:47。
转载请注明:macOSの暗号化zipファイルはパスワード無しで解凍できる | CTF导航

相关文章