Настольная книга компьютерного исследователя


Небольшое исследование Windows

Локальное переполнение буфера в explorer.exe

Для начала хочу немного погрузиться в историю. Если точнее — в Апрель 2000 года. Тогда в багтреке промелькнуло сообщение о новой уязвимости в explorer.exe. При попытке доступа к файлу, расширение которого больше 160 символов, происходило переполнение буффера. Самое же неприятное заключалось в том, что злоумышленник мог попытаться передать такой файл на ftp-сервер, работающий под управлением Win98, тем самым аварийно завершив работу удалённой машины.

Помню, что после этого ещё было сообщение о переполнении буффера при доступе к директории, содержащей в себе большое количество вложенных папок. Все известные уязвимости, связанные с организацией файловой системы, были исправлены в последующих версиях семейства Windows. Программисты Microsoft создали ограничения на длину названия и расширения файлов, папок и ярлыков.

|- Описание уязвимости:

Совсем недавно я занимался поиском новых методов переполнения буффера при попытке доступа к файлу/папке/ярлыку с большим именем. Я хотел обойти ограничения программистов Microsoft. Потратив большое количество времени, я всё же добился своего (кто ищёт, тот всегда найдёт ;). Конечно далеко не идеальный вариант, к тому же до сих пор не до конца исследованый мной (времени не хватает).

Всё описанное ниже я тестировал на Windows XP [ENG] [Version 5.1.2600] без SP, Windows XP [RU] [version 5.1.2600] + SP1, и на Win2k [ENG] + SP 1,2 с установленным microsoft office.

При многократном посещении какого-либо сетевого ресурса (например, \\server\soft), создаётся так называемый “Сетевой ярлык”. К примеру, при использовании команды “explorer \\server\music” будет создана одноименная ссылка. Теперь, для полноценного понимания сути уязвимости нам понадобиться ещё один сервер (желательно находящийся в твоей сети). На нем должна существовать скрытая папка (в нашем случае это будет xxx$).

!!!! ВАЖНО !!!! Сервер должен работать под линуксом !!!!! (непонятно почему, но если машина работает под Win, то ничего не происходит ;-/

Предположим,что путь к этой папке будет выглядеть так: «\\server\xxx$». Для доступа к этому ресурсу мы будем использовать команду “explorer [путь]”. Теперь запускаем «cmd.exe» и набираем:

> explorer \\Server\xxx$%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20
%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20
%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20
%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20
%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20
%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20
%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20
%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20
%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20
%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20
%20%20%20%20%20%20%20%20%20%20%20%20%20

Число последовательностей “%20” — около 270 [примерно 850 символов]. Точное-необходимое количество мне было лень высчитывать – я не мазохист ;) Теперь жмём “enter”, после чего сразу вылетает ошибка:

    _________________________
   |Windows Explorer         |
   |Can't access this folder |
   |Path is too long.        |
   |_________________________|

Explorer.exe ругнулся на слишком длинный путь. Но не смотря на это попытался открыть эту директорию! Теперь идём сюда: «explorer \\server\». В результате мы увидим новую сетевую папку, но на самом деле это всего лишь ярлык на ресурс к которому мы только что попытались получить доступ. Её название будет выглядеть примерно так: “xxx$%20%20%20%20%20%20%20…” (Explorer отображает неполный путь). Теперь при попытке доступа к этому ярлыку (например, если попробовать выделить его правой кнопкой мыши), explorer.exe начнёт сыпаться критическими ошибками. Подробнее, можешь ознакомиться с ними, нажав “Debug” :) Вот так вот всё непросто и во многом непонятно. Я попытался максимально подробно всё расписать. Если же кто-то не понял, или у кого-то не получилось, то можете взглянуть на наглядный пример – видео-ролик:

- Скорее всего эта уязвимость может рассматриваться только как локальное переполнение буффера в Explorer.exe. Способа использования её как удалённую я не нашёл.

- Найденная мной уязвимость не столь опасна, так как может быть использована лишь при некоторых обязательных (пока что непонятных) условиях (например, сервер под никс). Но представляет небольшую ценность из-за того, что мне удалось обойти ограничения, связанные
с длинным именем ярлыка (в данном случае).

- \\server\xxx$ взят лишь для примера (так как видео я снимал именно для этого имени). На самом же деле не обязательно обращаться к скрытой папке, да и тем более существующей :)

Команда должна выглядеть так:
“explorer \\[сервер]\[любая папка]%20%20….[около 850 символов]

- Я не очень понимаю почему переполнение буффера происходит тогда,когда пользователь обращается к этому ярлыку, а не во время его создания explorer’ом. Также пока остаётся загадкой то, почему данная уязвимость не работает при доступе к компьютеру, на котором установлена любая OS из семейства Win. Всё это будет выяснено в ближайшее время.

- Об этой уязвимости не будет сообщено в багтрек по разным причинам.

Ошибки в выполнение команд “dir” и “del”:

Тестировалось на Windows XP [ENG] [Version 5.1.2600] без SP, Windows XP [RU] [version 5.1.2600] + SP1, Win2k [ENG] + SP 1,2.

При работе с cmd.exe я заметил то, что почти все команды проверяют длину данных, которые передал пользователь (в качестве параметра или названия файла/папки к примеру). При попытке послать, например, такой запрос:

“md f:\%20%20%20%20…..[примерно 270 раз]”

cmd.exe ругнётся: “The full path of [название папки] is too long”. Но в результате тестирования оказалось, что не все отвечают подобным образом.

dir \\Server\xxx$%20%20%20%20%20 [около 850 символов]
del \\Server\%20%20%20%20 [около 850 символов]

При выполнении этих двух команд cmd.exe просто вылетает не сказав ни слова :) Хочу заметить, я не считаю это потенциальной уязвимостью, однако это весьма интересное явление. Не очень понятно почему программисты MS так вольно обошлись с этими командами. А ведь даже маленькая и на первый взгляд несерьёзная ошибка может обойтись очень дорого ;)

Ошибки в организации файловых систем NTFS (compressed volume) и FAT32

Тестировалось в WinXP Home/Proffesional [ENG] and [RU] version 5.1.2600 + SP1 на файловых системах NTFS (compressed volume) и FAT32.

Ошибка возникает при создании директории с именем какого-либо девайса, например:

C:\>mkdir aux
[Неверно задано имя папки.]

А вот если мы добавим слэш:

C:\>mkdir aux\

То директория с заданым именем будет создана. Но при работе с такой папкой через Explorer.exe никакие операции выполнить будет невозможно [переименовывание, удаление и т.д.]. Аналогично дело обстоит со всеми остальными dos-девайсами. Всего их 11 штук, поэтому если в корне создать 11 директорий с такими именами, то жить будет не очень удобно ;)

Девайсы: con, prn, aux, com1, com2, com3, com4, nul, lpt1, lpt2, lpt3

Удалять их нужно точно так же — со слэшем:

C:\>rmdir aux\

Это тоже не очень значительная ошибка, но как и любая другая, она заслуживает внимания. Может быть использована в программах-заподлянках.

The End!?

После “вынужденного” присоединения MS к сообществу OpenSources, количество описаний подобных ошибок в багтреках резко возрастёт. Всё тайное станет явным ;) И, возможно, после многократных патчей, семейство Win станет достаточно крепким и надёжным :] Большинство подобных ошибок уже исправлено, но всегда есть возможность придумать новые пути к достижению цели.

Всё, на этом мы хотим закончить наш скромный обзор ;)



©2013 Журнал Хакера Entries (RSS) and Comments (RSS)