声明:本文仅作为学习交流,请勿用于商业用途,否则后果自负。如需使用黄金或白金版X-Pack请购买正版。
接上篇 http://fishboy.iteye.com/blog/2391750 ,该文章是采用自己生成RSA的公钥私钥来进行破解的。准备工作与前篇一致,只需要按照以下代码自己生成RSA密钥对,然后计算出签名数据即可
package com.uoquo.xpack.crack; import java.io.BufferedOutputStream; import java.io.ByteArrayOutputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.nio.ByteBuffer; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.NoSuchAlgorithmException; import java.security.PrivateKey; import java.security.PublicKey; import java.security.SecureRandom; import java.security.Signature; import java.security.interfaces.RSAPrivateKey; import java.security.interfaces.RSAPublicKey; import java.util.Arrays; import java.util.Base64; import java.util.Collections; import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.io.Streams; import org.elasticsearch.common.xcontent.ToXContent; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.common.xcontent.XContentType; import org.elasticsearch.license.CryptUtils; import org.elasticsearch.license.License; import org.elasticsearch.license.LicenseVerifier; public class Crack { private static String KEY_FILE_PATH = ""; // 存放key的目录,为空时表示存放到编译的根目录下 private static String path = "";// 运行时的绝对路径 static { path = Crack.class.getResource("/").toString(); path = path.replaceFirst("file:/", "") + KEY_FILE_PATH; } /** * 生成RSA密钥对 */ public static void generateKey() { // KeyPairGenerator类用于生成公钥和私钥对,基于RSA算法生成对象 KeyPairGenerator keyPairGen = null; try { keyPairGen = KeyPairGenerator.getInstance("RSA"); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } // 初始化密钥对生成器,密钥大小为96-1024位 keyPairGen.initialize(2048, new SecureRandom()); // 生成密钥对 KeyPair keyPair = keyPairGen.generateKeyPair(); // 保存私钥 RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); byte[] prvData = CryptUtils.writeEncryptedPrivateKey(privateKey); save2File(prvData, "private.key"); // 保存公钥 RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); byte[] pubData = CryptUtils.writeEncryptedPublicKey(publicKey); save2File(pubData, "public.key"); } /** * 保存密钥到文件 */ private static void save2File(byte[] data, String fileName) { try { FileOutputStream fos = new FileOutputStream(path +"/"+ fileName); BufferedOutputStream oos = new BufferedOutputStream(fos); oos.write(data); // 写入文件 oos.close(); fos.close(); } catch (Exception e) { e.printStackTrace(); } } /** * 获取文件内容 */ private static byte[] read4File(String fileName) { try { InputStream is = Crack.class.getResourceAsStream(KEY_FILE_PATH +"/"+ fileName); ByteArrayOutputStream out = new ByteArrayOutputStream(); Streams.copy(is, (OutputStream)out); byte[] bytes = out.toByteArray(); return bytes; } catch (IOException ex) { throw new IllegalStateException(ex); } } /** * 数据签名 */ public static String signed(License license) { try { // 原始数据 XContentBuilder builder = XContentFactory.contentBuilder(XContentType.JSON); ToXContent.Params params = new ToXContent.MapParams(Collections.singletonMap("license_spec_view", "true")); license.toXContent(builder, params); byte[] data = BytesReference.toBytes(builder.bytes()); // RSA 签名对象 PrivateKey key = CryptUtils.readEncryptedPrivateKey(read4File("private.key")); Signature rsa = Signature.getInstance("SHA512withRSA"); rsa.initSign(key); rsa.update(data); // 数字签名 byte[] sigContent = rsa.sign(); int contentLen = sigContent.length; // 公钥信息 byte[] pubKeyData = read4File("public.key"); byte[] sigHash = Base64.getEncoder().encode(pubKeyData); int hashLen = sigHash.length; // 随机数据 byte[] magic = "1234567890123".getBytes(); int magicLen = magic.length; // 签名数据拼接 int capacity = 4*4 + magicLen + hashLen + contentLen; ByteBuffer byteBuffer = ByteBuffer.allocate(capacity); byteBuffer.putInt(license.version()); byteBuffer.putInt(magicLen); byteBuffer.put(magic); byteBuffer.putInt(hashLen); byteBuffer.put(sigHash); byteBuffer.putInt(contentLen); byteBuffer.put(sigContent); // 最终签名数据 return Base64.getEncoder().encodeToString(byteBuffer.array()); } catch (Exception e) { e.printStackTrace(); return null; } } /** * 签名校验 */ public static boolean verify(License license) { try { // 签名数据 byte[] signed = Base64.getDecoder().decode(license.signature()); ByteBuffer byteBuffer = ByteBuffer.wrap(signed); int version = byteBuffer.getInt(); int magicLen = byteBuffer.getInt(); byte[] magic = new byte[magicLen]; byteBuffer.get(magic); int hashLen = byteBuffer.getInt(); byte[] sigHash = new byte[hashLen]; byteBuffer.get(sigHash); int contentLen = byteBuffer.getInt(); byte[] sigContent = new byte[contentLen]; byteBuffer.get(sigContent); // 原始数据 XContentBuilder builder = XContentFactory.contentBuilder(XContentType.JSON); ToXContent.Params params = new ToXContent.MapParams(Collections.singletonMap("license_spec_view", "true")); license.toXContent(builder, params); byte[] data = BytesReference.toBytes(builder.bytes()); // RSA 校验对象 byte[] pubKeyData = read4File("public.key"); PublicKey key = CryptUtils.readEncryptedPublicKey(pubKeyData); Signature rsa = Signature.getInstance("SHA512withRSA"); rsa.initVerify(key); rsa.update(data); // 校验 return rsa.verify(sigContent) && Arrays.equals(Base64.getEncoder().encode(pubKeyData), sigHash); } catch (Exception e) { e.printStackTrace(); return false; } } /** * license数据 * @param sige * @return */ public static License getLicense(String sige) { // 手动设置 License.Builder builder = License.builder(); builder.uid("fd2deee3-******-4fd959056bea"); builder.type("platinum");// trial,basic,standard,gold,platinum builder.issueDate(1504051200000L); builder.expiryDate(1535673599999L); builder.issuedTo("hong king"); builder.issuer("Web Form"); builder.maxNodes(100); builder.startDate(1504051200000L); builder.signature(sige); // 以下三个字段不知道干啥的,可以不填 // builder.version(1); // 默认为3 // builder.subscriptionType("platinum"); // builder.feature(feature); return builder.build(); } public static void main(String[] args) { // 生成RSA密钥对 // generateKey(); // byte[] d1 = read4File("private.key"); // System.out.println(d1.length); // byte[] d2 = read4File("public.key"); // System.out.println(d2.length); // license对象 License license = getLicense(null); System.out.println(license.toString()); // 签名 String sige = signed(license); System.out.println(sige); System.out.println(sige.length()); // // 将签名数据放到license中 license = getLicense(sige); System.out.println(license.toString()); // 校验 boolean flag = verify(license); System.out.println(flag); // 用x-pack自身的校验方法校验,此时public.key需要放到src的根目录下 flag = LicenseVerifier.verifyLicense(license); System.out.println(flag); } }
在eclipse中创建一个java项目,lib包中引入x-pack的所有包,以及elasticsearch安装后的lib/elasticsearch-5.4.3.jar包,然后运行即可。
1. 修改getLicense中的相关数据
2.去掉main中generateKey();前面的注释,用于生成自己的RSA密钥对
3.将生成的pulic.key打包覆盖到x-pack-5.4.3.jar中,将控制台输出的license数据“{"uid":.....}”复制后,新建一个license.json文件,内容如下:
{"license": {"uid":......} // 控制台输出的uid那整行信息 }
4. 上传x-pack-5.4.3.jar和license.json
5.启动ES,执行更新license命令。
注:如果也抛出空指针异常,则采用前一篇文章中的方法,更新XPackBuild.class即可
采用这种方式,可以不用改动前端kibana,也可以方便控制版本及年限,对原包改动最小。
相关推荐
NULL 博文链接:https://fishboy.iteye.com/blog/2391750
Elasticsearch 7.6 和 Kibana 7.6 开启 X-Pack,支持 HTTPS 访问 ES,增加 ES 用户认证,增强数据安全,Kibana 支持用户权限分配,支持汉化。 Elasticsearch 7.6 和 Kibana 7.6 的 X-Pack 是一组商业功能,提供了...
2. 监控:X-Pack的监控功能能够实时收集并可视化Elasticsearch集群的性能指标,包括节点状态、索引活动、JVM内存使用情况等,帮助管理员及时发现并解决问题。此外,它还能通过电子邮件或 webhook 将警报发送给相关...
6. **X-Pack设置**: X-Pack是Elasticsearch的安全组件,包括身份验证、权限管理等功能。安装X-Pack的步骤包括在每个节点上解压`x-pack`插件,然后在`elasticsearch.yml`中启用它,如`xpack.security.enabled: true`...
ELK(Elasticsearch, Logstash, Kibana)是一个流行的开源日志分析栈,用于收集、解析、存储和可视化各种日志数据。在ELK 6.3.2版本中,X-Pack是一个包含安全、监控、警报、报告和管理功能的插件集合。X-Pack的引入...
Kibana 是 Elasticsearch 的可视化界面,5.* 版本的 Kibana 与 X-Pack 集成更加紧密,提供了丰富的可视化面板和工作台,方便用户进行数据分析和故障排查。 总的来说,Elasticsearch 的 X-Pack 5.* 通过提供全面的...
Elasticsearch是一个强大的开源搜索引擎,而Kibana是与之配套的数据可视化和分析工具,尤其在日志管理和实时数据分析方面表现突出。Kibana 6.0.0是其一个重要的版本,它提供了丰富的功能,使得用户能够方便地对...
5.6.3 X-Pack elasticsearch logstash kibana 参考: https://www.waitig.com/x-pack破解.html http://blog.csdn.net/qq_20641565/article/details/78286894 # curl -u elastic:changeme '...
**Elasticsearch 5.2.0 和 Kibana 5.2.0 for Windows x86** Elasticsearch 是一个流行的开源全文搜索引擎,广泛应用于数据检索、分析和存储。5.2.0 版本是 Elasticsearch 的一个重要里程碑,它在性能、稳定性和用户...
X-Pack是Elastic公司为Elastic Stack(包括Elasticsearch、Logstash、Kibana和Beats)提供的一款强大扩展,版本5.4.0包含了丰富的特性和功能。Elastic Stack是一套开源的数据收集、分析和可视化工具,广泛应用于日志...
x-pack-5.6.4.jar 是 elk 必备文件 5.6.4 X-Pack elasticsearch logstash kibana 步骤:下载本文件,替换elasticsearch里同名文件,重启es、kibana,申请注册文件,修改注册文件到永久,注册,搞定。 参考: ...
2. **配置文件:** 修改 `/etc/kibana/kibana.yml` 配置文件,设置服务器监听地址、端口、Elasticsearch 连接信息等。 3. **启动与管理:** 使用 `systemctl start kibana` 启动服务,`systemctl enable kibana` ...
Kibana是一款强大的开源分析和可视化平台,专为与Elasticsearch协同工作而设计。它提供了丰富的数据探索、仪表板创建以及数据可视化的功能,帮助用户理解存储在Elasticsearch中的海量数据。Kibana的核心目标是使数据...
7. **安全性和权限**:7.14.0版本可能包含增强的安全特性,例如支持基本认证、TLS/SSL加密以及集成Elasticsearch的X-Pack安全模块,这使得Kibana的数据访问和管理更加安全。 8. **插件和自定义**:Kibana允许安装和...
《X-Pack 6.2.4:Elasticsearch与Kibana协同工作的重要插件》 X-Pack 6.2.4是Elastic生态系统中的一个重要组成部分,它为Elasticsearch和Kibana提供了丰富的安全、监控、告警、报告以及管理功能。这个版本与elastic...
Kibana是ELK Stack(Elasticsearch、Logstash、Kibana)的重要组成部分,它为Elasticsearch的数据提供了强大的可视化界面,使得数据的分析和理解变得更加直观易懂。在本篇中,我们将深入探讨Kibana 6.7.1的特性及其...
总结,Kibana 6.3.0 for Windows x64版本是一个强大的数据分析工具,它简化了Elasticsearch数据的可视化和理解,尤其适合日志分析、业务监控和数据探索。通过“kibana-6.3.0-windows-x64.rar”这个压缩包,用户可以...
搭建elasticsearch集群需要的x-pack for kibana : x-pack-core-6.7.2.jar
docker cp <Elasticsearch容器ID>:/usr/share/elasticsearch/modules/x-pack/x-pack-core/x-pack-core-6.3.0.jar /docker/elasticsearch/ ``` - **参数解释**: - `<Elasticsearch容器ID>`: 此处应替换为实际运行...
Linux Kibana 7.15.1 是一个强大的数据可视化和分析工具,主要用于与Elasticsearch协同工作,提供交互式的数据探索和仪表板构建功能。这个版本是针对64位Linux系统的,所以文件名为“kibana-7.15.1-linux-x86_64.tar...