Vinod tiene la información correcta, pero para ampliarla un poco:
El Administrador de control de servicios (SCM, también consulte MSDN ) es el proceso principal de todos los servicios de Windows, y también es un Servidor de llamada a procedimiento remoto (RPC). Cuando se inicia un servicio (y asumiendo que el servicio no está en un binario compartido, generalmente svchost.exe
, que es una configuración utilizada principalmente para los servicios escritos por Microsoft), el SCM ejecuta el comando de servicio (en su ejemplo, C:\Program Files (x86)\Donald Duck\Donald_Duck.exe
) y luego espera a que el servicio se vuelva a conectar al SCM a través de RPC e informe que está en el inicio . Si el servicio no reporta al SCM (o informa que no pudo iniciarse por algún motivo, o no puede pasar del estado de inicio al estado de ejecución) dentro de un límite de tiempo (30000 ms o 30 segundos), entonces El SCM eliminará el proceso .
Para fines de explotación, hay tres maneras de solucionar esto.
- Realice su trabajo dentro de la ventana de 30 segundos (lo ideal es que esté bien dentro de ella, ya que en una máquina con suficiente carga puede gastar una gran cantidad de esa ventana esperando el tiempo de CPU o E / S). Si todo lo que necesita hacer es, por ejemplo, cambiar una clave de registro o acceder a un archivo, o tal vez algo como inyectar una DLL en otro proceso privilegiado, esto generalmente está bien.
- Inicia un proceso secundario que realiza el trabajo real. El SCM eliminará el proceso que inició, pero los hijos de ese proceso pueden continuar ejecutándose.
- Informe al SCM que usted es, de hecho, el servicio secuestrado y que está haciendo lo correcto. Esto no es trivial, pero en realidad no es tan difícil si conoce alguna programación en C, o especialmente en Win32 (en particular, no necesita saber nada sobre RPC, ya que todo está envuelto en Win32
ServiceDoThing()
APIs). Es posible que deba hacer esto si, por ejemplo, es importante para su escenario de explotación que el servicio parece estar ejecutándose (tal vez a algunos otros componentes les preocupa si el inicio del servicio tuvo éxito, o algún proceso de monitoreo se quejará a alguien si el lanzamiento falla) . La documentación para informar que usted es un programa de servicio se encuentra en MSDN .
Independientemente de todo esto, hay algo más que debes considerar. A menos que alguien haya cambiado los permisos NTFS de sus valores predeterminados, no puede crear ninguno de esos archivos sin que ya sea un Administrador. De manera predeterminada, los usuarios que no son administradores pueden crear (o edite) los directorios pero no los archivos en la raíz de una unidad, y, por supuesto, el directorio Program Files (x86)
ya existe, por lo que no puede crear una nueva copia. Tampoco puede cambiarle el nombre para reemplazarlo por otro directorio que controle. Tampoco puede crear, editar o renombrar los contenidos de Program Files
o Program Files (x86)
en absoluto, sin privilegios de administrador.
Dado que tener privilegios de administrador es equivalente a tener privilegios de SISTEMA (es decir, un administrador puede tomar el control y editar la ACL en cualquier cosa a la que quiera acceder, incluso si normalmente es solo SISTEMA, o simplemente puede iniciar un programa como SISTEMA) Si tiene suficientes privilegios para explotar este error de codificación, ya tiene todos los privilegios que le otorgaría. En otras palabras, aquí no hay Escalation of Privilege . sigue siendo un error de codificación, y podría tener un impacto de seguridad en un sistema mal configurado, pero en ese punto el error realmente se reduce a quien haya cambiado las ACL en la raíz de la unidad o el Program Files (x86)
directorio.