Альтернативные потоки данных ntfs. Что такое альтернативные данные и как ими пользоваться. Как создать альтернативный поток NTFS

Вы слышали что-нибудь о потоках NTFS ? Весьма интересная функциональность файловой системы, которой можно найти практическое применение. Сегодня поговорим о том, что это и как этим можно пользоваться.

Для начала немного теории .
Поддержка альтернативных потоков данных была добавлена в NTFS для совместимости с файловой системой HFS от Macintosh, которая использовала поток ресурсов для хранения иконок и другой информации о файле. Они присутствуют в NTFS еще с самых ранних версий Windows NT . Суть технологии в том, что у файла на NTFS может быть несколько потоков, содержащих данные. Проводник и большинство популярных файловых менеджеров ограничены работой лишь сглавным потоком (не имеющим имени), представляющим собой основное содержимое файла. Потоки могут использоваться для хранения метаданных файла, таким образом они использовались в Windows 2000 , насколько мне известно.

В Windows 7 альтернативные потоки NTFS , наличествующие у файла, штатными средствами не увидеть. И напрасно: адски хитрые вирусы, например, могут писать себя в потоки какого-нибудь вполне безобидного файла. Удалив файл с потоками, содержащими объёмные данные можно обнаружить, что места освободилось значительно больше, чем занимал файл по мнению Проводника .
Для просмотра имеющихся потоков мы будем пользоваться консольной утилитой , созданной небезызвестным Марком Руссиновичем.

Как создать альтернативный поток NTFS

Некоторые консольные команды позволяют создать и отобразить содержимое потока NTFS , например команда echo может позволить создать альтернативный поток для текстового файла. Чтобы было понятно, как это работает, рассмотрим пример. Введите следующее в командой строке:
echo Hello Happy Bulldozer > hello.txt
echo Hello World > hello.txt:test

А теперь откройте файл hello.txt в Блокноте:

Текст Hello World остался "за кадром", находясь в потоке с именем test . Если указать в имени открываемого файла и имя потока, открыть файл в потоке не получится: двоеточие - недопустимый символ для названия файла. Однако, можно воспользоваться командной строкой, которая несколько лояльней и позволит выполнить вот такую команду:
more < hello.txt:test

Просмотр потоков NTFS , как я писал выше, можно выполнить через утилиту streams.exe
streams.exe hello.txt


Я полагаю, тут всё понятно.

Альтернативные потоки NTFS и Блокнот

Продвинутые программы вроде справятся без особых усилий и отобразят вам содержимое потока:

Стандартный Блокнот будет приписывать расширение txt к имени потока. Если вы хотите использовать его, потоки именовать надо следующим образом:
echo Hello World > hello.txt:test.txt
Тогда выполненная из cmd.exe команда даст положительный результат:
notepad hello.txt:test.txt

Альтернативные потоки NTFS и файлы различных типов

У вас может сложится мнение, что область применения альтернативных потоков NTFS не простирается дальше текстовых файлов. Это не так. В следующем примере я добавил к файлу hello.txt поток, содержащий данные архива 7z:

Отмечу, что потоки можно создавать не только для файлов, но и для папок и даже для разделов жесткого диска.

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

В последнее время, в связи с удешевлением аппаратных средств (в долларовом эквиваленте) все большее число пользователей компьютера получает в распоряжении ресурсы вполне достаточные для работы операционной системы Microsoft Windows NT (i200MMX + 32-64 Mb). Ненадежность и непредсказуемость Windows 95/98, а также неспособность ее к управлению на должном уровне ресурсами современных компьютеров приводит многих пользователей к мысли о переходе на NT.

При этом многие неискушенные пользователи не находят для себя ничего кардинально нового. И действительно, установив Internet Explorer 4 и не пользуясь многочисленными возможностями NT по применению политики безопасности и защиты, самыми большими отличиями от Windows 98 может показаться наличие двух папок “Автозагрузка” в пусковом меню (текущего пользователя и общей для всех пользователей) и отсутствие апплета Add/Remove Hardware в Панели управления. А если еще и не форматировать диск файловой системой NTFS, то разницы можно больше и не найти.

