2010-01-15 24 views
12

Estoy ejecutando un proceso como usuario en el grupo Administradores, tratando de obtener un token de proceso para otro proceso. El otro proceso lo ejecuta un usuario que no está en el grupo Administradores. Aquí está la esencia del código que estoy usando. pid en este código representa la identificación del proceso del proceso que no es administrador. Todo esto está en Windows XP SP 2 y todo en la misma máquina. No hay acceso remoto pasando aquí.¿Por qué OpenProcessToken falla con ERROR_ACCESS_DENIED

HANDLE handle; 
HANDLE token; 

handle = OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,pid); 
token = NULL; 
OpenProcessToken(handle,TOKEN_DUPLICATE,&token); 

referencia para OpenProcess aquí: http://msdn.microsoft.com/en-us/library/ms684320%28VS.85%29.aspx

referencia para OpenProcessToken aquí: http://msdn.microsoft.com/en-us/library/aa379295%28VS.85%29.aspx

OpenProcess tiene éxito, pero no importa lo que pase para el argumento DesiredAccess a OpenProcessToken, se produce un error y el retorno GetLastError() ERROR: ACCESO DENEGADO. Agregué un código para entender los privilegios del proceso que ejecuta este código y para habilitar el mayor número posible, así como para reunir información sobre el proceso que estoy tratando de obtener un token. Eso implicó solicitar más acceso (READ_CONTROL | ACCESS_SYSTEM_SECURITY además de PROCESS_QUERY_INFORMATION) de OpenProcess y llamar a GetKernelObjectSecurity (handle). Esto es lo que tengo:

current user: PLEASE_T\dbyron (S-1-5-21-3405506234-1792454352-3826119157-1005) 
current process: group 0: flags: 0x00000007 sid: S-1-5-21-3405506234-1792454352-3826119157-513 (PLEASE_T\None) 
current process: group 1: flags: 0x00000007 sid: S-1-1-0 (\Everyone) 
current process: group 2: flags: 0x0000000F sid: S-1-5-32-544 (BUILTIN\Administrators) 
current process: group 3: flags: 0x00000007 sid: S-1-5-32-545 (BUILTIN\Users) 
current process: group 4: flags: 0x00000007 sid: S-1-5-4 (NT AUTHORITY\INTERACTIVE) 
current process: group 5: flags: 0x00000007 sid: S-1-5-11 (NT AUTHORITY\Authenticated Users) 
current process: group 6: flags: 0xC0000007 sid: S-1-5-5-0-91553 (no account mapping) 
current process: group 7: flags: 0x00000007 sid: S-1-2-0 (\LOCAL) 
SeDebugPrivilege privilege enabled 
SeTakeOwnershipPrivilege privilege enabled 
SeSecurityPrivilege privilege enabled 
SeChangeNotifyPrivilege privilege enabled 
SeBackupPrivilege privilege enabled 
SeRestorePrivilege privilege enabled 
SeSystemtimePrivilege privilege enabled 
SeShutdownPrivilege privilege enabled 
SeRemoteShutdownPrivilege privilege enabled 
SeDebugPrivilege privilege enabled 
SeSystemEnvironmentPrivilege privilege enabled 
SeSystemProfilePrivilege privilege enabled 
SeProfileSingleProcessPrivilege privilege enabled 
SeIncreaseBasePriorityPrivilege privilege enabled 
SeLoadDriverPrivilege privilege enabled 
SeCreatePagefilePrivilege privilege enabled 
SeIncreaseQuotaPrivilege privilege enabled 
SeUndockPrivilege privilege enabled 
SeManageVolumePrivilege privilege enabled 
SeImpersonatePrivilege privilege enabled 
SeCreateGlobalPrivilege privilege enabled

He tratado de conseguir todos los privilegios posibles, y creo que la información del grupo anterior muestra que el proceso llamando OpenTokenProcess es un miembro del grupo de administradores.

Aquí está la información de GetKernelObjectSecurity:

