информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Атака на InternetВсе любят мед
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
 Умер Никлаус Вирт 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
IRP приходит в контексте процесса/потока который сделал запрос 30.01.06 15:04  Число просмотров: 2309
Автор: Killer{R} <Dmitry> Статус: Elderman
<"чистая" ссылка>
> а не известно, как преобразовать PACCESS_TOKEN в HANDLE,
> потому что кроме варинта доступа через
> currentIrpStack->Parameters.Create.SecurityContext->A
> ccessState->SubjectSecurityContext.ClientToken
> ничего не описано
> и описание вызова функции SeQueryInformationToken нигде не
> удалось найти :(
Потому ZwOpenProcess/ThreadToken на KeGetCurrentXxx должен дать тебе хэндл на нужный тебе токен более-менее документированным способом.

А по поводу SeQueryInformationToken:

SeQueryInformationToken (
IN PACCESS_TOKEN AccessToken,
IN TOKEN_INFORMATION_CLASS TokenInformationClass,
OUT PVOID *TokenInformation
)

/*++


Routine Description:

Retrieve information about a specified token.

Arguments:

TokenHandle - Provides a handle to the token to operate on.

TokenInformationClass - The token information class about which
to retrieve information.

TokenInformation - Receives a pointer to the requested information.
The actual structures returned are dependent upon the information
class requested, as defined in the TokenInformationClass parameter
description.

TokenInformation Format By Information Class:

TokenUser => TOKEN_USER data structure. TOKEN_QUERY
access is needed to retrieve this information about a
token.

TokenGroups => TOKEN_GROUPS data structure. TOKEN_QUERY
access is needed to retrieve this information about a
token.

TokenPrivileges => TOKEN_PRIVILEGES data structure.
TOKEN_QUERY access is needed to retrieve this information
about a token.

TokenOwner => TOKEN_OWNER data structure. TOKEN_QUERY
access is needed to retrieve this information about a
token.

TokenPrimaryGroup => TOKEN_PRIMARY_GROUP data structure.
TOKEN_QUERY access is needed to retrieve this information
about a token.

TokenDefaultDacl => TOKEN_DEFAULT_DACL data structure.
TOKEN_QUERY access is needed to retrieve this information
about a token.

TokenSource => TOKEN_SOURCE data structure.
TOKEN_QUERY_SOURCE access is needed to retrieve this
information about a token.

TokenType => TOKEN_TYPE data structure.
TOKEN_QUERY access is needed to retrieve this information
about a token.

TokenStatistics => TOKEN_STATISTICS data structure.
TOKEN_QUERY access is needed to retrieve this
information about a token.

Return Value:

STATUS_SUCCESS - Indicates the operation was successful.


ЗЫ можно еще подождать местных гуру кернел-мода.
<programming>
[win32] помогите понять почему zwqueryinformationtoken выдавёт ошибку status_invalid_handle 30.01.06 12:10  
Автор: mmb Статус: Незарегистрированный пользователь
<"чистая" ссылка>
фрагмент кода:
PIO_STACK_LOCATION currentIrpStack;
HANDLE hTokenUser = NULL;
ULONG dwSizeOfToken = 0;
//
currentIrpStack = IoGetCurrentIrpStackLocation(Irp);
case IRP_MJ_CREATE:
if( currentIrpStack == NULL ) {
return ...;
}
hTokenUser = currentIrpStack->Parameters.Create.SecurityContext->AccessState->Subje ctSecurityContext.ClientToken;
if( hTokenUser == NULL ) {
return ...;
}
Status = ZwQueryInformationToken( hTokenUser, TokenUser, NULL, 0, &dwSizeOfToken);

и в результате
Status == STATUS_INVALID_HANDLE
В чём может быть дело?
А кто сказал что currentirpstack->parameters.create.securitycontext->accessstate->subje ctsecuritycontext.clienttoken - это handle? 30.01.06 13:14  
Автор: Killer{R} <Dmitry> Статус: Elderman
Отредактировано 30.01.06 13:19  Количество правок: 1
<"чистая" ссылка>
ИМХО там указатель на чтото типа
typedef struct _PROCESS_ACCESS_TOKEN {

//
// Handle to Primary token to assign to the process.
// TOKEN_ASSIGN_PRIMARY access to this token is needed.
//

HANDLE Token;

//
// Handle to the initial thread of the process.
// A process's access token can only be changed if the process has
// no threads or one thread. If the process has no threads, this
// field must be set to NULL. Otherwise, it must contain a handle
// open to the process's only thread. THREAD_QUERY_INFORMATION access
// is needed via this handle.

HANDLE Thread;

} PROCESS_ACCESS_TOKEN, *PPROCESS_ACCESS_TOKEN;


ЗЫ а почему не воспользоваться ZwOpenProcessToken/ZwOpenThreadToken?
[win32] а кто сказал что currentirpstack->parameters.create.securitycontext->accessstate->subje ctsecuritycontext.clienttoken - это handle? 30.01.06 13:34  
Автор: mmb Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> ИМХО там указатель на чтото типа
> typedef struct _PROCESS_ACCESS_TOKEN {
>
> //
> // Handle to Primary token to assign to the process.
> // TOKEN_ASSIGN_PRIMARY access to this token is needed.
> //
>
> HANDLE Token;
>
> //
> // Handle to the initial thread of the process.
> // A process's access token can only be changed if the
> process has
> // no threads or one thread. If the process has no
> threads, this
> // field must be set to NULL. Otherwise, it must
> contain a handle
> // open to the process's only thread.
> THREAD_QUERY_INFORMATION access
> // is needed via this handle.
>
> HANDLE Thread;
>
> } PROCESS_ACCESS_TOKEN, *PPROCESS_ACCESS_TOKEN;
>
>
> ЗЫ а почему не воспользоваться
> ZwOpenProcessToken/ZwOpenThreadToken?

В файле дано описание структур
Module Name: ntddk.h

typedef struct _SECURITY_SUBJECT_CONTEXT {
PACCESS_TOKEN ClientToken;
SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
PACCESS_TOKEN PrimaryToken;
PVOID ProcessAuditId;
} SECURITY_SUBJECT_CONTEXT, *PSECURITY_SUBJECT_CONTEXT;

typedef PVOID PACCESS_TOKEN; // winnt

В файле и описание самой функции
Module Name: ntifs.h, release 53.

NTKERNELAPI
NTSTATUS
SeQueryInformationToken (
IN PACCESS_TOKEN Token,
IN TOKEN_INFORMATION_CLASS TokenInformationClass,
OUT PVOID *TokenInformation
);
ZwQueryInformationToken!=SeQueryInformationToken 30.01.06 13:41  
Автор: Killer{R} <Dmitry> Статус: Elderman
<"чистая" ссылка>
[Win32] Мне нужен токен пользователя, от имени которого запущен процесс, а взять его можно из ClientToken 30.01.06 14:41  
Автор: mmb Статус: Незарегистрированный пользователь
<"чистая" ссылка>
а не известно, как преобразовать PACCESS_TOKEN в HANDLE, потому что кроме варинта доступа через
currentIrpStack->Parameters.Create.SecurityContext->AccessState->SubjectSecurityContext.ClientToken
ничего не описано
и описание вызова функции SeQueryInformationToken нигде не удалось найти :(
[Win32] Чтобы получить хендл, объект надо открыть [upd] 01.02.06 13:27  
Автор: amirul <Serge> Статус: The Elderman
Отредактировано 01.02.06 13:30  Количество правок: 1
<"чистая" ссылка>
> а не известно, как преобразовать PACCESS_TOKEN в HANDLE,

В данном конкртеном случае нужна функция ObOpenObjectByPointer

---------------

Только как по мне резолвить имя доменного юзера не выходя из нулевого кольца - гиблое дело. Как получить имя локального пользователя, я уже писал, а в домене скорее всего придется слать CIFS/SMB пакеты. Тогда уж действительно проще будет в каком нибудь юзерском процессе создать свой поток или в юзерский поток вставить APC. Ну в крайнем случае остается вариант - держать выделенный процесс (например сервис) специально для общения со своим драйвером.
IRP приходит в контексте процесса/потока который сделал запрос 30.01.06 15:04  
Автор: Killer{R} <Dmitry> Статус: Elderman
<"чистая" ссылка>
> а не известно, как преобразовать PACCESS_TOKEN в HANDLE,
> потому что кроме варинта доступа через
> currentIrpStack->Parameters.Create.SecurityContext->A
> ccessState->SubjectSecurityContext.ClientToken
> ничего не описано
> и описание вызова функции SeQueryInformationToken нигде не
> удалось найти :(
Потому ZwOpenProcess/ThreadToken на KeGetCurrentXxx должен дать тебе хэндл на нужный тебе токен более-менее документированным способом.

А по поводу SeQueryInformationToken:

SeQueryInformationToken (
IN PACCESS_TOKEN AccessToken,
IN TOKEN_INFORMATION_CLASS TokenInformationClass,
OUT PVOID *TokenInformation
)

/*++


Routine Description:

Retrieve information about a specified token.

Arguments:

TokenHandle - Provides a handle to the token to operate on.

TokenInformationClass - The token information class about which
to retrieve information.

TokenInformation - Receives a pointer to the requested information.
The actual structures returned are dependent upon the information
class requested, as defined in the TokenInformationClass parameter
description.

TokenInformation Format By Information Class:

TokenUser => TOKEN_USER data structure. TOKEN_QUERY
access is needed to retrieve this information about a
token.

TokenGroups => TOKEN_GROUPS data structure. TOKEN_QUERY
access is needed to retrieve this information about a
token.

TokenPrivileges => TOKEN_PRIVILEGES data structure.
TOKEN_QUERY access is needed to retrieve this information
about a token.

TokenOwner => TOKEN_OWNER data structure. TOKEN_QUERY
access is needed to retrieve this information about a
token.

TokenPrimaryGroup => TOKEN_PRIMARY_GROUP data structure.
TOKEN_QUERY access is needed to retrieve this information
about a token.

TokenDefaultDacl => TOKEN_DEFAULT_DACL data structure.
TOKEN_QUERY access is needed to retrieve this information
about a token.

TokenSource => TOKEN_SOURCE data structure.
TOKEN_QUERY_SOURCE access is needed to retrieve this
information about a token.

TokenType => TOKEN_TYPE data structure.
TOKEN_QUERY access is needed to retrieve this information
about a token.

TokenStatistics => TOKEN_STATISTICS data structure.
TOKEN_QUERY access is needed to retrieve this
information about a token.

Return Value:

STATUS_SUCCESS - Indicates the operation was successful.


ЗЫ можно еще подождать местных гуру кернел-мода.
[Win32] При локальной работе это бы подошло, но у меня работа на сервере :( 30.01.06 15:15  
Автор: mmb Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> Потому ZwOpenProcess/ThreadToken на KeGetCurrentXxx должен
> дать тебе хэндл на нужный тебе токен более-менее
> документированным способом.

При локальной работе это бы подошло, но у меня работа на сервере :(
[UPD]В смысле lanman сетевые клиенты? 30.01.06 15:44  
Автор: Killer{R} <Dmitry> Статус: Elderman
Отредактировано 31.01.06 13:19  Количество правок: 1
<"чистая" ссылка>
А они через impersonating работают и ZwOpenThreadToken вернет правильный токен если OpenAsSelf установить в тру

[UPD]
Сорри, OpenAsSelf надо FALSE
[Win32] Надо проверить... 30.01.06 15:45  
Автор: mmb Статус: Незарегистрированный пользователь
<"чистая" ссылка>
1




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


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