Статья показывает, как можно обхитрить внимательного пользователя, знакомого с азами социальной инженерии, следящего даже за расширениями файлов и ни в коей мере не призывает к использованию данной информации в незаконных целях. Цель – запустить исполняемый файл, выдав его за текстовый документ в 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, к примеру, вплоть до версии 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:
На хабре уже есть статья про возможности изменения порядка чтения 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:
Bringoff
В Windows 10 стандартный архиватор вообще говорит, что архив пустой.
Bringoff
Прилетело письмо на почту:
VictorAl
Читайте аннотацию: «Цель – запустить исполняемый файл, выдав его за текстовый документ в zip-архиве, а если запустить вряд ли получится, то не дать распаковать или скрыть файл.»
Конкретно для 7-zip всех версий и одновременно для WinRAR v3.80 достаточно вставить RLO символ в название файла. Версия 3.80 RLO еще не умеет отображать в качестве стрелки. Чтобы добавить поддержку уязвимости WinRAR 5.3 и спрятать файл для встроенного в проводник архиватора, написал 0x00 в начало имени файла.
Таким образом достигается невозможность распаковки в старых версиях 7-zip, так как иначе он отобразит расширение *.txt и не запустит файл.
В архиве для демонстрации всего один файл. Можно встроить несколько. Одни файлы — прятать, другие — нет.
— Вот еще один архив для всех версий 7-zip, WinRAR 3.8, проводника Windows. Везде файл с расширением *.txt: Sample 2
Ubuntovod
ploop
Просто он единственный корректно работает с юникодом :)
georgich
Прошу прощения, но значок исполняемого файла явно намекает.
JetP1L0t
MacOS — распаковывает exe и отображает txt со знаком вопроса вместо RLO
Проводник WinXP и Win8.1 не отображает ничего
WinRAR 5.10 отображает файл без имени, распаковывает exe с квадратиком вместо RLO
Total Commander говорит что архив поврежден
ИТОГО: не надёжный способ
ЗЫЖ: ИМХО более надежно вписать в путь к файлу внутри архива с "..\файл.ехе", он не будет отображаться при просмотре, но всеми распаковывается на уровень выше текущей/целевой папки.
vlivyur
Неподдерживаемый метод сжатия для файла 'sample' — 7zip 9.20
KawaiDesu
UnZip 6.00 of 20 April 2009, by Debian. Original by Info-ZIP:
Archive: sample.zip
: mismatching «local» filename (¦Ю¦- TГTБ¦¬тАоtxt.exe),
continuing with «central» filename version
mapname: conversion of failed
В листинге файл и его атрибуты видит, но имя не отображает.
Archive Manager 3.10.2.1 файл в архиве не отображает вообще.
Pinsky
Стандартная утилита бубунты.
vlivyur
opnSUSE'шный Ark то же самое показывает.
cdkrot
Ark — kde'шный, он не относится к какому-нибудь одному дистрибутиву. (как впрочем 95% софта под линукс).
vlivyur
Так-то оно так, но в других дистрибутивах не проверял, там может быть совсем всё по-другому. Из последнего: убунтушный тарбол не считается архивом в сусе.
vlivyur
Вон ниже, кстати, и скриншот приложили и он совсем другое показывает.
Extrapolator
Kubuntu:
achekalin
Вот даже радоваться или нет, не пойму. То, что шрифты некачественные (или, наоборот, качественно показывающие разницу между латинскими и русскими буквами схожего начертания) спасет самых внимательных, да.
Extrapolator
Тут написано 'Type: DOS/Windows executable', даже на шрифты смотреть не надо. Тем более, exe-шник на линуксе совсем не одним кликом запускается.
Sykoku
Будете смеяться, но это удобно. Даже был свой руссификатор с точками под символами с аналогичным начертанием (а, о, р, е, х и т.д.). Зачем? — бухгалтер в программе (еще под ДОС) оприходовала товар. Например, А1785Н-е. А вот найди его, если не знаешь, на каком языке эти буквы. Устать, если все варианты перебирать.
achekalin
Смеяться не буду. Наоборот, буду уважать, когда человек делает что-то сознательно, с целью.
ploop
priv8v
Если быть точным, то программа делает «ShellExecuteW» на «open» для «notepad.exe».
Т.е:
1. Это может быть не блокнот если в системе разбросаны (а вот хочу я так!) в разных местах вирусы с таким именем, то ваша программа может запустить нечто другое — то, что первым ей подсунет система, а это будет не факт что файл из system32.
2. А он, собственно, может и не запуститься, если у меня непонятно что с ассоциациями расширений в системе.
Так что вопрос о том, что делает ваша программа не так прост как кажется на первый взгляд.
S0mnium
Archive Manager Gnome
В 1 архиве — даже распаковать не получается, во втором предлагает запустить под wine)
Sykoku
Sample-1
Win 7 x64, WinRAR 5.30 beta2.
Видится как txt. При попытке открыть — сообщение
«Не удается проверить издателя. Вы действительно хотите запустить эту программу?»
Far Manager 3.0.4400 / Total Commander 8.51 видят как EXEcutable
jia3ep
Ради интереса залил второй пример на VirusTotal (и не я первый). Выявляется Exploit.RTL-ZIP.Gen. Показатель выявления: 9/55.
Там распознается именно попытка скрыть расширение файла? Не пробовали реакцию на другие варианты имени, когда расширение остается?
VictorAl
Скорее всего сравнивается совпадение имен в структуре. Пробывал разные комбинации. Всё работает по-разному в разных архиваторах. Написал о более-менее общих.
guai
Всего-то надо расширение отдельной колонкой показывать
greatvovan
С 7-zip, действительно, фейл. А вы не пробовали связываться с автором или заводить фича-реквест для программы?
VictorAl
Автору информацию отправлял 09 августа, сейчас повторил.