control(SE_DACL_PRESENT | SE_SELF_RELATIVE, 0x00008004) 
owner sid: S-1-5-21-3405506234-1792454352-3826119157-2807 (PLEASE_T\dummyusr) 
group sid: S-1-5-21-3405506234-1792454352-3826119157-513 (PLEASE_T\None) 
grant: mask(PROCESS_ALL_ACCESS, 0x001F0FFF), flags(0x00000000): S-1-5-21-3405506234-1792454352-3826119157-2807 (PLEASE_T\dummyusr) 
grant: mask(PROCESS_ALL_ACCESS, 0x001F0FFF), flags(0x00000000): S-1-5-32-544 (BUILTIN\Administrators) 
grant: mask(PROCESS_ALL_ACCESS, 0x001F0FFF), flags(0x00000000): S-1-5-18 (NT AUTHORITY\SYSTEM)

lo que parece que el proceso dummyusr (no administrador) permite el acceso al grupo de administradores. Es posible que esté malinterpretando el ¿Entonces por qué OpenProcessToken falla con ERROR_ACCESS_DENIED? Intenté cambiar TOKEN_DUPLICATE por TOKEN_QUERY, pero eso no cambia el resultado.

¿E-uniendo un privilegio? ¿Qué otra cosa me negaría el acceso a un token de acceso para este proceso? Lo intenté en una máquina sin software antivirus y todavía obtengo el mismo resultado.

También probé esto ejecutándose en el contexto del sistema. La información sobre el proceso en curso en ese caso es:

current user: NT AUTHORITY\SYSTEM (S-1-5-18) 
current process: group 0: flags: 0x0000000E sid: S-1-5-32-544 (BUILTIN\Administrators) 
current process: group 1: flags: 0x00000007 sid: S-1-1-0 (\Everyone) 
current process: group 2: flags: 0x00000007 sid: S-1-5-11 (NT AUTHORITY\Authenticated Users)

Tenga en cuenta que las banderas son ligeramente diferentes para el grupo BUILTIN \ Administradores. El proceso de administrador tenía 0xF y el proceso del sistema tenía 0xE. Desde http://msdn.microsoft.com/en-us/library/aa379624%28VS.85%29.aspx, el bit 0x1 significa SE_GROUP_MANDATORY que no parece relevante aquí.

Por defecto, el proceso de contexto del sistema también tenía algunos privilegios adicionales:

SeAuditPrivilege 
SeCreatePermanentPrivilege 
SeLockMemoryPrivilege 
SeTcbPrivilege

Pero todos ellos discapacitado y OpenProcessToken todavía tuvieron éxito en el proceso de contexto del sistema.

Gracias por su ayuda.

+0

(1) buena pregunta. Me enfrento a este tipo de problemas cada pocos meses cuando escribo un nuevo servicio de Windows, y obviamente cada vez que me olvido del baile. –

+0

¿Encontró una solución? (excepto que se ejecuta como servicio local) – vdk

Respuesta

1

En lugar de entrar en detalles primero, ¿ha seguido la ruta de la eliminación? - ejecutar el proceso como LOCAL_SYSTEM y ver si eso funciona. Después de todo, si Dios no puede hacerlo, nadie puede: P.

+0

Buena idea. Lo intenté y, por supuesto, funcionó como la cuenta del sistema. Lamentablemente, no se encienden las bombillas sobre por qué la cuenta de administrador no funciona. – dbyron

+0

Otro punto de fricción en estos asuntos es cómo estás conectado a la computadora de destino. Las conexiones a Escritorio remoto no tienen "acceso a la consola" de forma predeterminada. Si de hecho está desarrollando de forma remota: recomendaría el modificador/console o/admin (según la versión de Windows), que puede proporcionar al cliente RDP a través de la cadena de conexión. –

+0

Esto es todo en una sola máquina. No hay acceso remoto pasando aquí. – dbyron

0

Supongo que el SECURITY_DESCRIPTOR del proceso específico solo permite al usuario del SISTEMA abrir su token de proceso. Esto significaría tristemente que no hay nada que puedas hacer.

-1

sí hay una solución que puede ejecutar un servicio o una instancia de su aplicación como servicio. De esta manera obtendrá el código que se ejecuta como sistema ....

Otra opción (pero más intrusivo) ya que son ya de administración, es cambiar la ACL proceso de destino ....

Cuestiones relacionadas