Статья показывает, как можно обхитрить внимательного пользователя, знакомого с азами социальной инженерии, следящего даже за расширениями файлов и ни в коей мере не призывает к использованию данной информации в незаконных целях. Цель – запустить исполняемый файл, выдав его за текстовый документ в zip-архиве, а если запустить вряд ли получится, то не дать распаковать или скрыть файл.
На хабре уже есть статья про возможности изменения порядка чтения Unicode-символов с помощью байта RLO. В ней рассказывается, что, пользуясь стандартным проводником Windows, сложно заметить подмену (спуффинг) имени файла. В ней идет речь об укрытии реального расширения файла. Также есть статья о фичах встроенного в Проводник архиватора.
Мне, как человеку, всегда следящему за расширениями открываемых файлов, стало интересно, а есть ли программы, предупреждающие об этом? В частности, защищены ли архиваторы? И что могут сделать злоумышленники, чтобы обойти защиту.
В качестве подопытного возьмем исполняемый файл с расширением exe, назовем его «Об успtxt.exe».
После буквы «п» в режиме редактирования имени файла в контекстном меню проводника выберем «Вставить управляющий символ Юникода» и выберем RLO. В результате отображаемое имя файла изменится на «Об успexe.txt».
Далее заархивируем его. Я использовал самый популярный способ сжатия – Zip. И начнем открывать в разных архиваторах.
7-Zip 9.20/15.06
WinRAR 5.3
Встроенный в проводник Windows
Как видно, 7-zip сразу сдался, WinRAR порадовал стрелочкой, а встроенный в проводник архиватор не поддерживает RLO. Теперь думаем, а можно ли как-то и последними двумя архиваторами осуществить спуффинг? Для этого открываем заархивированный файл в HEX-редакторе, одновременно читая спецификацию формата ZIP.
При сжатии файла в zip имя файла дублируется 2 раза.
Первое вхождение
Второе вхождение
И вот здесь есть большое поле для творчества.
Во-первых, можно во втором вхождении затереть символы байта RLO. Тогда WinRAR отобразит имя файла «Об успexe.txt» и откроет его как текстовый документ. Однако же если пойти дальше изменить расширение .txt на .jpg, то вплоть до версии WinRAR 4.20 эта псевдокартинка будет запущена как приложение. В WinRAR 5.3b2 данной уязвимости уже нет.
Открыв файл с затертым во втором вхождении RLO во встроенном в проводник Windows архиваторе, можно наблюдать, что имя файла стало почти читаемым – не читаются только русские буквы. Чтобы имя стало читаемым, заменим их кодировку или напишем латинские. Однако, нам не надо, чтобы пользователь открыл программу как текстовый документ.
Чтобы архиватор Проводника перестал видеть файл, достаточно в имени файла указать один из зарезервированных файловой системой NTFS символов (например, <). Однако, это не спасет от просмотра архива WinRAR-ом. Что же делать? Добавить null-байт в начало имени файла!
Тогда случится маленькое чудо: WinRAR 5.3b отобразит файл как папку «Локальный диск», перейдя в которую внутри архиватора, WinRAR автоматически распакует наш файл с RLO символом в имени (имя для распаковки берет из первого вхождения!) в директорию «Temp\ Rar$*» и заботливо покажет в проводнике исполняемый файл как текстовый документ! Заметьте, что после закрытия архиватор заботливо попытается удалить этот файл как любой другой распакованный во временный каталог.
Можно одновременно сделать его таким, чтобы он был читаем архиватором Проводника. Тогда вместо null надо прописать другой непечатаемый символ.
Резюме
- 7-Zip 15.06 отображает имя файла из первого вхождения (с RLO символом). Исполняемый файл представлен как текстовый документ. Даже если у вас включено отображение расширений зарегистрированных типов файлов. Двойной клик в окне архиватора запустит исполняемый файл.
- Внутренний архиватор Windows не видит данного конкретного файла. Другие файлы видит.
- WinRAR 5.3b отображает файл как папку «Локальный диск», перейдя в которую внутри архиватора, WinRAR автоматически распаковывает наш файл с подменным именем (с RLO символом) – имя для распаковки берет из первого вхождения – в директорию «Temp» и заботливо показывает в проводнике исполняемый файл как текстовый документ!
Но не все так печально. 7-Zip, к примеру, вплоть до версии 9.20 отображает имя файла из второго вхождения. Однако, если имя файла во втором вхождении не менять и сделать не Zip-архив, а какой-то редкий, из этих трех архиваторов открываемый только 7-Zip, и положить его в наш Zip-архив (не находите знакомый шаблон – релиз сломанной программы, куда кладется обычно куча архивов с файлами readme.txt?), тогда атака получится и на него. Более того, версия 9.20 также некорректно отображает имя файла, начинающегося с null, и не даст его ни прочитать, ни распаковать.
Также в обзоре не указан архиватор WinZip. Если честно, он мне не понравился размером, внешним видом и рекламой в незарегистрированной версии. Однако же в плане предупреждения пользователя об исполняемых файлов и файлов с неправильными именами он выдержал все проверки.
Файл sample.zip – пример создания такого архива. Внутри – программа с иконкой блокнота, запускающая блокнот. Больше ничего не делает. Прячется от встроенного в проводник архиватора, заставляет автоматически распаковать WinRAR 5.3, отображает расширение .txt в 7-zip версии 15.
Еще один пример — Sample 2 для всех версий 7-zip, WinRAR 3.8, проводника Windows. Везде файл с расширением *.txt: