diff --git a/src/generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/zips-tricks.md b/src/generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/zips-tricks.md index f104810be..4b5d247e7 100644 --- a/src/generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/zips-tricks.md +++ b/src/generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/zips-tricks.md @@ -2,20 +2,164 @@ {{#include ../../../banners/hacktricks-training.md}} -**コマンドラインツール**は**zipファイル**の管理に不可欠で、診断、修復、及びzipファイルのクラッキングに役立ちます。以下は主なユーティリティです: +**コマンドラインツール**は **zip files** の診断、修復、クラッキングに不可欠です。ここでは主要なユーティリティを示します: -- **`unzip`**: zipファイルが解凍できない理由を明らかにします。 -- **`zipdetails -v`**: zipファイルフォーマットフィールドの詳細な分析を提供します。 -- **`zipinfo`**: zipファイルの内容を抽出せずにリストします。 -- **`zip -F input.zip --out output.zip`** と **`zip -FF input.zip --out output.zip`**: 壊れたzipファイルの修復を試みます。 -- **[fcrackzip](https://github.com/hyc/fcrackzip)**: zipパスワードのブルートフォースクラッキングツールで、約7文字までのパスワードに効果的です。 +- **`unzip`**: zip file が解凍されない理由を表示します。 +- **`zipdetails -v`**: zip file format fields を詳細に解析します。 +- **`zipinfo`**: 抽出せずに zip file の内容を一覧表示します。 +- **`zip -F input.zip --out output.zip`** と **`zip -FF input.zip --out output.zip`**: 破損した zip files の修復を試みます。 +- **[fcrackzip](https://github.com/hyc/fcrackzip)**: zip passwords のブルートフォース用ツール。おおよそ7文字までのパスワードに有効です。 -[Zipファイルフォーマット仕様](https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT)はzipファイルの構造と標準に関する包括的な詳細を提供します。 +[Zip file format specification](https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT) は zip files の構造と規格を包括的に説明しています。 -パスワード保護されたzipファイルは**ファイル名やファイルサイズを暗号化しない**ことに注意することが重要です。このセキュリティの欠陥は、RARや7zファイルには共有されていません。さらに、古いZipCrypto方式で暗号化されたzipファイルは、圧縮ファイルの暗号化されていないコピーが利用可能な場合、**平文攻撃**に対して脆弱です。この攻撃は、既知の内容を利用してzipのパスワードをクラッキングします。この脆弱性は[HackThisの記事](https://www.hackthis.co.uk/articles/known-plaintext-attack-cracking-zip-files)で詳述され、[この学術論文](https://www.cs.auckland.ac.nz/~mike/zipattacks.pdf)でさらに説明されています。しかし、**AES-256**暗号化で保護されたzipファイルはこの平文攻撃に対して免疫があり、機密データのために安全な暗号化方法を選択する重要性を示しています。 +重要なのは、パスワード保護された zip files はファイル名やファイルサイズを暗号化しないことです。これは、これらの情報を暗号化する RAR や 7z とは異なるセキュリティ上の欠陥です。さらに、古い ZipCrypto メソッドで暗号化された zip files は、圧縮済みファイルの未暗号化コピーが利用可能な場合に plaintext attack に対して脆弱です。この攻撃は既知の内容を利用して zip のパスワードを破るもので、詳細は [HackThis の記事](https://www.hackthis.co.uk/articles/known-plaintext-attack-cracking-zip-files) や [この学術論文](https://www.cs.auckland.ac.nz/~mike/zipattacks.pdf) を参照してください。ただし、**AES-256** で保護された zip files はこの plaintext attack に対して耐性があり、機密データには安全な暗号方式を選ぶ重要性を示しています。 -## References +--- + +## 改変された ZIP ヘッダを利用した APK の逆解析防止トリック + +Modern Android malware droppers は不正な ZIP メタデータを使って静的解析ツール(jadx/apktool/unzip など)を壊しつつ、デバイス上では APK をインストール可能にします。よく使われるトリックは次の通りです: + +- ZIP General Purpose Bit Flag (GPBF) の bit 0 を立てて偽の暗号化を示す +- 大きな/カスタムの Extra fields を悪用してパーサを混乱させる +- ファイル/ディレクトリ名の衝突で実際のアーティファクトを隠す(例: 実際の `classes.dex` の横に `classes.dex/` というディレクトリを置く) + +### 1) Fake encryption (GPBF bit 0 set) without real crypto + +症状: +- `jadx-gui` が次のようなエラーで失敗する: + +``` +java.util.zip.ZipException: invalid CEN header (encrypted entry) +``` +- `unzip` が core APK ファイルに対してパスワードを要求する(ただし有効な APK は `classes*.dex`、`resources.arsc`、`AndroidManifest.xml` が暗号化されることはありえません): + +```bash +unzip sample.apk +[sample.apk] classes3.dex password: +skipping: classes3.dex incorrect password +skipping: AndroidManifest.xml/res/vhpng-xhdpi/mxirm.png incorrect password +skipping: resources.arsc/res/domeo/eqmvo.xml incorrect password +skipping: classes2.dex incorrect password +``` + +zipdetails による検出: +```bash +zipdetails -v sample.apk | less +``` +local and central headers の General Purpose Bit Flag を見てください。特徴的な値は bit 0 がセットされていること(Encryption)で、core entries に対しても当てはまります: +``` +Extract Zip Spec 2D '4.5' +General Purpose Flag 0A09 +[Bit 0] 1 'Encryption' +[Bits 1-2] 1 'Maximum Compression' +[Bit 3] 1 'Streamed' +[Bit 11] 1 'Language Encoding' +``` +ヒューリスティック: APKがデバイスにインストールされ実行されるが、ツールから見るとコアエントリが "encrypted" のように見える場合、GPBFが改ざんされている。 + +Local File Headers (LFH) と Central Directory (CD) の両方のエントリで GPBF のビット0をクリアして修正する。最小限の byte-patcher: +```python +# gpbf_clear.py – clear encryption bit (bit 0) in ZIP local+central headers +import struct, sys + +SIG_LFH = b"\x50\x4b\x03\x04" # Local File Header +SIG_CDH = b"\x50\x4b\x01\x02" # Central Directory Header + +def patch_flags(buf: bytes, sig: bytes, flag_off: int): +out = bytearray(buf) +i = 0 +patched = 0 +while True: +i = out.find(sig, i) +if i == -1: +break +flags, = struct.unpack_from(' 1: +print('COLLISION', base, '->', variants) +``` +Blue-team detection ideas: +- ローカルヘッダが暗号化を示している(GPBF bit 0 = 1)にもかかわらずインストール/実行されるAPKをフラグを立てる。 +- コアエントリ上の大きい/不明な Extra fields をフラグする(`JADXBLOCK` のようなマーカーを探す)。 +- `AndroidManifest.xml`、`resources.arsc`、`classes*.dex` に関して、`X` と `X/` のようなパス衝突を特にフラグする。 + +--- + +## 参考資料 - [https://michael-myers.github.io/blog/categories/ctf/](https://michael-myers.github.io/blog/categories/ctf/) +- [GodFather – Part 1 – A multistage dropper (APK ZIP anti-reversing)](https://shindan.io/blog/godfather-part-1-a-multistage-dropper) +- [zipdetails (Archive::Zip script)](https://metacpan.org/pod/distribution/Archive-Zip/scripts/zipdetails) +- [ZIP File Format Specification (PKWARE APPNOTE.TXT)](https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT) {{#include ../../../banners/hacktricks-training.md}}