⚠️ Achtung — Risiko bei öffentlichen Dev-Hosts
Wenn du Entwicklungs- oder Testserver (z. B. per DynDNS / no‑ip + Portforward) öffentlich erreichbar machst, laufen automatisierte Scanner und Bots dauerhaft durchs Netz. Wird deine WordPress‑Instanz kompromittiert (fremde Plugins, Webshells, Backups im Webroot), handle sofort: isolieren, Beweise sichern, Schlüssel rotieren, bereinigen.
Dieses How‑To ist für eigene Systeme gedacht. Führe Befehle nur auf Geräten aus, die du kontrollierst.
Kurz-Einleitung (1‑Satz)
Dieses Dokument fasst Schnellmaßnahmen (Contain, Collect, Clean), forensische Prüfungen, WordPress‑Cleanup, Firewall‑ & Fail2Ban‑Basics und langfristige Härtung zusammen — copy & paste‑fähig für MarsEdit.
Sofortmaßnahmen (Containment)
- Isolieren: Portforwarding im Router sofort deaktivieren; Maschine vom Netz trennen oder UFW/Firewall hart schließen.
# Beispiel: alle eingehenden Verbindungen sperren (Linux/UFW)
sudo ufw default deny incoming
sudo ufw enable
- Wichtige Schlüssel & Passwörter rotieren
- SSH‑Keys erneuern (Clients & Server).
- WP‑Admin, DB‑Benutzer, Hosting‑Passwörter ändern.
- Beweise sichern (offline)
# Beispiel: gesamtes Webroot archivieren (auf externes Laufwerk)
cd /Users/andy/Programmierung
tar -czf /Volumes/BackupDrive/codekeks-infected-$(date +%F).tgz codekeks.test
# Apache / MAMP Logs sichern
cp /Applications/MAMP/logs/* /Volumes/BackupDrive/codekeks-logs-$(date +%F)/ || true
- Kein Neustart/kein Aufräumen, bevor gesicherte Kopien erstellt sind (für Forensik).
Erste Forensik-Checks (Copy/Paste)
Auf dem Mac mini (MAMP Pro):
tail -n 200 "/Applications/MAMP/logs/apache_error.log"
tail -n 200 "/Applications/MAMP/logs/apache_ssl_error.log"
lsof -i -nP | grep LISTEN
openssl s_client -connect 127.0.0.1:443 -servername codekeks.test </dev/null | openssl x509 -noout -subject -issuer -dates
Auf Linux‑Server (falls vorhanden):
sudo grep "Accepted publickey" /var/log/auth.log || true
sudo ss -tulpen
awk '{print $1}' /var/log/apache2/access.log | sort | uniq -c | sort -nr | head -n 40
Suche nach typischen Backdoors / Patterns:
grep -RIn --exclude-dir=node_modules -e "eval(" -e "base64_decode" -e "shell_exec(" /path/to/site || true
WordPress Cleanup (Schrittfolge)
- Plugins prüfen & entfernen (besonders File‑Manager‑Plugins und unbekannte Tools):
ls -la wp-content/plugins
rm -rf wp-content/plugins/file-manager-advanced wp-content/plugins/filester
- Core neu aufspielen
cd /tmp
curl -O https://wordpress.org/latest.tar.gz
tar -xzf latest.tar.gz
# Backup & ersetze wp-admin + wp-includes
mv /path/to/site/wp-admin /path/to/site/wp-admin.bak
mv /path/to/site/wp-includes /path/to/site/wp-includes.bak
cp -a wordpress/wp-admin /path/to/site/
cp -a wordpress/wp-includes /path/to/site/
- DB: Admin‑Passwort / Users prüfen (MySQL Beispiel):
USE your_wp_db;
UPDATE wp_users SET user_pass = MD5('SehrSicheresPasswort!') WHERE user_login = 'admin';
DELETE FROM wp_users WHERE user_login = 'unbekannter_user';
- Dateirechte korrigieren:
cd /path/to/site
find . -type d -exec chmod 755 {} \;
find . -type f -exec chmod 644 {} \;
- Zugriff auf /wp-admin einschränken (temporär)
# Beispiel .htaccess / VirtualHost
<Directory "/path/to/site/wp-admin">
Require ip 123.123.123.123
Require ip ::1
</Directory>
Firewall, Fail2Ban & Basis-Härtung
UFW Basis:
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 2222/tcp # Beispiel SSH-Port
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status verbose
Fail2Ban (einfach):
sudo apt update && sudo apt install fail2ban -y
# /etc/fail2ban/jail.local anlegen und sshd aktivieren
sudo systemctl restart fail2ban
Langfristig: 2FA für WP, regelmässige Updates, nur notwendige Plugins, Backups extern.
Wie Scanner/Bots arbeiten (kurze Erklärung)
- Netzweite Scanner schicken massenhaft Requests an IP‑Räume und bekannte Hostnamen (z. B.
.test
nicht relevant, aber public DynDNS ist Ziel). - Sie testen Pfade wie
/wp-login.php
,/xmlrpc.php
, bekannte Plugin‑URLs (z. B. File‑Manager), versuchen Brute‑Force auf Logins, oder uploaden Webshells über unsichere Upload‑Funktionen. - Portscanner prüfen offene Ports (80, 443, 21, 22, 3306, 10000 etc.).
- Erkennbare Muster: viele 404/POST‑Versuche, ungewöhnliche User‑Agents, viele Request/sec von einer IP.
Ein simpler Portscanner (nur gegen eigene Hosts!)
# scan_safe.py -- nur für eigene Geräte
import socket, sys, time
target = sys.argv[1] if len(sys.argv)>1 else '127.0.0.1'
for port in range(1,1025):
s = socket.socket()
s.settimeout(0.3)
try:
if s.connect_ex((target, port)) == 0:
print(f"OPEN {port}")
except:
pass
s.close()
time.sleep(0.02)
Quick‑Recovery Plan
- Maschine offline/Portforwarding aus.
- Backup der kompromittierten Instanz für Beweise.
- Keys & Passwörter rotieren.
- Saubere Neuinstallation (oder sauberes Backup auf neues Hostsystem).
- Monitoring + Härtung aktivieren. Wenn rechtlich relevant oder unsicher: Incident‑Response Profis hinzuziehen.
Nützliche Quick‑Commands (Zusammenfassung)
# Suchen nach verdächtigen Patterns
grep -RIn -e "eval(" -e "base64_decode" -e "shell_exec(" /path/to/site || true
# Häufige IPs aus access.log
awk '{print $1}' /var/log/apache2/access.log | sort | uniq -c | sort -nr | head -n 40
# Zertifikat prüfen
openssl s_client -connect 127.0.0.1:443 -servername codekeks.test </dev/null | openssl x509 -noout -subject -issuer -dates
Schlussbemerkung
Du hast schon gute Dinge gemacht: Portforwarding aus, Keys rotieren, Backups behalten. Konzentriere dich als nächstes auf: keine öffentlichen Dev‑Hosts, VPN/SSH‑Tunnel wenn externer Zugriff nötig ist, saubere WP‑Core/Plugins aus offiziellen Quellen, 2FA und Monitoring. Bei Zweifeln: lieber auf ein frisches System migrieren.
Erstellt für codekeks — sichere Bastelpraktiken & bessere Defaults für Hobby‑DevOps.*