2008-09-22 12 views

Respuesta

28

Contraseña: No, esto no se retiene por razones de seguridad, se usa y luego se descarta. Puede recuperar la contraseña cifrada para este usuario del registro, con suficientes privilegios, y luego descifrarla usando algo como rainbow tables, pero eso requiere una gran cantidad de recursos y consume mucho tiempo con los métodos actuales. Mucho mejor para incitar al usuario.

Alternativamente, si desea implementar algún tipo de sistema de 'inicio de sesión único' como lo hace Novell, debe hacerlo mediante un GINA (previo a la Vista) o un proveedor de credenciales (Vista), lo que dará como resultado su código recibir el nombre de usuario y la contraseña al iniciar sesión, el único momento en que la contraseña está disponible.

Para nombre de usuario, obtener actual nombre de usuario (el que está ejecutando su código) es fácil: la función GetUserName en AdvApi32.dll hace exactamente esto para usted.

Si se está ejecutando como un servicio, debe recordar que no hay un "usuario registrado": hay varios en cualquier momento, como LocalSystem, NetworkService, SYSTEM y otras cuentas, además de cualquier real gente. This article provides some sample code and documentation por hacer eso.

+0

Gracias, no quiero descifrar la contraseña, solo quería salvar al usuario un paso, pero como no hay una "buena" manera de hacerlo, solo le pediré al usuario que lo haga. – dennisV

3

¡Consideraría un gran defecto de seguridad si eso fuera posible!

+1

Sí, eso es lo que estoy pensando también, pero quería comprobar que no me he perdido nada ... – dennisV

2

GetUserName le dará el nombre, pero la contraseña no puede obtener. Ni siquiera es algo que Windows almacene, AFAIK: solo un hash de tu contraseña.

Dependiendo de lo que esté tratando de lograr (puede decirnos un poco más ...) es posible suplantar a un usuario que ha iniciado sesión y hacer cosas en su nombre.

+0

Gracias - eso es lo que pensé. – dennisV

4

No se puede obtener la contraseña de un usuario desde que está encriptada (sin mencionar que es una práctica estándar no almacenar contraseñas en texto plano).

Para obtener el nombre de usuario, puede utilizar GetUserName o NPGetUser

0

que pueda obtener el nombre de usuario con GetUserName(), pero no se puede obtener la contraseña; esto violaría la seguridad para los tontos 101.

+0

Gracias - Tendré que avisar al usuario, supongo. – dennisV

0

re "Red de recuperación de contraseña" herramienta
de Windows (hasta XP) almacena una copia de los ficheros de contraseñas con un fácil más fácil de romper cifrado: para conectarse a recursos compartidos de red lanmanager de estilo antiguo. Las herramientas generalmente intentan todas las contraseñas posibles contra esto, usando tablas rainbow (versiones codificadas precalucadas de palabras de diccionario) acelera esto.

En XPsp2/3 Vista esta función se elimina. El nuevo cifrado es mucho más difícil de descifrar y requiere muchas horas para probar todos los valores posibles, existen servicios en línea que lo ejecutarán en un gran número de máquinas para brindarle una respuesta rápida por un precio.

Para responder al cartel original, generalmente no almacena la contraseña y la compara con lo que el usuario usó. Encripta (realmente pica) la contraseña introducida y la almacena. Para verificar una contraseña, realice el mismo cifrado en lo que sea que el usuario ingresó y compare eso. En general, es imposible pasar de la forma encriptada a la contraseña real.

EDIT Sospecho que usted está haciendo la pregunta incorrecta aquí - ¿por qué quiere la contraseña, qué intenta verificar y cuándo?

+0

Sí, lo entiendo. Es más seguro preguntar al usuario, solo un poco "inusual", ya que no he visto demasiadas aplicaciones que lo hagan. – dennisV

+0

No quiero verificar la contraseña, de hecho quiero establecer la configuración del servicio para iniciar sesión como usuario y para eso necesito el nombre de usuario y la contraseña. Pensé que podría ahorrarle un poco al usuario si pudiera obtener esa información automáticamente, pero no puedo, así que tendré que tener alguna GUI para solicitarla. – dennisV

+0

@dennisV ¿ha encontrado alguna solución para esto? – lucacerone

2

Para los muchos comentaristas que creen que no es posible revelar la contraseña del usuario que ha iniciado sesión en, ver Dump cleartext passwords of logged in user(s) que muestra cómo utilizar mimikatz de hacer precisamente eso:

mimikatz # privilege::debug 
Demande d'ACTIVATION du privilège : SeDebugPrivilege : OK 

mimikatz # sekurlsa::logonPasswords full 
... 
Utilisateur principal  : user 
Domaine d'authentification : domain 
     kerberos : 
     * Utilisateur : user 
     * Domaine  : domain 
     * Mot de passe : pass 
1

no lo hago Conozca la contraseña de inicio de sesión de Windows ... pero definitivamente puede extraer contraseñas de texto plano del Administrador de credenciales. Por ejemplo, aquí hay un programa para extraer la contraseña de TFS. En la mayoría de los casos, esto es lo mismo que el inicio de sesión de Windows.

namespace ShowPassword 
{ 
    using Microsoft.TeamFoundation.Client; 
    using System; 
    using System.Net; 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      var tpc = new TfsTeamProjectCollection(new Uri("http://mycompany.com/tfs")); 
      var nc = tpc.Credentials as NetworkCredential; 
      Console.WriteLine("the password is " + nc.Password); 
     } 
    } 
} 

Compilé esto como aplicación "consola" bajo vs 2015 con el paquete Nuget TeamFoundation ExtendedClient.

Cuestiones relacionadas