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

La caractéristique la plus sous-estimée d'Amcache.hve est qu'elle survit aux binaires qu'elle enregistre. Un attaquant supprime un outil dès qu'il n'en a plus besoin. Le snapshot Amcache du chemin, du hash, de l'éditeur, de la version et du moment d'inventaire de ce binaire persiste typiquement dans la ruche des semaines ou des mois après.

Cette page est le workflow pratique quand le binaire a disparu et que la ruche est tout ce que vous avez.

Pour le contexte d'artefact, voir la Référence Amcache complète. Pour le contexte de comparaison, voir Amcache vs Prefetch et Amcache vs Shimcache.

Pourquoi Amcache survit au binaire#

L'appraiser écrit le snapshot d'inventaire une fois par passe. Une fois qu'une entrée est dans Root\InventoryApplicationFile, elle reste dans la ruche jusqu'à :

  • Une passe ultérieure de l'appraiser la supprime activement (exception, pas règle), ou
  • La ruche elle-même est supprimée ou expire.

En pratique, sur une station Windows 11, les entrées persistent des mois même après la disparition du binaire. Sur des stations qui tournent longtemps, des entrées de plusieurs années sont routinières.

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

Ce que vous récupérez réellement#

Quand un binaire est supprimé, vous perdez typiquement :

  • Le binaire lui-même.
  • Les timestamps de système de fichiers dans la MFT (peuvent être effacés ou écrasés).
  • La capacité de vérifier le hash du binaire directement.

Ce que vous conservez dans Amcache :

Récupéré Depuis
Chemin complet au moment de l'inventaire FullPath / LowerCaseLongPath
SHA-1 des 31 premiers MiB Hash (retirez 0000 du FileId)
Taille du fichier Size
Link date PE LinkDate
Éditeur Publisher / PublisherName
Chaînes de version Version, BinFileVersion, ProductVersion
Nom de produit ProductName
Identité d'application ProgramId
Quand l'appraiser l'a vu KeyLastWriteTimestamp

De quoi soumettre le hash à VirusTotal (voir FileId Amcache expliqué), pivoter le ProgramId entre hôtes (voir Mouvement latéral et pivot par ProgramId), borner dans le temps l'événement de drop via KeyLastWriteTimestamp (voir Horodatages Amcache expliqués), et reconstruire l'identité du binaire même si ses octets ont disparu.

Le workflow post-suppression#

Un workflow reproductible pour "on pense 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 aussi touché la ruche vivante, énumérez les Volume Shadow Copies et récupérez la copie de chaque cliché. Voir Où se trouve Amcache.hve sur le disque. Sur une station, deux ou trois clichés couvrent typiquement la dernière semaine ou deux. Chacun est une cible de parsing distincte.

2. Parser en multi-passes#

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

Le flag --mp est critique. Il récupère les entrées orphelines que l'appraiser a dissociées mais pas complètement supprimées. Certaines sont exactement les lignes "fraîchement supprimées" que vous cherchez.

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

Filtre de triage standard, avec une modification : laissez tomber toute vérification que FullPath existe sur le disque, parce que ce n'est plus le cas.

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 KeyLastWriteTimestamp, FullPath, Hash, Size, LinkDate |
 Sort-Object KeyLastWriteTimestamp

C'est la liste des binaires déposés (et probablement supprimés) tels que l'appraiser les a vus.

4. Croiser avec le système de fichiers#

Pour chaque ligne, vérifiez si le fichier existe encore :

$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 vos candidates de binaires supprimés.

5. Enrichir avec VirusTotal#

Hachez tout, soumettez, capturez les résultats. Même un lookup à bas volume contre l'API publique remonte du connu-malveillant sur un hôte infecté typique.

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 de plus de 31 MiB, rappelez-vous que le hash Amcache est un hash de préfixe, pas un hash de fichier complet. Voir FileId Amcache expliqué.

6. Borner le drop dans le temps#

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

  • Toutes les autres lignes Amcache (drivers, périphériques, autres fichiers inventoriés dans la même fenêtre, souvent le reste du toolkit).
  • 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 du système de fichiers.
  • Entrées du journal USN. L'autre journal de système de fichiers, qui attrape souvent ce que la MFT rate.

On reconstruit typiquement toute la séquence drop + exécution + nettoyage depuis ces jointures, même si le binaire a disparu.

Contre-mesures anti-forensiques#

Quelques techniques d'attaquant précises et comment les détecter.

Drop and delete dans un cycle d'appraiser#

L'attaquant dépose, exécute et supprime dans un seul intervalle d'appraiser (<24h sur les stations). Le binaire peut ne jamais apparaître dans Amcache.

Détection : croiser Prefetch (qui enregistre l'exécution en temps réel et survit à la suppression du binaire) et Sysmon 1 / 11 avec Amcache. Les binaires présents dans Prefetch / Sysmon mais absents d'Amcache sont des drops intra-appraiser.

Modification directe de la ruche#

Un attaquant capable avec admin peut éditer Amcache.hve pour retirer des entrées précises. Inhabituel (fastidieux, la plupart des attaquants ne s'embêtent pas) mais possible.

Détection : parser la ruche vivante ET la version de la ruche dans chaque Volume Shadow Copy. Diff. Les entrées dans les clichés mais absentes de la vivante sont la preuve d'un nettoyage délibéré. Les entrées à des offsets inattendus dans la ruche vivante sont la preuve d'un remaniement.

Sabotage de l'appraiser#

Désactiver la tâche planifiée ou mettre AllowTelemetry à zéro. Stoppe les nouvelles écritures Amcache entièrement. Les anciennes entrées restent jusqu'à expirer. La ruche gèle au moment du sabotage.

Détection : vérifier l'historique de la tâche de l'appraiser dans Microsoft-Windows-TaskScheduler%4Operational.evtx via votre parseur EVTX. Regarder la distribution de KeyLastWriteTimestamp de la ruche. Si elle s'arrête brutalement alors qu'on attendrait des entrées plus récentes, soupçonner un sabotage. Vérifier aussi HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags et HKLM\SOFTWARE\Policies\Microsoft\Windows\DataCollection\AllowTelemetry.

Suppression de la ruche#

L'instrument brut. Windows recrée la ruche à la prochaine passe de l'appraiser, mais les contenus antérieurs sont perdus du système vivant.

Détection : le KeyLastWriteTimestamp le plus ancien de la ruche recréée est bien plus récent qu'attendu. Comparer avec les Volume Shadow Copies et les sauvegardes forensiques, récupérer la ruche précédente depuis les clichés.

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

Amcache est bonne. Elle n'est pas magique.

  • Le binaire lui-même. Vous avez un hash et des métadonnées, pas les octets.
  • La ligne de commande à l'exécution. Utilisez la liste de fichiers Prefetch et 4688 / Sysmon 1.
  • Les destinations réseau contactées par le binaire. Utilisez SRUM, les logs firewall, la télémétrie réseau EDR.
  • Le contexte utilisateur. Utilisez 4688 / Sysmon 1.

Amcache est un artefact dans le kit post-suppression. Combinez avec les autres pour une reconstruction complète.

Pour aller plus loin#

Liens#

Articles liés

Retour à tous les articles