2010-10-29 32 views
3

Existe-t-il un moyen de déterminer le nom d'un utilisateur simplement en reniflant l'en-tête NTLM? J'ai une application qui accède à un site authentifié NTLM, et une invite Auth s'ouvre pour que l'utilisateur s'authentifie auprès du site en entrant son nom d'utilisateur/mot de passe.obtenir le nom d'utilisateur à partir de l'en-tête auth NTLM?

Est-il possible, juste avec l'accès aux en-têtes, de savoir quel est le nom d'utilisateur entré?

Est-ce encore possible?

Merci,

Jonsie

Répondre

8

sûr, vous pouvez le faire même avec un simple fichier JSP ... (cela ne fonctionne qu'avec NTLMv1, non v2, je suis toujours à la recherche que ..)

Ainsi, le code de la JSP est (je l'ai essayé sur Apache Tomcat 6)

<%@ page import="sun.misc.BASE64Encoder" %> 
<% 
String auth = request.getHeader("Authorization"); 
String s = ""; 

//no auth, request NTLM 
if (auth == null) { 
     response.setStatus(response.SC_UNAUTHORIZED); 
     response.setHeader("WWW-Authenticate", "NTLM"); 
     return; 
} 
//check what client sent 
if (auth.startsWith("NTLM ")) { 
     out.println(auth); 

     byte[] msg = 
      new sun.misc.BASE64Decoder().decodeBuffer(auth.substring(5)); 
     int off = 0, length, offset; 
     out.println("<br>"+msg); 
     out.println("<br>"+msg[1]+" "+msg[2]+" "+msg[3]+" "+msg[4]+" "+msg[5]+" "+msg[6]+" "+msg[7]+" "+msg[8]+" "+msg[9]+" "+msg[10]+"<br>"); 

     if (msg[8] == 1) { 
      off = 18; 

      byte z = 0; 
      byte[] msg1 = 
       {(byte)'N', (byte)'T', (byte)'L', (byte)'M', (byte)'S',(byte)'S', (byte)'P', 
       z,(byte)2, z, z, z, z, z, z, z, 
       (byte)40, z, z, z, (byte)1, (byte)130, z, z, 
       z, (byte)2, (byte)2, (byte)2, z, z, z, z, // 
       z, z, z, z, z, z, z, z}; 
      // send ntlm type2 msg 

      response.setStatus(response.SC_UNAUTHORIZED); 
      response.setHeader("WWW-Authenticate", "NTLM " 
       + new sun.misc.BASE64Encoder().encodeBuffer(msg1).trim()); 

       return; 
     } 
     else if (msg[8] == 3) { 
       off = 30; 
       length = msg[off+17]*256 + msg[off+16]; 
       offset = msg[off+19]*256 + msg[off+8]; 
       s = new String(msg, offset, length); 
       // print computer name // out.println(s + " "); 
     } 
     else 
     return; 

     length = msg[off+1]*256 + msg[off]; 
     offset = msg[off+3]*256 + msg[off+2]; 
     s = new String(msg, offset, length); 
     //domain//out.println(s + " "); 
     length = msg[off+9]*256 + msg[off+8]; 
     offset = msg[off+11]*256 + msg[off+10]; 

     s = new String(msg, offset, length); 
     out.println("Hello <span style='position:relative; width:190;" 
      + " height:10;filter:glow(Color=#009966,Strength=1)'>"); 
     out.println(s + "</SPAN>"); 
} 
%> 
+1

Pourquoi msg [8] == 1 signifie qu'ils ne sont pas autorisés? –

+1

puisque cette paix m'a beaucoup aidé ici, j'ai pensé que cette question devrait être répondue pour les futurs lecteurs. Le msg [8] est la position de l'indicateur de version. Étant donné que NTLMv1 n'est pas recommandé et pris en charge, nous souhaitons obtenir NTLMv2. – Nico

+0

ne pouvait pas éditer mon commentaire précédent ... Ceci est une édition et une correction de celui-ci! Étant donné que NTLMv1 n'est pas recommandé et pris en charge, nous souhaitons obtenir NTLMv3 en envoyant une réponse NTLMv2 et en demandant toujours l'authentification. Pour référence, consultez [Obtenir un nom d'utilisateur avec NT Challenge] (https://www.innovation.ch/personal/ronald/ntlm.html) – Nico