В
статье показана недостаточность защиты сетевых соединений между рабочими станциями и серверами Windows NT, организованных посредством интерфейса NPFS. Этот интерфейс имеет ряд слабостей, позволяющих осуществлять
различные удаленные атаки. Предложены две атаки, одна из которых относится к классу "отказ в обслуживании", а другая
позволяет получать обычному пользователю права администратора путем перехвата административных сетевых соединений. Рассматриваются возможности усиления защиты NPFS-соединений в Windows NT.
Что такое NPFS.
Аббревиатура NPFS расшифровывается как Named Pipe File System. Несмотря на то, что в этом названии присутствуют слова "file system", назвать
NPFS файловой системой можно только с очень большой натяжкой. Драйвер npfs.sys, хотя и работает в соответствии со спецификациями драйвера файловой системы, не управляет никакими файлами. Вместо этого npfs.sys
управляет так называемыми каналами (named pipes). Вместе с файлами, дисковыми директориями, устройствами и почтовыми ящиками (mailslots) каналы относятся к классу файловых объектов.
Большинство функций, предназначенных для работы с файлами (в том числе CreateFile, ReadFile и WriteFile), работают и с каналами.
Канал можно представить
себе как некую виртуальную трубу, по которой перетекает информация от одного процесса к другому. Информация может передаваться как в одну сторону (однонаправленный канал), так и в обе стороны (двунаправленный
или дуплексный канал). Хотя каналы Windows NT очень похожи на аналогичные объекты UNIX, техническая реализация каналов в Windows NT и UNIX существенно различается.
Создание
канала происходит следующим образом.
- Процесс-сервер создает канал с помощью функции программного интерфейса Win32 CreateNamedPipe.
Канал может быть создан только на локальном компьютере.
- Процесс-сервер активизирует канал с помощью функции ConnectNamedPipe. Теперь к каналу могут подключаться
клиенты.
- Процесс-клиент подключается к каналу посредством вызова функции CreateFile. Параметры функции отличаются от обычных только именем открываемого объекта,
которое имеет вид \\computer_name\pipe\pipe_name. Вместо имени компьютера может использоваться символ '.' (точка), в этом случае речь идет о локальном компьютере.
После
выполнения перечисленных действий процесс-клиент и процесс-сервер могут обмениваться информацией посредством канала с помощью функций ReadFile и WriteFile. Все, что один участник информационного обмена
записывает в канал функцией WriteFile, может быть прочтено другим участником посредством вызова функции ReadFile. Клиент может отключиться от канала
в любой момент с помощью функции CloseHandle. Сервер может отключить клиента в любой момент с помощью функции DisconnectNamedPipe. После прекращения связи с клиентом сервер может повторно использовать канал
с помощью повторного вызова функции ConnectNamedPipe.
С помощью одного и того же канала сервер может одновременно обслуживать нескольких клиентов. Для
этого сервер должен создать несколько экземпляров канала, вызвав функцию CreateNamedPipe нужное количество раз, при этом в каждом вызове CreateNamedPipe должно быть указано одно и то же имя канала.
Если канал имеет несколько экземпляров, клиент может быть подключен к любому свободному (не занятому другим клиентом) экземпляру этого канала. Как показывают эксперименты, клиент всегда подключается к тому
экземпляру канала, который был создан или освобожден раньше других. Другими словами, свободные экземпляры канала подключаются к клиентам в порядке "живой" очереди.
Интерфейс
NPFS имеет много других возможностей, поддерживаются асинхронная передача информации, транзакции и многое другое. Полное описание NPFS выходит за пределы настоящей статьи.
В
целом интерфейс NPFS весьма удобен для обмена информацией между процессами, особенно в тех случаях, когда процесс-клиент и процесс-сервер выполняются на разных компьютерах одной локальной сети. NPFS широко
используется операционной системой Windows NT для своих нужд. С помощью NPFS решается множество задач, некоторые из которых играют важную роль в обеспечении безопасности операционной системы. Например,
каналы lsass, lsarpc и LANMAN используются при передаче по сети имени и пароля пользователя при сквозной аутентификации в домене Windows NT. Также стоит отметить, что удаленный вызов процедур (RPC) в Windows
NT реализован как надстройка над NPFS.
Некоторые странности NPFS.
До тех пор, пока речь не
идет о защите информации, NPFS выглядит просто прекрасно. Но стоит только начать исследовать этот интерфейс на предмет устойчивости к злонамеренным воздействиям прикладных программ, обнаруживается множество
удивительных фактов.
Пусть некий процесс создал экземпляр некоторого канала. Другой процесс пытается создать экземпляр того же самого канала, вызывая
CreateNamedPipe с тем же именем создаваемого канала. Как это ни странно, второй экземпляр канала будет успешно создан. Более того, если второй процесс вызовет теперь ConnectNamedPipe, экземпляр канала,
созданный вторым процессом, сможет обслуживать клиентов.
Итак, в системе появляются два объекта, имеющих одинаковое имя, но обслуживаемых разными процессами.
Когда клиент подключается к каналу, операционная система предоставляет ему первый экземпляр, поскольку он был создан раньше. Но когда к тому же каналу захочет подключиться другой клиент, он будет подключен
ко второму экземпляру. При этом клиент никакими средствами не сможет определить, какой процесс обслуживает его запрос. Получается, что клиент хотел получить услугу от одного процесса, а на самом деле эту
услугу ему предоставляет совсем другой процесс. Это выглядит очень странно. Представьте себе, что Вы открываете файл на жестком диске, а операционная система лезет в Internet. При этом, когда файл открыт,
Вы никак не сможете узнать, откуда был взят файл, который Вы открыли.
Особенно интересно, что процессы из вышеприведенного примера могут быть запущены
разными пользователями. Например, пользователь guest, локально работающий с контроллером домена, может создать экземпляр канала lsass, и, дождавшись подключения клиента, вмешаться в процедуру сетевой аутентификации
пользователя.
Другой интересный эффект. Каналы, как и любые другие объекты Windows NT, могут иметь дескриптор защиты (security descriptor), описывающий то, какие пользователи
имеют какие права на доступ к данному объекту. Мне так и не удалось найти простой метод, позволяющий получить дескриптор защиты канала по его имени (конечно, можно это сделать с помощью драйвера фиктивного
устройства, но это слишком трудоемко). Эксперименты показывают, что любой канал, даже системный, даже такой важный и ответственный, как lsass, может быть открыт любым пользователем.
Источник:
http://www.cyberinfo.ru
Автор: Вадим Проскурин
Обсудить в форуме...>>>>