2009-07-20 15 views
6

¿Hay alguna alternativa a LogonUser y para suplantar la cuenta dada para acceder a los recursos de red? Estoy buscando el método de suplantación que me permita conectarme a la máquina en dominios extranjeros (o máquinas de grupos de trabajo para el mismo asunto).Alternativas a LogonUser para suplantación de red (C++)

Para los datos iniciales que tengo: nombre de la máquina, nombre de usuario (o dominio \ nombre de usuario), contraseña de texto claro.

Sé que hay una forma de establecer una conexión usando WNetAddConnection a \\ machinename \ ipc $, entonces la mayoría de las funciones de red se ejecutarán en un contexto de esa cuenta, sin embargo win2008 agregó otro giro y algunas funciones aún usan la cuenta, que hilo se está ejecutando en.

También sé que hay alguna forma de obtener un token de suplantación utilizando SSPI. ¿Alguien ha experimentado con esos tokens, son buenos para acceder a acciones, SCM, registro remoto y esas cosas? ¿Qué es lo que usa WNetAddConnection?

EDIT: Para aclarar, la razón por la que no puedo utilizar LogonUser es porque necesito al suplantar al usuario en un dominio que no sea de confianza o un grupo de trabajo

Edit2: Otra aclaración: el tema que estoy tratando de implementar es similar a psexec, por ejemplo:

  • programa no debe modificar la configuración de host o directorio activo (por ejemplo: crear usuarios locales temporales, etc.). Por otra parte suposición no se puede decir que se está ejecutando en DC o no
  • no puede haber supuestos acerca de qué software está preinstalado en la máquina remota, única condición dada es que el intercambio de archivos de Windows está habilitado en el blanco
  • Cuenta Se sabe que la contraseña funciona en el destino, pero la máquina de destino puede estar en el dominio local, en el dominio externo, no en el dominio.

Edit3: realmente me gustaría saber más acerca de la opción de SSPI InitializeSecurityContext/AcquireCredentialsHandle. ¿Hay alguien que haya trabajado extensivamente con esta API? ¿Es posible utilizar los tokens devueltos con suplantación, para que un hilo pueda acceder a los recursos compartidos de red y copiar archivos, etc.? ¿Alguien puede publicar un fragmento de código que funcione?

EDIT4: Gracias a Marsh Ray, el problema se resolvió. Si alguien está buscando para ver el código de prueba de concepto, it is here

Respuesta

7

Si tienes intención de "acceso a recursos de red" fuera de su bosque, hacer eso con WNetAddConnection2/3 como usted ha mencionado, o utilizar las API estándar con RPC RPC_ C__ AUTHN__ GSS__ NEGOTIATE y estructura de credenciales explícitas.

Normalmente, "suplantación" es algo que sucede en el lado del servidor. El lado del servidor podrá suplantar la conexión como la cuenta a la que se está conectando.

Pero la clave es esta: la suplantación solo tiene sentido para suplantar una cuenta a la que el servidor puede acceder en su directorio SAM/dominio/bosque local. Si el cliente y el servidor se encuentran en bosques diferentes, es evidente que no pueden ponerse de acuerdo sobre el SID de una cuenta para un token de suplantación (excepto en el caso de SID conocidos como Administrator que sirven principalmente para confundir este tipo de cosas), y eso parece necesario para verificar contra las DACL, etc.

Quizás lo que desea es llamar a LogonUserEx con la bandera LOGON32__ LOGON__ NEW__ CREDENTIALS. Esto debería tener éxito (incluso en un bosque diferente, en realidad no autentica las credenciales que le das) y te proporciona un token con el nombre de usuario/contraseña que has especificado. Es posible que deba utilizar DuplicateToken para convertirlo en un token de suplantación. Luego puede usar SetThreadToken para reemplazar el token en su hilo.

En mi humilde opinión esto no es realmente "suplantación", solo está utilizando las credenciales, pero le permite acceder a los recursos de la red de forma transparente como el nombre de usuario/contraseña arbitraria que proporciona.

Editar: Ah, sí, tenga en cuenta que no hay protección contra el hombre en el medio en este tipo de conexión. El cliente, en particular, no puede autenticar con fuerza el servidor (salvo heroicidades como IPSEC), por lo que, en teoría, no puede confiar en nada que el servidor le indique.

+0

guau, suena como un gran enfoque! Nunca pensé en usar esto. Déjame darle una prueba rápida para ver si funciona – galets

+0

amigo, ¡eso fue todo! Muchas gracias, esto fue exactamente lo que he estado buscando – galets

+0

¡genial! ¡alegra oírlo! –

0

Hacer esto directa y confiablemente a través de la API de Windows parece casi imposible, además Windows hace tanto trabajo detrás de escena para hacer que el acceso a la red "simplemente funcione". Además, el aspecto de suplantación de las cosas solo funciona para el único hilo que llamó a las API.

Pero ... puede ejecutar un programa completo bajo un usuario diferente ... como cuando ejecuta un servicio.

De modo que podría editar el registro en su programa principal para ejecutar varios servicios bajo diferentes tokens de seguridad y usar IPC/Sockets para comunicarse con esos procesos desde su aplicación principal. es decir.un grupo completo (o reiniciar y reconfigurar el mismo proceso) de procesos auxiliares que se ejecutan bajo los diferentes usuarios que abusa su aplicación principal.

Comprendo que esto es un truco pero parece viable;)

+0

no. No es viable. debe ser capaz de obtener tokens de suplantación para máquinas en bosques no confiables. No puede ejecutar un programa como usuario del bosque que no es de confianza – galets

+0

Puede crear el usuario localmente ya que tiene la contraseña de texto simple y eliminar al usuario cuando haya terminado. Otra opción es hablar directamente con DCERPC/MSRPC (http://en.wikipedia.org/wiki/MSRPC), pero luego se está yendo por una pista similar a samba, pero al menos se puede usar Wireshark para comparar su implementación con lo que sucede a través de las API de Windows normales. ¿Puede instalar programas auxiliares en la máquina remota y suplantar en ese extremo (y utilizar el protocolo que desee para conectarse al programa remoto de ayuda?)? –

+0

Supongo que no he leído detenidamente su comentario sobre el servicio. Mi publicación ha sido instigada específicamente por el hecho de que cuando intento instalar el servicio en el cuadro remoto de Windows 2008, y ya tengo un recurso compartido asignado, el SCM remoto aún no usará la cuenta utilizada para asignar un recurso – galets

0

se podían abrir una línea de comandos, asignar la unidad utilizando el nombre de usuario y contraseña en texto plano. A continuación, desconecte la unidad:

net use m: \\machinename\share password /user:username 
... do stuff ... 
net use m: /delete 

http://technet.microsoft.com/en-us/library/cc756153(WS.10).aspx

+1

Mencioné que esta solución no funciona: "Sé que hay una manera de establecer la conexión usando WNetAddConnection a un \\ nombre de máquina \ ipc $, ..." - esencialmente sugieres lo mismo Lo – galets

+0

Lo siento, pensé que WNetAddConnection era algo diferente. – Robert

Cuestiones relacionadas