HEX
Server: LiteSpeed
System: Linux web0101.theory7.net 5.14.0-570.37.1.el9_6.x86_64 #1 SMP PREEMPT_DYNAMIC Tue Aug 26 10:33:12 EDT 2025 x86_64
User: t7x1378p822w (2195)
PHP: 8.4.12
Disabled: NONE
Upload Files
File: /home/t7x1378p822w/security-audit.md
# Security Audit Rapport — Hostingpakket t7x1378p822w
**Datum audit:** 3 april 2026  
**Uitgevoerd door:** GitHub Copilot (geautomatiseerde analyse)  
**Scope:** `/home/t7x1378p822w/domains/` — alle 6 WordPress-installaties

---

## Samenvatting

Het hostingpakket is gehackt geweest waarbij alle domeinen geïnfecteerd raakten. Op basis van de access logs is vastgesteld dat op **30 maart 2026 om ~07:47** een **ShellBot 2.0** webshell actief was op `brabantvandaag.nl/admin.php`. De aanvallers hadden op dat moment volledige servertoegang. Meerdere structurele beveiligingslekken hebben de infectie mogelijk gemaakt en verergerd.

---

## 1. Bevestigd Bewijs van de Aanval (Logs)

### 1.1 ShellBot 2.0 Webshell — brabantvandaag.nl
Uit de access logs van 30 maart 2026 bleek dat een webshell (`admin.php`) aanwezig was in de public root:

```
47.39.119.19 - [30/Mar/2026:07:47:59] "GET /admin.php?520" 200 - "ShellBot 2.0"
199.168.98.202 - [30/Mar/2026:07:48:06] "POST /admin.php?520" 200 - "ShellBot 2.0"
199.168.98.202 - [30/Mar/2026:07:48:23] "POST /admin.php?upload&q=.../private_html" 200 - "ShellBot 2.0"
```

- De aanvaller **uploadde bestanden** via de webshell naar `private_html`
- Via de webshell werd ook `/wp-includes/SIibfyHmWkj.php` aangeroepen (secundaire backdoor)
- Het bestand `admin.php` is inmiddels verwijderd door de Imunify-scan

### 1.2 Meer backdoors gevonden in logs
```
134.195.82.203 - [30/Mar/2026:07:32:43] "POST /wp-admin/Zbk2GWrPoEi.php" 500
47.39.119.19  - [30/Mar/2026:07:48:00] "GET /wp-includes/SIibfyHmWkj.php" 500
```
Deze willekeurig benoemde `.php`-bestanden in `wp-admin/` en `wp-includes/` zijn typische backdoors. De 500-status geeft aan dat ze al deels verwijderd/geblokkeerd waren toen ze werden aangeroepen.

### 1.3 Brute Force op wp-login.php
Meerdere IP-adressen voerden op 30 maart brute force aanvallen uit op `wp-login.php`:

- **89.251.0.x** subnet — tientallen POST-verzoeken
- **173.239.213.16/17** — succesvolle 200-responses op `POST /wp-login.php`
- **193.56.116.253 / 91.193.232.187** — idem

> **Conclusie:** Er zijn vermoedelijk geldige admin-inloggegevens gevonden via brute force, waarna een webshell is geüpload.

### 1.4 xmlrpc.php aanvallen
Meerdere aanvallers misbruikten `xmlrpc.php` via gecoördineerde POST-verzoeken:

```
168.253.248.179 - "POST /xmlrpc.php" 200
203.212.200.101 - "POST /xmlrpc.php" 200
43.247.158.230  - "POST /xmlrpc.php" 200
103.197.49.103  - "POST /xmlrpc.php" 200
155.212.111.15  - "POST /xmlrpc.php" 200
```
`xmlrpc.php` was op alle 6 domeinen toegankelijk en actief.

---

## 2. Geïnstalleerde Software en Versies

### 2.1 WordPress Core
| Domein | WP-versie |
|--------|-----------|
| brabantvandaag.nl | 6.9.1 |
| dierenvandaag.nl | 6.9.1 |
| nieuwsvandaag.nl | 6.9.1 |
| royaltynieuws.nl | 6.9.1 |
| technieuws.nl | 6.9.1 |
| yepmediagroup.com | 6.9.1 |

Alle sites draaien dezelfde WordPress-versie (backup van voor de infectie, herstelde versie). De huidige versie is actueel.

