`
FishBoy
  • 浏览: 16092 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

ElasticSearch及Kibana的X-pack破解2

阅读更多

声明:本文仅作为学习交流,请勿用于商业用途,否则后果自负。如需使用黄金或白金版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,也可以方便控制版本及年限,对原包改动最小。

 

0
0
分享到:
评论

相关推荐

    ElasticSearch及Kibana的X-pack破解

    NULL 博文链接:https://fishboy.iteye.com/blog/2391750

    elasticsearch7.6、kibana7.6开启x-pack

    Elasticsearch 7.6 和 Kibana 7.6 开启 X-Pack,支持 HTTPS 访问 ES,增加 ES 用户认证,增强数据安全,Kibana 支持用户权限分配,支持汉化。 Elasticsearch 7.6 和 Kibana 7.6 的 X-Pack 是一组商业功能,提供了...

    x-pack-elasticsearch-5.0.1.zip

    2. 监控:X-Pack的监控功能能够实时收集并可视化Elasticsearch集群的性能指标,包括节点状态、索引活动、JVM内存使用情况等,帮助管理员及时发现并解决问题。此外,它还能通过电子邮件或 webhook 将警报发送给相关...

    Elasticsearch 7.x 单机多node部署步骤 X-Pack设置用户密码+安装包

    6. **X-Pack设置**: X-Pack是Elasticsearch的安全组件,包括身份验证、权限管理等功能。安装X-Pack的步骤包括在每个节点上解压`x-pack`插件,然后在`elasticsearch.yml`中启用它,如`xpack.security.enabled: true`...

    ELK6.3.2的x-pack.6.3.2破解

    ELK(Elasticsearch, Logstash, Kibana)是一个流行的开源日志分析栈,用于收集、解析、存储和可视化各种日志数据。在ELK 6.3.2版本中,X-Pack是一个包含安全、监控、警报、报告和管理功能的插件集合。X-Pack的引入...

    Elasticsearch 的 X-Pack 5.*

    Kibana 是 Elasticsearch 的可视化界面,5.* 版本的 Kibana 与 X-Pack 集成更加紧密,提供了丰富的可视化面板和工作台,方便用户进行数据分析和故障排查。 总的来说,Elasticsearch 的 X-Pack 5.* 通过提供全面的...

    elasticsearch管理工具:kibana-6.0.0-linux-x86_64.tar.g

    Elasticsearch是一个强大的开源搜索引擎,而Kibana是与之配套的数据可视化和分析工具,尤其在日志管理和实时数据分析方面表现突出。Kibana 6.0.0是其一个重要的版本,它提供了丰富的功能,使得用户能够方便地对...

    x-pack-5.6.3.jar

    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-windows-x86

    **Elasticsearch 5.2.0 和 Kibana 5.2.0 for Windows x86** Elasticsearch 是一个流行的开源全文搜索引擎,广泛应用于数据检索、分析和存储。5.2.0 版本是 Elasticsearch 的一个重要里程碑,它在性能、稳定性和用户...

    x-pack-5.4.0.zip

    X-Pack是Elastic公司为Elastic Stack(包括Elasticsearch、Logstash、Kibana和Beats)提供的一款强大扩展,版本5.4.0包含了丰富的特性和功能。Elastic Stack是一套开源的数据收集、分析和可视化工具,广泛应用于日志...

    x-pack-5.6.4.jar

    x-pack-5.6.4.jar 是 elk 必备文件 5.6.4 X-Pack elasticsearch logstash kibana 步骤:下载本文件,替换elasticsearch里同名文件,重启es、kibana,申请注册文件,修改注册文件到永久,注册,搞定。 参考: ...

    kibana-6.8.1-x86-64.rpm

    2. **配置文件:** 修改 `/etc/kibana/kibana.yml` 配置文件,设置服务器监听地址、端口、Elasticsearch 连接信息等。 3. **启动与管理:** 使用 `systemctl start kibana` 启动服务,`systemctl enable kibana` ...

    kibana-8.3.2-windows-x86_64.zip

    Kibana是一款强大的开源分析和可视化平台,专为与Elasticsearch协同工作而设计。它提供了丰富的数据探索、仪表板创建以及数据可视化的功能,帮助用户理解存储在Elasticsearch中的海量数据。Kibana的核心目标是使数据...

    最新版windows kibana-7.14.0-windows-x86_64.zip

    7. **安全性和权限**:7.14.0版本可能包含增强的安全特性,例如支持基本认证、TLS/SSL加密以及集成Elasticsearch的X-Pack安全模块,这使得Kibana的数据访问和管理更加安全。 8. **插件和自定义**:Kibana允许安装和...

    x-pack-6.2.4

    《X-Pack 6.2.4:Elasticsearch与Kibana协同工作的重要插件》 X-Pack 6.2.4是Elastic生态系统中的一个重要组成部分,它为Elasticsearch和Kibana提供了丰富的安全、监控、告警、报告以及管理功能。这个版本与elastic...

    kibana-6.7.1-windows-x86_64.zip

    Kibana是ELK Stack(Elasticsearch、Logstash、Kibana)的重要组成部分,它为Elasticsearch的数据提供了强大的可视化界面,使得数据的分析和理解变得更加直观易懂。在本篇中,我们将深入探讨Kibana 6.7.1的特性及其...

    kibana-6.3.0-windows-x64.rar

    总结,Kibana 6.3.0 for Windows x64版本是一个强大的数据分析工具,它简化了Elasticsearch数据的可视化和理解,尤其适合日志分析、业务监控和数据探索。通过“kibana-6.3.0-windows-x64.rar”这个压缩包,用户可以...

    x-pack-core-6.7.2.jar

    搭建elasticsearch集群需要的x-pack for kibana : x-pack-core-6.7.2.jar

    docker 版X-pack 6.3.0破解

    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-linux-x86_64.tar.gz

    Linux Kibana 7.15.1 是一个强大的数据可视化和分析工具,主要用于与Elasticsearch协同工作,提供交互式的数据探索和仪表板构建功能。这个版本是针对64位Linux系统的,所以文件名为“kibana-7.15.1-linux-x86_64.tar...

Global site tag (gtag.js) - Google Analytics