Parent : [[INDEX-CYBERSECU]]
Détection d'effacement de logs Windows - wevtutil cl, PowerShell history purge
Problème
Après exfiltration et déploiement des persistances, les attaquants ont nettoyé le serveur de pré-prod : suppression des outils (ChromeDecrypt), vidage des journaux Windows (7 fichiers .evtx, 47 MB total), purge des logs système, suppression des traces utilisateur (PowerShell history, fichiers récents, Jump Lists, CBS logs, Windows Error Reporting).
Contexte archive Ygg
- Source :
https://yggleak.top/fr/home/ygg-dossier#phase-15-effacement-des-traces - Phase 15 — Effacement des traces
- Serveur :
X.X.X.X(Windows Server 2019) - Logs vidés : Security, System, Application, PowerShell, TerminalServices (7 fichiers .evtx, 47 MB)
- PowerShell history : 443 lignes purgées
- Fichiers récents, Jump Lists, CBS logs, WER : tous purgés
Technique d'effacement
1. Vidage des journaux Windows
for /F "tokens=*" %1 in ('wevtutil.exe el') DO wevtutil.exe cl "%1"
Cette commande boucle sur tous les journaux d'événements Windows et les efface un par un.
2. Purge des traces utilisateur
# PowerShell history (443 lignes)
Remove-Item (Get-PSReadlineOption).HistorySavePath -Force
# Fichiers récents
Remove-Item "$env:APPDATA\Microsoft\Windows\Recent\*" -Force -Recurse
# Jump Lists
Remove-Item "$env:APPDATA\Microsoft\Windows\Recent\AutomaticDestinations\*" -Force
# CBS logs (Component Based Servicing)
Remove-Item "C:\Windows\Logs\CBS\*" -Force
# Windows Error Reporting
Remove-Item "C:\ProgramData\Microsoft\Windows\WER\*" -Force -Recurse
3. Suppression des outils
Remove-Item "C:\Temp\ChromeDecrypt*" -Force -Recurse
Solution protectif — Détection et protection contre l'effacement de logs
1. Détection de vidage des logs Windows
# detect-log-wipe.ps1
# Vérifier si les logs ont été vidés récemment
$logs = @(
"Security",
"System",
"Application",
"Microsoft-Windows-PowerShell/Operational",
"Microsoft-Windows-TerminalServices-RemoteConnectionManager/Operational"
)
foreach ($logName in $logs) {
try {
$log = Get-WinEvent -ListLog $logName -ErrorAction Stop
# Vérifier si le log est vide ou très petit
if ($log.RecordCount -eq 0 -and $log.LastWriteTime -gt (Get-Date).AddDays(-7)) {
Write-Warning "[ALERT] Log '$logName' est vide mais a été modifié récemment ($($log.LastWriteTime))"
# Vérifier dans le Security log s'il y a un événement de vidage
$clearEvents = Get-WinEvent -FilterHashtable @{
LogName = 'Security'
ID = 1102, 1100 # Audit log was cleared, Event logging service shut down
StartTime = (Get-Date).AddDays(-1)
} -ErrorAction SilentlyContinue
if ($clearEvents) {
Write-Warning "[CRITICAL] Événement de vidage de log détecté!"
$clearEvents | Format-Table TimeCreated, Id, LevelDisplayName, Message -Wrap
}
}
}
catch {
Write-Warning "[ALERT] Impossible d'accéder au log '$logName' : $_"
}
}
2. Protection contre wevtutil
# wevtutil-protection.ps1
# Restreindre l'accès à wevtutil.exe
$wevtutilPath = "C:\Windows\System32\wevtutil.exe"
$wevtutilAcl = Get-Acl $wevtutilPath
# Retirer les permissions d'exécution pour les non-administrateurs
$usersRule = $wevtutilAcl.Access | Where-Object {
$_.IdentityReference -eq "BUILTIN\Users" -and $_.FileSystemRights -match "Execute"
}
if ($usersRule) {
$wevtutilAcl.RemoveAccessRule($usersRule)
Set-Acl $wevtutilPath $wevtutilAcl
Write-Host "Permissions d'exécution wevtutil retirées pour les utilisateurs standards"
}
# Alternative : renommer wevtutil (défense en profondeur)
# Rename-Item $wevtutilPath "wevtutil.exe.disabled"
3. Forwarding des logs vers un SIEM externe
# winrm-log-forwarding.ps1
# Configurer le forwarding des logs vers un SIEM externe
# Activer Windows Event Collector
wecutil qc /q
# Configurer la subscription
$subscription = @"
<Subscription xmlns="http://schemas.microsoft.com/2006/03/windows/events/subscription">
<SubscriptionId>SIEM-Forward</SubscriptionId>
<SubscriptionType>SourceInitiated</SubscriptionType>
<Description>Forward security logs to SIEM</Description>
<Enabled>true</Enabled>
<Uri>http://schemas.microsoft.com/wbem/wsman/1/windows/EventLog</Uri>
<ConfigurationMode>MinLatency</ConfigurationMode>
<Query><![CDATA[
<QueryList>
<Query Id="0" Path="Security">
<Select Path="Security">*</Select>
</Query>
<Query Id="1" Path="System">
<Select Path="System">*[System[(Level=1 or Level=2 or Level=3)]]</Select>
</Query>
<Query Id="2" Path="Microsoft-Windows-PowerShell/Operational">
<Select Path="Microsoft-Windows-PowerShell/Operational">*</Select>
</Query>
</QueryList>
]]></Query>
<ReadExistingEvents>true</ReadExistingEvents>
<TransportName>HTTP</TransportName>
<ContentFormat>RenderedText</ContentFormat>
<Locale Language="en-US"/>
<LogFile>ForwardedEvents</LogFile>
<PublisherName>Microsoft-Windows-EventCollector</PublisherName>
<AllowedSourceNonDomainComputers></AllowedSourceNonDomainComputers>
<AllowedSourceDomainComputers></AllowedSourceDomainComputers>
</Subscription>
"@
$subscription | Out-File -FilePath "C:\temp\siem-subscription.xml" -Encoding UTF8
wecutil cs "C:\temp\siem-subscription.xml"
4. Sysmon pour la détection
<!-- sysmon-config.xml — Configuration Sysmon pour détecter l'effacement de logs -->
<Sysmon schemaversion="4.90">
<EventFiltering>
<!-- Détecter l'exécution de wevtutil -->
<RuleGroup name="Log Wipe Detection" groupRelation="or">
<ProcessCreate onmatch="include">
<Rule name="wevtutil execution">
<Image condition="end with">wevtutil.exe</Image>
</Rule>
<Rule name="powershell clear-eventlog">
<CommandLine condition="contains">Clear-EventLog</CommandLine>
</Rule>
<Rule name="powershell remove-item history">
<CommandLine condition="contains">(Get-PSReadlineOption).HistorySavePath</CommandLine>
</Rule>
</ProcessCreate>
</RuleGroup>
<!-- Détecter la suppression de fichiers de logs -->
<RuleGroup name="Log File Deletion" groupRelation="or">
<FileDelete onmatch="include">
<TargetFilename condition="contains">\Windows\System32\winevt\Logs\</TargetFilename>
<TargetFilename condition="contains">\Windows\Logs\CBS\</TargetFilename>
<TargetFilename condition="contains">\Microsoft\Windows\WER\</TargetFilename>
</FileDelete>
</RuleGroup>
</EventFiltering>
</Sysmon>
5. Tamper-proof logging (WSL / Linux subsystem)
#!/bin/bash
# tamper-proof-logger.sh — Envoyer les logs vers un syslog externe
# Configurer rsyslog pour forwarder vers un serveur externe
cat << 'EOF' > /etc/rsyslog.d/99-forward.conf
# Forward all logs to external SIEM
*.* @siem.example.com:514
EOF
# Redémarrer rsyslog
systemctl restart rsyslog
# Vérifier que les logs sont bien forwardés
logger -t security-test "Test log forwarding"
# Vérifier sur le SIEM que le log est reçu
6. Détection de PowerShell history purge
# detect-pshistory-purge.ps1
$historyPath = (Get-PSReadlineOption).HistorySavePath
if (Test-Path $historyPath) {
$history = Get-Content $historyPath
$lineCount = $history.Count
if ($lineCount -lt 10 -and (Get-Item $historyPath).LastWriteTime -gt (Get-Date).AddHours(-1)) {
Write-Warning "[ALERT] PowerShell history vide ou très court ($lineCount lignes)"
Write-Warning " Fichier: $historyPath"
Write-Warning " Dernière modification: $((Get-Item $historyPath).LastWriteTime)"
}
}
else {
Write-Warning "[ALERT] Fichier PowerShell history inexistant: $historyPath"
}
# Vérifier les événements de suppression de fichiers récents
$recentFiles = "$env:APPDATA\Microsoft\Windows\Recent"
$recentItems = Get-ChildItem $recentFiles -ErrorAction SilentlyContinue
if ($recentItems.Count -lt 5 -and (Get-Item $recentFiles).LastWriteTime -gt (Get-Date).AddHours(-1)) {
Write-Warning "[ALERT] Fichiers récents supprimés ou très peu nombreux ($($recentItems.Count))"
}
Checklist de validation
- Logs forwardés vers un SIEM externe (tamper-proof)
-
wevtutil.exerestreint aux administrateurs uniquement - Sysmon configuré pour détecter l'effacement de logs
- PowerShell history protégé (read-only ou versionné)
- Fichiers récents monitorés
- Jump Lists monitorés
- Event ID 1102/1100 monitorés (log cleared)
- Logs Windows non stockés uniquement localement
- Backup des logs avant purge (si maintenance)
- Alertes sur volume anormal de suppression de fichiers .evtx
- Windows Event Collector actif
- Audit des accès aux répertoires sensibles (Panther, Temp, etc.)
Anti-pattern associé
KNOW-ANT-016— Storing logs only locally without SIEM forwarding
Références
- Archive Ygg : Phase 15 — Effacement des traces (YGGLeak)
- Sysmon : https://docs.microsoft.com/sysinternals/downloads/sysmon
- Windows Event Collector : https://docs.microsoft.com/windows/security/threat-protection/use-windows-event-forwarding