Но эта статья как раз и описывает некоторые отличия NTFS от FAT, VFAT, FAT16 и FAT32. Общеизвестные отличия: способность к самовосстановлению, отложенная запись, максимальный размер тома и файла на нем до 16 Экзабайт (1 Экзабайт = 1000000 Гбайт), возможность сжатия отдельных файлов и папок, установки разрешений и аудита достаточно широко освещены в литературе и документации к Windows NT. Но существуют еще малоизвестные и малоиспользуемые возможности NTFS: жесткие ссылки (hardlinks) и множественные потоки данных (multiply data flows или forks). Далее пойдет речь именно о них.

Множественные потоки данных . Этот термин знаком пользователям Macintosh. В этой системе файл может иметь два потока (forks): поток данных и поток ресурсов. В потоке данных хранятся данные файла - этот поток и копируется как единственный при переносе файла с Macintosh на PC. Второй поток файла - поток ресурсов, содержащий данные операционной системы – меню, значки, шрифты, в общем, все то, что принято называть ресурсами. Когда Windows NT Server обслуживает клиентов Macintosh и предоставляет им дисковое пространство для хранения файлов, необходимо чтобы файловая система сервера поддерживала формат файлов клиента. Это является одной из причин появления множественных потоков данных в NTFS.

Каким образом это реализовано? Любая информация о файле, начиная с его имени, разрешений и заканчивая собственно данными, хранящимися в файле, с точки зрения NTFS представляет собой атрибут, хранящийся в собственном потоке (stream). Разработчики NTFS посчитали, что можно не ограничиваться одним потоком для данных – безымянным, и добавили возможность создания нескольких, помимо основного, именованных потоков. Для создания множественных потоков можно применить функцию Win32 API, но можно поступить и проще.

Со времен Кернигана и Ричи – разработчиков языка C и операционной системы UNIX у многих операционных систем существует возможность обобщения операций ввода – вывода. С этой точки зрения, любая операция ввода – вывода может рассматриваться как операция ввода из потока или вывода в поток независимо оттого, что является источником данных (консоль, т.е. клавиатура, файл или порт) и приемником (опять же консоль, в данном случае уже экран монитора, принтер или файл). Существует и возможность перенаправить ввод – вывод программы с экрана на принтер и вводить команды не с клавиатуры, а из файла. В наше время повсеместного использования графического пользовательского интерфейса эти возможности применяются очень редко, поэтому поясним сказанное примером.

Команда операционных систем Microsoft echo используется для вывода информации на экран в текстовом режиме:

C:>echo Hello, World!

Команда echo в качестве устройства вывода информации использует экран монитора. Вывод этой команды можно перенаправить с консоли в файл (для этого используется символ “ > ”):

C:>echo Hello, World! > file

Как видите, команда echo в данном случае на экран ничего не вывела. Но в файле file можно обнаружить строку “Hello, World!”. Аналогично вывод команды echo можно перенаправить и на принтер:

C:>echo Hello, World! > lpt1

На экране опять ничего, но на листе бумаги в принтере можно обнаружить все ту же строку “Hello, world!”, если конечно принтер подсоединен к порту lpt1. Таким образом, вывод любой программы текстового режима можно перенаправить на любое устройство, поддерживающее потоковый ввод информации или в файл, за исключением тех программ, которые в текстовом режиме используют для вывода информации непосредственную модификацию видеопамяти и другие нестандартные, с точки зрения классического C, возможности.

Аналогично можно перенаправить и ввод программы. Команда more операционных систем Microsoft используется для буферизации вывода команд, выводящих информации больше, чем умещается на экран. Но эту команду можно использовать и для иллюстрации перенаправления ввода:

