Windows Vista/Windows 7 privilegio: SeDebugPrivilege & OpenProcess


Todo lo que he podido encontrar sobre escalar a los privilegios apropiados para mis necesidades ha estado de acuerdo con mis métodos actuales, pero el problema existe. Espero que tal vez alguien tiene un poco de Windows Vista/Windows 7 experiencia interna que podría brillar un poco de luz donde solo hay oscuridad. Estoy seguro de que esto se alargará, pero por favor tengan paciencia conmigo.

Contexto

Estoy trabajando en una aplicación que requiere acceder a la memoria de otros procesos en la máquina actual. Esto, obviamente, requiere derechos de administrador. También requiere SeDebugPrivilege (no, no es un error ortográfico de SetDebugPrivilege), que creo que estoy adquiriendo correctamente, aunque cuestiono si no son necesarios más privilegios y por lo tanto la causa de mis problemas. El código hasta ahora ha funcionado con éxito en todas las versiones de Windows XP, y en mis entornos de prueba Vista de 32 bits y Windows 7 de 64 bits.

Proceso

  • El Programa Siempre se ejecutará con Derechos de Administrador. Esto puede se asumirá a lo largo de este post.
  • Escalando el proceso actual Access Token para incluir SeDebugPrivilege derechos.
  • Usando EnumProcesses para crear una lista de PIDs actuales en el sistema
  • Abrir una manija usando OpenProcess con PROCESS_ALL_ACCESS derechos de acceso
  • Usando ReadProcessMemory para leer la memoria del otro proceso.

Problema:

Todo ha estado funcionando bien durante el desarrollo y mis pruebas personales (incluyendo Windows XP 32 & 64, Windows Vista 32, y Windows 7 x64). Sin embargo, durante una implementación de prueba en máquinas Windows Vista (32 bits) y Windows 7 (64 bits) de un colega, parece haber un problema de privilegios / derechos con OpenProcess falla con un error genérico Access Denied. Esto ocurre tanto cuando se ejecuta como un Usuario limitado (como sería de esperar) y también cuando se ejecuta explícitamente como Administrador (haga clic con el botón derecho → Ejecutar como Administrador y cuando se ejecuta desde un símbolo del sistema a nivel de Administrador).

Sin embargo, este problema tiene ha sido irreproducible para mí en mi entorno de prueba. He sido testigo del problema de primera mano, así que confío en que el problema exista. La única diferencia que puedo discernir entre el entorno real y mi entorno de prueba es que el error actual está ocurriendo cuando se usa una cuenta de Administrador de dominio en el prompt de UAC, mientras que mis pruebas (que funcionan sin errores) usan una cuenta de administrador local en el prompt de UAC.

Parece que aunque las credenciales son utilizado permitir UAC para 'ejecutar como administrador', el proceso todavía no está obteniendo los derechos correctos para ser capaz de OpenProcess en otro proceso. No estoy lo suficientemente familiarizado con el funcionamiento interno de Vista/Windows 7 para saber lo que esto podría ser, y espero que alguien tenga una idea de lo que podría ser la causa.

El Pateador

La persona que ha reportado este error, y cuyo entorno puede reproducir regularmente este error, tiene una pequeña aplicación llamada en la línea de RunWithDebugEnabled que es un pequeño programa de arranque que parece escalar sus propios privilegios y luego lanzar el ejecutable que se le pasa (heredando así los privilegios escalados). Cuando se ejecuta con este programa, utilizando las mismas credenciales de Administrador de dominio en UAC prompt, el programa funciona correctamente y es capaz de llamar con éxito OpenProcess y funciona según lo previsto.

Así que esto es definitivamente un problema con la adquisición de los privilegios correctos, y se sabe que la cuenta de Administrador de Dominio es una cuenta de administrador que debería poder acceder a los derechos correctos. (Obviamente obtener este código fuente sería genial, pero no estaría aquí si eso fuera posible).

Notas

Como se señaló, los errores reportados por el error OpenProcess los intentos son Access Denied. De acuerdo con la documentación de MSDN de OpenProcess:

Si la persona que llama ha habilitado el privilegio SeDebugPrivilege, el acceso solicitado se concede independientemente de la contenido del descriptor de seguridad.

Esto me lleva a creer que tal vez haya un problema bajo estas condiciones, ya sea con (1) Obtener SeDebugPrivileges o (2) Requerir otros privilegios que no se han mencionado en ninguna documentación de MSDN, y que podrían diferir entre una cuenta de Administrador de Dominio y una cuenta de Administrador Local{[19]]}

