这个 Python 工具能创建在文件结构中嵌入额外数据的 zip 文件。这些额外数据在检查或解压 zip 时不可见/不会显示,但可以通过 zip 文件中的 Windows 快捷方式文件(LNK)使用 powershell 检索。
脚本需要你指定 zip 文件 / 快捷方式文件 / 被夹带文件的名称,以及你想要夹带的文件/数据:
python3 zip_smuggle.py important_data /home/ubuntu/zip_smuggling/testdata.txt
这将在脚本文件夹中生成 important_data.zip。将此 zip 文件传输到 Windows 机器,双击进入 zip 或将其解压,然后点击其中包含的快捷方式。你提供的夹带数据将从 zip 文件中被检索出来,保存到磁盘,并作为文本文件打开。
本项目利用了我之前的一个老项目 lnk_generator,它允许你使用预设模板创建任意的快捷方式文件。查看该仓库以了解更多细节/更完整的脚本以及生成快捷方式文件的笔记。
被夹带的数据被放置在归档内文件数据与归档中央目录之间,中央目录某种程度上充当 zip 文件的目录表。该中央目录包含归档内文件的偏移量,因此虽然我们注入的数据存在于 zip 中,但它不被中央目录跟踪或索引,因此无法轻易查看或提取。Python 脚本在 zip 文件中找到“End of Central Directory”偏移量,并在注入夹带数据后将其更新为中央目录的新位置。下图左侧显示了 zip 的一般结构,右侧显示了我们的数据被插入的位置:

被夹带的数据使用 powershell 命令提取:
powershell.exe -w 1 -c "$name = \"testing\";$file = (get-childitem -Pa $Env:USERPROFILE -Re -Inc *$name.zip).fullname;$bytes=[System.IO.File]::ReadAllBytes($file);$size = (0..($bytes.Length - 4) | Where-Object {$bytes[$_] -eq 0x55 -and $bytes[$_+1] -eq 0x55 -and $bytes[$_+2] -eq 0x55 -and $bytes[$_+3] -eq 0x55 })[0] + 4;$length=12;$chunk=$bytes[$size..($size+$length-1)];$out = \"$Env:TEMP\$name.txt\";[System.IO.File]::WriteAllBytes($out,$chunk);Invoke-Item $out"
此命令:
0x55/0x55/0x55/0x55),标记被夹带数据的起始位置这个 POC 写得比较通用/将其武器化以使用其他文件类型等,将留给读者作为练习。