C:>more Hello, World!

В файле file находилась строка “Hello, World!”, которая была направлена на экран.

Точно также, с помощью перенаправления ввода - вывода можно создавать и читать множественные потоки данных:

C:>echo string1 > file:fork1

Записью file:fork1 определяется в файле file поток с именем fork1 (поскольку он еще не существует, то создается новый с этим именем) и перенаправляем в него вывод команды echo. При этом размер файла при просмотре его свойств не изменяется, и стандартными средствами Windows NT, не зная имени потока его существования нельзя определить. Но, зная его имя, можно с помощью команды more определить и его содержимое:

Таким образом, можно создавать и читать содержимое потоков данных файла. Количество потоков, создаваемых в одном файле ограничено только наличием свободного пространства на диске. Аналогично можно создавать потоки данных в каталогах, но для просмотра содержимого потока придется применить другое средство вывода потока на экран, так как команда more при этом выдает следующую ошибку:

Если ничего подходящего найти не удалось, то можно написать в любом компиляторе C++ такую программу:

while (cin.get(ch)) cout.put(ch);

Скомпоновать эту программу лучше как консольное Win32 приложение, и использовать как средство для изучения потоков каталогов.

Windows NT не предоставляет стандартных средств для получения информации о множественных потоках данных. Но что делать, если все же необходима такая информация? В этом случае можно воспользоваться программой streams Марка Руссиновича (Mark Russinovich), которую вместе с исходным кодом можно взять на www.sysinternals.com . В этой программе для получения информации о множественных потоках данных используются недокументированные функции Windows NT. Вот информация, полученная с помощью программы streams о файле file:

NTFS Streams Enumerator v1.0

Systems Internals - http://www.sysinternals.com

Здесь можно видеть как название потока данных, так и его размер в байтах (дополнительные 3 символа это пробел после символа “ > ”, возврат каретки и перевод строки, добавляемые командой echo). К сожалению, streams не позволяет определить множественные потоки данных в каталогах.

Для чего можно применять множественные потоки данных? Помимо применения, найденного для них фирмой Apple, можно сказать о самом простом средстве для скрытия информации, например, для запоминания даты установки программы shareware. На заре технологии OLE Microsoft предполагала использовать потоки данных для хранения информации о внедренных объектах, но видимо обеспечить потоки данных на FAT оказалось сложнее, чем создать длинные имена файлов и от этой идеи пришлось отказаться. Создание “файла ресурсов” для скрипта с хранением в нем всех надписей, выводимых на разных языках, также может быть интересной возможность применения потоков. Помимо приведенных, существует еще множество интересных применений для множественных потоков данных, чтобы не обходить их своим вниманием.

Жесткие ссылки . Пользователям различных клонов UNIX хорошо знакомо это понятие. В отличии от файловой системы FAT, в которой принято, что у каждого файла может быть только одно имя, в UNIX такого ограничения нет – каждый файл может иметь несколько имен и его данные не могут быть удалены, пока счетчик имен файла не равен 0. В UNIX существуют также символьные ссылки – аналог ярлыков (shortcut) в Windows, но следящих за перемещением объекта, на который они ссылаются.

Windows NT ограниченно соответствует стандарту POSIX (Portable Operating System Interface for Computing Environments). Один из примеров ограниченности – поддержка жестких ссылок и отсутствие поддержки символьных. Видимо, было решено, что ярлыки являются достойным аналогом символьных ссылок.

В NTFS жесткие ссылки организованы аналогично множественным потокам данных: если у файла есть несколько потоков с данными, почему не может быть нескольких потоков с именами? Несколько имен файла могут находиться в разных каталогах, но только в пределах одного раздела.

Для изготовления жесткой ссылки необходима программа для подсистемы POSIX Windows NT. Такая программа вместе с исходными текстами находится на компакт-диске “Ресурсы Windows NT”. По аналогии с UNIX эта программа называется ln. Синтаксис этой команды:

