Calcular PMK (Parwise Master Key) con Javascript

Publicado por wh00t, 27 de Agosto de 2012, 03:56:53 AM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

wh00t



AUTOR: Joris van Rantwijk
NOMBRE del ARCHIVO: wpapsk.html
DESCRIPCION: Codigo HTML con funcion Javascript que  muestra en el browser un formulario el cual calcula la PMK apartir del ESSID y la Clave (PSK) .



Código: php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>

<title>WPA key calculation: From passphrase to hex</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />


<style type="text/css">
BODY       {SCROLLBAR-FACE-COLOR: #dee3e7; SCROLLBAR-HIGHLIGHT-COLOR: #ffffff; SCROLLBAR-SHADOW-COLOR: #dee3e7; SCROLLBAR-3DLIGHT-COLOR: #d1d7dc; SCROLLBAR-ARROW-COLOR: #006699; SCROLLBAR-TRACK-COLOR: #efefef; SCROLLBAR-DARKSHADOW-COLOR: #98aab1; BACKGROUND-COLOR: #5F5F5F;}
TH, TD, P  {FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif; -moz-border-radius-topleft: 1px; -moz-border-radius-topright: 1px; -moz-border-radius-bottomright: 1px; -moz-border-radius-bottomleft: 1px;}
TH         {FONT-WEIGHT: bold; FONT-SIZE: 10px; COLOR: #ACB5BB; HEIGHT: 20px; BACKGROUND-COLOR: #3B3F3F}
TD         {BACKGROUND-COLOR: #576E7F; }
TD.header  {BACKGROUND-COLOR: #74888F; text-align: center; FONT-WEIGHT: bold}
TD.row1    {BACKGROUND-COLOR: #74888F}
TD.row2    {BACKGROUND-COLOR: #7D878F}
TD.row3    {BACKGROUND-COLOR: #d1d7dc}
TD.row4    {BACKGROUND-COLOR: #00AA00; color: #FFFFFF; FONT-WEIGHT: bold; text-align:center;}
TD.row5    {BACKGROUND-COLOR: #CC0000; color: #FFFFFF; FONT-WEIGHT: bold; text-align:center;}
TD.row6    {BACKGROUND-COLOR: #7D878F; FONT-SIZE: 10px; text-align: center;}
TD.row7    {BACKGROUND-COLOR: #576E7F}
TD.row8    {BACKGROUND-COLOR: #7D878F; FONT-SIZE: 10px; text-align: center;}
A:link     {COLOR: #dd6900; TEXT-DECORATION: none}
A:active   {COLOR: #dd6900; TEXT-DECORATION: none}
A:visited  {COLOR: #000000; TEXT-DECORATION: none}
A:hover    {COLOR: #dd6900; TEXT-DECORATION: underline}
PRE        {TEXT-ALIGN: left}
.maintable {BORDER-RIGHT: #000000 4px solid; BORDER-TOP: #000000 4px solid; BORDER-LEFT: #000000 4px solid; BORDER-BOTTOM: #000000 4px solid; BACKGROUND-COLOR: #576E7F; vertical-align: center; -moz-border-radius: 3px; font-style: normal; FONT-SIZE: 20px; HEIGHT: 25px;}
.menutable {BORDER-RIGHT: #000000 2px solid; BORDER-TOP: #000000 2px solid; BORDER-LEFT: #000000 2px solid; BORDER-BOTTOM: #000000 2px solid; BACKGROUND-COLOR: #74888F; vertical-align: center}
.itemmenu  {BACKGROUND-COLOR: #efefef; FONT-SIZE: 11px; HEIGHT: 28}
.tbcontent {width: 90%;}
.middle    {text-align: center; vertical-align: top}
.tdbfw     {BACKGROUND-COLOR: #576E7F}


input{
-moz-border-radius: 6px;
-webkit-border-radius: 6px;
background-color : #5A595F;
border : 3.5px solid #000000;
font-family : Arial, Verdana, Helvetica, sans-serif;
font-size : 20px;
color: #ACB5BB;
padding-left : 5px;
padding-right : 5px;
}

select{
-moz-border-radius: 3px;
-webkit-border-radius: 3px;
background-color : #5A595F;
border : 2px solid #000000;
font-family : Arial, Verdana, Helvetica, sans-serif;
font-size : 10px;
color: #ACB5BB;
padding-left : 5px;
padding-right : 5px;
}
</style>




<script type="text/javascript">// <![CDATA[
/*
* getWpaPskKeyFromPassphrase( pass: string, ssid: string)
*  -> string of 64 hex digits
*
* Compute the binary PMK from passphrase and SSID as used in the WPA-PSK
* wireless encryption standard. The passphrase is usually entered by
* the user as a string of at most 63 characters; the binary key is usually
* displayed as a sequence of 64 hex digits.
*/
function getWpaPskKeyFromPassphrase(pass, salt) {

  /* pad string to 64 bytes and convert to 16 32-bit words */
  function stringtowords(s, padi) {
    /* return a 80-word array for later use in the SHA1 code */
    var z = new Array(80);
    var j = -1, k = 0;
    var n = s.length;
    for (var i = 0; i < 64; i++) {
      var c = 0;
      if (i < n) {
        c = s.charCodeAt(i);
      } else if (padi) {
        /* add 4-byte PBKDF2 block index and
   standard padding for the final SHA1 input block */
if (i == n) c = (padi >>> 24) & 0xff;
else if (i == n + 1) c = (padi >>> 16) & 0xff;
else if (i == n + 2) c = (padi >>> 8) & 0xff;
else if (i == n + 3) c = padi & 0xff;
else if (i == n + 4) c = 0x80;
      }
      if (k == 0) { j++; z[j] = 0; k = 32; }
      k -= 8;
      z[j] = z[j] | (c << k);
    }
    if (padi) z[15] = 8 * (64 + n + 4);
    return z;
  }

  /* compute the intermediate SHA1 state after processing just
     the 64-byte padded HMAC key */
  function initsha(w, padbyte) {
    var pw = (padbyte << 24) | (padbyte << 16) | (padbyte << 8) | padbyte;
    for (var t = 0; t < 16; t++) w[t] ^= pw;
    var s = [ 0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0 ];
    var a = s[0], b = s[1], c = s[2], d = s[3], e = s[4];
    var t;
    for (var k = 16; k < 80; k++) {
      t = w[k-3] ^ w[k-8] ^ w[k-14] ^ w[k-16];
      w[k] = (t<<1) | (t>>>31);
    }
    for (var k = 0; k < 20; k++) {
      t = ((a<<5) | (a>>>27)) + e + w[k] + 0x5A827999 + ((b&c)|((~b)&d));
      e = d; d = c; c = (b<<30) | (b>>>2); b = a; a = t & 0xffffffff;
    }
    for (var k = 20; k < 40; k++) {
      t = ((a<<5) | (a>>>27)) + e + w[k] + 0x6ED9EBA1 + (b^c^d);
      e = d; d = c; c = (b<<30) | (b>>>2); b = a; a = t & 0xffffffff;
    }
    for (var k = 40; k < 60; k++) {
      t = ((a<<5) | (a>>>27)) + e + w[k] + 0x8F1BBCDC + ((b&c)|(b&d)|(c&d));
      e = d; d = c; c = (b<<30) | (b>>>2); b = a; a = t & 0xffffffff;
    }
    for (var k = 60; k < 80; k++) {
      t = ((a<<5) | (a>>>27)) + e + w[k] + 0xCA62C1D6 + (b^c^d);
      e = d; d = c; c = (b<<30) | (b>>>2); b = a; a = t & 0xffffffff;
    }
    s[0] = (s[0] + a) & 0xffffffff;
    s[1] = (s[1] + b) & 0xffffffff;
    s[2] = (s[2] + c) & 0xffffffff;
    s[3] = (s[3] + d) & 0xffffffff;
    s[4] = (s[4] + e) & 0xffffffff;
    return s;
  }

  /* compute the intermediate SHA1 state of the inner and outer parts
     of the HMAC algorithm after processing the padded HMAC key */
  var hmac_istate = initsha(stringtowords(pass, 0), 0x36);
  var hmac_ostate = initsha(stringtowords(pass, 0), 0x5c);

  /* output is created in blocks of 20 bytes at a time and collected
     in a string as hexadecimal digits */
  var hash = '';
  var i = 0;
  while (hash.length < 64) {
    /* prepare 20-byte (5-word) output vector */
    var u = [ 0, 0, 0, 0, 0 ];
    /* prepare input vector for the first SHA1 update (salt + block number) */
    i++;
    var w = stringtowords(salt, i);
    /* iterate 4096 times an inner and an outer SHA1 operation */
    for (var j = 0; j < 2 * 4096; j++) {
      /* alternate inner and outer SHA1 operations */
      var s = (j & 1) ? hmac_ostate : hmac_istate;
      /* inline the SHA1 update operation */
      var a = s[0], b = s[1], c = s[2], d = s[3], e = s[4];
      var t;
      for (var k = 16; k < 80; k++) {
        t = w[k-3] ^ w[k-8] ^ w[k-14] ^ w[k-16];
        w[k] = (t<<1) | (t>>>31);
      }
      for (var k = 0; k < 20; k++) {
        t = ((a<<5) | (a>>>27)) + e + w[k] + 0x5A827999 + ((b&c)|((~b)&d));
        e = d; d = c; c = (b<<30) | (b>>>2); b = a; a = t & 0xffffffff;
      }
      for (var k = 20; k < 40; k++) {
        t = ((a<<5) | (a>>>27)) + e + w[k] + 0x6ED9EBA1 + (b^c^d);
        e = d; d = c; c = (b<<30) | (b>>>2); b = a; a = t & 0xffffffff;
      }
      for (var k = 40; k < 60; k++) {
        t = ((a<<5) | (a>>>27)) + e + w[k] + 0x8F1BBCDC + ((b&c)|(b&d)|(c&d));
        e = d; d = c; c = (b<<30) | (b>>>2); b = a; a = t & 0xffffffff;
      }
      for (var k = 60; k < 80; k++) {
        t = ((a<<5) | (a>>>27)) + e + w[k] + 0xCA62C1D6 + (b^c^d);
        e = d; d = c; c = (b<<30) | (b>>>2); b = a; a = t & 0xffffffff;
      }
      /* stuff the SHA1 output back into the input vector */
      w[0] = (s[0] + a) & 0xffffffff;
      w[1] = (s[1] + b) & 0xffffffff;
      w[2] = (s[2] + c) & 0xffffffff;
      w[3] = (s[3] + d) & 0xffffffff;
      w[4] = (s[4] + e) & 0xffffffff;
      if (j & 1) {
        /* XOR the result of each complete HMAC-SHA1 operation into u */
u[0] ^= w[0]; u[1] ^= w[1]; u[2] ^= w[2]; u[3] ^= w[3]; u[4] ^= w[4];
      } else if (j == 0) {
        /* pad the new 20-byte input vector for subsequent SHA1 operations */
w[5] = 0x80000000;
for (var k = 6; k < 15; k++) w[k] = 0;
w[15] = 8 * (64 + 20);
      }
    }
    /* convert output vector u to hex and append to output string */
    for (var j = 0; j < 5; j++)
      for (var k = 0; k < 8; k++) {
        var t = (u[j] >>> (28 - 4 * k)) & 0x0f;
hash += (t < 10) ? t : String.fromCharCode(87 + t);
      }
  }

  /* return the first 32 key bytes as a hexadecimal string */
  return hash.substring(0, 64);
}

function fshowkey(s) {
  if (s == "") { for (var i = 0; i < 64; i++) s += "\u00a0"; }
  var elem = document.getElementById("fhexkey");
  while (elem.hasChildNodes()) elem.removeChild(elem.firstChild);
  elem.appendChild(document.createTextNode(s));
}

function fcalc() {
  var ssid = document.getElementById("fssid").value;
  var pass = document.getElementById("fpass").value;
  fshowkey("");
  if (ssid.length < 1) {
    alert("ERROR: You must enter the network SSID string.");
    document.getElementById("fssid").focus();
    return;
  }
  if (ssid.length > 32) {
    alert("ERROR: The SSID string must not be longer than 32 characters.");
    document.getElementById("fssid").focus();
    return;
  }
  if (pass.length < 1) {
    alert("ERROR: Passphrase must be at least 8 characters.");
    document.getElementById("fpass").focus();
    return;
  }
  if (pass.length > 63) {
    alert("ERROR: Passphrase must not be longer than 63 characters.");
    document.getElementById("fpass").focus();
    return;
  }
  for (var i = 0; i < pass.length; i++)
    if (pass.charCodeAt(i) < 1 || pass.charCodeAt(i) > 126) {
      alert("ERROR: Passphrase contains strange characters.");
      document.getElementById("fpass").focus();
      return;
    }
  for (var i = 0; i < ssid.length; i++)
    if (ssid.charCodeAt(i) < 1 || ssid.charCodeAt(i) > 126) {
      alert("ERROR: SSID string contains strange characters.");
      document.getElementById("fssid").focus();
      return;
    }
  var hash = getWpaPskKeyFromPassphrase(pass, ssid);
  fshowkey(hash);
}

function fclear() {
  document.getElementById("fssid").value = "";
  document.getElementById("fpass").value = "";
  fshowkey("");
}

function ftest() {
  document.getElementById("fssid").value = "linksys54gh";
  document.getElementById("fpass").value = "radiustest";
  fcalc();
  var n = document.getElementById("fhexkey");
  if (n && n.firstChild && n.firstChild.data ==
      "9e9988bde2cba74395c0289ffda07bc41ffa889a3309237a2240c934bcdc7ddb") {
    alert("test passed succesfully");
  } else {
    alert("ERROR: test failed, please get a better webbrowser");
  }
}
// ]]></script>

</head>
<body>

<div lang="en" class="mainpanel">

<div class="topbar">
  <h1>Calculo de clave WPA</h1>
  <span class="subtitle">Passphrase (Clvae texto plano ) a Clave hexadecimal</span>
</div>

<!--
<p>
A wireless network with <a href="http://en.wikipedia.org/wiki/Wi-Fi_Protected_Access" title="Wikipedia page about WPA">WPA</a>-PSK encryption requires a passphrase (the pre-shared key) to be entered to get access to the network.
Most wireless drivers accept the passphrase as a string of at most 63 characters, and internally convert the passphrase to a 256-bit key.
However, some software also allows the key to be entered directly in the form of 64 hexadecimal digits.
It is therefore occasionally useful to be able to calculate the 64-digit hexadecimal key that correspons to a given passphrase.
</p>
-->
<p>
Una red inalámbrica con WPA-PSK cifrado requiere una contraseña (la clave pre-compartida) la cual debera ser introducido para obtener acceso a la red. La mayoría de los controladores inalámbricos aceptan la contraseña como una cadena de no más de 63 caracteres, e internamente convierten la contraseña a una clave de 256 bits. Sin embargo, algunos software también permiten que la llave que se introduce directamente en forma de 64 dígitos hexadecimales. Por tanto, es ocasionalmente útil ser capaz de calcular la clave hexadecimal de 64 dígitos que corresponde a un determinada contraseña.


</p>

<!--
<p>
This page explains how WPA software computes the hexadecimal key from the passphrase and the network <a href="http://en.wikipedia.org/wiki/Service_set_identifier" title="Wikipedia page about SSID">SSID</a>.
The form below demonstrates this calculation for any given input.
</p>

-->

<p>

Esta página explica cómo WPA calcula la clave hexadecimal de la contraseña y el SSID de la red. El siguiente formulario muestra este cálculo para cualquier entrada dada.
</p>

<center>
<table class=maintable >
  <tr>
    <td>Network SSID:</td>
    <td><input type="text" name="fssid" id="fssid" size="48" maxlength="32" /></td>
  </tr>
  <tr>
    <td>WPA passphrase:</td>
    <td><input type="text" name="fpass" id="fpass" size="48" maxlength="63" /></td>
  </tr>
  <tr>
    <td></td>
    <td>
      <input type="button" value="Calculate" onclick="fcalc()" />
      &nbsp;<input type="button" value="Clear" onclick="fclear()" />
      &nbsp;<input type="button" value="Test" onclick="ftest()" />
    </td>
  </tr>
  <tr>
    <td>Hexadecimal key:</td>
    <td  id="fhexkey">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
  </tr>
</table>

</center>
<!--
<h3>How to use the form</h3>

<p>
Enter the network SSID string (at most 32 alphanumeric characters) and the passphrase (at least 8 and at most 63 ASCII characters) in the form above and click <code>Calculate</code>.
Make sure that you don't accidentally type space characters before/after the string.
The derived key will appear in the form as a sequence of 64 hexadecimal digits.
</p>
-->

<h3>Cómo utilizar el formulario</h3>

<p>
Introduzca la cadena SSID de la red (como máximo 32 caracteres alfanuméricos) y la contraseña (por lo menos 8 y un máximo de 63 caracteres ASCII) en el formulario de arriba y haga clic en <code>Calcular</code>. Asegúrese de que usted no accidentalmente escribir caracteres de espacio antes / después de la cadena. La clave derivada aparecerá en la forma como una secuencia de 64 dígitos hexadecimales.


</p>

<!--
<p>
The <code>Test</code> button can be used to check that your web browser computes the correct result for a sample case.
Testing is recommended, since a broken Javascript engine may compute incorrect key values.
A number of popular web browsers have been tested, and all of them seem to work correctly.
</p>
-->

<p>
El botón <font color="red"><b>TEST</b></font> se puede utilizar para comprobar que su navegador calcula el resultado correcto con un ejemplo. La prueba se recomienda, ya que un motor roto Javascript puede calcular valores incorrectos clave. Algunos de los navegadores web más populares han sido probados, y todos ellos parecen funcionar correctamente.

</p>


<h3>A word about entering passwords on web forms</h3>
<b><small>Esto habla de como alguien mal intencionando puede choriar a un usuario con un formulario similar a este, <br>
la contraseña de la red de su hogar atravez de fhishing agregando al script AJAX GET</b>

<p>
Of course, blindly entering your SSID and passphrase in a web form would be quite stupid indeed.
However, this particular form is safe because it does not send any data over the network; all calculations are done in Javascript on your own computer.
</p>

<p>
Please don't even take my word for it.
Instead, download this webpage to your computer, look through the HTML code to make sure I don't play any tricks, then open the downloaded page in your browser and use it.
</p>

<!--
<p>
Una palabra sobre la introducción de contraseñas en formularios web

Por supuesto, a ciegas ingresar su SSID y la contraseña en un formulario web sería bastante estúpido por cierto. Sin embargo, esta forma particular es seguro, ya que no envía datos a través de la red, todos los cálculos se hacen en javascript en tu propio ordenador.

Por favor, no incluso tomar mi palabra para ella. En su lugar, descargar la página a la computadora, mirar a través del código HTML para asegurarse de que no juegan ningún truco, a continuación, abra la página de descarga en tu navegador y usarlo. correctamente.
</p>

-->

<!--
<h3>Details of the calculation</h3>

<p>
For WPA-PSK encryption, the binary key is derived from the passphrase according to the following formula:
</p>

<pre>
  Key = PBKDF2(passphrase, ssid, 4096, 256)
</pre>

<p>
The function <code>PBKDF2</code> is a standardized method to derive a key from a passphrase.
It is specified in <a href="http://www.ietf.org/rfc/rfc2898.txt">RFC2898</a> with a clear explanation on how to compute it.
The function needs an underlying pseudorandom function.
In the case of WPA, the underlying function is <code>HMAC-SHA1</code>.
<br />
<code>SHA1</code> is a function that computes a 160-bit hash from an arbitrary amount of input data.
It is clearly explained in <a href="http://www.ietf.org/rfc/rfc3174.txt">RFC3174</a>.
<code>HMAC</code> is a standardized method to turn a cryptographic hash function into a keyed message authentication function.
It is specified in <a href="http://www.ietf.org/rfc/rfc2104">RFC2104</a>.
</p>

<p>
To summarize, the key derivation process involves iterating a <code>HMAC-SHA1</code> function 4096 times, and then doing that again to produce more key bits.
</p>
-->

<h3>Detalles del cálculo </h3>
<p>

Para <b>WPA-PSK</b>, la clave binaria se deriva de la frase de paso de acuerdo con la siguiente fórmula: <br />

<pre>
   Clave = PBKDF2 (frase, SSID, 4096, 256)
</pre>

<p>
El función <code>PBKDF2</code> es un método estándar para derivar una clave de una frase de contraseña. Se especifica en <a href="http://www.ietf.org/rfc/rfc2898.txt">RFC2898</a> con una explicación clara sobre la manera de calcular. La función de las necesidades de una función pseudoaleatoria subyacente. En el caso de WPA, la función subyacente es HMAC-SHA1.
</p>

<p>
<code>SHA1</code> es una función que calcula un hash de 160 bits a partir de una cantidad arbitraria de datos de entrada. Está claramente explicado en <a href="http://www.ietf.org/rfc/rfc3174.txt">RFC3174</a>.
</p>

HMAC es un método estandarizado para activar una función hash criptográfica en una función de autenticación de mensajes clave. Se especifica en <a href="http://www.ietf.org/rfc/rfc2104">RFC2104</a>.

En resumen, el proceso de derivación de claves implica iterar una función HMAC-SHA1 4096 veces, y luego hacerlo de nuevo para producir fragmentos más importantes.

</p>

<hr />
<address>2006-12-06 <a href="http://jorisvr.nl/">Joris van Rantwijk</a></address>

</div>

</body>
</html>


carrasco30

hola whoot esto para k es para sacar las claves de redes de wifi.

wh00t

Hola carrasco

mira te recomiendo copies el codigo y lo guardes como wpapsk.html
y abris el archivo con tu navegador web usa FIREFOX preferntemente

ahi yo hice una traduccion del script html del autor
una vez que lo puedas asimilar basicamente.

bajate este PDF y seguilo paso a paso
You are not allowed to view links. Register or Login

vos me preguntas si esto sirve para sacar claves wifi
yo te respondo que esto es parte de lo que uno debe saber o tener en cuenta
a la hora de buscar sacar una clave wifi del tipo WPA-PSK o WPA2

cuando vos captures un 4 way handshake vas a estar capturando dentro de ese archivo.CAP
el WPA key MIC entre otras cosas mas





que son las que usa aircrack-ng para relacionar una CLAVE (passphrase)
aircrack toma una CLAVE del diccionario que seria el (PSK (pre shared key)) y la mezcla con el
ESSID y lo mete dentro de un algoritmo llamado PBKDF2 y consigue sacar la PMK (pairwise master key)
y contruye los datos de EAPOL y los verifica contra el EAPOL que esta dentro del archivo.CAP y si son iguales entonces la CLAVE es correcta.



Master Key = PMK

para ahorrar que aircrack tenga que armar con cada clave y el essid un PMK etc
hicieron programas como genpmk que hace un archivo de claves precalculadas
cuando lo provees de un diccionario y un ESSID
que ayuda a liberar de esa tarea a aircrack y permite probar una importante mayor cantidad de claves por segundo utilizando cowpatty.

en mi humilde opinion hasta ahora entiendo eso
conclusion: esto sirve en cierta forma para sacar claves wifi, es cuestion de cranearla.

Saludos.




marmacan

 ;) Que lindo post che , ya lo copie y lo probare en cuanto pueda. Mil gracias por el aporte a la comunidad
8)