mirror of
https://github.com/mvt-project/mvt.git
synced 2026-09-30 21:19:41 +02:00
Merge branch 'extract-key' of https://github.com/pkirkovsky/mvt into pkirkovsky-extract-key
This commit is contained in:
commit
bfcfb3aa06
4 files changed
+101
-1
No files matched your search
@@ -17,6 +17,7 @@ from mvt.common.module import run_module, save_timeline
|
||||
from mvt.common.options import MutuallyExclusiveOption
|
||||
|
||||
from .decrypt import DecryptBackup
|
||||
from .keyutils import KeyUtils
|
||||
from .modules.fs import BACKUP_MODULES, FS_MODULES
|
||||
|
||||
# Setup logging using Rich.
|
||||
@@ -62,6 +63,26 @@ def decrypt_backup(destination, password, key_file, backup_path):
|
||||
raise click.ClickException("Missing required option. Specify either "
|
||||
"--password or --key-file.")
|
||||
|
||||
#==============================================================================
|
||||
# Command: extract-key
|
||||
#==============================================================================
|
||||
@cli.command("extract-key", help="Extract decryption key from an iTunes backup")
|
||||
@click.option("--password", "-p",
|
||||
help="Password to use to decrypt the backup",
|
||||
prompt="Backup password",
|
||||
hide_input=True, prompt_required=False, required=True)
|
||||
@click.option("--key-file", "-k",
|
||||
help="Key file to be written (if unset, will print to STDOUT)",
|
||||
required=False,
|
||||
type=click.Path(exists=False, file_okay=True, dir_okay=False, writable=True))
|
||||
@click.argument("BACKUP_PATH", type=click.Path(exists=True))
|
||||
def extract_key(password, backup_path, key_file):
|
||||
key_utils = KeyUtils(password, backup_path)
|
||||
if key_file:
|
||||
key_utils.write_key(key_file)
|
||||
else:
|
||||
key_utils.print_key()
|
||||
|
||||
|
||||
#==============================================================================
|
||||
# Command: check-backup
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
import os
|
||||
import logging
|
||||
from iOSbackup import iOSbackup
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
class KeyUtils:
|
||||
"""This class provides functions to extract a backup key from a password.
|
||||
"""
|
||||
|
||||
def __init__(self, password, backup_path):
|
||||
"""Generates a key file for an iOS backup.
|
||||
:param password: Backup encryption password
|
||||
:param key_file: Path to the file where to store the generated key file
|
||||
"""
|
||||
self.password = password
|
||||
self.backup_path = backup_path
|
||||
self._backup = None
|
||||
|
||||
def get_key(self):
|
||||
try:
|
||||
self._backup = iOSbackup(udid=os.path.basename(self.backup_path),
|
||||
cleartextpassword=self.password,
|
||||
backuproot=os.path.dirname(self.backup_path))
|
||||
except Exception as e:
|
||||
log.exception(e)
|
||||
log.critical("Failed to decrypt backup. Did you provide the correct password?")
|
||||
return
|
||||
else:
|
||||
self.decryption_key = self._backup.getDecryptionKey()
|
||||
log.info("Extracted decryption key.")
|
||||
|
||||
def print_key(self):
|
||||
self.get_key()
|
||||
log.info("Decryption key for backup at path %s is:\n %s",
|
||||
self.backup_path, self.decryption_key)
|
||||
|
||||
def write_key(self, key_file):
|
||||
self.get_key()
|
||||
|
||||
try:
|
||||
with open(key_file, 'w') as writer:
|
||||
writer.write(self.decryption_key)
|
||||
except Exception as e:
|
||||
log.exception(e)
|
||||
log.critical("Failed to write key file.")
|
||||
return
|
||||
else:
|
||||
log.info("Wrote decryption key for backup at path %s to file %s",
|
||||
self.backup_path, key_file)
|
||||
log.warn("The file %s is equivalent to a plaintext password. Keep this file safe!",
|
||||
key_file)
|
||||
Reference in new issue
Block a user