Récupérer la preuve de binaires supprimés depuis Amcache

La fonctionnalité la plus sous-estimée de Amcache.hve est qu'il survit aux binaires qu'il enregistre. Un attaquant peut supprimer un outil dès qu'il n'en a plus besoin ; le snapshot d'Amcache du chemin, hash, éditeur, version et heure d'inventaire de ce binaire persiste typiquement dans la ruche pendant des semaines ou des mois après.

Cette page est le workflow pratique pour utiliser Amcache quand le binaire lui-même est parti.

Pour la référence plus large sur l'artefact, voir la référence complète Amcache ; pour la comparaison canonique, voir Amcache vs Prefetch et Amcache vs ShimCache.


Pourquoi Amcache survit au binaire#

Le Compatibility Appraiser, la tâche planifiée qui alimente Amcache, écrit le snapshot d'inventaire une fois par scan. Une fois qu'une entrée est dans Root\InventoryApplicationFile, elle reste dans la ruche jusqu'à ce que :

  • Un passage ultérieur de l'appraiser la supprime activement (ce qui est l'exception, pas la règle), ou
  • La ruche elle-même soit supprimée ou vieillie.

En pratique, sur un poste de travail Windows 11 typique, les entrées persistent pendant des mois même après que le binaire sous-jacent est parti. Sur un poste de travail de longue durée, des entrées de plusieurs années sont courantes.

Cela fait d'Amcache l'artefact post-suppression le plus fiable pour les fichiers PE sur Windows.


Ce que vous récupérez#