### 2.2 Plugins (op 5 van de 6 domeinen identiek)
| Plugin | Versie |
|--------|--------|
| LiteSpeed Cache | 7.7 |
| SEO by Rank Math | 1.0.264.1 |
| SEO by Rank Math Pro | 3.0.107 |
| td-composer (Newspaper) | 5.4.3 |
| td-cloud-library | 3.9.3 |

### 2.3 Plugins op royaltynieuws.nl (afwijkend)
| Plugin | Versie |
|--------|--------|
| LiteSpeed Cache | 7.7 |
| Maintenance | 4.20 |

### 2.4 Themes
| Domein | Theme | Versie |
|--------|-------|--------|
| brabantvandaag.nl t/m yepmediagroup.com | Newspaper (tagDiv) | 12.7.4 |
| royaltynieuws.nl | Twenty Twenty-Five | standaard |

---

## 3. Gevonden Beveiligingslekken

### 🔴 KRITIEK

#### 3.1 Automatische updates uitgeschakeld (alle domeinen)
**Bestand:** `wp-content/mu-plugins/automation-by-installatron.php`

De Installatron mu-plugin schakelt automatische WordPress-updates uit met:
```php
add_filter( 'automatic_updater_disabled', '__return_true', -9999 );
```
Dit geldt voor **alle 6 domeinen**. Als plugins of WordPress zelf een kritieke kwetsbaarheid kregen, werden deze **niet automatisch gepatcht**. Dit is waarschijnlijk de primaire reden dat een bekende plugin-kwetsbaarheid niet op tijd werd gedicht.

> **Aanbeveling:** Zet automatische updates aan voor minor releases en beveiligingsupdates, óf stel een actief updatebeleid in via Installatron.

#### 3.2 Geen beveiligingsplugin aanwezig (alle domeinen)
Op geen enkel domein is een security-plugin geïnstalleerd (geen Wordfence, Sucuri, iThemes Security, etc.). Hierdoor:
- Geen rate limiting op inlogpogingen
- Geen detectie van bekende aanvalspatronen
- Geen blokkering van verdachte IP-adressen
- Geen bestandsintegriteitscontrole

> **Aanbeveling:** Installeer Wordfence (gratis) of Solid Security op alle sites. Activeer in elk geval de brute-force bescherming.

#### 3.3 xmlrpc.php toegankelijk (alle 6 domeinen)
`xmlrpc.php` is op alle domeinen publiek bereikbaar en beantwoordt verzoeken met HTTP 200. Dit bestand wordt zwaar misbruikt voor:
- Brute force aanvallen (multicall-methode: duizenden wachtwoorden per verzoek)
- DDoS-amplificatie
- Pingback-aanvallen

Aanbevolen blokkering via `.htaccess`:
```apache
<Files xmlrpc.php>
    Order Deny,Allow
    Deny from all
</Files>
```

> **Aanbeveling:** Blokkeer `xmlrpc.php` via `.htaccess` als XML-RPC niet gebruikt wordt.

#### 3.4 Geen bescherming van wp-admin / wp-login.php
Geen enkel domein heeft een `.htaccess` in de `wp-admin/` map, en er is geen IP-beperking op `wp-login.php`. Dit maakt ongelimiteerde brute-force aanvallen mogelijk, zoals aantoonbaar het geval was.

Aanbevolen bescherming via `.htaccess` in public_html:
```apache
# Beperk wp-login.php tot bekende IP's
<Files wp-login.php>
    Order Deny,Allow
    Deny from all
    Allow from [jouw_ip]
</Files>
```

> **Aanbeveling:** Voeg IP-beperking toe aan wp-login.php of activeer een 2FA-plugin.

### 🟠 HOOG

#### 3.5 xmlrpc.php brute force aanvallen actief
Meerdere IP-adressen versturen actief POST-verzoeken naar `xmlrpc.php` op alle domeinen. De logs tonen herhaalde succesvolle (200) responses, wat wijst op actief misbruik.

#### 3.6 readme.html publiek toegankelijk (alle 6 domeinen)
`/readme.html` is aanwezig en tonen de exacte WordPress-versie. Dit helpt aanvallers gericht kwetsbaarheden voor die versie te zoeken.

> **Aanbeveling:** Verwijder of blokkeer `readme.html` op alle domeinen.

#### 3.7 DISALLOW_FILE_EDIT niet ingesteld (alle domeinen)
In geen van de `wp-config.php` bestanden is `DISALLOW_FILE_EDIT` of `DISALLOW_FILE_MODS` gedefinieerd. Als een aanvaller admin-toegang kreeg tot het WordPress dashboard, kan hij via de ingebouwde code-editor directe PHP/JS code aanpassen.

