mirror of
https://github.com/mvt-project/mvt.git
synced 2024-06-01 18:55:31 +00:00
Fix exception with bad password
This commit is contained in:
parent
be511dcb51
commit
ac26aa964a
|
@ -10,6 +10,8 @@ import string
|
||||||
import sys
|
import sys
|
||||||
import tempfile
|
import tempfile
|
||||||
import time
|
import time
|
||||||
|
import base64
|
||||||
|
import getpass
|
||||||
|
|
||||||
from adb_shell.adb_device import AdbDeviceTcp, AdbDeviceUsb
|
from adb_shell.adb_device import AdbDeviceTcp, AdbDeviceUsb
|
||||||
from adb_shell.auth.keygen import keygen, write_public_keyfile
|
from adb_shell.auth.keygen import keygen, write_public_keyfile
|
||||||
|
@ -19,7 +21,7 @@ from adb_shell.exceptions import (AdbCommandFailureException, DeviceAuthError,
|
||||||
from usb1 import USBErrorAccess, USBErrorBusy
|
from usb1 import USBErrorAccess, USBErrorBusy
|
||||||
|
|
||||||
from mvt.common.module import InsufficientPrivileges, MVTModule
|
from mvt.common.module import InsufficientPrivileges, MVTModule
|
||||||
from mvt.android.parsers.backup import parse_ab_header, parse_backup_file
|
from mvt.android.parsers.backup import parse_ab_header, parse_backup_file, InvalidBackupPassword
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
@ -244,7 +246,7 @@ class AndroidExtraction(MVTModule):
|
||||||
# Disconnect from the device.
|
# Disconnect from the device.
|
||||||
self._adb_disconnect()
|
self._adb_disconnect()
|
||||||
|
|
||||||
def _generate_backup(package_name):
|
def _generate_backup(self, package_name):
|
||||||
# Run ADB command to create a backup of SMS app
|
# Run ADB command to create a backup of SMS app
|
||||||
self.log.warning("Please check phone and accept Android backup prompt. You may need to set a backup password. \a")
|
self.log.warning("Please check phone and accept Android backup prompt. You may need to set a backup password. \a")
|
||||||
|
|
||||||
|
@ -253,6 +255,7 @@ class AndroidExtraction(MVTModule):
|
||||||
backup_output_b64 = self._adb_command("/system/bin/bu backup -nocompress '{}' | base64".format(package_name))
|
backup_output_b64 = self._adb_command("/system/bin/bu backup -nocompress '{}' | base64".format(package_name))
|
||||||
backup_output = base64.b64decode(backup_output_b64)
|
backup_output = base64.b64decode(backup_output_b64)
|
||||||
header = parse_ab_header(backup_output)
|
header = parse_ab_header(backup_output)
|
||||||
|
|
||||||
if not header["backup"]:
|
if not header["backup"]:
|
||||||
self.log.error("Extracting SMS via Android backup failed. No valid backup data found.")
|
self.log.error("Extracting SMS via Android backup failed. No valid backup data found.")
|
||||||
return
|
return
|
||||||
|
@ -261,7 +264,7 @@ class AndroidExtraction(MVTModule):
|
||||||
return parse_backup_file(backup_output, password=None)
|
return parse_backup_file(backup_output, password=None)
|
||||||
|
|
||||||
# Backup encrypted. Request password from user.
|
# Backup encrypted. Request password from user.
|
||||||
while password_retry in range(0, 3):
|
for password_retry in range(0, 3):
|
||||||
backup_password = getpass.getpass(prompt="Backup Password: ", stream=None)
|
backup_password = getpass.getpass(prompt="Backup Password: ", stream=None)
|
||||||
try:
|
try:
|
||||||
decrypted_backup_tar = parse_backup_file(backup_output, backup_password)
|
decrypted_backup_tar = parse_backup_file(backup_output, backup_password)
|
||||||
|
|
|
@ -117,6 +117,9 @@ class SMS(AndroidExtraction):
|
||||||
algorithim. This module only supports an unencrypted ADB backup.
|
algorithim. This module only supports an unencrypted ADB backup.
|
||||||
"""
|
"""
|
||||||
backup_tar = self._generate_backup("com.android.providers.telephony")
|
backup_tar = self._generate_backup("com.android.providers.telephony")
|
||||||
|
if not backup_tar:
|
||||||
|
return
|
||||||
|
|
||||||
try:
|
try:
|
||||||
self.results = parse_tar_for_sms(backup_tar)
|
self.results = parse_tar_for_sms(backup_tar)
|
||||||
except AndroidBackupParsingError:
|
except AndroidBackupParsingError:
|
||||||
|
|
|
@ -78,20 +78,20 @@ def decrypt_master_key(password, user_salt, user_iv, pbkdf2_rounds, master_key_b
|
||||||
decryptor = cipher.decryptor()
|
decryptor = cipher.decryptor()
|
||||||
try:
|
try:
|
||||||
decryted_master_key_blob = decryptor.update(master_key_blob) + decryptor.finalize()
|
decryted_master_key_blob = decryptor.update(master_key_blob) + decryptor.finalize()
|
||||||
|
|
||||||
|
# Extract key and IV from decrypted blob.
|
||||||
|
key_blob = io.BytesIO(decryted_master_key_blob)
|
||||||
|
master_iv_length = ord(key_blob.read(1))
|
||||||
|
master_iv = key_blob.read(master_iv_length)
|
||||||
|
|
||||||
|
master_key_length = ord(key_blob.read(1))
|
||||||
|
master_key = key_blob.read(master_key_length)
|
||||||
|
|
||||||
|
master_key_checksum_length = ord(key_blob.read(1))
|
||||||
|
master_key_checksum = key_blob.read(master_key_checksum_length)
|
||||||
except TypeError:
|
except TypeError:
|
||||||
raise InvalidBackupPassword()
|
raise InvalidBackupPassword()
|
||||||
|
|
||||||
# Extract key and IV from decrypted blob.
|
|
||||||
key_blob = io.BytesIO(decryted_master_key_blob)
|
|
||||||
master_iv_length = ord(key_blob.read(1))
|
|
||||||
master_iv = key_blob.read(master_iv_length)
|
|
||||||
|
|
||||||
master_key_length = ord(key_blob.read(1))
|
|
||||||
master_key = key_blob.read(master_key_length)
|
|
||||||
|
|
||||||
master_key_checksum_length = ord(key_blob.read(1))
|
|
||||||
master_key_checksum = key_blob.read(master_key_checksum_length)
|
|
||||||
|
|
||||||
# Handle quirky encoding of master key bytes in Android original Java crypto code
|
# Handle quirky encoding of master key bytes in Android original Java crypto code
|
||||||
if format_version > 1:
|
if format_version > 1:
|
||||||
hmac_mk = to_utf8_bytes(master_key)
|
hmac_mk = to_utf8_bytes(master_key)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user