информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Все любят медПортрет посетителяСетевые кракеры и правда о деле Левина
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 ФБР нашла русский след в атаках... 
 Массовый взлом SharePoint 
 Microsoft Authenticator прекращает... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / operating systems
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Кто соображает в NT security — вроде как баг отловил... 20.05.03 22:15  
Автор: HandleX <Александр М.> Статус: The Elderman
Отредактировано 20.05.03 22:21  Количество правок: 1
<"чистая" ссылка>
Короче, суть бага такова, что включение SeDebugPrivilege выключает SeSecurityPrivilege.
program TestProg;
{$APPTYPE CONSOLE}
uses
  Windows, SysUtils;

  function SysErrorMessage(ErrorCode: Integer): string;
  begin
    Result := SysUtils.SysErrorMessage(ErrorCode);
    ANSItoOEM(PChar(Result), PChar(Result));
    If Result <> '' Then
      Result := Format('%s (Error %d)', [Result, ErrorCode]);
  end;

Type
  TTokenPrivileges = record
    PrivilegeCount: DWORD;
    Privileges: array[0..1] of TLUIDAndAttributes;
  end;

Var
  pHndl: THandle;
  aSD: PSecurityDescriptor;
  aSize: DWord;
  hToken: THandle;
  tkp: TTokenPrivileges;
begin
  hToken := 0;
  Try
    ZeroMemory(@tkp, SizeOf(tkp));
    //чтобы потестить  только с SeSecurityPrivilege, выставьте здесь единичку вместо двойки.
    tkp.PrivilegeCount := 2;
    tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
    tkp.Privileges[1].Attributes := SE_PRIVILEGE_ENABLED;

    If Not (//Выставляем привилегии для процесса
      OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, hToken) And
      LookupPrivilegeValue(Nil, 'SeSecurityPrivilege', tkp.Privileges[0].Luid) And
      LookupPrivilegeValue(Nil, 'SeDebugPrivilege', tkp.Privileges[1].Luid) And
      AdjustTokenPrivileges(hToken, False, PTokenPrivileges(@tkp)^, 0, Nil, PDWORD(Nil)^))
    Then Begin
      WriteLn(SysErrorMessage(GetLastError));
      Exit;
    End;

    //Открываем процесс с требуемым уровнем доступа
    pHndl := OpenProcess(MAXIMUM_ALLOWED Or ACCESS_SYSTEM_SECURITY, False, GetCurrentProcessID);
    If pHndl = 0 Then Begin
      WriteLn(SysErrorMessage(GetLastError));
      Exit;
    End; // Прикольно, что здесь всё нормально, OS выдаёт дескриптор процесса с этим уровнем доступа!

    Try
      aSD := Nil; //   VVV    А вот здесь ненормально - возвращает false и говорит, что в доступе отказано!
      GetKernelObjectSecurity(pHndl, SACL_SECURITY_INFORMATION, aSD, 0, aSize);
      If GetLastError <> ERROR_INSUFFICIENT_BUFFER Then
      Begin
        WriteLn(SysErrorMessage(GetLastError));
        Exit;
      End;
      GetMem(aSD, aSize);
      Try
        If Not GetKernelObjectSecurity(pHndl, SACL_SECURITY_INFORMATION, aSD, aSize, aSize) Then
        Begin
          WriteLn(SysErrorMessage(GetLastError));
          Exit;
        End;
      Finally
        FreeMem(aSD);
      End;
    Finally
      CloseHandle(pHndl);
    End;
    WriteLn('Success!');
  Finally
    If hToken <> 0 Then CloseHandle(hToken);
    Write('Press Enter to continue...');
    ReadLn;
  End;
end.

---
Я не гуру конечно, но 21.05.03 10:13  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> Короче, суть бага такова, что включение SeDebugPrivilege
> выключает SeSecurityPrivilege.
Это вряд ли. Я видел токены со включенными обоими этими привилегиями.

