
Утилита Python3 для создания zip-файлов, скрытно переносящих дополнительные данные для последующего извлечения.
Эта утилита на Python создаёт zip-файлы, содержащие дополнительные данные, встроенные в структуру файла. Эти дополнительные данные не видны/не отображаются при просмотре или распаковке zip-архива, но могут быть извлечены с помощью PowerShell через файл ярлыка Windows (LNK) внутри zip-файла.
Скрипту требуется имя для вашего 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-скрипт находит смещение «End of Central Directory» внутри zip-файла и обновляет его, указывая новое расположение центрального каталога после внедрения скрытно передаваемых данных. Приведённая ниже схема показывает общую структуру 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 оставлена довольно общей; её «вооружение» для использования других типов файлов и т. п. останется в качестве упражнения для читателя.