Persistance
Tâches BITS (base qmgr)
Fiche tâches BITS : qmgr0.dat/qmgr1.dat ou qmgr.db (ESE), événements Bits-Client 3, 4, 59, 60, persistance SetNotifyCmdLine et BitsParser.
- Emplacement
- C:\ProgramData\Microsoft\Network\Downloader\qmgr.db
- Prouve
- Une tâche BITS a transféré un fichier depuis ou vers une URL, et peut lancer une commande à la fin
- Horodatages
- Création/modification des tâches en FILETIME, UTC dans qmgr.db ; événements EVTX Bits-Client en UTC ; horodatages NTFS du fichier cible
- Rétention
- Tâches supprimées à la fin ou à l'annulation (récupérables jusqu'à écrasement) ; inactives abandonnées après 90 jours ; journal Bits-Client tournant par taille
- Accès
- Administrateur ; qmgr.db verrouillé à chaud : collecter par copie brute (KAPE) ou depuis un cliché instantané
- Preuve de
- PersistanceRéseau et accès distant
- Type
- Base de données
- Windows
- Vista / 78 / 8.11011
- Cible KAPE
- BITSEventLogs
- Velociraptor
- Windows.Triage.Targets:BITSEventLogs
Outils
Comparer tous les outilsPrésentation
Le service de transfert intelligent en arrière-plan (BITS) télécharge et envoie des fichiers en arrière-plan pour Windows Update, Defender et de nombreuses applications. Les attaquants l'utilisent via bitsadmin.exe ou le module PowerShell BitsTransfer : les transferts s'exécutent dans un processus de service svchost.exe, reprennent après un redémarrage et passent par le proxy du système, ce qui fait de BITS un LOLBin de téléchargement bien pratique.
BITS prend aussi en charge une ligne de commande de notification : un programme lancé lorsqu'une tâche se termine ou passe en erreur. Associée à un téléchargement conçu pour échouer, elle offre une persistance qui n'existe que dans la base des tâches BITS, pas dans le registre.
L'état des tâches est conservé dans la base du gestionnaire de files d'attente (qmgr), et l'activité cliente est journalisée dans le canal Bits-Client Operational.
Emplacement
| Version de Windows | Base des tâches | Remarques |
|---|---|---|
| Vista / 7 / 8 / 8.1 | C:\ProgramData\Microsoft\Network\Downloader\qmgr0.dat et qmgr1.dat | Format binaire propriétaire ; deux copies, la seconde peut contenir des enregistrements plus anciens ou uniques |
| 10 / 11 | C:\ProgramData\Microsoft\Network\Downloader\qmgr.db | Base ESE avec edb.log et d'anciens journaux de transactions edb*.log dans le même dossier |
| Toutes (Vista et suivants) | Journal Microsoft-Windows-Bits-Client/Operational | Microsoft-Windows-Bits-Client%4Operational.evtx |
Le dossier correspond à %ALLUSERSPROFILE%\Microsoft\Network\Downloader. À partir de Windows 10, le service BITS ouvre la base sans partage : une copie de fichier classique échoue tant que le service tourne.
Ce que l'artefact prouve
- Un transfert a été configuré : nom de la tâche, URL source, fichier de destination local, octets transférés, propriétaire (SID) et état.
- Une commande y a été associée : programme et arguments de notification que BITS lance à la fin ou en cas d'erreur.
- URL et processus client dans le journal : l'événement 3 nomme la tâche et son propriétaire, les événements 59/60 donnent l'URL.
- Elle ne prouve pas que le fichier téléchargé a été exécuté ; suivez le chemin de destination dans le Prefetch, Amcache ou les événements de processus. Les tâches terminées ou annulées sont retirées de la base active.
Champs clés
| Champ (sortie de BitsParser) | Signification |
|---|---|
JobName, JobDesc, JobId | Nom, description et GUID choisis par le créateur (les attaquants imitent souvent « System update ») |
JobType | Téléchargement, envoi ou envoi avec réponse |
JobState | En file, en transfert, suspendu, en erreur, transféré… |
OwnerSID, Owner | Compte qui a créé la tâche |
CommandExecuted, CommandArguments | Ligne de commande de notification définie par /SetNotifyCmdLine |
SourceURL, DestFile, TmpFile | URL distante, chemin local final et fichier temporaire BIT*.tmp |
DownloadByteSize, TransferByteSize | Taille attendue et taille transférée |
CreationTime, ModifiedTime | Dates de la tâche lorsqu'elles figurent dans l'enregistrement |
Carved | Enregistrement récupéré dans l'espace libre ou les journaux de transactions |
Horodatages
| Horodatage | Positionné quand | Format | Pièges |
|---|---|---|---|
| Création / modification de la tâche | Tâche créée ou modifiée | FILETIME dans l'enregistrement, UTC (BitsParser affiche de l'ISO 8601) | Tous les enregistrements ne portent pas les deux dates, surtout ceux récupérés par carving |
| Événement 3 | BITS a créé une nouvelle tâche | EVTX, UTC | Contient le nom de la tâche, son propriétaire et, selon les versions, le processus client |
| Événements 59 / 60 | Début / arrêt du transfert | EVTX, UTC | Contiennent l'URL ; le 60 porte aussi le code d'état |
| Événement 4 | Tâche de transfert terminée | EVTX, UTC | À associer aux 59/60 pour l'URL |
| Événements 61 / 64 | Erreur de transfert / impossible de lancer le programme de notification | EVTX, UTC | Le 64 révèle la commande de notification même quand la tâche a disparu |
| Horodatages $SI du fichier de destination | Fichier écrit par BITS | NTFS, UTC | Écrit d'abord dans un fichier BIT*.tmp, renommé à la fin |
Rétention et effacement
- Les tâches sont supprimées de la base lorsqu'elles se terminent ou sont annulées, mais des enregistrements peuvent survivre dans les pages libres de la base et dans les journaux de transactions ESE jusqu'à leur écrasement.
- Les tâches inactives sont abandonnées après un délai de 90 jours par défaut (stratégie
JobInactivityTimeout), ce qui limite la durée de vie d'une persistance par « téléchargement en échec » si elle n'est pas renouvelée. bitsadmin /reset /allusersouGet-BitsTransfer -AllUsers | Remove-BitsTransferefface les tâches ; le journal d'événements et le carving peuvent encore les révéler.- Le journal Bits-Client est très actif sur les machines sollicitées par Windows Update et tourne selon sa taille.
Collecte
- Cible KAPE :
BITS(tout le dossierDownloader, avec copie brute pour les fichiers verrouillés) etEventLogspour le canal Bits-Client. - Velociraptor (
Windows.Triage.Targets) :BITS,EventLogs. Aucun artefact d'analyse Velociraptor intégré ne cible la base qmgr : collectez les fichiers et analysez-les hors ligne. - Commandes natives : l'énumération en direct exige des droits d'administrateur ; la base elle-même doit provenir d'un cliché instantané ou d'un outil de copie brute.
bitsadmin /list /allusers /verbose
powershell -c "Get-BitsTransfer -AllUsers | Format-List *"
wevtutil epl Microsoft-Windows-Bits-Client/Operational E:\case\Bits-Client.evtx
vssadmin list shadows
Outils d'analyse
- BitsParser (Mandiant, open source, Python 3) : analyse l'ancien format qmgr comme la base ESE de Windows 10 et suivants, sortie JSON ;
--carvedbet--carveallrécupèrent les enregistrements supprimés dans la base et les journaux de transactions. - EvtxECmd (Eric Zimmerman) : événements Bits-Client en CSV pour la chronologie.
- Visionneuses ESE (par exemple
esedbexportde libesedb, open source) : elles ouvrentqmgr.db, mais le détail des tâches et fichiers est stocké dans des blobs binaires ; BitsParser reste le choix pratique.
Conseils d'investigation
- Cherchez les tâches dotées d'une commande de notification (
CommandExecuted) qui n'est pas un programme de mise à jour connu, et les tâches appartenant à des comptes utilisateurs qui rapatrient des exécutables ou des scripts. - Extrayez toutes les URL des événements 59 et 60 ; domaines inhabituels, adresses IP brutes et hôtes non Microsoft ressortent nettement face au trafic Windows Update.
- Une tâche en erreur avec une commande de notification et une URL injoignable correspond au schéma classique de persistance BITS.
- Examinez le fichier de destination dans la $MFT et le journal USN : BITS écrit d'abord un fichier temporaire
BIT*.tmp, puis le renomme avec le nom de destination. bitsadmin.exedans le Prefetch ou des journaux PowerShell montrantStart-BitsTransferconfirment qui a piloté le transfert.- Rapprochez URL et horaires des tâches des journaux de proxy, DNS ou pare-feu pour confirmer que le transfert est sorti de la machine et en estimer le volume.
Artefacts liés
- Tâches planifiéesFiche tâches planifiées : XML et .job, clés TaskCache, horodatages DynamicInfo, tâches masquées, événements TaskScheduler et 4698.
- Services WindowsFiche services Windows : valeurs de la clé Services (ImagePath, Start, Type, ServiceDll), événements 7045 et 4697, traces de PsExec et pièges.
- Référentiel WMI et SCCM RecentlyUsedAppsFiche référentiel WMI : OBJECTS.DATA, filtres, consommateurs et liaisons d'événements, WMI-Activity 5857–5861, fichiers MOF et CCM_RecentlyUsedApps.
- Journaux d'événements Windows (EVTX)Fiche des journaux d'événements Windows : emplacements EVTX, ID indispensables (connexions, processus, services, effacement), rétention, audit et outils.
- Journal USN ($UsnJrnl:$J)Fiche journal USN : $UsnJrnl:$J et $Max, champs, indicateurs Reason, référence parent, taille par défaut, rotation, fsutil et analyse avec MFTECmd.
- Table de fichiers maîtres ($MFT)Fiche $MFT : enregistrements FILE, horodatages $SI et $FN, données résidentes, entrées supprimées, numéros de séquence, timestomping et MFTECmd.
Termes du glossaire
- PersistanceMécanismes permettant à un malware ou à un attaquant de survivre aux redémarrages : clés Run, services, tâches planifiées, abonnements WMI.
- Base ESE (Extensible Storage Engine)Le format de base de données transactionnelle de Microsoft derrière SRUM, WebCache, l'index Windows Search et la file BITS, souvent « dirty ».
- LOLBin (binaire living-off-the-land)Binaire Windows légitime et signé que les attaquants détournent pour télécharger, exécuter ou dissimuler une charge sans déposer leurs outils.
- ID d'événement WindowsLe numéro qui identifie un type d'événement au sein d'un fournisseur donné ; il n'a de sens qu'associé à ce fournisseur et à son canal.