# Rapport d'incident & playbook de remédiation — WordPress multi-sites

- **Date d'intervention :** 2026-06-15
- **Serveur :** OVH mutualisé `ssh.cluster128.hosting.ovh.net` — user `iavddcx-nekena`, home `/home/iavddcx-nekena`
- **Périmètre :** ~31 installations WordPress (sites dentaires agence MaRéputationEnLigne)
- **Statut :** Désinfection réalisée et vérifiée. Mises à jour cœur/extensions = en cours.
- **Document évolutif** — voir le CHANGELOG en bas, mis à jour au fil des découvertes.

> Ce rapport sert aussi de **checklist portable** pour auditer un autre serveur :
> les sections « IOC » et « Commandes de détection » sont faites pour être rejouées telles quelles.

---

## 1. Résumé exécutif

Plusieurs sites étaient infectés par une famille de malware **« Black Hat SEO + backdoor »** déguisée
en faux plugins, **plus** un toolkit d'accès distant indépendant (webshell RCE + file manager) et un
outil tiers non autorisé. L'attaquant disposait d'un **accès admin à distance** et d'une **exécution de
code arbitraire (RCE)**. Tous les éléments malveillants ont été identifiés, mis en quarantaine, et
l'infrastructure durcie (rotation mots de passe DB, salts, suppression backdoors).

**Cause racine probable :** cœurs WordPress et extensions **très en retard** (cœurs 4.9 → 6.x) +
extensions à risque (**wp-file-manager / file-manager-advanced**, RCE connues) + **mutualisation**
(tous les sites sous un même user Unix → un site compromis peut écrire chez les voisins).

---

## 2. Vecteurs d'attaque & éléments malveillants

### 2.1 Famille « SEO-Booster » (faux plugins) — Black Hat SEO + backdoor admin + RCE + C2 blockchain
- **Emplacements :** `wp-content/plugins/hseo/` et `wp-content/plugins/wp-helper-<6hex>/`
  (variantes observées : `wp-helper-654e80`, `-1d62a0`, `-8b025c`, `-c026e3`, `-98ca22`, `-91e729`, `-9b8945`)
- **Structure :** fichier plugin principal + fichier constantes `_<8hex>.php` (ex. `_59eeb6d5.php`, `_c188c182.php`) + dossier `cache/`
- **Capacités :**
  - **Backdoor admin sans mot de passe** : URL `…/wp-login.php?al=true` → `wp_set_auth_cookie()` du 1er administrateur.
  - **RCE** via route cachée `/sh<chiffres>` (récupère et exécute du code distant).
  - **C2 sur blockchain (EtherHiding)** : adresse du serveur lue dans un smart contract BSC via `eth_call` → `bsc-testnet-rpc.publicnode.com` (contourne les blocages DNS).
  - **SEO spam** : faux sitemaps `/blog-sitemap.xml`, détournement sitemaps Yoast/AIOSEO/SEOPress, pages spam servies depuis `/panel/get-posts-from-page/`.
  - **Furtivité** : se masque de la liste des extensions (filtre `plugins_list`), noms de fonctions `_x<12hex>`.
  - Endpoint `/blog-verify?key=`.

### 2.2 Webshell chinois (eval/gzinflate)
- **Emplacement :** `wp-content/themes/<theme>/templates/themes-config.php` (vu sur le thème custom `predentis`)
- **Signature :** `eval(gzinflate(base64_decode('…')))` ; payload ~141 Ko ; charset GB2312 ;
  auth par mot de passe `$_REQUEST[envlpass]` ; `assert` masqué via `str_replace(x,"","axsxxsxexrxxt")`.

### 2.3 Toolkit RCE `debuug.php` + Tiny File Manager — **raté par les scans regex initiaux**
- **`wp-content/debuug.php`** (52 934 octets) — webshell RCE :
  - `?cup=<hex>` exécute des commandes (décodage maison `acup()` = `chr(hexdec…)`), `?tea=df` télécharge.
  - `$_POST['iuw']` → `new mysqli($_POST…)` + `password_hash()` → **injecte un compte admin WP** à la demande.
  - **Évasion sécurité** : `WORDFENCE_DISABLE_LIVE_TRAFFIC`, `WORDFENCE_DISABLE_FILE_MODS`, bypass Imunify360 (`X-Imunify360-Captcha-Bypass`), ModSecurity, spoof Cloudflare ; coupe display_errors/log_errors.
- **`wp-content/debug.tmpp.php`** (225 787 octets) — **Tiny File Manager v2.6** (H3K) déposé par l'attaquant, identifiants par défaut `admin`/`admin@123`.
- **Leçon :** ces shells utilisent un **encodage hexadécimal maison** (pas `eval(base64)`) et des **noms anodins** (`debuug`, `debug.tmpp`) → invisibles aux regex classiques. Les **dates de modification de fichiers** (forensique) les ont révélés.