C:>Ln file hardlink1

С помощью этой команды мы создаем для файла file второе имя или жесткую ссылку hardlink1 и, изменяя содержимое файла file можно изменить содержимое hardlink1, точнее это один и тот же файл, но с двумя именами. Аналогично можно менять и другие атрибуты файла. Количество имен у файла не ограничено, но при копировании имени файла ссылка разрывается и создается еще один файл. Существует возможность создания ссылки в другом каталоге:

C:>Ln file ../temp/hardlink2

В этом случае необходимо указывать не абсолютное, а относительное имя каталога.

Применений для жестких ссылок можно найти не меньше, чем для множественных потоков данных. Например, создавать жесткие ссылки для библиотек dll, чтобы обезопасить свою программу от случайного удаления необходимого файла. Другие возможные применения жестких ссылок лучше всего искать в литературе, относящейся к UNIX. И, конечно же, применение жестких ссылок можно комбинировать с описанными выше множественными потоками данных.

Были представлены в Windows NT 4.0 и были вокруг всех потомков (исключая win-95 потомки: 98, Me). В XP, Vista и Win 7 они все еще существуют. Пока версии Windows поддерживают NTFS, они будут поддерживать файловые потоки. Они будут поддерживать NTFS в течение длительного времени.

Ошибка, которую вы указали, описана на странице, которую вы видите в своем вопросе. Команда type не понимает потоки. Использование:

More < 1013.pdf:Zone.Identifier

Работа с потоками

Microsoft имеет только несколько команд, которые работают с потоками, фактически только < , > работают с потоками, и поэтому могут использоваться только команды, которые могут работать с этими операторами перенаправления. Я написал о том, как вы все еще можете управлять потоками только с этими командами.

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

Когда вы пытаетесь открыть поток файлов с помощью start filename:streamname , и программа говорит что-то вроде "незаконного имени файла" или "файл не найден", и вы уверены, что имя потока верное, то, скорее всего, программа не поддерживают потоки. Я заметил, что Notepad, Wordpad и Word/Excel работают правильно с потоками, хотя Word и Excel считают файлы опасными. Ниже приведены некоторые эксперименты .

ПРИМЕЧАНИЕ: вам кажется, что альтернативные потоки данных нечетны. Они странные, потому что они настолько скрыты, но многие основные файловые системы (HFS, NSS) имеют это, и концепция восходит к началу 80-х годов. Фактически, изначально потоки были добавлены в NTFS для взаимодействия с другими файловыми системами.

DIR /B C:\WINDOWS\System32\*.SCR

DIR /B C:\WINDOWS\System32\*.* |FIND /i ".SCR"

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

4.1.8. Файловые потоки NTFS*

Файловая система NTFS поддерживает файловые потоки – альтернативные потоки данных. Фактически файловые потоки представляют собой объединение нескольких файлов в одну группу с одним общим именем файла (у каждого потока своё дополнительное имя). В группе существует основной поток данных, с которым большинство программ работают как с файлом, и дополнительные именованные потоки, не отображающиеся обычными средствами. При файловых операциях копирования, переноса, удаления и т.п., в NTFS операция производится над всей группой. При использовании некоторых архиваторов и копировании файлов, содержащих альтернативные потоки, на раздел FAT, эти потоки могут быть утеряны. Технически альтернативные потоки применяются для дополнения файла информацией без изменения содержания основного потока и без создания дополнительных файлов, которые могут быть утеряны.

Альтернативные потоки используются антивирусами для сохранения информации о файле («отпечатка», контрольной суммы) для детектирования изменения файла во времени. Клиенты системы обмена файлами Direct Connect (DC++) могут сохранять результаты хеширования (вычисление контрольных сумм) для больших файлов, которые используются в случае перемещения файла при повторном хешировании, что существенно ускоряет обновление списка.

