Ayuda con SeAssignSecurity

Iniciado por Vaagish, 31 Marzo 2015, 02:51 AM

0 Miembros y 1 Visitante están viendo este tema.

Vaagish

Hola!

Estoy tratando de cargar un driver en win7, pero el "loader" me devuelve el codigo de error 0xC0000061 - STATUS_PRIVILEGE_NOT_HELD

El driver es un simple driver de prueba.. solo tiene estas rutinas:

Código (cpp) [Seleccionar]
NTSTATUS DriverEntry (IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath);
NTSTATUS DriverCreate (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
NTSTATUS DriverClose (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
NTSTATUS DriverUnload (IN PDRIVER_OBJECT DriverObject);


Por lo que lei, deberia usar SeAssignSecurity, pero no estoy seguro en donde ni para que..

La sintaxis es esta:

Código (cpp) [Seleccionar]
NTSTATUS SeAssignSecurity(
  _In_opt_  PSECURITY_DESCRIPTOR      ParentDescriptor,
  _In_opt_  PSECURITY_DESCRIPTOR      ExplicitDescriptor,
  _Out_     PSECURITY_DESCRIPTOR      *NewDescriptor,
  _In_      BOOLEAN                   IsDirectoryObject,
  _In_      PSECURITY_SUBJECT_CONTEXT SubjectContext,
  _In_      PGENERIC_MAPPING          GenericMapping,
  _In_      POOL_TYPE                 PoolType
);


Donde deberia implementar dicha funcion? DriverEntry quizas? Y que consigo? Elevar los permisos de dicho objeto?

Bueno, eso es lo que me preocupa..

Gracias! Saludos!

x64core

¿Problemas de privilegios? El token del usuario debe ser alguno del grupo de administradores o del sistema y tener los privilegios habilitados, como administrador:

    #define SE_LOAD_DRIVER_PRIVILEGE         10L
   
    HANDLE hToken;
    BYTE Privileges[FIELD_OFFSET(TOKEN_PRIVILEGES, Privileges) + sizeof(LUID_AND_ATTRIBUTES)];
    PTOKEN_PRIVILEGES pTokenPrivileges;

    if (OpenProcessToken(
        GetCurrentProcess(),
        TOKEN_ADJUST_PRIVILEGES,
        &hToken))
    {
        pTokenPrivileges = (PTOKEN_PRIVILEGES)Privileges;
        pTokenPrivileges->PrivilegeCount = 1;
        pTokenPrivileges->Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
        pTokenPrivileges->Privileges[0].Luid.HighPart = 0;
        pTokenPrivileges->Privileges[0].Luid.LowPart = SE_LOAD_DRIVER_PRIVILEGE;
        if (AdjustTokenPrivileges(hToken, FALSE, pTokenPrivileges, 0, NULL, NULL))
        {
            // Load driver
           
        }
        CloseHandle(hToken);
    }
   

Vaagish

Excelente!! Muchas gracias x64Core!

Una pequeña duda mas..

Cual seria el proposito de poner estas restricciones si se puede "evadir" con un poco de codigo?? A lo mejor lo estoy mal interpretando yo,, pero es algo asi como no poner ninguna restricción/control, no?

Saludos! Gracias!

x64core

En realidad para administradores el privilegio está desactivado por defecto pero para usuarios cómunes no esta disponible, osea incluso si ejecutas ese código no podrás habilitar el privilegio. Es una caracteristica de seguridad de Windows, es por eso que se introdujo la UAC desde Windows Vista+. Pero esto puede ser modificado en el panel de control. Más cosas podrian ser hechas por ejemplo creando Tokens con privilegios especificos, programas de seguridad como Antivirus controlan este tipo de acciones, etc. Podes usar alguna herramienta como Process Explorer para analizar los procesos del sistema y usuarios, ejecutar como administrador de preferencia.

Vaagish

Entiendo.. Gracias x64! Asunto resuelto.

Saludos!