### 2.4 Outil tiers non autorisé (verrouilleur de fichiers turc)
- `wp-track-back.php` (nom imitant le cœur WP) + mu-plugin `wp-content/mu-plugins/file-lockdown.php`
- Commentaires turcs ; panneau web protégé par mot de passe (« arsene ») ; force `DISALLOW_FILE_MODS`.
- Défensif d'intention mais **non autorisé, dissimulé** → traité comme indésirable.

### 2.5 Compte administrateur frauduleux
- Admin au **username aléatoire** (`VISz0fAvGw`) + email Gmail externe (`mathias89100@gmail.com`) sur un site archivé.

---

## 3. IOC (Indicators of Compromise) — à grep sur l'autre serveur

**Fichiers / dossiers :**
```
wp-content/plugins/hseo/
wp-content/plugins/wp-helper-<6hex>/        (+ _<8hex>.php, cache/)
wp-content/themes/*/templates/themes-config.php   (si eval/gzinflate)
wp-content/debuug.php            (52934 o)
wp-content/debug.tmpp.php        (225787 o, Tiny File Manager)
wp-track-back.php                (à la racine du site)
wp-content/mu-plugins/file-lockdown.php
```

**Chaînes / signatures :**
```
bsc-testnet-rpc.publicnode.com      # C2 blockchain SEO-Booster
get-posts-from-page                 # endpoint C2
get-domain-active
define("API", "0xd2c18e0b")  /  define("SH", "0x2c0ef004")
XKEY / XVALUE                       # clés XOR
?al=true  +  wp_set_auth_cookie     # backdoor login admin
/sh<digits>  ,  /blog-verify  ,  /blog-sitemap.xml
function acup(  /  function tea(     # webshell debuug.php
WORDFENCE_DISABLE_LIVE_TRAFFIC en dehors du plugin wordfence
X-Imunify360-Captcha-Bypass
eval(gzinflate(base64_decode(        # webshell chinois
$_REQUEST[envlpass]
Tiny File Manager / tinyfilemanager / admin@123
```

**Comptes :** admin à username aléatoire (`[A-Za-z0-9]{8,12}`) + email externe non corporate.

---

## 4. Commandes de détection (playbook — rejouables ailleurs)

```bash
# 0. Cadre : se placer dans le home contenant les sites
cd ~

# 1. Faux plugins SEO-Booster
find . -type d \( -name "wp-helper-*" -o -name "hseo" \) -not -path "*/_quarantine_*"

# 2. Signatures C2 / backdoor en contenu
grep -rlE "bsc-testnet-rpc|get-posts-from-page|get-domain-active|define\(.XVALUE|wp_set_auth_cookie.*al=|function acup\(|WORDFENCE_DISABLE_LIVE_TRAFFIC" \
  --include="*.php" . 2>/dev/null | grep -v "/_quarantine_" | grep -v "/plugins/wordfence/"

# 3. Webshells eval-obfusqués
grep -rlE "eval\s*\(\s*(gzinflate|gzuncompress|str_rot13|base64_decode)" --include="*.php" . \
  | grep -vE "/(wp-includes|wp-admin)/"

# 4. PHP isolés dans wp-content/ (emplacement anormal) — exclure les fichiers légitimes
find . -path "*/wp-content/*.php" -not -path "*/_quarantine_*" | grep -E "/wp-content/[^/]+\.php$" \
  | grep -vE "/(index|advanced-cache|wp-cache-config|object-cache)\.php$"

# 5. PHP dans uploads/ (ne devrait JAMAIS exister, hors caches connus)
find . -path "*/wp-content/uploads/*" -name "*.php" -not -path "*/cache/*"

# 6. FORENSIQUE par dates : derniers fichiers modifiés par site (révèle les drops cachés)
find . -path "*/SITE/*" -type f -not -path "*/cache/*" -not -path "*/uploads/*" \
  -printf "%TY-%Tm-%Td %TH:%TM %p\n" | sort -r | head -20

# 7. .htaccess / .user.ini : injections auto_prepend
find . -name ".htaccess" -o -name ".user.ini" | xargs grep -lE "auto_prepend_file|auto_append_file" 2>/dev/null

# 8. Intégrité (wp-cli) — cœur, extensions, comptes admin, IOC en base
wp core verify-checksums
wp plugin verify-checksums --all
wp user list --role=administrator --fields=ID,user_login,user_email,user_registered
wp db search "bsc-testnet-rpc"
wp cron event list --fields=hook,next_run_relative

# 9. Test compatibilité PHP 8.x sans casser le web (CLI alternatif)
/usr/local/php8.1/bin/php ~/.local/bin/wp --path=<SITE> option get home
```

---

## 5. Remédiation réalisée (cluster128, 2026-06-15)

- [x] **Quarantaine** de tous les éléments malveillants → `~/_quarantine_<site>_2026-06-15/` (réversible, preuves conservées) :
      hseo, wp-helper-*, themes-config.php (webshell chinois), debuug.php, debug.tmpp.php, wp-track-back.php, file-lockdown.php.