В перспективе программы библиотек, фильмотек и аудиотек могут использовать альтернативные потоки для хранения совместно с документами потоков обложек, аудиодорожек, описания, причём на различных языках. Альтернативные потоки позволяют прикреплять «секретные» данные, что представляет собой потенциальную опасность.

Просмотреть информацию о потоках можно командой STREAMS 25 , программой NTFS Stream Explorer26 , с помощью модулей расширения файловых менеджеров27 , в Windows 7 командаdir /r выводит список всех потоков для указанных объектов (с командой также dir можно использовать дополнительные ключи).

При сохранении файлов из интернета по умолчанию файлу в NTFS добавляется поток Zone.Identifier 28 , который имеет формат ini-файла, и обычно содержит текст:

Параметр ZoneId с числом означает зону, откуда прибыл файл на компьютер, номер зоны берётся из настроек зон безопасности (Панель управления /Свойства обозревателя (Сеть и интернет/ Свойства брау-

зера )/ вкладкаБезопасность ). Допустимы следующие значения29 : 0 – локальный компьютер

1 – интранет (локальная сеть, домен)

2 – доверенный источник

3 – интернет

4 – недоверенный источник

При значении 3 система выдаст предупреждение «Не удаётся прове-

рить издателя. Вы действительно хотите запустить эту программу?»,

внизу сообщения установлен флажок «Всегда спрашивать при открытии этого файла », снятие которого удаляет потокZone.Identifier . ЕслиZoneId содержит значение 4, то появится предупреждение «Эти файлы нельзя открыть. Параметры безопасности Интернета не позволили открыть