> //чтобы потестить только с SeSecurityPrivilege,
> выставьте здесь единичку вместо двойки.
Потестить не могу, так как не дельфиец (СОВСЕМ не дельфиец :-) ). А переписывать самому в лом. Я так понимаю, пока не включается SE_DEBUG_NAME все работает отлично?

> pHndl := OpenProcess(MAXIMUM_ALLOWED Or
> ACCESS_SYSTEM_SECURITY, False, GetCurrentProcessID);
> End; // Прикольно, что здесь всё нормально, OS выдаёт
> дескриптор процесса с этим уровнем доступа!
Вот главная причина, по которой можно судить что SE_SECURITY_NAME не вырубилась. Хендл получен - значит привилегия есть. А не хватает запрошенных прав в самом хендле. Можно попробовать открыть процесс с PROCESS_ALL_ACCESS и посмотреть что получится. (небольшой оффтоп: тем кто говорил, что у паскаля ясный синтаксис - мне вот например ну ничего не говорит о том, что GetCurrentProcessID на самом деле функция).


> aSD := Nil; // VVV А вот здесь ненормально -
> возвращает false и говорит, что в доступе отказано!
> GetKernelObjectSecurity(pHndl,
> SACL_SECURITY_INFORMATION, aSD, 0, aSize);
Попробуй посмотреть какие реально привилегии у процесса и какие права у хендла. Можно написать самому что нить в этом роде, но мне вот например нравятся утилитки со http://www.smidgeonsoft.com/
В частности TopToBottomNT может это все посмотреть.

Успехов
Нда. Почти всё так, но косяк всё равно ;-) 21.05.03 10:35  
Автор: HandleX <Александр М.> Статус: The Elderman
<"чистая" ссылка>
> > Короче, суть бага такова, что включение
> SeDebugPrivilege
> > выключает SeSecurityPrivilege.
> Это вряд ли. Я видел токены со включенными обоими этими
> привилегиями.
Я знаю. Я специально при отладке смотрел токен — обе привилегии включены.
>
> > //чтобы потестить только с SeSecurityPrivilege,
> > выставьте здесь единичку вместо двойки.
> Потестить не могу, так как не дельфиец (СОВСЕМ не дельфиец
> :-) ). А переписывать самому в лом. Я так понимаю, пока не
> включается SE_DEBUG_NAME все работает отлично?
Да, без SE_DEBUG_NAME всё работает.

> > pHndl := OpenProcess(MAXIMUM_ALLOWED Or
> > ACCESS_SYSTEM_SECURITY, False, GetCurrentProcessID);
> > End; // Прикольно, что здесь всё нормально, OS
> выдаёт
> > дескриптор процесса с этим уровнем доступа!
> Вот главная причина, по которой можно судить что
> SE_SECURITY_NAME не вырубилась. Хендл получен - значит
> привилегия есть. А не хватает запрошенных прав в самом
> хендле. Можно попробовать открыть процесс с
Не помогает. Да и более того:
PROCESS_ALL_ACCESS = 111110000111111111111 (binary);
ACCESS_SYSTEM_SECURITY = 1000000000000000000000000 (binary),
т.е. PROCESS_ALL_ACCESS на самом деле не такой уж и «полный» ;-)


> (небольшой
> оффтоп: тем кто говорил, что у паскаля ясный синтаксис -
> мне вот например ну ничего не говорит о том, что
> GetCurrentProcessID на самом деле функция).
В смысле можно спутать с переменной? По семантике, если вникнуть, скобки () избыточны, если параметров нет ;-) Это дело привычки...

> > aSD := Nil; // VVV А вот здесь ненормально
> -
> > возвращает false и говорит, что в доступе отказано!
> > GetKernelObjectSecurity(pHndl,
> > SACL_SECURITY_INFORMATION, aSD, 0, aSize);
> Попробуй посмотреть какие реально привилегии у процесса и
> какие права у хендла. Можно написать самому что нить в этом
> роде, но мне вот например нравятся утилитки со
> http://www.smidgeonsoft.com/
> В частности TopToBottomNT может это все посмотреть.
>
> Успехов
Спасибо, попробую.
1




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


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