Brute Force-Attacken auf WordPress Admin-Oberfläche stoppen

Gestern habe ich die zwei WordPress-Plugins Aryo Activity Log sowie WordPress User Login Notifier installiert, weil ich über erfolgreiche Logins auf die WordPress Admin-Oberfläche informiert werden möchte.

Zurückzuführen ist das auf die Paranoia eines Security Professionals sowie die Interessen einer Person, die von Metriken getrieben wird — peinlich nur, dass mir das erst 14 Jahre nach meinem ersten Blog-Artikel einfällt (wobei ich ja mein Blog anfänglich auf Blogger.com gehostet hatte und WordPress erst seit einigen Jahren verwende).

Da ich die E-Mail-Notifications bei erfolgreichen und fehlgeschlagenen Login-Versuchen mit dem ersten Plugin nicht zum Laufen gekriegt habe (andere Leute klagen vom denselben Problem), versuchte ich es mit dem zweiten Plugin. Und hiermit klappte es tadellos.

Leider sogar zu gut: In den letzten 24 Stunden habe ich über 250 E-Mail-Notifications zu fehlgeschlagenen Login-Versuchen erhalten.

Ich war mir nicht bewusst, dass es Bots da draussen gibt, welche derart penetrant versuchen, sich regelmässig auf WordPress-Installationen einzuloggen!

Um mir ein Bild von den Angriffen zu machen, habe ich kurzerhand die E-Mails im Verzeichnis von Apple Mail ausgewertet, welche vom Plugin gesendet wurden:

$ cd ~/Library/Mail/V5/%UUID%/INBOX.mbox/Blog.mbox/Security.mbox
$ grep -R "IP: " * | awk '{print $2}' | sort | uniq -c | sort -n
1 103.28.53.243
1 103.48.193.61
1 109.71.51.146
1 112.167.48.194
1 116.66.197.119
1 116.98.146.168
1 125.27.251.87
1 129.121.176.210
1 158.69.1.224
1 159.65.24.244
1 163.172.31.156
1 167.99.199.157
1 169.46.90.112
1 178.254.10.204
1 178.63.95.126
1 183.108.175.18
1 185.119.81.50
1 185.186.247.115
1 185.20.49.4
1 185.85.238.244
1 185.86.13.213
1 185.86.164.104
1 185.86.164.106
1 185.86.164.99
1 185.86.167.4
1 198.245.53.5
1 198.71.231.36
1 198.71.231.82
1 198.71.234.37
1 202.148.2.254
1 207.154.254.235
1 209.212.158.122
1 213.136.88.141
1 218.155.202.145
1 3.82.149.65
1 3.82.92.104
1 35.204.143.164
1 59.115.86.221
1 62.210.203.197
1 66.42.53.87
1 71.89.36.92
1 72.167.190.46
1 81.176.232.150
1 82.146.152.108
1 86.195.244.22
1 89.46.106.148
1 89.46.107.143
1 94.23.255.76
1 95.110.207.17
2 101.37.88.44
2 103.81.85.184
2 134.0.63.134
2 150.95.110.27
2 185.2.5.13
2 185.86.164.101
2 188.166.72.215
2 202.21.116.202
2 206.189.169.36
2 217.170.198.14
5 150.138.253.73
12 115.28.229.143
18 193.201.224.194
31 94.242.55.108
60 59.42.123.186
89 140.143.90.193

Die Top 5 Angreifer waren gemäss dieser Liste:

140.143.90.193 host meldet NXDOMAIN, gemäss WHOIS IP Lookup Tool gehört die IP Tencent, einem chinesischen Cloud-Provider

59.42.123.186 host meldet 186.123.42.59.broad.gz.gd.dynamic.163data.com.cn, ebenfalls eine IP aus China

94.242.55.108 host meldet NXDOMAIN, gemäss WHOIS IP Lookup Tool gehört die IP dem russischen Rechenzentrumsbetreiber Veesp

193.201.224.194 host meldet NXDOMAIN, gemäss WHOIS IP Lookup Tool gehört die IP „PE Tetyana Mysyk“ im IP-Block von Opa Telekom in der Ukraine

115.28.229.143 host meldet NXDOMAIN, gemäss WHOIS IP Lookup Tool gehört die IP Alibaba in China

Erstaunlich war auch, dass ich mit Limit Login Attempts ein WordPress-Plugin installiert habe, welches die Logins von einer bestimmten IP innerhalb einer bestimmten Zeit auf drei Versuche reduziert, einige IPs sich aber in derselben Minuten dutzende Male einzuloggen versucht haben. Entweder generiert das E-Mail-Script dutzende E-Mails, wenn es nur eins geben sollte, oder aber das Rate Limit funktioniert nicht oder nur verzögert. Da das Plugin offenbar nicht mit meiner WordPress-Version getestet wurde, habe ich mich entschieden, es zu deaktivieren und stattdessen Limit Login Attempts Reloaded zu installieren. Hoffen wir, dass dieser zusätzliche Schutz nun (wieder) funktioniert.

Noch erstaunlicher: Angriffe auf den Standard-Benutzername admin erschienen mir noch trivial, dass deutlich mehr Angriffe auf meinen persönlichen (!) Benutzernamen gerichtet waren, liessen mich mulmig werden — können Scripts diesen irgendwie in Erfahrung bringen, oder wird das manuell in die Angriffstools eingepflegt?

Ich habe nun nicht lange gefackelt und im Web-Root meiner WordPress-Installation die .htaccess-Datei folgendermassen angepasst:

...
<Files wp-login.php>
Order Deny,Allow
Deny from all

Allow from 1.2.3.4
Allow from 1.2.
</Files>
...

Quelle: Restrict WordPress Admin Access by IP Address

Ich habe für den Zugriff auf die PHP-Datei wp-login.php dasjenige IP-Subnetz whitegelistet, mit welchem ich mich normalerweise auf die Administrationsoberfläche verbinde. Alle anderen Requests werden vom Server ab sofort mit einem HTTP 403 Forbidden geblockt.

Diese Massnahme nützt aber natürlich nur etwas gegen Brute Force-Attacken von Leuten, die freundlicherweise die offizielle Eingangstüre benutzen wollen. Wenn im Programmcode von WordPress sonstige Schwachstellen vorhanden sind, ist im schlimmsten Fall gar kein Login nötig, um eine Installation zu kompromittieren.

Nachtrag

Trotz dieser Anpassungen hörten die E-Mail-Meldungen nicht auf. Wie ich schlussendlich herausfand, versuchen Angreifer auch, über die XML-RPC-Schnittstelle von WordPress Brute Force-Attacken durchzuführen (bei mir unter /xmlrpc.php). Diese Komponente, eigentlich für Pingbacks (ein anderes Blog verlinkt auf einen Artikel von mir) sowie externe Blog-Editoren gedacht, bietet ebenfalls eine Authentifizierungsmöglichkeit an. Und bei dieser greifen die oben ergriffenen Sicherheitsmassnahmen natürlich nicht.

Ich habe deshalb noch folgendes Plugin installiert und aktiviert (ACHTUNG: Das Plugin aktiviert sich nach der Installation nicht von selbst, es ist noch eine Benutzerinteraktion nötig: Klick auf „aktivieren“): Disable XML-RPC. Seit gestern Abend, 23:07 Uhr, herrscht nun endgültig Ruhe.