Código de ejemplo:

void sample()
{
   /////////////////////////////////////////////////////////
   //   Note: Enabling SeDebugPrivilege adapted from sample
   //     MSDN @ http://msdn.microsoft.com/en-us/library/aa446619%28VS.85%29.aspx
   // Enable SeDebugPrivilege
   HANDLE hToken = NULL;
   TOKEN_PRIVILEGES tokenPriv;
   LUID luidDebug;
   if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken) != FALSE)
   {
      if(LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luidDebug) != FALSE)
      {
         tokenPriv.PrivilegeCount           = 1;
         tokenPriv.Privileges[0].Luid       = luidDebug;
         tokenPriv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
         if(AdjustTokenPrivileges(hToken, FALSE, &tokenPriv, 0, NULL, NULL) != FALSE)
         {
            // Always successful, even in the cases which lead to OpenProcess failure
            cout << "SUCCESSFULLY CHANGED TOKEN PRIVILEGES" << endl;
         }
         else
         {
            cout << "FAILED TO CHANGE TOKEN PRIVILEGES, CODE: " << GetLastError() << endl;
         }
      }
   }
   CloseHandle(hToken);
   // Enable SeDebugPrivilege
   /////////////////////////////////////////////////////////

   vector<DWORD> pidList = getPIDs();  // Method that simply enumerates all current process IDs

   /////////////////////////////////////////////////////////
   // Attempt to open processes
   for(int i = 0; i < pidList.size(); ++i)
   {
      HANDLE hProcess = NULL;
      hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pidList[i]);
      if(hProcess == NULL)
      {
         // Error is occurring here under the given conditions
         cout << "Error opening process PID(" << pidList[i] << "): " << GetLastError() << endl;
      }
      CloseHandle(hProcess);
   }
   // Attempt to open processes
   /////////////////////////////////////////////////////////
}




Gracias!

Si alguien tiene alguna información sobre qué posibles permisos, privilegios, derechos, etc. que puede faltar para abrir correctamente otro proceso (suponiendo que el ejecutable ha sido correctamente"Ejecutar como Administrador" ed) en Windows Vista y Windows 7 bajo las condiciones anteriores, sería muy apreciado.

No estaría aquí si no estuviera absolutamente perplejo, pero tengo la esperanza de que una vez más la experiencia y el conocimiento del grupo brillen. Gracias por tomarse el tiempo para leer este muro de texto. Solo las buenas intenciones son apreciadas, ¡gracias por ser el tipo de persona que hace que Stack Overflow sea tan útil para todos!

Author: Peter Mortensen, 2010-05-29

1 answers

Así que después de mucha depuración y molestar a mucha gente para obtener información, finalmente pude rastrear al tipo que escribió la aplicación RunWithDebugEnabled y obtener un resumen de cómo funciona.

El problema, en este caso, es que el privilegio Debug programs en la política local para el administrador de dominio se había eliminado, y por lo tanto el token SeDebugPrivilege no estaba presente en el token de acceso del proceso. No se puede habilitar si no está presente en absoluto, y todavía no sé de ninguna manera de agregar el privilegio a un token de acceso existente.


Cómo funciona la magia actual:
Por lo tanto, la aplicación RunWithDebugEnabled magic usaría sus derechos de Administrador para instalarse como un servicio e iniciarse, por lo tanto, se ejecutaría bajo la cuenta de usuario SYSTEM en lugar del Administrador del Dominio. Con los privilegios SYSTEM, la aplicación crea un nuevo token de acceso que es idéntico al token de Administrador, solo con el token SeDebugPrivilege presente. Este nuevo token se utiliza para CreateProcessAsUser() y ejecutar el programa con el nuevo activado SeDebugPrivilege que faltaba antes.

En realidad no me gusta esta "solución" aquí, y he estado continuando mi búsqueda de una manera 'más limpia' para obtener este privilegio. Voy a publicar esto como otra pregunta aquí en SO, que voy a tratar de recordar para enlazar aquí también para ayudar a otros a seguir a lo largo y para referencia futura.

EDITAR: Suplantar EL SISTEMA (o equivalente) de la Cuenta de Administrador



Les agradezco a todos por su tiempo y energías para ayudar a depurar y resolver este problema. Realmente es muy apreciado!

 12
Author: KevenK,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:53:22