Last active
January 21, 2025 17:20
-
-
Save itsfolf/8bdf18ac890fb6431b8fd54ea5a69414 to your computer and use it in GitHub Desktop.
VictoriaMetrics Enterprise | More reversing info: https://gist.github.com/itsfolf/25fcaa047e4f6a8c1ae8b3a06e36634e
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| version: "3.5" | |
| services: | |
| victoriametrics: | |
| container_name: victoriametrics | |
| image: victoriametrics-patched/victoria-metrics:v1.102.0-enterprise | |
| ports: | |
| - 8428:8428 | |
| volumes: | |
| - vmdata:/storage | |
| network_mode: none # For testing offline validation | |
| command: | |
| - "-storageDataPath=/storage" | |
| - "-license.forceOffline=true" | |
| - "-license=PMRGU5DJEI5CEMZQG4ZTSNBRMEWWMOBTHEWTIZDCGQWTSYZYGAWTMNTBGI2WGMZWGNRWEZJCFQRHG5LCEI5CE3LFN53UAY3PNRXW4LTUNBZGKZJCFQRGC5LEEI5FWITUMVZXIIRMEJ3G2YTBMNVXK4DNMFXGCZ3FOIRCYITWNVRGCY3LOVYCELBCOZWXEZLTORXXEZJCFQRHM3LBNZXW2YLMPERCYITWNVTWC5DFO5QXSIRMEJ3G2Y3MOVZXIZLSEIWCE5TNONUW4Z3MMURCYITWNVQWYZLSOQRCYITWNVQWOZLOOQRCYITWNVQXK5DIEJOSYITFPBYCEORSGA2DKMBQGQ2DCNBMEJQWY3DPO5HWMZTMNFXGKIR2ORZHKZL5_GBDAEIIAWFGHV2EESUJSSQFHBQLESETRAK73XPRNDZUEZMNDGLHKNWHOS3MAEIIAXSIMFNAWZNQJGDXYHHK4CC2GHVPORWEL55BNNSVLIPN4LYBMM5FA" | |
| volumes: | |
| vmdata: {} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import docker | |
| import tarfile | |
| import io | |
| import hashlib | |
| import sys | |
| tag = "v1.102.0-enterprise" | |
| if len(sys.argv) > 1: | |
| tag = sys.argv[1] | |
| OG_KEY = '46 33 47 70 50 2B 35 63 74 7A 31 31 63 4B 66 6B 61 32 79 34 53 64 34 4D 65 4C 39 35 6B 75 7A 65 6B 6C 56 39 63 6B 58 6B 4D 34 57 76 70 4D 68 30 35 2F 61 61 32 71 2F 6A 30 6D 51 71 79 34 48 2F 0A 7A 30 4D 4A 69 7A 70 52 78 71 4F 30 6E 4C 77 57 4C 72 71 61 6B 47 48 72 50 5A 53 33 45 53 6E 52 41 55 33 51 34 4A 50 65 6D 50 34 65 4D 33 44 62 48 69 62 6C 6C 4B 49 39 6F 41 65 38 69 41 34 4C 0A 72 42 68 48 4C 50 4D 30 30 77 56 56 75 5A 4B 66 76 37 4A 35 4E 61 77 2B 2B 4F 6D 53 77 56 5A 44 53 51 39 41 66 50 36 41 6D 32 4D 76 65 46 6F 79 7A 35 63 62 5A 58 4B 67 42 75 78 50 35 4F 73 48 0A 42 47 76 33 62 55 51 39 5A 79 61 7A 43 66 64 73 50 6E 4E 4D 31 35 56 64 55 64 2F 6D 37 46 72 34 2B 33 70 5A 7A 36 2F 33 61 57 49 65 76 4F 4A 38 36 30 62 77 38 4C 64 38 72 67 2F 52 57 2F 74 64' | |
| NEW_KEY = 'F3GpP+5ctz11cKfka2y4Sd4MeL95kuzeklV9ckXkM4WvpMh05/aa2q/j0mQqy4H/DKRNnuJHZlL1Qa54JefU/w5iCMgHv7oim0Hr9bsEM775puqC9uOakq7HMj13ei7wL1E96x8cSGYGv3YribJM92IwpL0yyMKXu4Po1qtOcI4rC16lq/jUX5+UUQcQBnp5YDrC+dm40SAIK3C6SwLYMM8WejZiuY0SbaF/x0Bb+HrLK5oMjPxXitCdiolTnU97' | |
| NEW_KEY_HEX = NEW_KEY.encode().hex() | |
| newlen = len(NEW_KEY_HEX) | |
| oglen = len(OG_KEY.replace(" ", "")) | |
| if newlen != oglen: | |
| missing = (oglen - newlen) // 2 | |
| print(f"Padding {missing} bytes") | |
| NEW_KEY_HEX += "0A" * missing | |
| client = docker.DockerClient() | |
| def digest(data): | |
| sha256 = hashlib.sha256() | |
| sha256.update(data) | |
| return sha256.hexdigest() | |
| def save_image(): | |
| image_name = f"victoriametrics/victoria-metrics:{tag}" | |
| print(f"Extracting {image_name}") | |
| try: | |
| image = client.images.get(f"victoriametrics/victoria-metrics:{tag}") | |
| except docker.errors.ImageNotFound: | |
| print(f"Attempting to pull {image_name}") | |
| image = client.images.pull(image_name) | |
| f = open('image.tar', 'wb') | |
| for chunk in image.save(chunk_size=2097152, named=False): | |
| f.write(chunk) | |
| f.close() | |
| def patch_image(): | |
| file = tarfile.open('image.tar') | |
| newfile = tarfile.open('image.patched.tar', 'w') | |
| oldDigest = None | |
| newDigest = None | |
| for member in file.getmembers(): | |
| if 'blobs' in member.name and member.isfile(): | |
| f = file.extractfile(member) | |
| data = f.read() | |
| if data.find(bytes.fromhex(OG_KEY)) != -1: | |
| oldDigest = member.name.split('/')[-1] | |
| print(f"Found vm binary: {oldDigest}") | |
| data = data.replace(bytes.fromhex(OG_KEY), bytes.fromhex(NEW_KEY_HEX)) | |
| newDigest = digest(data) | |
| member.name = f"blobs/sha256/{newDigest}" | |
| newfile.addfile(tarinfo=member, fileobj=io.BytesIO(data)) | |
| print(f"Patched vm binary: {newDigest}") | |
| break | |
| if oldDigest is None or newDigest is None: | |
| print("Could not find vm binary") | |
| sys.exit(1) | |
| for member in file.getmembers(): | |
| f = file.extractfile(member) | |
| if f is None: | |
| newfile.addfile(tarinfo=member) | |
| continue | |
| if newDigest in member.name: | |
| continue | |
| data = f.read() | |
| data = data.replace(bytes(oldDigest, 'utf-8'), bytes(newDigest, 'utf-8')) | |
| newfile.addfile(tarinfo=member, fileobj=io.BytesIO(data)) | |
| print("Patching complete") | |
| def load_image(): | |
| print("Loading patched image to docker") | |
| with open('image.patched.tar', 'rb') as f: | |
| new_image = client.images.load(f.read()) | |
| new_image[0].tag(repository='victoriametrics-patched/victoria-metrics', tag=tag) | |
| print(f"Loaded as victoriametrics-patched/victoria-metrics:{tag}") | |
| save_image() | |
| patch_image() | |
| load_image() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment