Nettoyage du dump
Nous allons extraire les caractères textuels avec la commande strings
.
strings lime.dump > lime_to_string
Analyse des timestamps et dates
Ensuite, nous pouvons filtrer les timestamps et les dates (voir le code en annexe 1).
Plusieurs lignes peuvent attirer l’œil :
-
Lignes 70121:
system_app_strictmode@1616526769876.txt.gz
(Date trouvée: 1616526769876 -> 2021-03-23 19:12:49 UTC) -
Ligne 1594546:
type=1400 audit(1616526815.693:11968): avc: denied { module_load } for pid=4752 comm="insmod" path="/storage/emulated/0/lime.ko" dev="sdcardfs" ino=57349 scontext=u:r:su:s0 tcontext=u:object_r:sdcardfs:s0 tclass=system permissive=1
(Date trouvée: 1616526815 -> 2021-03-23 19:13:35 UTC)
La ligne 70121, ainsi que les autres similaires en “@<timestamp>.txt.gz”, semblent être des opérations d’extraction de données de log, mais ne sont pas des dumps de mémoire.
Très proche, la ligne 1594546 contient trois indices : LiME, “avc: denied” et “permissive=1”.
Il parait probable que LiME soit Linux Memory Extractor, et la règle SELinux pourrait indiquer une compromission.
Il semble donc possible de suspecter un lien entre ce comportement et la version personnalisée du noyau :
Linux version 4.4.124+ (forensics@fcsc2021) (gcc version 4.9.x 20150123 (prerelease) (GCC) ) #3 SMP PREEMPT Sun Mar 21 19:15:33 CET 2021
Conversion de la date
Il ne reste plus qu’à convertir la date : 2021-03-23 19:13.
echo -n 2021-03-23 19:13 | sha256sum
b7dc08558ee16d1acbf54db67263c1d92e9a9d9603e6a1345550c825527adc06 -
ATTENTION: Il est impératif d’utiliser l’argument -n
avec echo
, sinon un caractère \n
sera ajouté et rendra le hash invalide.
Annexe 1 : Script Python pour le filtrage des dates
import datetime
import re
def filter_dates_in_file(filepath):
# Définir la date de début pour le filtrage (1er janvier 2020 00:00:00 UTC)
min_datetime_2020 = datetime.datetime(2020, 1, 1, 0, 0, 0, tzinfo=datetime.timezone.utc)
# Définir la date de fin pour le filtrage (1er janvier 2022 00:00:00 UTC)
max_datetime_2022 = datetime.datetime(2022, 1, 1, 0, 0, 0, tzinfo=datetime.timezone.utc)
with open(filepath, 'r') as f:
# Lire le fichier ligne par ligne pour conserver les numéros de ligne
for line_num, line_content in enumerate(f, 1):
# Trouver tous les motifs YYYY-MM-DD ou les timestamps numériques sur la ligne
# Nous nous concentrons uniquement sur ces formats pour l'affichage et le filtrage.
# L'ordre dans la regex est important si un motif peut chevaucher l'autre.
# Ici, les deux sont distincts.
date_patterns_on_line = re.findall(r'\b\d{4}-\d{2}-\d{2}\b|\b[0-9]{10,}\b', line_content)
found_valid_entry_on_line = False
# Traiter les dates et timestamps pour le filtrage
for found_str in date_patterns_on_line:
dt_object = None
try:
# Tente de parser comme un timestamp numérique
if re.fullmatch(r'[0-9]{10,}', found_str):
ts_int = int(found_str)
if len(found_str) == 13: # Millisecondes
dt_object = datetime.datetime.fromtimestamp(ts_int / 1000, tz=datetime.timezone.utc)
elif len(found_str) == 10: # Secondes
dt_object = datetime.datetime.fromtimestamp(ts_int, tz=datetime.timezone.utc)
# Tente de parser comme une date YYYY-MM-DD
elif re.fullmatch(r'\d{4}-\d{2}-\d{2}', found_str):
dt_object = datetime.datetime.strptime(found_str, '%Y-%m-%d')
dt_object = dt_object.replace(tzinfo=datetime.timezone.utc)
except ValueError:
# Gérer les chaînes qui ne sont pas des dates/timestamps valides
continue
if dt_object: # Si un objet datetime valide a été créé
# Vérifier si la date est entre 2020 (inclus) et 2022 (exclus)
if min_datetime_2020 <= dt_object < max_datetime_2022:
if not found_valid_entry_on_line:
print(f"Ligne {line_num}:")
print(f" {line_content.strip()}")
found_valid_entry_on_line = True
print(f" (Date trouvée: {found_str} -> {dt_object.strftime('%Y-%m-%d %H:%M:%S UTC')})")
if found_valid_entry_on_line:
print("") # Ajoute une ligne vide pour une meilleure lisibilité
filter_dates_in_file('toStrg')