本文章只为学习研究目的,我们应当尊重elastic的官方权益,禁止使用本文方法做任何商业用途!你可能会被追究商业责任。
初始化项目
我基于容器折腾的,所以要先初始化一个容器项目。
我这里使用的项目基于:https://github.com/deviantony/docker-elk
将项目克隆到本地
git clone https://github.com/deviantony/docker-elk.git cd docker-elk source .env docker-compose up -d
项目就运行起来了,你通过 http://localhost:5601/ 就能看到你的kibana界面了。账号:elastic 密码:changeme,可以进去感受下界面。
开始破解
我们的目标是把x-pack-core-7.2.0.jar 这个文件处理下,该文件里面有验证license是否有效的函数,破坏该函数,然后用一个伪造的license来进行注册,即可达到可以长期本地实验环境继续体验强大elastic的目的。
使用命令提取jar包
docker cp 13be6172db3d:/usr/share/elasticsearch/modules/x-pack-core/x-pack-core-7.2.0.jar .
使用 docker cp 命令将 容器里面的文件复制出来, 冒号前面的是 容器id, 使用docker ps 来查询。
反编译jar包类容
我们使用 luyten 这个工具来反编译,下载页面:https://github.com/deathmarine/Luyten/releases
软件下载下来,打开软件,把x-pack-core-7.2.0.jar 丢进去,就能看到我们jar包的源代码了。
我们需要把2个文件提取出来进行修改。
org.elasticsearch.license.LicenseVerifier
org.elasticsearch.xpack.core.XPackBuild
修改LicenseVerifier
LicenseVerifier 中有两个静态方法,这就是验证授权文件是否有效的方法,我们把它修改为全部返回true.
package org.elasticsearch.license;
import java.nio.*;
import org.elasticsearch.common.bytes.*;
import java.security.*;
import java.util.*;
import org.elasticsearch.common.xcontent.*;
import org.apache.lucene.util.*;
import org.elasticsearch.core.internal.io.*;
import java.io.*;
public class LicenseVerifier
{
public static boolean verifyLicense(final License license, final byte[] publicKeyData) {
return true;
}
public static boolean verifyLicense(final License license) {
return true;
}
}
XPackBuild 中最后一个静态代码块中 try的部分全部删除,这部分会验证jar包是否被修改.
package org.elasticsearch.xpack.core;
import org.elasticsearch.common.io.*;
import java.net.*;
import org.elasticsearch.common.*;
import java.nio.file.*;
import java.io.*;
import java.util.jar.*;
public class XPackBuild
{
public static final XPackBuild CURRENT;
private String shortHash;
private String date;
@SuppressForbidden(reason = "looks up path of xpack.jar directly")
static Path getElasticsearchCodebase() {
final URL url = XPackBuild.class.getProtectionDomain().getCodeSource().getLocation();
try {
return PathUtils.get(url.toURI());
}
catch (URISyntaxException bogus) {
throw new RuntimeException(bogus);
}
}
XPackBuild(final String shortHash, final String date) {
this.shortHash = shortHash;
this.date = date;
}
public String shortHash() {
return this.shortHash;
}
public String date() {
return this.date;
}
static {
final Path path = getElasticsearchCodebase();
String shortHash = null;
String date = null;
Label_0109: {
shortHash = "Unknown";
date = "Unknown";
}
CURRENT = new XPackBuild(shortHash, date);
}
}
编译修改后的java文件
编译需要用到elasticsearch的lib,所以要把elasticsearch的lib复制出来。
docker cp 13be6172db3d:/usr/share/elasticsearch/lib .
使用 docker cp 命令将 容器里面的文件复制出来, 冒号前面的是 容器id, 使用docker ps 来查询。
javac -cp ".:./x-pack-core-7.2.0.jar:./lib/*" LicenseVerifier.java
javac -cp ".:./x-pack-core-7.2.0.jar:./lib/*" XPackBuild.java
上面2条命令是将我们修改后的java文件进行编译,引号里面的依赖的库根据你实际的位置来指定,我这里都在相同目录。
将编译好的修改后的文件从新打会原来的jar包
将原版jar包解压出来
unzip x-pack-core-7.2.0.jar -d ./x-pack-core-7.2.0
将我们修改编译好的class文件替换到 解压出来的 x-pack-core-7.2.0 目录里面对应文件 的位置(我拖拽覆盖的,这里你们自己操作)
将修改过的x-pack-core-7.2.0目录从新打成jar包
jar -cvf x-pack-core-7.2.0.jar -C x-pack-core-7.2.0 .
将修改 过的jar包替换回容器,然后重新启动容器
ADD x-pack-core-7.2.0.jar /usr/share/elasticsearch/modules/x-pack-core/x-pack-core-7.2.0.jar
上面是elasticsearch的Docerfile,替换 x-pack-core-7.2.0.jar
导入授权文件
1、 先从官网申请basic授权文件
https://license.elastic.co/registration
2、 授权文件修改
{
"uid": "6fb96d6b-938c-45ff-9ce7-6b53b39cd7dd",
"type": "platinum", # 修改授权为白金版本
"issue_date_in_millis": 1530489600000,
"expiry_date_in_millis": 2855980923000, #修改到期时间为2060-07-02
"max_nodes": 100, # 修改最大节点数
"issued_to": "xxxx",
"issuer": "Web Form",
"signature":"AAAAAwAAAA3PP60wKNtAvRmuCGdSAAABmC9ZN0hjZDBGYnVyRXpCOW5Bb3FjZDAxOWpSbTVoMVZwUzRxVk1PSmkxaktJRVl5MUYvUWh3bHZVUTllbXNPbzBUemtnbWpBbmlWRmRZb25KNFlBR2x0TXc2K2p1Y1VtMG1UQU9TRGZVSGRwaEJGUjE3bXd3LzRqZ05iLzRteWFNekdxRGpIYlFwYkJiNUs0U1hTVlJKNVlXekMrSlVUdFIvV0FNeWdOYnlESDc3MWhlY3hSQmdKSjJ2ZTcvYlBFOHhPQlV3ZHdDQ0tHcG5uOElCaDJ4K1hob29xSG85N0kvTWV3THhlQk9NL01V",
"start_date_in_millis": 1530489600000
}
进入到kibana后台,license管理,导入新的证书,完成。