Toe te voegen aan `wp-config.php`:
```php
define('DISALLOW_FILE_EDIT', true);
define('DISALLOW_FILE_MODS', true);
```

#### 3.8 WP_TEMP_DIR ingesteld op uploads map
Op brabantvandaag.nl staat in wp-config.php:
```php
define('WP_TEMP_DIR', dirname(__FILE__).'/wp-content/uploads');
```
Dit plaatst tijdelijke bestanden in de publiek toegankelijke uploads-map, wat informatielekken kan veroorzaken.

### 🟡 GEMIDDELD

#### 3.9 Geen .htaccess in uploads mappen (alle domeinen)
Er ontbreekt een `.htaccess` die PHP-uitvoering blokkeert in `wp-content/uploads/`. Als een aanvaller via file upload een `.php`-bestand kan plaatsen, kan die direct worden uitgevoerd.

Aan te maken: `wp-content/uploads/.htaccess`:
```apache
<Files *.php>
    deny from all
</Files>
```

#### 3.10 FORCE_SSL_ADMIN niet ingesteld
In geen enkel domein is `FORCE_SSL_ADMIN` gedefinieerd in `wp-config.php`. Hierdoor kunnen admin-inloggegevens over HTTP worden verzonden als SSL niet correct is geconfigureerd.

Toe te voegen:
```php
define('FORCE_SSL_ADMIN', true);
```

#### 3.11 wp-cron.php onbeschermd
`wp-cron.php` is publiek aanroepbaar voor iedereen. Bij drukke sites kan dit leiden tot ongewenste serverbelasting of misbruik als DDoS-vector.

Voeg toe aan `wp-config.php`:
```php
define('DISABLE_WP_CRON', true);
```
En stel een echte cron-job in via DirectAdmin.

#### 3.12 .htaccess backup-bestanden aanwezig (alle domeinen)
Op alle 6 domeinen staat een `.htaccess.bk` bestand in de public root. Dit is toegankelijk via de browser en bevat de volledige Apache/LiteSpeed configuratie, inclusief beveiligingsregels.

Bestanden gevonden:
- `brabantvandaag.nl/public_html/.htaccess.bk`
- `dierenvandaag.nl/public_html/.htaccess.bk`
- `nieuwsvandaag.nl/public_html/.htaccess.bk`
- `royaltynieuws.nl/public_html/.htaccess.bk`
- `technieuws.nl/public_html/.htaccess.bk`
- `yepmediagroup.com/public_html/.htaccess.bk`

> **Aanbeveling:** Verwijder deze bestanden of blokkeer ze via `.htaccess`.

### 🔵 LAAG / INFORMATIEF

#### 3.13 LiteSpeed Cache — historisch kritieke kwetsbaarheden
LiteSpeed Cache had in 2024 twee kritieke kwetsbaarheden:
- **CVE-2024-28000** (CVSS 9.8): Unauthenticated Privilege Escalation in versies < 6.4
- **CVE-2024-50550** (CVSS 9.8): Privilege Escalation via zwakke hash in versies < 6.5.0.1

De huidige geïnstalleerde versie **7.7** is niet kwetsbaar. Echter, als vóór de backup een oudere versie actief was en automatische updates uitgeschakeld waren, kon dit een initieel aanvalsvector zijn geweest.

#### 3.14 Newspaper Theme — historische kwetsbaarheden
Het Newspaper-theme (tagDiv) had in 2024 meerdere kwetsbaarheden:
- **CVE-2024-5239**: XSS via td_block AJAX handler (fix in 12.6.5)
- **CVE-2024-6509**: Broken Access Control (fix in 12.7.1)
- **CVE-2024-8854**: Local File Inclusion via td_ajax_block (fix in 12.7.4)

Alle 5 sites met Newspaper draaien **versie 12.7.4** (de gepatche versie). Als echter vóór de hack een oudere versie actief was, kan de **LFI-kwetsbaarheid (CVE-2024-8854)** hebben bijgedragen; een aanvaller kon daarmee server-bestanden uitlezen en eventueel code injecteren.

#### 3.15 WP_DEBUG staat correct op false
`WP_DEBUG` is op `false` gezet in alle installaties. Dit is correct voor productie.

