PowerShell Sécurité - Référence Complète
Table des matières
1. Introduction
Vérifier la version de PowerShell
$PSVersionTable.PSVersion
Politique d'exécution
La politique d'exécution détermine quels scripts peuvent être exécutés sur le système.
# Vérifier la politique actuelle
Get-ExecutionPolicy
Get-ExecutionPolicy -List
# Définir la politique (nécessite droits administrateur)
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
# Exécuter un script en contournant temporairement la politique
powershell -ExecutionPolicy Bypass -File script.ps1
Obtenir de l'aide
# Aide sur une commande
Get-Help Get-Process -Full
# Mettre à jour l'aide
Update-Help -Force
# Rechercher des commandes
Get-Command *EventLog*
Get-Command -Module ActiveDirectory
Exécuter en tant qu'administrateur
# Vérifier si on est administrateur
([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
# Relancer en tant qu'administrateur
Start-Process powershell -Verb RunAs
2. Gestion des logs et événements
Get-EventLog (journaux classiques)
# Lister les journaux disponibles
Get-EventLog -List
# Derniers événements du journal Sécurité
Get-EventLog -LogName Security -Newest 50
# Filtrer par EventID
Get-EventLog -LogName Security -InstanceId 4625 -Newest 100
# Filtrer par date
Get-EventLog -LogName System -After (Get-Date).AddDays(-7)
# Filtrer par source
Get-EventLog -LogName Application -Source "MSSQLSERVER" -Newest 20
Get-WinEvent (journaux modernes - recommandé)
# Derniers événements de sécurité
Get-WinEvent -LogName Security -MaxEvents 50
# Filtrer avec FilterHashtable (plus performant)
Get-WinEvent -FilterHashtable @{
LogName = 'Security'
Id = 4625
StartTime = (Get-Date).AddDays(-1)
} | Select-Object TimeCreated, Message
# Filtrer par niveau (1=Critical, 2=Error, 3=Warning, 4=Information)
Get-WinEvent -FilterHashtable @{
LogName = 'System'
Level = 1,2
StartTime = (Get-Date).AddHours(-24)
}
# Recherche par mot-clé avec FilterXPath
Get-WinEvent -LogName Security -FilterXPath "*[EventData[Data[@Name='TargetUserName']='administrateur']]" -MaxEvents 20
Event IDs critiques pour la sécurité
4624 - Connexion réussie
# Toutes les connexions réussies des dernières 24h
Get-WinEvent -FilterHashtable @{
LogName = 'Security'
Id = 4624
StartTime = (Get-Date).AddHours(-24)
} | ForEach-Object {
$xml = [xml]$_.ToXml()
[PSCustomObject]@{
Time = $_.TimeCreated
User = $xml.Event.EventData.Data | Where-Object {$_.Name -eq 'TargetUserName'} | Select-Object -ExpandProperty '#text'
LogonType = $xml.Event.EventData.Data | Where-Object {$_.Name -eq 'LogonType'} | Select-Object -ExpandProperty '#text'
Source = $xml.Event.EventData.Data | Where-Object {$_.Name -eq 'IpAddress'} | Select-Object -ExpandProperty '#text'
}
} | Format-Table -AutoSize
4625 - Échec de connexion
# Échecs de connexion (tentatives de brute force)
Get-WinEvent -FilterHashtable @{
LogName = 'Security'
Id = 4625
StartTime = (Get-Date).AddHours(-24)
} | ForEach-Object {
$xml = [xml]$_.ToXml()
[PSCustomObject]@{
Time = $_.TimeCreated
User = $xml.Event.EventData.Data | Where-Object {$_.Name -eq 'TargetUserName'} | Select-Object -ExpandProperty '#text'
Source = $xml.Event.EventData.Data | Where-Object {$_.Name -eq 'IpAddress'} | Select-Object -ExpandProperty '#text'
Reason = $xml.Event.EventData.Data | Where-Object {$_.Name -eq 'FailureReason'} | Select-Object -ExpandProperty '#text'
}
} | Group-Object User | Sort-Object Count -Descending | Format-Table Count, Name
4648 - Connexion avec identifiants explicites
Get-WinEvent -FilterHashtable @{
LogName = 'Security'
Id = 4648
StartTime = (Get-Date).AddDays(-7)
} | Select-Object TimeCreated, Message | Format-List
4672 - Privilèges spéciaux attribués
Get-WinEvent -FilterHashtable @{
LogName = 'Security'
Id = 4672
StartTime = (Get-Date).AddDays(-1)
} | Select-Object TimeCreated, @{N='User';E={
([xml]$_.ToXml()).Event.EventData.Data | Where-Object {$_.Name -eq 'SubjectUserName'} | Select-Object -ExpandProperty '#text'
}} | Format-Table -AutoSize
4720 - Création de compte utilisateur
Get-WinEvent -FilterHashtable @{
LogName = 'Security'
Id = 4720
StartTime = (Get-Date).AddDays(-30)
} | Select-Object TimeCreated, Message
4732 - Membre ajouté à un groupe local
Get-WinEvent -FilterHashtable @{
LogName = 'Security'
Id = 4732
StartTime = (Get-Date).AddDays(-30)
} | Select-Object TimeCreated, Message
1102 - Journal d'audit effacé
# CRITIQUE : quelqu'un a effacé les logs
Get-WinEvent -FilterHashtable @{
LogName = 'Security'
Id = 1102
} | Select-Object TimeCreated, Message
4688 - Création de processus
Get-WinEvent -FilterHashtable @{
LogName = 'Security'
Id = 4688
StartTime = (Get-Date).AddHours(-1)
} | ForEach-Object {
$xml = [xml]$_.ToXml()
[PSCustomObject]@{
Time = $_.TimeCreated
Process = $xml.Event.EventData.Data | Where-Object {$_.Name -eq 'NewProcessName'} | Select-Object -ExpandProperty '#text'
CommandLine = $xml.Event.EventData.Data | Where-Object {$_.Name -eq 'CommandLine'} | Select-Object -ExpandProperty '#text'
User = $xml.Event.EventData.Data | Where-Object {$_.Name -eq 'SubjectUserName'} | Select-Object -ExpandProperty '#text'
}
} | Format-Table -AutoSize -Wrap
7045 - Service installé
Get-WinEvent -FilterHashtable @{
LogName = 'System'
Id = 7045
} | Select-Object TimeCreated, @{N='ServiceName';E={
([xml]$_.ToXml()).Event.EventData.Data | Where-Object {$_.Name -eq 'ServiceName'} | Select-Object -ExpandProperty '#text'
}}, @{N='ImagePath';E={
([xml]$_.ToXml()).Event.EventData.Data | Where-Object {$_.Name -eq 'ImagePath'} | Select-Object -ExpandProperty '#text'
}} | Format-Table -AutoSize -Wrap
3. Analyse des processus et services
Lister les processus
# Tous les processus avec détails
Get-Process | Sort-Object CPU -Descending | Select-Object -First 20 Id, ProcessName, CPU, WorkingSet, Path
# Processus avec ligne de commande complète
Get-CimInstance Win32_Process | Select-Object ProcessId, Name, CommandLine, ParentProcessId | Format-Table -AutoSize -Wrap
# Processus par nom
Get-Process -Name "powershell" | Select-Object Id, ProcessName, StartTime, Path
Détection de processus suspects
# Processus lancés depuis des répertoires temporaires
Get-CimInstance Win32_Process | Where-Object {
$_.ExecutablePath -match '(\\Temp\\|\\tmp\\|\\AppData\\Local\\Temp\\)'
} | Select-Object ProcessId, Name, ExecutablePath, CommandLine
# Processus lancés depuis des emplacements inhabituels
Get-CimInstance Win32_Process | Where-Object {
$_.ExecutablePath -and
$_.ExecutablePath -notmatch '(C:\\Windows|C:\\Program Files|C:\\Program Files \(x86\))'
} | Select-Object ProcessId, Name, ExecutablePath
# Processus PowerShell encodés (souvent utilisé par les malwares)
Get-CimInstance Win32_Process | Where-Object {
$_.CommandLine -match '(-enc|-EncodedCommand|-e )'
} | Select-Object ProcessId, Name, CommandLine
# Processus sans fichier exécutable sur le disque
Get-Process | Where-Object {
$_.Path -and !(Test-Path $_.Path)
} | Select-Object Id, ProcessName, Path
Analyse des services
# Tous les services en cours d'exécution
Get-Service | Where-Object {$_.Status -eq 'Running'} | Sort-Object DisplayName
# Services en démarrage automatique
Get-CimInstance Win32_Service | Where-Object {$_.StartMode -eq 'Auto'} |
Select-Object Name, DisplayName, State, PathName | Format-Table -AutoSize -Wrap
# Services avec des chemins non standard
Get-CimInstance Win32_Service | Where-Object {
$_.PathName -and
$_.PathName -notmatch '(C:\\Windows|C:\\Program Files)'
} | Select-Object Name, State, StartMode, PathName | Format-Table -AutoSize -Wrap
# Services non signés
Get-CimInstance Win32_Service | Where-Object {$_.PathName} | ForEach-Object {
$path = $_.PathName -replace '"', '' -replace ' /.*$| -.*$', ''
if (Test-Path $path) {
$sig = Get-AuthenticodeSignature $path
if ($sig.Status -ne 'Valid') {
[PSCustomObject]@{
Name = $_.Name
Path = $path
SignatureStatus = $sig.Status
}
}
}
} | Format-Table -AutoSize
Arbre de processus parent-enfant
# Voir les processus enfants d'un processus spécifique
$parentPid = (Get-Process -Name "explorer").Id
Get-CimInstance Win32_Process | Where-Object {$_.ParentProcessId -eq $parentPid} |
Select-Object ProcessId, Name, CommandLine
4. Analyse réseau
Connexions TCP actives
# Toutes les connexions TCP établies
Get-NetTCPConnection -State Established |
Select-Object LocalAddress, LocalPort, RemoteAddress, RemotePort, OwningProcess,
@{N='Process';E={(Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue).ProcessName}} |
Sort-Object RemoteAddress | Format-Table -AutoSize
# Connexions sur des ports distants inhabituels
Get-NetTCPConnection -State Established | Where-Object {
$_.RemotePort -notin @(80, 443, 53, 22, 25, 587, 993, 995, 3389) -and
$_.RemoteAddress -notmatch '(127\.0\.0\.1|::1|0\.0\.0\.0)'
} | Select-Object LocalPort, RemoteAddress, RemotePort,
@{N='Process';E={(Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue).ProcessName}} |
Format-Table -AutoSize
Connexions en écoute
# Ports en écoute
Get-NetTCPConnection -State Listen |
Select-Object LocalAddress, LocalPort,
@{N='Process';E={(Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue).ProcessName}} |
Sort-Object LocalPort | Format-Table -AutoSize
Points d'écoute UDP
Get-NetUDPEndpoint |
Select-Object LocalAddress, LocalPort,
@{N='Process';E={(Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue).ProcessName}} |
Sort-Object LocalPort | Format-Table -AutoSize
Test de connectivité
# Tester la connexion à un hôte et un port
Test-NetConnection -ComputerName 192.168.1.1 -Port 443
# Tester avec traceroute
Test-NetConnection -ComputerName 8.8.8.8 -TraceRoute
# Résolution DNS
Resolve-DnsName exemple.com
Resolve-DnsName exemple.com -Type MX
Resolve-DnsName exemple.com -Type TXT
Resolve-DnsName exemple.com -Server 8.8.8.8
Cache DNS local
# Afficher le cache DNS
Get-DnsClientCache | Select-Object Entry, RecordName, Data |
Sort-Object Entry | Format-Table -AutoSize
# Vider le cache DNS
Clear-DnsClientCache
Équivalents netstat
# Toutes les connexions avec PID
Get-NetTCPConnection | Select-Object State, LocalAddress, LocalPort, RemoteAddress, RemotePort, OwningProcess |
Format-Table -AutoSize
# Résumé par état
Get-NetTCPConnection | Group-Object State | Select-Object Count, Name | Sort-Object Count -Descending
Détection de connexions suspectes
# Connexions vers des adresses IP publiques non habituelles
Get-NetTCPConnection -State Established | Where-Object {
$_.RemoteAddress -notmatch '(^10\.|^172\.(1[6-9]|2[0-9]|3[01])\.|^192\.168\.|^127\.|^::1|^0\.)'
} | Select-Object RemoteAddress, RemotePort,
@{N='Process';E={(Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue).ProcessName}},
@{N='DNS';E={
try { [System.Net.Dns]::GetHostEntry($_.RemoteAddress).HostName } catch { 'N/A' }
}} | Format-Table -AutoSize -Wrap
5. Analyse du système de fichiers
Rechercher des fichiers récents
# Fichiers modifiés dans les dernières 24 heures
Get-ChildItem -Path C:\ -Recurse -ErrorAction SilentlyContinue |
Where-Object {$_.LastWriteTime -gt (Get-Date).AddHours(-24)} |
Select-Object FullName, LastWriteTime, Length |
Sort-Object LastWriteTime -Descending | Select-Object -First 50
# Exécutables récents dans les dossiers utilisateurs
Get-ChildItem -Path C:\Users -Include *.exe,*.dll,*.ps1,*.bat,*.vbs,*.cmd -Recurse -ErrorAction SilentlyContinue |
Where-Object {$_.CreationTime -gt (Get-Date).AddDays(-7)} |
Select-Object FullName, CreationTime, Length
Fichiers cachés et système
# Fichiers cachés
Get-ChildItem -Path C:\Users -Hidden -Recurse -ErrorAction SilentlyContinue |
Where-Object {!$_.PSIsContainer} |
Select-Object FullName, Attributes, LastWriteTime | Select-Object -First 50
# Fichiers système dans des emplacements inhabituels
Get-ChildItem -Path C:\Users -System -Recurse -ErrorAction SilentlyContinue |
Select-Object FullName, Attributes, LastWriteTime
Alternate Data Streams (ADS)
# Détecter les flux alternatifs (technique de dissimulation)
Get-ChildItem -Path C:\Users -Recurse -ErrorAction SilentlyContinue |
ForEach-Object { Get-Item $_.FullName -Stream * -ErrorAction SilentlyContinue } |
Where-Object {$_.Stream -ne ':$DATA'} |
Select-Object FileName, Stream, Length
# Lire le contenu d'un ADS
Get-Content -Path "C:\fichier.txt" -Stream "hidden_stream"
Hachage de fichiers
# Hash SHA256
Get-FileHash -Path C:\suspect.exe -Algorithm SHA256
# Hash MD5
Get-FileHash -Path C:\suspect.exe -Algorithm MD5
# Hasher tous les exécutables d'un dossier
Get-ChildItem -Path C:\Temp -Include *.exe,*.dll -Recurse -ErrorAction SilentlyContinue |
ForEach-Object {
[PSCustomObject]@{
File = $_.FullName
SHA256 = (Get-FileHash $_.FullName -Algorithm SHA256).Hash
Size = $_.Length
}
} | Format-Table -AutoSize -Wrap
Permissions et signatures
# Vérifier les ACL d'un fichier ou dossier
Get-Acl C:\Windows\System32\config | Format-List
# Vérifier la signature numérique d'un exécutable
Get-AuthenticodeSignature C:\Windows\System32\cmd.exe
# Trouver les exécutables non signés dans un dossier
Get-ChildItem -Path C:\Program Files -Include *.exe,*.dll -Recurse -ErrorAction SilentlyContinue |
Where-Object {
(Get-AuthenticodeSignature $_.FullName).Status -ne 'Valid'
} | Select-Object FullName, @{N='SigStatus';E={(Get-AuthenticodeSignature $_.FullName).Status}}
6. Active Directory
Nécessite le module RSAT Active Directory. Installation :
# Windows 10/11
Add-WindowsCapability -Online -Name Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0
# Windows Server
Install-WindowsFeature RSAT-AD-PowerShell
# Vérifier le module
Get-Module -ListAvailable ActiveDirectory
Import-Module ActiveDirectory
Recherche d'utilisateurs
# Tous les utilisateurs activés
Get-ADUser -Filter {Enabled -eq $true} -Properties LastLogonDate, PasswordLastSet |
Select-Object Name, SamAccountName, LastLogonDate, PasswordLastSet |
Sort-Object LastLogonDate | Format-Table -AutoSize
# Comptes désactivés
Get-ADUser -Filter {Enabled -eq $false} |
Select-Object Name, SamAccountName, DistinguishedName
# Comptes qui ne se sont jamais connectés
Get-ADUser -Filter {LastLogonDate -notlike "*"} -Properties LastLogonDate |
Select-Object Name, SamAccountName, Created
# Mots de passe expirés
Get-ADUser -Filter {Enabled -eq $true -and PasswordExpired -eq $true} -Properties PasswordExpired |
Select-Object Name, SamAccountName
# Mots de passe n'expirant jamais
Get-ADUser -Filter {PasswordNeverExpires -eq $true -and Enabled -eq $true} -Properties PasswordNeverExpires |
Select-Object Name, SamAccountName
Groupes privilégiés
# Membres du groupe Domain Admins
Get-ADGroupMember -Identity "Domain Admins" -Recursive |
Select-Object Name, SamAccountName, ObjectClass
# Membres du groupe Enterprise Admins
Get-ADGroupMember -Identity "Enterprise Admins" -Recursive |
Select-Object Name, SamAccountName
# Membres du groupe Schema Admins
Get-ADGroupMember -Identity "Schema Admins" -Recursive |
Select-Object Name, SamAccountName
# Tous les groupes privilégiés et leurs membres
@("Domain Admins", "Enterprise Admins", "Schema Admins", "Administrators", "Account Operators", "Backup Operators") | ForEach-Object {
$group = $_
Get-ADGroupMember -Identity $group -Recursive -ErrorAction SilentlyContinue | ForEach-Object {
[PSCustomObject]@{
Group = $group
Member = $_.Name
Type = $_.ObjectClass
}
}
} | Format-Table -AutoSize
Ordinateurs du domaine
# Tous les ordinateurs
Get-ADComputer -Filter * -Properties OperatingSystem, LastLogonDate |
Select-Object Name, OperatingSystem, LastLogonDate |
Sort-Object LastLogonDate -Descending | Format-Table -AutoSize
# Ordinateurs inactifs (plus de 90 jours)
$threshold = (Get-Date).AddDays(-90)
Get-ADComputer -Filter {LastLogonDate -lt $threshold} -Properties LastLogonDate |
Select-Object Name, LastLogonDate
Changements récents
# Utilisateurs créés récemment
Get-ADUser -Filter {Created -gt $((Get-Date).AddDays(-30))} -Properties Created |
Select-Object Name, SamAccountName, Created | Sort-Object Created -Descending
# Métadonnées de réplication d'un objet
Get-ADReplicationMetadata -Object "CN=Administrateur,CN=Users,DC=domaine,DC=local" -Server DC01 |
Select-Object AttributeName, LastOriginatingChangeTime | Sort-Object LastOriginatingChangeTime -Descending
7. Investigation malware
Tâches planifiées
# Toutes les tâches planifiées
Get-ScheduledTask | Where-Object {$_.State -ne 'Disabled'} |
Select-Object TaskName, TaskPath, State |
Format-Table -AutoSize
# Détails des actions des tâches (chercher des commandes suspectes)
Get-ScheduledTask | Where-Object {$_.State -ne 'Disabled'} | ForEach-Object {
$task = $_
$task.Actions | ForEach-Object {
[PSCustomObject]@{
TaskName = $task.TaskName
Execute = $_.Execute
Arguments = $_.Arguments
}
}
} | Format-Table -AutoSize -Wrap
# Tâches créées récemment
Get-ScheduledTask | Get-ScheduledTaskInfo -ErrorAction SilentlyContinue |
Where-Object {$_.NextRunTime -or $_.LastRunTime -gt (Get-Date).AddDays(-7)} |
Select-Object TaskName, LastRunTime, NextRunTime
Éléments de démarrage
# Programmes au démarrage (WMI)
Get-CimInstance Win32_StartupCommand |
Select-Object Name, Command, Location, User |
Format-Table -AutoSize -Wrap
Clés de registre Run
# HKLM Run
Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" -ErrorAction SilentlyContinue
# HKLM RunOnce
Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce" -ErrorAction SilentlyContinue
# HKCU Run
Get-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" -ErrorAction SilentlyContinue
# HKCU RunOnce
Get-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce" -ErrorAction SilentlyContinue
# Run 32 bits sur système 64 bits
Get-ItemProperty -Path "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Run" -ErrorAction SilentlyContinue
# Toutes les clés Run en une commande
$runKeys = @(
"HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run",
"HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce",
"HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run",
"HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce",
"HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Run"
)
foreach ($key in $runKeys) {
Write-Output "--- $key ---"
Get-ItemProperty -Path $key -ErrorAction SilentlyContinue |
Select-Object * -ExcludeProperty PS* | Format-List
}
Abonnements WMI (persistence avancée)
# Vérifier les Event Filters WMI
Get-CimInstance -Namespace root\subscription -ClassName __EventFilter |
Select-Object Name, Query | Format-List
# Vérifier les Event Consumers
Get-CimInstance -Namespace root\subscription -ClassName CommandLineEventConsumer |
Select-Object Name, CommandLineTemplate | Format-List
Get-CimInstance -Namespace root\subscription -ClassName ActiveScriptEventConsumer |
Select-Object Name, ScriptText | Format-List
# Vérifier les liaisons Filter-Consumer
Get-CimInstance -Namespace root\subscription -ClassName __FilterToConsumerBinding |
Select-Object Filter, Consumer | Format-List
Vérification des services (binPath)
# Services avec des chemins suspects
Get-CimInstance Win32_Service | Where-Object {
$_.PathName -match '(cmd\.exe|powershell|\\Temp\\|\\AppData\\|\.bat|\.vbs|\.js)'
} | Select-Object Name, DisplayName, State, PathName | Format-Table -AutoSize -Wrap
# Services dont le chemin contient des espaces non quotés (vulnérabilité unquoted service path)
Get-CimInstance Win32_Service | Where-Object {
$_.PathName -and
$_.PathName -notmatch '^"' -and
$_.PathName -match '.* .*\.exe'
} | Select-Object Name, PathName | Format-Table -AutoSize -Wrap
Indicateurs de DLL Hijacking
# DLL récentes dans les dossiers système
Get-ChildItem -Path C:\Windows\System32 -Filter *.dll -ErrorAction SilentlyContinue |
Where-Object {$_.CreationTime -gt (Get-Date).AddDays(-7)} |
Select-Object FullName, CreationTime, @{N='Signed';E={
(Get-AuthenticodeSignature $_.FullName).Status
}}
# DLL dans les répertoires PATH des utilisateurs
$env:PATH -split ';' | Where-Object {$_ -match 'Users'} | ForEach-Object {
Get-ChildItem -Path $_ -Filter *.dll -ErrorAction SilentlyContinue
} | Select-Object FullName, CreationTime, Length
8. Hardening et audit
Partages réseau
# Lister tous les partages
Get-SmbShare | Select-Object Name, Path, Description | Format-Table -AutoSize
# Permissions des partages
Get-SmbShare | ForEach-Object {
$share = $_.Name
Get-SmbShareAccess -Name $share | ForEach-Object {
[PSCustomObject]@{
Share = $share
Account = $_.AccountName
AccessRight = $_.AccessRight
AccessControlType = $_.AccessControlType
}
}
} | Format-Table -AutoSize
# Sessions SMB actives
Get-SmbSession | Select-Object ClientComputerName, ClientUserName, NumOpens | Format-Table -AutoSize
Stratégies de groupe (GPO)
# Lister toutes les GPO du domaine
Get-GPO -All | Select-Object DisplayName, GpoStatus, CreationTime, ModificationTime |
Sort-Object ModificationTime -Descending | Format-Table -AutoSize
# Rapport d'une GPO spécifique en HTML
Get-GPOReport -Name "Default Domain Policy" -ReportType Html -Path C:\Temp\gpo_report.html
# Résultat des stratégies appliquées (RSoP)
Get-GPResultantSetOfPolicy -ReportType Html -Path C:\Temp\rsop.html
Windows Defender
# Statut de Windows Defender
Get-MpComputerStatus | Select-Object AntivirusEnabled, RealTimeProtectionEnabled,
AntivirusSignatureLastUpdated, FullScanEndTime, QuickScanEndTime
# Menaces détectées
Get-MpThreatDetection | Select-Object ThreatID, @{N='Threat';E={
(Get-MpThreat -ThreatID $_.ThreatID).ThreatName
}}, InitialDetectionTime, ProcessName, Resources | Format-Table -AutoSize -Wrap
# Historique des menaces
Get-MpThreat | Select-Object ThreatName, SeverityID, IsActive, DidThreatExecute |
Format-Table -AutoSize
# Exclusions configurées (vérifier qu'elles sont légitimes)
Get-MpPreference | Select-Object -ExpandProperty ExclusionPath
Get-MpPreference | Select-Object -ExpandProperty ExclusionProcess
Get-MpPreference | Select-Object -ExpandProperty ExclusionExtension
# Lancer un scan rapide
Start-MpScan -ScanType QuickScan
# Mettre à jour les signatures
Update-MpSignature
BitLocker
# Statut BitLocker de tous les volumes
Get-BitLockerVolume | Select-Object MountPoint, VolumeStatus, ProtectionStatus,
EncryptionMethod, EncryptionPercentage | Format-Table -AutoSize
# Détails d'un volume spécifique
Get-BitLockerVolume -MountPoint "C:" | Select-Object *
Pare-feu Windows
# Profils du pare-feu
Get-NetFirewallProfile | Select-Object Name, Enabled, DefaultInboundAction, DefaultOutboundAction
# Règles actives en entrée
Get-NetFirewallRule -Direction Inbound -Enabled True |
Select-Object DisplayName, Action, Protocol,
@{N='LocalPort';E={($_ | Get-NetFirewallPortFilter).LocalPort}} |
Sort-Object DisplayName | Format-Table -AutoSize
# Règles autorisant tout le trafic entrant (potentiellement dangereux)
Get-NetFirewallRule -Direction Inbound -Enabled True -Action Allow |
Where-Object {($_ | Get-NetFirewallPortFilter).LocalPort -eq 'Any'} |
Select-Object DisplayName, Profile | Format-Table -AutoSize
# Règles ajoutées récemment
Get-NetFirewallRule | Where-Object {
$_.CreationClassName -and $_.Status -eq 'The rule was parsed successfully from the store.'
} | Select-Object DisplayName, Direction, Action, Enabled | Format-Table -AutoSize
9. Scripts utiles complets
Script de vérification rapide de la sécurité
# === QUICK SECURITY HEALTH CHECK ===
Write-Host "=== SECURITY HEALTH CHECK ===" -ForegroundColor Cyan
Write-Host "Date : $(Get-Date)" -ForegroundColor Cyan
Write-Host "Machine : $env:COMPUTERNAME" -ForegroundColor Cyan
Write-Host ""
# 1. Vérifier Windows Defender
Write-Host "[+] Windows Defender" -ForegroundColor Yellow
$defender = Get-MpComputerStatus -ErrorAction SilentlyContinue
if ($defender) {
Write-Host " Antivirus actif : $($defender.AntivirusEnabled)"
Write-Host " Protection temps réel: $($defender.RealTimeProtectionEnabled)"
Write-Host " Signatures à jour : $($defender.AntivirusSignatureLastUpdated)"
} else {
Write-Host " Windows Defender non disponible" -ForegroundColor Red
}
Write-Host ""
# 2. Vérifier le pare-feu
Write-Host "[+] Pare-feu Windows" -ForegroundColor Yellow
Get-NetFirewallProfile | ForEach-Object {
Write-Host " $($_.Name) : Enabled=$($_.Enabled) InBound=$($_.DefaultInboundAction)"
}
Write-Host ""
# 3. Vérifier BitLocker
Write-Host "[+] BitLocker" -ForegroundColor Yellow
Get-BitLockerVolume -ErrorAction SilentlyContinue | ForEach-Object {
Write-Host " $($_.MountPoint) : $($_.ProtectionStatus) ($($_.VolumeStatus))"
}
Write-Host ""
# 4. Échecs de connexion récents
Write-Host "[+] Échecs de connexion (24h)" -ForegroundColor Yellow
$fails = Get-WinEvent -FilterHashtable @{LogName='Security';Id=4625;StartTime=(Get-Date).AddHours(-24)} -ErrorAction SilentlyContinue
Write-Host " Nombre d'échecs : $($fails.Count)"
Write-Host ""
# 5. Comptes administrateurs locaux
Write-Host "[+] Administrateurs locaux" -ForegroundColor Yellow
Get-LocalGroupMember -Group "Administrateurs" -ErrorAction SilentlyContinue | ForEach-Object {
Write-Host " $($_.Name) ($($_.ObjectClass))"
}
Write-Host ""
# 6. Ports en écoute
Write-Host "[+] Ports en écoute" -ForegroundColor Yellow
Get-NetTCPConnection -State Listen | Select-Object LocalPort,
@{N='Process';E={(Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue).ProcessName}} |
Sort-Object LocalPort -Unique | ForEach-Object {
Write-Host " Port $($_.LocalPort) - $($_.Process)"
}
Write-Host ""
# 7. Services suspects
Write-Host "[+] Services non signés en exécution" -ForegroundColor Yellow
Get-CimInstance Win32_Service | Where-Object {$_.State -eq 'Running' -and $_.PathName} | ForEach-Object {
$path = $_.PathName -replace '"', '' -replace ' /.*$| -.*$', '' -replace ' $', ''
if ((Test-Path $path) -and (Get-AuthenticodeSignature $path -ErrorAction SilentlyContinue).Status -ne 'Valid') {
Write-Host " $($_.Name) : $path" -ForegroundColor Red
}
} 2>$null
Write-Host ""
# 8. Logs effaces
Write-Host "[+] Vérification effacement de logs" -ForegroundColor Yellow
$cleared = Get-WinEvent -FilterHashtable @{LogName='Security';Id=1102} -ErrorAction SilentlyContinue
if ($cleared) {
Write-Host " ALERTE : Logs effaces $($cleared.Count) fois !" -ForegroundColor Red
$cleared | Select-Object TimeCreated | ForEach-Object { Write-Host " $($_.TimeCreated)" }
} else {
Write-Host " Aucun effacement détecté" -ForegroundColor Green
}
Write-Host ""
Write-Host "=== FIN DU CHECK ===" -ForegroundColor Cyan
Script de collecte de données pour réponse à incident
# === INCIDENT RESPONSE DATA COLLECTION ===
$outputDir = "C:\IR_$(Get-Date -Format 'yyyyMMdd_HHmmss')"
New-Item -ItemType Directory -Path $outputDir -Force | Out-Null
Write-Host "Collecte IR dans : $outputDir" -ForegroundColor Cyan
# Informations système
Write-Host "[1/10] Informations système..." -ForegroundColor Yellow
Get-ComputerInfo | Out-File "$outputDir\system_info.txt"
# Processus en cours
Write-Host "[2/10] Processus..." -ForegroundColor Yellow
Get-CimInstance Win32_Process |
Select-Object ProcessId, Name, ParentProcessId, ExecutablePath, CommandLine, CreationDate |
Export-Csv "$outputDir\processes.csv" -NoTypeInformation
# Connexions réseau
Write-Host "[3/10] Connexions réseau..." -ForegroundColor Yellow
Get-NetTCPConnection |
Select-Object State, LocalAddress, LocalPort, RemoteAddress, RemotePort, OwningProcess,
@{N='Process';E={(Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue).ProcessName}} |
Export-Csv "$outputDir\network_connections.csv" -NoTypeInformation
# Services
Write-Host "[4/10] Services..." -ForegroundColor Yellow
Get-CimInstance Win32_Service |
Select-Object Name, DisplayName, State, StartMode, PathName |
Export-Csv "$outputDir\services.csv" -NoTypeInformation
# Tâches planifiées
Write-Host "[5/10] Tâches planifiées..." -ForegroundColor Yellow
Get-ScheduledTask | ForEach-Object {
$task = $_
[PSCustomObject]@{
Name = $task.TaskName
Path = $task.TaskPath
State = $task.State
Actions = ($task.Actions | ForEach-Object { "$($_.Execute) $($_.Arguments)" }) -join '; '
}
} | Export-Csv "$outputDir\scheduled_tasks.csv" -NoTypeInformation
# Clés de registre Run
Write-Host "[6/10] Clés de registre Run..." -ForegroundColor Yellow
$runKeys = @(
"HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run",
"HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce",
"HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run",
"HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce"
)
$runEntries = foreach ($key in $runKeys) {
$props = Get-ItemProperty -Path $key -ErrorAction SilentlyContinue
if ($props) {
$props.PSObject.Properties | Where-Object {$_.Name -notmatch '^PS'} | ForEach-Object {
[PSCustomObject]@{Key=$key; Name=$_.Name; Value=$_.Value}
}
}
}
$runEntries | Export-Csv "$outputDir\run_keys.csv" -NoTypeInformation
# Événements de sécurité critiques (24h)
Write-Host "[7/10] Événements de sécurité (24h)..." -ForegroundColor Yellow
$criticalIds = @(4624, 4625, 4648, 4672, 4720, 4732, 1102, 4688, 7045)
foreach ($id in $criticalIds) {
Get-WinEvent -FilterHashtable @{LogName='Security';Id=$id;StartTime=(Get-Date).AddHours(-24)} -ErrorAction SilentlyContinue |
Select-Object TimeCreated, Id, Message |
Out-File "$outputDir\events_$id.txt" -Append
}
# Utilisateurs locaux
Write-Host "[8/10] Utilisateurs locaux..." -ForegroundColor Yellow
Get-LocalUser | Select-Object Name, Enabled, LastLogon, PasswordLastSet, PasswordRequired |
Export-Csv "$outputDir\local_users.csv" -NoTypeInformation
# Abonnements WMI
Write-Host "[9/10] Abonnements WMI..." -ForegroundColor Yellow
Get-CimInstance -Namespace root\subscription -ClassName __EventFilter -ErrorAction SilentlyContinue |
Select-Object Name, Query | Out-File "$outputDir\wmi_filters.txt"
Get-CimInstance -Namespace root\subscription -ClassName CommandLineEventConsumer -ErrorAction SilentlyContinue |
Select-Object Name, CommandLineTemplate | Out-File "$outputDir\wmi_consumers.txt"
# Cache DNS
Write-Host "[10/10] Cache DNS..." -ForegroundColor Yellow
Get-DnsClientCache | Export-Csv "$outputDir\dns_cache.csv" -NoTypeInformation
Write-Host ""
Write-Host "Collecte terminée. Données dans : $outputDir" -ForegroundColor Green
Write-Host "Fichiers créés :" -ForegroundColor Green
Get-ChildItem $outputDir | ForEach-Object { Write-Host " $($_.Name) ($([math]::Round($_.Length/1KB, 1)) KB)" }
Script d'audit d'activité utilisateur
# === USER ACTIVITY AUDIT ===
param(
[string]$Username = $env:USERNAME,
[int]$DaysBack = 7
)
$startDate = (Get-Date).AddDays(-$DaysBack)
Write-Host "=== AUDIT ACTIVITE UTILISATEUR ===" -ForegroundColor Cyan
Write-Host "Utilisateur : $Username" -ForegroundColor Cyan
Write-Host "Période : $DaysBack derniers jours" -ForegroundColor Cyan
Write-Host ""
# 1. Connexions réussies
Write-Host "[+] Connexions réussies" -ForegroundColor Yellow
Get-WinEvent -FilterHashtable @{
LogName = 'Security'
Id = 4624
StartTime = $startDate
} -ErrorAction SilentlyContinue | ForEach-Object {
$xml = [xml]$_.ToXml()
$user = $xml.Event.EventData.Data | Where-Object {$_.Name -eq 'TargetUserName'} | Select-Object -ExpandProperty '#text'
if ($user -eq $Username) {
[PSCustomObject]@{
Time = $_.TimeCreated
LogonType = $xml.Event.EventData.Data | Where-Object {$_.Name -eq 'LogonType'} | Select-Object -ExpandProperty '#text'
Source = $xml.Event.EventData.Data | Where-Object {$_.Name -eq 'IpAddress'} | Select-Object -ExpandProperty '#text'
}
}
} | Format-Table -AutoSize
Write-Host ""
# 2. Échecs de connexion
Write-Host "[+] Échecs de connexion" -ForegroundColor Yellow
$failures = Get-WinEvent -FilterHashtable @{
LogName = 'Security'
Id = 4625
StartTime = $startDate
} -ErrorAction SilentlyContinue | ForEach-Object {
$xml = [xml]$_.ToXml()
$user = $xml.Event.EventData.Data | Where-Object {$_.Name -eq 'TargetUserName'} | Select-Object -ExpandProperty '#text'
if ($user -eq $Username) { $_ }
}
Write-Host " Nombre d'échecs : $($failures.Count)"
Write-Host ""
# 3. Processus lancés par l'utilisateur
Write-Host "[+] Processus actifs" -ForegroundColor Yellow
Get-CimInstance Win32_Process | Where-Object {
$owner = Invoke-CimMethod -InputObject $_ -MethodName GetOwner -ErrorAction SilentlyContinue
$owner.User -eq $Username
} | Select-Object ProcessId, Name, CreationDate, CommandLine |
Format-Table -AutoSize -Wrap
Write-Host ""
# 4. Fichiers récemment modifiés par l'utilisateur
Write-Host "[+] Fichiers récemment modifiés (profil utilisateur)" -ForegroundColor Yellow
$userProfile = "C:\Users\$Username"
if (Test-Path $userProfile) {
Get-ChildItem -Path $userProfile -Recurse -ErrorAction SilentlyContinue |
Where-Object {!$_.PSIsContainer -and $_.LastWriteTime -gt $startDate} |
Sort-Object LastWriteTime -Descending |
Select-Object FullName, LastWriteTime, Length -First 30 |
Format-Table -AutoSize
}
Write-Host ""
# 5. Historique PowerShell
Write-Host "[+] Historique PowerShell" -ForegroundColor Yellow
$historyPath = "C:\Users\$Username\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt"
if (Test-Path $historyPath) {
Write-Host " Dernières commandes :"
Get-Content $historyPath -Tail 30 | ForEach-Object { Write-Host " $_" }
} else {
Write-Host " Fichier historique non trouvé"
}
Write-Host ""
# 6. Connexions réseau de l'utilisateur
Write-Host "[+] Connexions réseau actives (processus utilisateur)" -ForegroundColor Yellow
$userProcesses = Get-CimInstance Win32_Process | Where-Object {
$owner = Invoke-CimMethod -InputObject $_ -MethodName GetOwner -ErrorAction SilentlyContinue
$owner.User -eq $Username
} | Select-Object -ExpandProperty ProcessId
Get-NetTCPConnection -State Established -ErrorAction SilentlyContinue | Where-Object {
$_.OwningProcess -in $userProcesses
} | Select-Object RemoteAddress, RemotePort,
@{N='Process';E={(Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue).ProcessName}} |
Format-Table -AutoSize
Write-Host "=== FIN DE L'AUDIT ===" -ForegroundColor Cyan