25 Streams (http://technet.microsoft.com/ru-ru/sysinternals/bb897440)

26 NTFS Stream Explorer, программа для работы с потоками NTFS (http://hex.pp.ua/ntfs-stream-explorer.php )

27 NTFS File Information

(http://forum.farmanager.com/viewtopic.php?t=2050)

28 Отключить создание блокирующего потока для файлов можно в редакторе локальной групповой политики (gpedit.msc): Конфигурация пользо-

вателя/ Административные шаблоны/ Компоненты Windows/ Диспетчер вложений/ Удаление сведений о зоне происхождения вложений.

29 Поток Zone.Identifier (http://hex.pp.ua/Zone.Identifier.php)

один или несколько файлов » и открытие файлов блокируется. При открытии в проводнике окнаСвойства для файла, полученного из интернета, внизу вкладкиОбщие появляется кнопкаРазблокировать и

надпись « Осторожно: этот файл получен с другого компьютера и, возможно, был заблокирован с целью защиты компьютера», нажатие кнопки Разблокироватьудаляет поток Zone.Identifier.

С помощью обозревателя интернет скачайте файл STREAMS.zip (можете скачать любой небольшой файл, указав его имя в команде далее), сохраните его в корневую папку диска F:, просмотрите содержимое потокаZone.Identifier командой:

MORE < F:\Streams.zip:Zone.Identifier

Откройте в проводнике окно Свойства (Alt+Enter или командаСвойства контекстного меню) для скачанного файла, на вкладке Общие нажмите кнопкуРазблокировать , в консоли повторите предыдущую команду.

Создайте тестовый файл, командой, перенаправляющей текст оператора вывода текста, добавьте альтернативный поток, просмотрите результат:

ECHO Main text > F:\M.TXT

ECHO Hidden text > F:\M.TXT:Secret.TXT

TYPE F:\M.TXT

MORE < F:\M.TXT:Secret.TXT

Альтернативный текстовый поток можно загрузить в блокнот:

NOTEPAD F:\M.TXT:Secret.TXT

Альтернативные потоки можно создавать также у папок и системных файлов30 .

Потоки также используются для хранения расширенных атрибутов31 .

30 Скрытое хранение данных в потоках файла $Repair в системном каталоге $RmMetadata (http://hex.pp.ua/RmMetadata.php )

31 Расширенные атрибуты NTFS и FAT16

(http://hex.pp.ua/extended-attributes.php) 53

Цель этой статьи объяснить смысл
дополнительных потоков данных (alternate data streams)
в операционных системах Windows,
продемонстрировать как создать их и
скомпрометировать машину, как найти
скрытые файлы используя общедоступные
утилиты. Первым шагом нужно будет осознать
смысл ADS и то, какую угрозу они несут, затем
посмотрим как они используются для взлома
ну и наконец затем рассмотрим инструменты
для обнаружения активности и то, как
остановить дальнейшую незаконную работу с
ними.

Зачем?

Дополнительные потоки данных появились в
Windows вместе с NTFS. На самом деле, насколько я
понимаю, особого смысла в них не было — они
были сделаны для совместимости с HFS, старой
файловой системой Macintosh — Hierarchical File System. Дело
в том, что эта файловая система использует
как ветвь данных, так и ветвь ресурсов для
хранения контента. Ветвь данных,
соответственно, ответственна за содержание
документа, а ветвь ресурсов за
идентификацию файла — его типа и прочих
данных. К нынешнему времени о существовании
дополнительных потоков из обычных юзеров
мало кто знает. Однако, в мире компьютерной
безопасности они получили определенное
распространение. Например злобные хакеры
используют ADS для хранения файлов на
взломанных компьютерах, так же они иногда
применяются вирусами и другим malware. Дело
ведь все в том, что эти потоки не
просматриваются обычными методами, тем же
Проводником или через командную строку. Чем
интересны эти потоки? А тем, что в случае
расследования взлома не всегда обращают
внимание на них, к тому же не все антивирусы
по умолчанию просматривают потоки в
поисках вредоносного софта.

К делу

Для того, что бы понять реальную опасность
ADS лучше продемонстрируем работу с ними.
В примере мы с помощью Metasploit Framework проникнем
на машину. Для этого используем уязвимость
MS04-011 (lsass). Затем при помощи TFTP зальем файлы,
которые и поместим в дополнительные потоки
данных. Как только это будет закончено на
удаленной машине запусти из командной
строки сканер, который просканирует сеть на
наличие других машин. Обратите внимание,
что авторы Metasploit Framework снабдили свое
творение сигнатурой METASPLOIT, дабы создатели
защитных программ могли определять пакет,
исходящий от MF. Обратите внимание на пакет,
исходящий от атакующего:

Тут 192.168.1.102 компьютер атакующего на
котором стоит Metasploit Framework, а 192.168.1.101 —
уязвимый комп с Win2K Prof. В данном случае Ось
поставлена без патчей и сервиспаков,
исключительно для демонстрационных целей
:). Обратите внимание, что сами по себе ADS не
слишком полезны, они, естественно, радуют
нападающего только в том случае, если есть
доступ к машине, системная уязвимость в
операционной системе. В настоящей сети вы
вряд ли найдете непропатченную W2K, так что
придется искать другие принципы
проникновения.

Ниже мы видим, что атака была успешной и на
атакующей машине открыт реверсивный шелл,
отданный жертвой. По умолчанию для этой
уязвимости в Metasploit используется порт 4321,
однако его можно изменить:

Проникнув на машину надо передать туда
файлы. Для этого используем TFTP, в данном
случае получаем ipeye.exe.

Таким же образом закачиваем psexec.exe, pslist.exe и
klogger.exe. Сделаем листинг директории C:\Compaq\,
куда все и поклалось:

Запихнем теперь ipeye.exe с поток,
ассоциированный с существующим файлом
test_file.

Затем то же самое можно проделать и стремя
другими необходимыми для работы файлами.
Обратите внимание, что альтернативный
поток можно организовать не только для
файлов, но и для каталогов, того же C:\ к
примеру. Запустим сканер, о котором мы
говорили в начале, ipeye.exe, на зараженном
компьютере:

c:\Compaq\test_file:ipeye.exe

(Продолжение следует)