Quand un binaire est supprimé, vous perdez typiquement :

  • Le binaire lui-même.
  • Les horodatages système de fichiers (l'entrée MFT peut aussi être effacée ou écrasée).
  • La capacité de vérifier directement le hash du binaire.

Ce que vous conservez dans Amcache :

Récupéré Depuis le champ Amcache
Chemin complet au moment de l'inventaire FullPath / LowerCaseLongPath
SHA-1 des 31 premiers Mio Hash (retirer le préfixe 0000 de FileId)
Taille du fichier Size
Date de link PE LinkDate
Éditeur Publisher / PublisherName
Chaînes de version Version, BinFileVersion, ProductVersion
Nom de produit ProductName
Identité applicative ProgramId
Quand l'appraiser l'a vu KeyLastWriteTimestamp

Cet ensemble de champs récupérés est suffisant pour :


Le workflow post-suppression#

Un workflow reproductible pour « nous pensons qu'ils ont déposé un outil ici, puis l'ont effacé » :

1. Collecter la ruche plus les journaux de transactions#

Copy-Item 'C:\Windows\AppCompat\Programs\Amcache.hve'      'C:\Triage\' -Force
Copy-Item 'C:\Windows\AppCompat\Programs\Amcache.hve.LOG1' 'C:\Triage\' -Force
Copy-Item 'C:\Windows\AppCompat\Programs\Amcache.hve.LOG2' 'C:\Triage\' -Force

Si vous soupçonnez que l'attaquant a également supprimé ou modifié la ruche active, énumérez les Volume Shadow Copies et récupérez la copie de la ruche de chaque shadow également — voir Où se trouve Amcache.hve sur disque. Sur un poste de travail, deux ou trois shadow copies couvrent typiquement la dernière semaine ou les deux dernières ; chacune est une cible d'analyse séparée.

2. Analyser en multi-pass#

AmcacheParser.exe `
  -f 'C:\Triage\Amcache.hve' `
  --csv 'C:\Triage\Parsed' `
  --csvf 'HOST01_amcache.csv' `
  --mp

Le drapeau --mp est critique ici : il récupère les entrées orphelines que l'appraiser a désassociées mais pas entièrement supprimées. Certaines sont exactement le genre de lignes « juste supprimées » que vous cherchez.

3. Filtrer les PE non signés suspects dans les chemins inscriptibles par l'utilisateur#

C'est le filtre de triage standard, avec une modification : retirer tout filtre sur FullPath existant sur disque car le fichier n'existe plus.

Import-Csv 'C:\Triage\Parsed\HOST01_amcache_UnassociatedFileEntries.csv' |
  Where-Object {
    $_.IsPeFile -eq 'True' -and
    -not $_.Publisher    -and
    $_.FullPath -match '\\Users\\|\\ProgramData\\|\\AppData\\|\\Temp\\'
  } |
  Select-Object KeyLastWriteTimestamp, FullPath, Hash, Size, LinkDate |
  Sort-Object KeyLastWriteTimestamp

Cette liste est ce que l'attaquant a déposé (et probablement supprimé), tel que l'appraiser l'a vu.

4. Recroiser contre le système de fichiers#

Pour chaque ligne, vérifier si le fichier existe encore sur disque :

$rows = Import-Csv ... | Where-Object { ... }
$rows | ForEach-Object {
    $exists = Test-Path -LiteralPath $_.FullPath
    [pscustomobject]@{
        Path     = $_.FullPath
        Hash     = $_.Hash
        SeenAt   = $_.KeyLastWriteTimestamp
        OnDisk   = $exists
    }
} | Where-Object { -not $_.OnDisk }

Les lignes où OnDisk = False sont les candidats binaires supprimés.

5. Enrichir avec VirusTotal#

Hashez tout, soumettez, capturez les résultats. Même une recherche à faible volume contre l'API publique fait remonter des correspondances known-malicious sur un hôte typiquement infecté.

import csv, requests, time
 
API = 'https://www.virustotal.com/api/v3/files/'
HEADERS = {'x-apikey': '<your-key>'}
 
with open('deleted_candidates.csv', newline='') as f:
    for row in csv.DictReader(f):
        h = row['Hash']
        if not h:
            continue
        r = requests.get(API + h, headers=HEADERS)
        if r.status_code == 200:
            stats = r.json()['data']['attributes']['last_analysis_stats']
            if stats.get('malicious', 0) > 0:
                print(h, row['Path'], stats)
        time.sleep(15)

Pour les fichiers plus grands que 31 Mio, rappelez-vous que le hash Amcache est un prefix hash, pas un hash de fichier complet — voir FileId Amcache expliqué pour la nuance.

6. Borner dans le temps l'événement de dépôt#

Pour chaque binaire supprimé confirmé malveillant, prenez son KeyLastWriteTimestamp ± 1 heure et tirez de cette fenêtre :

  • Toutes les autres lignes Amcache (pilote + périphérique + autres fichiers inventoriés dans la même fenêtre — souvent le reste de la boîte à outils de l'attaquant).
  • Prefetch (sortie PECmd) — confirme l'exécution.
  • Security 4688 / Sysmon 1 — création de processus avec ligne de commande.
  • Sysmon 11 (file create) — confirme quand le fichier a été écrit.
  • Entrées MFT pour \Users\bob\...\ — corroboration au niveau système de fichiers.

Vous reconstruisez typiquement toute la séquence dépôt + exécution + nettoyage à partir de ces jointures, même si le binaire lui-même est parti.


Contre-mesures anti-forensiques#

Quelques techniques spécifiques que les attaquants utilisent pour cacher des binaires d'Amcache, et comment les détecter :

Déposer et supprimer dans un cycle d'appraiser#

Si l'attaquant dépose un binaire, l'exécute et le supprime tout dans un seul intervalle d'appraiser (typiquement <24 h sur les postes de travail), le binaire peut n'apparaître jamais dans Amcache.

Détection : recroiser Prefetch (qui enregistre l'exécution en temps réel, survivant à la suppression du binaire) et Sysmon 1 / 11 (création de processus et fichier en temps réel) contre Amcache. Les binaires présents dans Prefetch / Sysmon mais absents d'Amcache sont des dépôts « intra-appraiser ».

Modification directe de la ruche#

Un attaquant capable avec des droits admin peut éditer Amcache.hve pour retirer des entrées spécifiques. C'est peu courant (surtout parce que c'est fastidieux et que la plupart des attaquants ne s'en embêtent pas) mais possible.

Détection : analyser la ruche active ET les versions de la ruche de toutes les Volume Shadow Copies. Les differ. Les entrées présentes dans les shadows mais absentes du live sont la preuve d'un nettoyage délibéré. Les entrées présentes dans la ruche active mais à des offsets inattendus sont la preuve d'une restructuration.

Sabotage de l'appraiser#

Désactiver ou paralyser la tâche planifiée Compatibility Appraiser arrête entièrement les nouvelles écritures Amcache. Les anciennes entrées restent (jusqu'à ce qu'elles vieillissent), mais la ruche se « fige » au moment du sabotage.

Détection : vérifiez l'historique de tâche de l'appraiser dans le journal d'événements Task Scheduler (Microsoft-Windows-TaskScheduler/Operational). Regardez la distribution des KeyLastWriteTimestamp de la ruche — si elle s'arrête brusquement à une date donnée et que vous attendez des entrées plus récentes, suspectez un sabotage. Vérifiez aussi HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags pour DisableInventory ou des valeurs de désactivation similaires.

Suppression de la ruche#

La suppression pure et simple d'Amcache.hve est l'option la plus brutale. Windows recrée la ruche au prochain passage de l'appraiser, mais le contenu précédent est perdu du système actif.

Détection : le KeyLastWriteTimestamp le plus ancien de la ruche recréée sera bien plus récent qu'attendu. Comparez aux Volume Shadow Copies et aux sauvegardes forensiques ; récupérez la ruche précédente depuis les shadows.


Ce qu'Amcache ne peut pas récupérer#

Malgré ses forces comme artefact post-suppression, Amcache ne récupère pas :

  • Le binaire lui-même (vous avez un hash et des métadonnées, pas des octets).
  • La ligne de commande du binaire à l'exécution (utilisez la liste de fichiers de Prefetch et 4688 / Sysmon 1 à la place).
  • Les destinations réseau que le binaire a contactées (utilisez SRUM, les journaux firewall, la télémétrie réseau EDR).
  • Le contexte utilisateur sous lequel le binaire a tourné (utilisez 4688 / Sysmon 1).

Amcache est un artefact dans la trousse à outils post-suppression. Couplez avec les autres sources de preuve d'exécution Windows pour une reconstruction complète.


Voir aussi#

Pour explorer votre ruche à la recherche de candidats binaires supprimés sans rien installer, déposez un fichier sur la page d'accueil de l'analyseur — il s'analyse entièrement dans votre navigateur.

Articles liés

Retour à tous les articles