информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Где водятся OGRыSpanning Tree Protocol: недокументированное применение
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Крупный взлом GoDaddy 
 Просроченный сертификат ломает... 
 Phrack #70/0x46 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / operating systems
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Драйвер запускается от имени системы? 20.05.09 16:17  Число просмотров: 2389
Автор: Den <Denis> Статус: The Elderman
<"чистая" ссылка>
<operating systems>
filter driver, проблема с правами 20.05.09 11:19   [Den]
Автор: sasha_s Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Есть драйвер фильтр файловых операций. Он просто перенаправляет обращения к одной шаре на другую шару с другого компа. Но... Юзер всегда отхватывает "Access denied", т.е. на прямую доступ есть, а вот при перенаправлении уже нет.

Вот код перенаправления:

PFILE_OBJECT FileObject = Data->Iopb->TargetFileObject;

// allocate memory for file name
if(FileObject->FileName.MaximumLength < Real->Length) {
PWCHAR Buffer = (PWCHAR)ExAllocatePool(NonPagedPool, Real->MaximumLength);
if(NULL == Buffer) {
ERROR(ExAllocatePool, STATUS_INSUFFICIENT_RESOURCES);
return FLT_PREOP_SUCCESS_NO_CALLBACK;
}

ExFreePool(FileObject->FileName.Buffer);

FileObject->FileName.Buffer = Buffer;
FileObject->FileName.MaximumLength = Real->MaximumLength;
}

// update name in file
FileObject->FileName.Length = Real->Length;
memCopy(FileObject->FileName.Buffer, FileObject->FileName.MaximumLength, Real->Buffer, Real->Length);

FltSetCallbackDataDirty(Data);

// reparse information
Data->IoStatus.Status = STATUS_REPARSE;
Data->IoStatus.Information = IO_REPARSE;

Real -- это путь куда идет перенаправление.

Что это за такая хитрая ишью? Есть рецепты?
Драйвер запускается от имени системы? 20.05.09 16:17  
Автор: Den <Denis> Статус: The Elderman
<"чистая" ссылка>
Ну иначе как от "имени системы" драйвер и не запустится. Или... 20.05.09 16:29  
Автор: sasha_s Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Ну иначе как от "имени системы" драйвер и не запустится. Или я что-то путаю?
Я понимаю о чем вы хотите сказать, что мол раз драйвер запускается под SYSTEM аккаунтом, то и права он имеет соотв и все его запросы тоже, но в запросе (запрос на дисковую операцию) есть поле типа
IO_SECURITY_CONTEXT SecurityContext
так вот в нем есть токен и этот токен описывает именно того юзера который стучится к этой шаре. И этот юзер имеет нужные права.
Вот и получаем:
приходит запрос с нужными правами, в запросе подменяеться только путь и возвращается нужный код для репарза, но далее "аксес денайд". Хотя после репарза в запросе SecurityContext не отличается от изначального.
Все верно 20.05.09 20:00  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> Ну иначе как от "имени системы" драйвер и не запустится.
> Или я что-то путаю?
Ничего не путаешь. Есть вопрос: access denied случается даже если доступ к шаре (реальной) уже получен (net use \\server\share, или просто зайти туда напрямую)?

> Я понимаю о чем вы хотите сказать, что мол раз драйвер
> запускается под SYSTEM аккаунтом, то и права он имеет соотв
> и все его запросы тоже, но в запросе (запрос на дисковую
> операцию) есть поле типа
> IO_SECURITY_CONTEXT SecurityContext
> так вот в нем есть токен и этот токен описывает именно того
> юзера который стучится к этой шаре. И этот юзер имеет
> нужные права.
С редиректорами все чуть не так, насколько я помню. То есть совершенно по фигу какие права дала ЛОКАЛЬНАЯ система этому запросу, важно то, что об этом думает удаленная (собственно сервер).

> Вот и получаем:
> приходит запрос с нужными правами, в запросе подменяеться
> только путь и возвращается нужный код для репарза, но далее
> "аксес денайд". Хотя после репарза в запросе
> SecurityContext не отличается от изначального.
В данном случае гораздо важнее смотреть на экстендед атрибуты (собственно SystemBuffer и Parameters.Create.EaLength), в которых передается инфа, необходимая СЕРВЕРУ для авторизации данного клиента. К сожалению с минифильтрами не работал никогда и понятия не имею как они реализуют репарс, но на уровне object manager-а open packet (с инфой об этих самых ea) @#$ится и репарснутое открытие уже происходит без них.
Фуф, вот тока руки дошли проверить советы... 25.05.09 16:36  
Автор: sasha_s Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Фуф, вот тока руки дошли проверить советы...

> Есть вопрос: access denied случается
> даже если доступ к шаре (реальной) уже получен (net use
> \\server\share, или просто зайти туда напрямую)?

Отлуп происходит полюбому.

