Merge branch 'extract-key' of https://github.com/pkirkovsky/mvt into pkirkovsky-extract-key

This commit is contained in:
Nex committed 2021-07-30 18:29:47 +02:00
commit bfcfb3aa06
4 files changed
+101 -1

No files matched your search

+21
View File
@@ -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
+52
View File
@@ -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)