- [x] **Base de données** : `active_plugins` nettoyée sur les 31 sites (aucune réf. malware) ; `wp db search` IOC = 0.
- [x] **Extensions vecteur d'entrée** : `wp-file-manager` + `file-manager-advanced` désactivées et mises en quarantaine (7 sites).
- [x] **Compte admin frauduleux** `VISz0fAvGw` supprimé (contenu réassigné).
- [x] **Rotation des 3 mots de passe DB** (`iavddcxu`=29 sites, `iavddcx641`=medicalesthetique, `orthodontica_prod`) + synchro `DB_PASSWORD` dans tous les `wp-config.php`.
- [x] **Purge de `~/.bash_history`** (contenait un mot de passe DB en clair).
- [x] **Rotation des salts** (`wp config shuffle-salts`) sur les 31 sites → toutes sessions/cookies volés invalidés.
- [x] **Suppression** du site archivé `old-predentis` (cœur 4.9, webshell) — backups `~/_backup_old-predentis_2026-06-15.{tar.gz,sql}`.
- [x] **Vérifs d'intégrité** : checksums cœur + extensions, cron, IOC base — propres sur les 31.
- [x] **PHP 8.1** : test de boot CLI full-stack des 30 sites — aucun fatal au chargement (à reconfirmer côté front web).

---

## 6. À faire / durcissement recommandé