> С редиректорами все чуть не так, насколько я помню. То есть
> совершенно по фигу какие права дала ЛОКАЛЬНАЯ система этому
> запросу, важно то, что об этом думает удаленная (собственно
> сервер).

Это ясно. Но после репарза что-то происходит и запросс уже совсем непонятно от чьего имени идет. Скорее всего от систем...

> В данном случае гораздо важнее смотреть на экстендед
> атрибуты (собственно SystemBuffer и
> Parameters.Create.EaLength), в которых передается инфа,
> необходимая СЕРВЕРУ для авторизации данного клиента. К
> сожалению с минифильтрами не работал никогда и понятия не
> имею как они реализуют репарс, но на уровне object
> manager-а open packet (с инфой об этих самых ea) @#$ится и
> репарснутое открытие уже происходит без них.

Так, я немного не в теме что в этих полях храниться.

typedef union _FLT_PARAMETERS {

//
// IRP_MJ_CREATE
//

struct {
PIO_SECURITY_CONTEXT SecurityContext;

//
// The low 24 bits contains CreateOptions flag values.
// The high 8 bits contains the CreateDisposition values.
//

ULONG Options;

USHORT POINTER_ALIGNMENT FileAttributes;
USHORT ShareAccess;
ULONG POINTER_ALIGNMENT EaLength;

PVOID EaBuffer; //Not in IO_STACK_LOCATION parameters list
LARGE_INTEGER AllocationSize; //Not in IO_STACK_LOCATION parameters list
} Create;

EaBuffer, EaLength -- это они?
А что в EaBuffer лежит? Я пока рою сайт самого MS, пока ничего путного не нашел...
Вот это странно. Еще один тест: гостевая шара (пускающая без... 25.05.09 22:04  
Автор: amirul <Serge> Статус: The Elderman
Отредактировано 25.05.09 22:06  Количество правок: 1
<"чистая" ссылка>
> Фуф, вот тока руки дошли проверить советы...
>
> > Есть вопрос: access denied случается
> > даже если доступ к шаре (реальной) уже получен (net
> use
> > \\server\share, или просто зайти туда напрямую)?
>
> Отлуп происходит полюбому.
Вот это странно. Еще один тест: гостевая шара (пускающая без пароля) - пускает или нет.

> EaBuffer, EaLength -- это они?
Они

> А что в EaBuffer лежит? Я пока рою сайт самого MS, пока
> ничего путного не нашел...
Там пары ключ (текстовый)/значение. Можно передавать файловой системе любую метаинформацию. NTFS ее сохраняет и в дальнейшем можно вычитывать. Ну а SMB использует эти атрибуты для авторизации, насколько я помню. Для твоих целей нужно просто сравнить содержимое eabuffer-а до и после репарса. Если там инфа теряется, то для авторизации на стороне сервера просто нет данных
Может я ламер, но как сделать шару именно гостевой? 29.05.09 19:42  
Автор: sasha_s Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> > Отлуп происходит полюбому.
> Вот это странно. Еще один тест: гостевая шара (пускающая
> без пароля) - пускает или нет.

Может я ламер, но как сделать шару именно гостевой?

> Там пары ключ (текстовый)/значение. Можно передавать
> файловой системе любую метаинформацию. NTFS ее сохраняет и
> в дальнейшем можно вычитывать. Ну а SMB использует эти
> атрибуты для авторизации, насколько я помню. Для твоих
> целей нужно просто сравнить содержимое eabuffer-а до и
> после репарса. Если там инфа теряется, то для авторизации
> на стороне сервера просто нет данных

Хм...
Я в непонятках. Посмотрел до репарза: в этих полях NULL.
Data->Iopb->Parameters.Create.EaBuffer -- NULL
Data->Iopb->Parameters.Create.EaLength -- 0
где Data -- PFLT_CALLBACK_DATA Data
Я вообще правильно смотрю?
Я делал это давно - помню только, что через secpol.msc ->... 30.05.09 01:57  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> Может я ламер, но как сделать шару именно гостевой?
Я делал это давно - помню только, что через secpol.msc -> Local Policies.

> Хм...
> Я в непонятках. Посмотрел до репарза: в этих полях NULL.
> Data->Iopb->Parameters.Create.EaBuffer -- NULL
> Data->Iopb->Parameters.Create.EaLength -- 0
> где Data -- PFLT_CALLBACK_DATA Data
> Я вообще правильно смотрю?
Вроде правильно. Если бы по уже установленным сессиям ходило нормально, я бы был почти уверен, что дело в этом. А так даже не знаю.
Полагаю, что нужно получить контекст безопасности с целевой системы, на которую делается редирект. 26.05.09 01:40  
Автор: Den <Denis> Статус: The Elderman
<"чистая" ссылка>
Для не-домена этого и сделать то нельзя 26.05.09 07:07  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
Вообще, я писал подобный редиректор, но не минифильтр, а обычный фильтр. И у меня тоже была проблема с access denied, вот только когда клиент уже установил сессию с сервером все проходило на ура.
1






Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2021 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach