Skip to content

Instantly share code, notes, and snippets.

@itsfolf
Last active January 21, 2025 17:20
Show Gist options
  • Select an option

  • Save itsfolf/8bdf18ac890fb6431b8fd54ea5a69414 to your computer and use it in GitHub Desktop.

Select an option

Save itsfolf/8bdf18ac890fb6431b8fd54ea5a69414 to your computer and use it in GitHub Desktop.
VictoriaMetrics Enterprise | More reversing info: https://gist.github.com/itsfolf/25fcaa047e4f6a8c1ae8b3a06e36634e
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: {}
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