- [ ] **Mettre à jour les cœurs WordPress** (priorité #1, c'est la faille d'entrée) : ~18 sites en retard (predentis 5.4, martiniere 5.6, alaie 5.7, kujawa/smileart 5.8, plusieurs 5.9/6.x).
- [ ] **Mettre à jour extensions + thème Impreza** (sécurité + stabilité PHP 8.1).
- [ ] Confirmer l'affichage **front** réel des sites sous PHP 8.1.
- [ ] `define('DISALLOW_FILE_EDIT', true);` dans chaque `wp-config.php`.
- [ ] Empêcher l'exécution PHP dans `uploads/` (règle serveur / .htaccess).
- [ ] Installer/activer **Wordfence** (ou équivalent) avec scan planifié sur chaque site.
- [ ] Vérifier le compte admin externe `DP-admin / implantinformations@gmail.com` (smileart) ; renommer le user `admin` (smile-mood).
- [ ] Ménage final : dropper les tables `old_predentis_*`, supprimer `_quarantine_*` et backups une fois sereins.
- [ ] **Sites « débris » à archiver/supprimer** (cœur ancien + 0 publication récente) : predentis, martiniere, pathammavong, et autres < 2024 (voir inventaire §7).

---

## 7. Inventaire des sites (réf. 2026-06-15)

| Site | WP | Thème | Dernière publi | URL |
|---|---|---|---|---|
| abtan | 6.9.4 | Impreza 7.9 | 2026-02-23 | dr-laurence-abtan.fr |
| alaie | 5.7.10 | Impreza 7.11 | 2022-03-28 | dr-alexandre-alaie.fr |
| amar | 6.9.4 | Impreza 7.11 | 2024-09-20 | orthodontie-courbevoie.fr |
| assayag | 7.0 | Impreza 8.46.2 | 2026-01-08 | cabinet-orthodontie-dr-assayag.fr |
| azogui | 7.0 | Impreza 7.11 | 2026-01-20 | dr-axel-azogui.fr |
| ducasse | 5.9.5 | Impreza 7.11 | 2018-01-15 | dr-marc-ducasse.chirurgiens-dentistes.fr |
| fazaiee-perso | 6.3.2 | Impreza 7.9 | 2023-09-11 | dr-maxime-fazaiee.fr |
| hyperdentaire | 6.3.4 | Impreza 7.8.2 | 2022-01-18 | hyperdentaire.fr |
| koskas | 6.3.5 | Impreza 7.8.2 | 2024-11-27 | dentiste-clichy.fr |
| kujawa | 5.8.9 | Impreza 7.6.1 | 2023-05-03 | dr-kujawa-marie-ange.chirurgiens-dentistes.fr |
| lahmi | 7.0 | Impreza 7.12 | 2026-04-21 | dr-mike-lahmi.fr |
| lasvergnas | 7.0 | Impreza 8.46.2 | 2026-03-26 | dr-lasvergnas.fr |
| marcadet | 6.8.1 | Impreza-child | 2025-06-11 | dentisteparis75018.fr |
| martiniere | 5.6.17 | Impreza 7.13 | 2021-01-26 | chevaux-martiniere.mrel-productions.com (staging) |
| maynard | 5.9.5 | Impreza 7.11 | 2022-01-07 | dr-annie-maynard.fr |
| medicalesthetique | 7.0 | Impreza 8.42 | 2025-09-10 | medical-esthetique-laser-pantin.fr |
| medina | 7.0 | Impreza 8.46.2 | 2026-05-05 | occlusodontieparis.fr |
| miquel | 7.0 | Impreza 7.11 | 2025-12-10 | dr-serge-miquel.fr |
| nassif | 7.0 | Impreza 7.10 | 2025-06-05 | dr-nayla-nassif.fr |
| pathammavong | 5.9.9 | (cassé) | jamais | dr-pathammavong.fr |
| predentis | 5.4.19 | (cassé) | 2021-04-14 | predentis.mrel-productions.com (staging) |
| orthodontica | 6.3.1 | hello-elementor | 2023-08-28 | orthodontica.fr |
| rabki | 6.0.3 | Impreza 7.9 | 2022-10-04 | orthodontiste-reze.fr |
| revah | 6.9 | Impreza 7.11 | 2023-12-12 | dr-jonathan-revah-chirurgiens-dentistes.fr |
| sarcelles | 5.9.5 | Impreza 8.7 | 2023-02-16 | dentistesarcelles.fr |
| s-hombrouck | 6.3.8 | Impreza 7.6.1 | 2023-11-28 | dr-samuel-hombrouck-chirurgiens-dentistes.fr |
| smileart | 5.8.6 | Impreza 7.6.1 | 2022-05-13 | dentalplan.fr |
| smileart-ads | 6.9.4 | Impreza 7.6.1 | 2026-01-16 | smileart-orthodontie.fr |
| smile-mood | 6.3.1 | Impreza 8.2.1 | 2023-09-28 | smilemood.fr |
| zeitoun-saal | 6.9.4 | Impreza 7.11 | 2026-02-05 | cabinet-dentaire-georgev.fr |

> Note : DBs = `iavddcxu` (29 sites, mutualisée), `iavddcx641` (medicalesthetique), `orthodontica_prod` (orthodontica).

---

## CHANGELOG (document évolutif)

- **2026-06-15** — Création. Désinfection SEO-Booster + webshell chinois + debuug.php/Tiny File Manager + outil turc.
  Rotation 3 mots de passe DB + salts (31 sites). Suppression old-predentis + admin frauduleux. Vérifs d'intégrité OK.
  Webshell `debuug.php`/`debug.tmpp.php` découvert via forensique de dates (raté par regex). Sweep élargi = propre.
  *Reste : mises à jour cœurs/extensions, durcissement, confirmation front PHP 8.1.*
- **2026-06-15 (suite)** — Scan du CONTENU de la base (posts/options) sur 30 sites : 0 script/spam injecté, 0 option obfusquée, 0 compte créé après 2025-01-01. Helper PHP read-only : ~/_audit_db_content.php.


---

## 8. Topologie d'hébergement — DÉCOUVERTE MAJEURE (2026-06-15)

⚠️ **Ce serveur cluster128 (`51.91.236.193`) ne sert AUCUN site public.** Tous les domaines résolvent ailleurs :
les installations WordPress présentes ici sont des **copies anciennes / abandonnées**. Le live a été migré ou reconstruit ailleurs.

Cartographie (résolution DNS + reverse DNS + en-têtes HTTP) :
- **cluster028 OVH** (`92.222.139.190`, PTR `cluster028.hosting.ovh.net`) — 15 domaines : abtan, amar, assayag, azogui, lahmi, lasvergnas, medicalesthetique, medina, miquel, nassif, s-hombrouck, smileart-ads, zeitoun-saal + predentis/martiniere (staging). → **serveur de prod probable, à auditer en PRIORITÉ (même malware vraisemblable).**
- **n0c.com** (autre hébergeur, `185.221.182.x` / `146.88.238.91`) — 4 : fazaiee-perso, hyperdentaire, pathammavong, smile-mood.
- **Heroku / AWS** — maynard : `dr-annie-maynard.fr` = site RECONSTRUIT hors WordPress (`server: Heroku`).
- **Cloudflare** (origine masquée) — marcadet, revah.
- **Parking OVH** (`213.186.33.5`) — orthodontica (domaine non hébergé activement).
- **DNS mort** (ne résout pas) — alaie, ducasse, koskas, kujawa, rabki, sarcelles, smileart(dentalplan.fr).
- **ICI, cluster128** — **0 domaine servi**.

**Conséquence :** la désinfection réalisée ici porte sur un serveur d'anciennes copies. **La PROD (cluster028 + n0c + Heroku/CF) reste à auditer** avec ce même playbook (§4).
IP utiles : SSH `5.135.37.213` (ssh.cluster128) · web cluster128 `51.91.236.193` · web cluster028 `92.222.139.190`.

## 9. Suppressions de copies obsolètes (2026-06-15 — SANS backup, vérifié manuellement par le client)

Fichiers supprimés — **~10,7 Go libérés** :

| Site | Taille | Tables DB orphelines (base `iavddcxu`) |
|---|---|---|
| smileart | 8,2 G | `smileart_` |
| sarcelles | 539 M | `srclls_` |
| ducasse | 473 M | `dcss_` |
| predentis | 356 M | `prdnts_` |
| kujawa | 288 M | `kjw_` |
| hyperdentaire | 282 M | `hyprdntr_` |
| rabki | 226 M | `rabki_` |
| martiniere | 196 M | `chevaux_` |
| alaie | 173 M | `alaie_` |

(+ `old-predentis` supprimé plus tôt, lui AVEC backup `~/_backup_old-predentis_2026-06-15.*`.)
**Les tables DB de ces 9 sites restent présentes (orphelines) → à dropper.**
**Sites WordPress restants sur cluster128 : 21.**

## CHANGELOG (suite)

- **2026-06-15 (topologie)** — Découverte majeure : cluster128 ne sert aucun domaine public ; ce sont des copies anciennes. Live réparti sur cluster028 (15), n0c.com (4), Heroku/AWS (maynard), Cloudflare (marcadet, revah), parking (orthodontica), DNS mort (7). **Prod à auditer ailleurs — priorité cluster028.**
- **2026-06-15 (nettoyage)** — Suppression SANS backup de 9 copies obsolètes (~10,7 Go) : smileart, sarcelles, ducasse, predentis, kujawa, hyperdentaire, rabki, martiniere, alaie. Tables DB orphelines à dropper (préfixes : `prdnts_ chevaux_ dcss_ smileart_ srclls_ alaie_ kjw_ hyprdntr_ rabki_`).

## 10. Sonde externe des sites LIVE (cluster028) — 2026-06-15

Vérification **non intrusive** (HTTP GET publics) pour répondre à : « le live est-il infecté, ou seulement les vieilles copies ici ? »

Résultats sur 12 sites live (cluster028) :
- Version WordPress : **6.9.4 / 7.0 (à jour)** — vs 4.9–6.x sur les copies de cluster128.
- `/blog-sitemap.xml` (faux sitemap SEO-Booster) : **404 partout**.
- Injection `robots.txt` : **aucune**.
- Webshells `wp-content/debuug.php` et `debug.tmpp.php` : **absents (404)**.
- Route backdoor `/blog-verify` : **404**.

**Conclusion :** aucune empreinte d'infection détectée en externe sur le live → cohérent avec l'hypothèse
« infection concentrée sur les vieilles copies vulnérables de cluster128 (propagation latérale via user partagé) ».

**RÉSERVE (non-preuve) :** sondage passif uniquement. Le module SEO de ce malware est **piloté par C2** (peut être
dormant), un webshell pourrait porter un **autre nom**, et le backdoor `?al=true` n'a **pas** été testé (intrusif).
→ Rassurant mais **pas une preuve** ; seul un audit fichiers/DB (accès SSH à cluster028) serait définitif.
Piste : cluster028 est une IP OVH (`92.222.139.190`) → trouver à quel hébergement/compte OVH il appartient pour y rejouer le playbook §4.

## CHANGELOG (suite)

- **2026-06-15 (sonde live)** — Sondage HTTP non intrusif des 12 sites live (cluster028) : WP à jour (6.9.4/7.0), aucun `/blog-sitemap.xml`, robots non injecté, webshells `debuug.php`/`debug.tmpp.php` absents (404), `/blog-verify` 404. **Aucune empreinte d'infection externe.** Réserve : passif/C2-gated → rassurant, pas une preuve.

## 11. CORRECTION de la §8 (topologie) — 2026-06-15

⚠️ **La §8 était ERRONÉE.** Vérification via le manager OVH (autorité) :
- Compte d'hébergement `iavddcx` : **IPv4 `92.222.139.190`**, **Filer 975**, **cluster128**, nom produit `iavddcx.cluster028.hosting.ovh.net`, PHP 8.1 global, 93 sites web.
- La session SSH atterrit dans `/homez.975/iavddcx` (filer 975) → **c'est le même compte**.

**Donc : `cluster028` (PTR de `92.222.139.190`) = CE serveur.** Le nommage OVH est trompeur (le hostname générique
`cluster128.hosting.ovh.net` résout vers `51.91.236.193`, une IP de répartition — PAS l'IP du compte).

**Conclusion corrigée :**
- Les **13 domaines qui résolvent vers `92.222.139.190` sont servis ICI** = ce sont les **sites LIVE de production** (abtan, amar, assayag, azogui, lahmi, lasvergnas, medicalesthetique, medina, miquel, nassif, s-hombrouck, smileart-ads, zeitoun-saal). La désinfection a donc bien porté sur la **prod**.
- Le « sondage externe » de la §10 testait en réalité CE serveur → il a confirmé que le nettoyage a marché (`debuug.php` → 404 car retiré).
- **PAS d'audit d'un « autre serveur cluster028 » à faire — c'est celui-ci.**

**Réellement hors de ce serveur (ça reste vrai) :** maynard (Heroku), fazaiee-perso/pathammavong/smile-mood (n0c.com),
marcadet/revah (Cloudflare, origine incertaine), orthodontica (parking OVH), koskas + domaines morts (DNS éteint).

## CHANGELOG (suite)

- **2026-06-15 (CORRECTION topologie)** — La §8 était fausse. Le manager OVH confirme : compte `iavddcx` = IP `92.222.139.190`, filer 975, cluster128 (= la session SSH). Les domaines sur `92.222.139.190` sont servis ICI = **sites live de prod**. Pas de « cluster028 » séparé à auditer. Désinfection = bien sur la prod. Seuls maynard (Heroku), 3× n0c, 2× Cloudflare, orthodontica (parking), koskas (DNS mort) sont hors-serveur.

## 12. État courant par site (corrigé) — 2026-06-15

**A. LIVE servis depuis CE serveur** (domaine → `92.222.139.190`) — 13, désinfectés & vérifiés :
abtan, amar, assayag, azogui, lahmi, lasvergnas, medicalesthetique, medina, miquel, nassif, s-hombrouck, smileart-ads, zeitoun-saal.

**B. Copies ORPHELINES ici (live ailleurs)** — 6 :
- maynard → Heroku (site reconstruit, plus WordPress)
- fazaiee-perso, pathammavong, smile-mood → n0c.com
- revah → Cloudflare → ailleurs (live WP 7.0 ≠ copie ici 6.9)
- marcadet → Cloudflare → origine incertaine

**C. Domaine parqué / DNS mort (ne tourne nulle part de visible)** — 2 :
- orthodontica → parking OVH (copie ici = peut-être la seule)
- koskas → DNS mort (copie ici = peut-être la seule)

**D. SUPPRIMÉS le 2026-06-15** — 10 :
- old-predentis (ancien/staging, WP 4.9 + webshell) — AVEC backup `~/_backup_old-predentis_2026-06-15.*`
- predentis, martiniere (staging) — sans backup
- ducasse, smileart, sarcelles, alaie, kujawa, rabki (DNS mort) — sans backup
- hyperdentaire (live sur n0c) — sans backup
→ Tables DB orphelines restantes (base iavddcxu) : `prdnts_ chevaux_ dcss_ smileart_ srclls_ alaie_ kjw_ hyprdntr_ rabki_` (+ `old_predentis_`).

**Total : 21 présents · 10 supprimés.**

## CHANGELOG (suite)

- **2026-06-15 (état)** — Inventaire corrigé : 13 sites LIVE ici (prod), 6 copies orphelines (maynard/Heroku, fazaiee-perso/pathammavong/smile-mood/n0c, revah/marcadet/Cloudflare), 2 parqués/morts (orthodontica, koskas), 10 supprimés. revah live = WP 7.0 ≠ copie locale 6.9 → live ailleurs.

## 13. Preuve tangible : les copies orphelines ne sont PAS servies ici — 2026-06-15

Méthode (reproductible) : dépôt d'un fichier témoin `_mrelproof8f3a9c2.txt` dans `~/<site>/` sur ce serveur,
puis lecture via l'URL publique. Si le site était servi d'ici, le témoin reviendrait en HTTP 200.

| Site | IP live (≠ 92.222.139.190) | Serveur | Témoin via URL |
|---|---|---|---|
| maynard | 15.197.129.158 | Heroku | 404 → pas servi ici |
| fazaiee-perso | 185.221.182.113 | LiteSpeed (n0c) | 404 → pas servi ici |
| pathammavong | 185.221.182.15 | LiteSpeed (n0c) | 404 → pas servi ici |
| smile-mood | 146.88.238.91 | LiteSpeed (n0c) | 404 → pas servi ici |
| revah | 172.67.142.197 | Cloudflare | 404 → pas servi ici |
| marcadet | 162.159.135.42 | Cloudflare | 301 (redirige, ne sert pas le témoin) → pas servi ici |

Témoins supprimés après le test. Conclusion : les 6 copies orphelines sont supprimables ici sans impacter le live.

## CHANGELOG (suite)

- **2026-06-15 (preuve orphelins)** — Test fichier-témoin : les 6 copies orphelines (maynard, fazaiee-perso, pathammavong, smile-mood, revah, marcadet) ne sont PAS servies depuis ce serveur (témoin déposé ici = 404/301 via URL publique ; IP live + serveur distincts : Heroku, n0c/LiteSpeed, Cloudflare). Supprimables sans risque.

## 14. Suppression des 6 copies orphelines + bilan — 2026-06-15

Supprimées (sans backup, preuve §13 faite) — ~5 Go :
| Site | Taille | Tables DB orphelines |
|---|---|---|
| marcadet | 2,0 G | `marcadet_` |
| revah | 952 M | `revah_` |
| maynard | 667 M | `mynrd_` |
| fazaiee-perso | 544 M | `fz_perso_` |
| smile-mood | 542 M | `s_m_` |
| pathammavong | 357 M | `arya_` |

**BILAN suppressions 2026-06-15 : 16 sites supprimés (~16,7 Go libérés). 15 sites restants :**
- 13 = PROD live servie ici : abtan, amar, assayag, azogui, lahmi, lasvergnas, medicalesthetique, medina, miquel, nassif, s-hombrouck, smileart-ads, zeitoun-saal.
- 2 à vérifier (peut-être seule copie) : orthodontica (parqué), koskas (DNS mort).

**Tables DB orphelines à dropper (16 préfixes, base iavddcxu) :**
`prdnts_ chevaux_ dcss_ smileart_ srclls_ alaie_ kjw_ hyprdntr_ rabki_ old_predentis_ mynrd_ fz_perso_ arya_ s_m_ revah_ marcadet_`

## CHANGELOG (suite)

- **2026-06-15 (suppr. orphelins)** — Supprimées sans backup : maynard, fazaiee-perso, pathammavong, smile-mood, revah, marcadet (~5 Go). Total supprimé ce jour = 16 sites (~16,7 Go). Restent 15 (13 prod live + orthodontica/koskas à vérifier). 16 préfixes de tables orphelines en attente de drop.

## 15. Test des 15 sites restants (path / url / ici / status) — 2026-06-15

Résolution via serveur (getent) + test HTTP local avec IP épinglée. NB : IPv6 de ce compte = `2001:41d0:301:3::28`.

| PATH | URL | ICI | HTTP |
|---|---|---|---|
| ~/abtan | dr-laurence-abtan.fr | OUI | 200 |
| ~/amar | orthodontie-courbevoie.fr | OUI | 200 |
| ~/assayag | cabinet-orthodontie-dr-assayag.fr | OUI | 200 |
| ~/azogui | dr-axel-azogui.fr | OUI (IPv6) | 200 |
| ~/koskas | dentiste-clichy.fr | NON (DNS mort) | - |
| ~/lahmi | dr-mike-lahmi.fr | OUI | 200 |
| ~/lasvergnas | dr-lasvergnas.fr | OUI | 200 |
| ~/medicalesthetique | medical-esthetique-laser-pantin.fr | OUI (IPv6) | 200 |
| ~/medina | www.occlusodontieparis.fr | OUI (IPv6) | 200 |
| ~/miquel | dr-serge-miquel.fr | OUI | 200 |
| ~/nassif | dr-nayla-nassif.fr | OUI | 200 |
| ~/production/orthodontica | orthodontica.fr | NON (parking OVH) | 000 |
| ~/s-hombrouck | dr-samuel-hombrouck-chirurgiens-dentistes.fr | OUI (IPv6) | 200 |
| ~/smileart-ads | smileart-orthodontie.fr | OUI | 200 |
| ~/zeitoun-saal | cabinet-dentaire-georgev.fr | OUI | 200 |

**Bilan : 13 sites servis ici, tous HTTP 200 (front OK sous PHP 8.1).** 2 non-live : koskas (DNS mort), orthodontica (parking).

## CHANGELOG (suite)

- **2026-06-15 (test 15 restants)** — Les 13 sites prod servis ici répondent tous HTTP 200 (front confirmé OK sous PHP 8.1). koskas = DNS mort, orthodontica = parking (000) → seuls non-live restants.

## 16. Suppression orthodontica + koskas — ÉTAT FINAL — 2026-06-15

Supprimés (sans backup) :
- production/orthodontica (1,4 Go) — DB = **Cloud `orthodontica_prod`** (prefix wp_) → la base Cloud OVH reste, **à supprimer dans le manager OVH** (Web Cloud Databases). orthodontica.fr redirige désormais vers la version live sur n0c (orthodontie-paris20.fr).
- koskas (335 Mo) — DB iavddcxu prefix `kosks_` (DNS mort).
- ~/production/ (vide) supprimé.

### ÉTAT FINAL : 13 sites restants = PROD LIVE servie ici, tous HTTP 200, désinfectés & vérifiés
abtan, amar, assayag, azogui, lahmi, lasvergnas, medicalesthetique, medina, miquel, nassif, s-hombrouck, smileart-ads, zeitoun-saal.

**Total supprimé le 2026-06-15 : 18 sites.**

Tables DB orphelines (base iavddcxu) à dropper — 17 préfixes :
`prdnts_ chevaux_ dcss_ smileart_ srclls_ alaie_ kjw_ hyprdntr_ rabki_ old_predentis_ mynrd_ fz_perso_ arya_ s_m_ revah_ marcadet_ kosks_`
+ Base Cloud orpheline : `orthodontica_prod` (à supprimer côté manager OVH).

## CHANGELOG (suite)

- **2026-06-15 (état final)** — Suppression orthodontica (redirige vers n0c ; base Cloud orthodontica_prod à supprimer dans OVH) + koskas (DNS mort). Total supprimé = 18 sites. Restent 13 = prod live (tous HTTP 200, désinfectés). 17 préfixes orphelins iavddcxu + 1 base Cloud orpheline à nettoyer.

## 17. Compte rendu des mises à jour par site (13 sites prod) — 2026-06-15

### Cœur WordPress
- À jour (7.0) : assayag, azogui, lahmi, lasvergnas, medicalesthetique, medina, miquel, nassif.
- À mettre à jour : abtan, amar, smileart-ads, zeitoun-saal (6.9.4 -> 7.0) ; s-hombrouck (6.3.8 -> 7.0, le plus en retard).

### Extensions à mettre à jour, par site
- abtan (cœur 6.9.4->7.0) : akismet, beaf-before-and-after-gallery, classic-editor, duplicate-page, metricool, updraftplus, wordpress-seo (7)
- amar (6.9.4->7.0) : akismet, classic-editor, maintenance, metricool, WORDFENCE 8.1.4->8.2.2, wordpress-seo (6)
- assayag (7.0) : aucune
- azogui (7.0) : wordpress-seo 27.7->27.8 (1)
- lahmi (7.0) : wordpress-seo (1)
- lasvergnas (7.0) : aucune
- medicalesthetique (7.0) : akismet, all-in-one-wp-migration, duplicate-page, litespeed-cache, maintenance, metricool, really-simple-ssl, wp-force-ssl, wordpress-seo (9)
- medina (7.0) : aucune
- miquel (7.0) : wordpress-seo (1)
- nassif (7.0) : wordpress-seo (1)
- s-hombrouck (6.3.8->7.0) : akismet 5.2->5.7, classic-editor, metricool, password-protected, popup-builder, WORDFENCE 7.10.3->8.2.2 (6) [PRIORITÉ]
- smileart-ads (6.9.4->7.0) : akismet, all-in-one-wp-migration, classic-editor, webp-converter-for-media, duplicate-page, metricool, WORDFENCE 8.1.4->8.2.2, wp-super-cache, wordpress-seo (9)
- zeitoun-saal (6.9.4->7.0) : webp-converter-for-media, metricool, custom-css-js, google-site-kit, instagram-feed, wp-smushit, wordpress-seo (7)

NB : les MAJ de thèmes signalées = thèmes par défaut inactifs (twentytwenty*), sans impact ; thème actif = Impreza (premium, hors wp.org).

### Priorités
1. s-hombrouck (cœur 6.3.8 + Wordfence 7.10.3 très ancien).
2. Wordfence sur amar et smileart-ads (8.1.4->8.2.2).
3. Cœur 6.9.4->7.0 (abtan, amar, smileart-ads, zeitoun-saal) + Yoast un peu partout.

### Ménage effectué ce jour (résidu)
Supprimés : dossiers vides (liniere, peyraud, smileart-non), cache wp-cli (45M), 17 quarantaines (~211M), backup old-predentis (144M) = ~400 Mo. NB : chokron (vieux site statique TYPO3 2022) en attente de confirmation de suppression.

## CHANGELOG (suite)

- **2026-06-15 (audit MAJ)** — Compte rendu MAJ des 13 sites : 8 cœurs à jour (7.0), 5 à updater (s-hombrouck 6.3.8 prioritaire + 4 en 6.9.4). Wordfence en retard sur s-hombrouck (7.10.3), amar, smileart-ads. Yoast/akismet/divers mineurs. Résidu nettoyé ~400 Mo (vides, cache, quarantaines, backup).

## 18. Mises à jour APPLIQUÉES — 2026-06-15 [cluster128/MREL]

Backup DB de chaque site avant MAJ : `~/.maintenance-logs/premaj_2026-06-15/<site>.sql`.
- Cœur mis à jour vers 7.0 : s-hombrouck (6.3.8->7.0), abtan/amar/smileart-ads/zeitoun-saal (6.9.4->7.0) + DB upgrade. Les 8 autres déjà en 7.0.
- Plugins : tous mis à jour sur les 13 sites (dont Wordfence s-hombrouck 7.10.3->8.2.2, amar/smileart-ads 8.1.4->8.2.2 ; Yoast partout ; etc.).
- Vérif post-MAJ : les 5 sites au cœur mis à jour répondent HTTP 200 (aucune casse).
- Aussi supprimé : chokron (vieux site statique TYPO3 2022).

ÉTAT : 13 sites prod, cœur + plugins à jour, désinfectés, HTTP 200. Reste optionnel : dropper 17 tables orphelines iavddcxu + base Cloud orthodontica_prod ; backups premaj supprimables après contrôle.

## CHANGELOG (suite)

- **2026-06-15 (MAJ appliquées)** — 13 sites: backup DB, cœur->7.0 (5 sites), plugins tous à jour (Wordfence/Yoast/etc.), post-MAJ HTTP 200 OK. chokron supprimé. Maintenance MREL terminée.

## Suivi 2026-06-16 — re-scan post-remédiation
- Re-scan complet des 13 sites (signatures toutes familles + checksums cœur + admins cachés + fichiers récents) : **0 nouvelle infection**. Seule modif récente = MAJ légitime du plugin RevSlider sur zeitoun-saal. La remédiation du 2026-06-15 a tenu.