#### 3.16 wp-config.php heeft veilige rechten (600)
Alle `wp-config.php` bestanden hebben bestandsrechten `600` — alleen leesbaar door de eigenaar. Dit is correct.

#### 3.17 Database table prefix is niet 'wp_'
Alle sites gebruiken willekeurige tabel-prefixen (bv. `xvug_`, `cnzt_`, `y6s8_`). Dit is correct en bemoeilijkt SQL-injectie-aanvallen.

---

## 4. Waarschijnlijk Aanvalsscenario

Op basis van de logs is het meest waarschijnlijke scenario:

1. **Fase 1 — Verkenning (vóór 30 maart):** Geautomatiseerde scanners vonden de site en testten bekende eindpunten (`xmlrpc.php`, `wp-login.php`, plugin-specifieke endpoints).

2. **Fase 2 — Toegang (voor 07:32 op 30 maart):** De aanvaller verkreeg toegang via één van:
   - Een **brute force aanval op wp-login.php** (bevestigd in logs)
   - Een **xmlrpc.php multicall-aanval** (bevestigd in logs)
   - Een **kwetsbaarheid in een plugin of theme** (LiteSpeed Cache CVE-2024-28000 of Newspaper CVE-2024-8854 als vóór de backup een oudere versie actief was)

3. **Fase 3 — Backdoor installatie (vóór 07:32):** Na het verkrijgen van admin-toegang plaatste de aanvaller meerdere PHP-backdoors:
   - `/public_html/admin.php` (ShellBot 2.0)
   - `/wp-admin/Zbk2GWrPoEi.php`
   - `/wp-includes/SIibfyHmWkj.php`

4. **Fase 4 — Misbruik (07:47 op 30 maart):** Via de ShellBot werd actief bestanden geüpload naar `private_html` en andere locaties.

5. **Fase 5 — Verspreiding:** Omdat alle domeinen op hetzelfde hostingpakket staan en dezelfde PHP-gebruiker delen, konden scripts van één domein bestanden schrijven naar andere domeinen.

---

## 5. Prioriteitslijst Aanbevelingen

| Prioriteit | Actie |
|-----------|-------|
| 🔴 Onmiddellijk | Activeer brute-force bescherming op wp-login.php (IP-whitelist of 2FA) |
| 🔴 Onmiddellijk | Installeer een security-plugin (Wordfence) op alle 6 domeinen |
| 🔴 Onmiddellijk | Blokkeer xmlrpc.php via .htaccess op alle domeinen |
| 🔴 Onmiddellijk | Stel updatebeleid in — activeer automatische beveiligingsupdates |
| 🟠 Deze week | Voeg `DISALLOW_FILE_EDIT` toe aan alle wp-config.php bestanden |
| 🟠 Deze week | Maak `.htaccess` in alle `wp-content/uploads/` mappen met PHP-blokkering |
| 🟠 Deze week | Verwijder alle `readme.html` bestanden |
| 🟠 Deze week | Verwijder alle `.htaccess.bk` bestanden |
| 🟡 Binnenkort | Voeg `FORCE_SSL_ADMIN` toe aan wp-config.php |
| 🟡 Binnenkort | Schakel wp-cron.php uit en configureer echte systeemcron |
| 🟡 Binnenkort | Verwijder of blokkeer `wp-signup.php` en `wp-trackback.php` als niet gebruikt |
| 🟡 Binnenkort | Verwijder `WP_TEMP_DIR` definitie op brabantvandaag.nl of wijs naar een niet-publieke map |

---

## 6. Aanvullende Aanbeveling: Wachtwoorden Wijzigen

Omdat bevestigd is dat aanvallers admin-toegang hadden, moeten de volgende wachtwoorden worden gewijzigd:

- WordPress admin-wachtwoorden op alle 6 sites
- DirectAdmin-accountwachtwoord
- Database-wachtwoorden (vermeld in wp-config.php)
- FTP-wachtwoorden
- Email-wachtwoorden (imap/)

Tevens: wijzig de `AUTH_KEY`, `SECURE_AUTH_KEY` en andere salts in alle `wp-config.php` bestanden via [https://api.wordpress.org/secret-key/1.1/salt/](https://api.wordpress.org/secret-key/1.1/salt/). Dit logt alle bestaande sessies uit.

---

*Rapport gegenereerd op 3 april 2026 — aanvullend handmatig onderzoek van de database-inhoud (spam-posts, onbekende admin-gebruikers) wordt aanbevolen.*