⚠️ LEGAL DISCLAIMER / AVISO LEGALThis toolkit is intended exclusively for authorized penetration testing, security research on systems you own or have explicit written permission to test, and educational/CTF purposes. Unauthorized use against systems you do not own or have permission to test is illegal and may result in criminal prosecution. The author assumes no liability for misuse.
- Overview
- Project Structure
- Component 1: WordPress Login Checker (wp.py)
- Component 2: Protect Uploads WordPress Plugin
- Requirements
- Installation
- Input Format
- Usage
- Output Files
- How It Works
- Troubleshooting
This toolkit contains two primary components for WordPress security assessment:
-
wp.py— A multi-process Python script that tests WordPress admin credentials across multiple sites simultaneously. It also detects whether authenticated accounts have access to plugin installation and file manager capabilities. -
Files/plugin/— A WordPress plugin ("Protect Uploads") that secures thewp-content/uploadsdirectory by creating index files and.htaccessrules to prevent directory browsing and unauthorized file listing.
uploadwebshell/
├── wp.py # WordPress credential checker script
├── README.md # This file
├── LICENSE # License file
└── Files/
├── plugin.zip # Packaged WordPress plugin (ready to upload)
├── plugin/
│ └── plugin/
│ ├── protect-uploads.php # Main plugin entry point
│ ├── uninstall.php # Cleanup on uninstall
│ ├── admin/
│ │ ├── class-protect-uploads-admin.php # Admin panel logic
│ │ └── assets/css/protect-uploads-admin.css
│ ├── includes/
│ │ ├── class-protect-uploads.php # Core plugin class
│ │ ├── class-protect-uploads-loader.php # Hook loader
│ │ ├── class-protect-uploads-i18n.php # Internationalization
│ │ ├── class-protect-uploads-activator.php
│ │ └── class-protect-uploads-deactivator.php
│ └── languages/ # Translation files (es_ES, fr_FR, it_IT)
└── theme/
└── theme/ # FitnessBase WordPress theme
wp.py is a Python script that tests WordPress login credentials against multiple sites in parallel using multiprocessing. It detects successful logins and checks for elevated capabilities like plugin installation access and WP File Manager plugin.
- Multi-process: 50 parallel workers by default for fast bulk testing
- Multi-path detection: Tries
/wp-login.php,/admin,/userlogin paths - UserPro support: Handles custom login forms from the UserPro plugin
- Capability detection: Checks if authenticated user can install plugins or access WP File Manager
- Auto encoding handling: Converts credential files to UTF-8 automatically
- Flexible input: Accepts file path as argument or via interactive prompt
A WordPress plugin that secures the wp-content/uploads directory against directory listing attacks. When activated, it creates protective index.php files and .htaccess rules in the uploads folder and all its subdirectories (up to 2 levels deep).
- Directory protection: Adds
index.php(blank redirect) in uploads directories - Apache hardening: Creates
.htaccesswithOptions -Indexesto block directory browsing - Status dashboard: Admin panel under WordPress Media menu showing protection status per directory
- HTTP check: Verifies protection is actually working by testing each protected URL
- Auto-scan: Scans all subdirectories on activation
- Multi-language: Supports Spanish (
es_ES), French (fr_FR), and Italian (it_IT) - Clean uninstall: Removes all created files when plugin is deactivated
| Requirement | Version |
|---|---|
| Python | 2.7 or 3.x |
| requests | >= 2.20.0 |
| urllib3 | >= 1.24.0 |
| Requirement | Version |
|---|---|
| WordPress | 4.0 or higher |
| PHP | 5.6 or higher |
| Apache | (for .htaccess support) |
pip install requests urllib32. Prepare your credentials file (see Input Format below)
python wp.py- Log in to your WordPress admin panel (
yourdomain.com/wp-admin) - Go to Plugins → Add New
- Click Upload Plugin
- Select
Files/plugin.zip - Click Install Now
- After installation, click Activate Plugin
- Extract
Files/plugin.zip - Upload the
plugin/folder to your server at:/wp-content/plugins/protect-uploads/ - Go to WordPress Admin → Plugins
- Find "Protect Uploads" and click Activate
wp plugin install /path/to/plugin.zip --activatePrepare a plain text file where each line follows this format:
domain.com/wp-login.php#username@password
Examples:
example.com/wp-login.php#admin@password123
myblog.com/wp-login.php#webmaster@MySecurePass!
shop.domain.com/wp-login.php#store_admin@letmein2024
192.168.1.20/wp-login.php#admin@admin
Rules:
- One credential set per line
- Format is strict:
domain/wp-login.php#username@password - Domain should not include
http://orhttps://(added automatically) - Lines that do not match the format are skipped
- Blank lines are ignored
python wp.pyYou will be prompted:
Enter path to credentials file: credentials.txt
python wp.py credentials.txt$ python wp.py combo.txt
[*] Loading credentials from combo.txt...
[*] Starting 50 workers...
[+] SUCCESS → example.com | admin | password123
[+] PLUGIN → shop.com | admin | pass456 [can install plugins]
[+] FILEMGR → blog.org | editor | mypass [has WP File Manager]
[-] FAILED → test.com | admin | wrongpassword
[-] FAILED → down.com | user | pass (connection error)
[*] Done. Results saved.
| File | Description |
|---|---|
Successfully_logged_WordPress.txt |
All valid WordPress logins |
plugin-install.txt |
Accounts with plugin installation capability |
filemanager.txt |
Accounts with WP File Manager plugin access |
Format inside output files:
domain.com | username | password
- Load file: Reads credentials, converts encoding to UTF-8
- Parse line: Extracts domain, username, password from format
- Normalize URL: Builds full URL with
https://prefix - Send POST: Submits login form to
/wp-login.php - Detect success: Checks response HTML for WordPress admin indicators (
#wpadminbar,/wp-admin/,log out) - Check capabilities:
- Requests
/wp-admin/plugin-install.php— checks for plugin install access - Checks for WP File Manager plugin presence
- Requests
- Save results: Writes to appropriate output file
- On activation: Scans
wp-content/uploads/and all subdirectories (2 levels) - For each directory: Creates:
index.php→ PHP file that redirects to home page.htaccess→ ContainsOptions -Indexesdirective
- Admin panel: Shows table with each protected directory, file status, and HTTP status code
- On deactivation: Removes all
index.phpand.htaccessfiles created by the plugin
| Problem | Solution |
|---|---|
ModuleNotFoundError |
Run pip install requests urllib3 |
| All results are failed | Check internet connection; verify credential file format |
| Script is slow | Increase worker count in source (default: 50) |
| UnicodeDecodeError | The script auto-converts encoding; ensure file is readable |
| Empty output files | All credentials may have failed; check the console output |
| Problem | Solution |
|---|---|
| Plugin won't activate | Check PHP version (requires 5.6+) and WordPress version (4.0+) |
| Protection not working | Ensure Apache mod_rewrite is enabled and .htaccess is allowed |
| Admin menu missing | Deactivate and reactivate the plugin |
| HTTP check shows error | Server may not allow loopback HTTP requests; disable firewall rules |
- Descripción General
- Estructura del Proyecto
- Componente 1: Verificador de Login de WordPress (wp.py)
- Componente 2: Plugin de WordPress Protect Uploads
- Requisitos
- Instalación
- Formato de Entrada
- Uso
- Archivos de Salida
- Cómo Funciona
- Solución de Problemas
Este toolkit contiene dos componentes principales para la evaluación de seguridad de WordPress:
-
wp.py— Un script Python multiproceso que prueba credenciales de administrador de WordPress en múltiples sitios de forma simultánea. También detecta si las cuentas autenticadas tienen acceso a la instalación de plugins y a capacidades de administrador de archivos. -
Files/plugin/— Un plugin de WordPress ("Protect Uploads") que asegura el directoriowp-content/uploadscreando archivos de índice y reglas.htaccesspara prevenir el listado de directorios y el acceso no autorizado a archivos.
uploadwebshell/
├── wp.py # Script verificador de credenciales WordPress
├── README.md # Este archivo
├── LICENSE # Archivo de licencia
└── Files/
├── plugin.zip # Plugin WordPress empaquetado (listo para subir)
├── plugin/
│ └── plugin/
│ ├── protect-uploads.php # Punto de entrada principal del plugin
│ ├── uninstall.php # Limpieza al desinstalar
│ ├── admin/
│ │ ├── class-protect-uploads-admin.php # Lógica del panel admin
│ │ └── assets/css/protect-uploads-admin.css
│ ├── includes/
│ │ ├── class-protect-uploads.php # Clase principal del plugin
│ │ ├── class-protect-uploads-loader.php # Cargador de hooks
│ │ ├── class-protect-uploads-i18n.php # Internacionalización
│ │ ├── class-protect-uploads-activator.php
│ │ └── class-protect-uploads-deactivator.php
│ └── languages/ # Archivos de traducción (es_ES, fr_FR, it_IT)
└── theme/
└── theme/ # Tema de WordPress FitnessBase
wp.py es un script Python que prueba credenciales de inicio de sesión de WordPress contra múltiples sitios en paralelo usando multiprocesamiento. Detecta inicios de sesión exitosos y verifica capacidades elevadas como acceso a instalación de plugins y WP File Manager.
- Multiproceso: 50 workers paralelos por defecto para pruebas masivas rápidas
- Detección multi-ruta: Prueba las rutas de login
/wp-login.php,/admin,/user - Soporte UserPro: Maneja formularios de inicio de sesión personalizados del plugin UserPro
- Detección de capacidades: Verifica si el usuario autenticado puede instalar plugins o acceder al WP File Manager
- Manejo automático de codificación: Convierte archivos de credenciales a UTF-8 automáticamente
- Entrada flexible: Acepta ruta de archivo como argumento o mediante solicitud interactiva
Un plugin de WordPress que asegura el directorio wp-content/uploads contra ataques de listado de directorios. Al activarse, crea archivos index.php protectores y reglas .htaccess en la carpeta de uploads y todos sus subdirectorios (hasta 2 niveles de profundidad).
- Protección de directorios: Añade
index.php(redirección en blanco) en los directorios de uploads - Fortalecimiento Apache: Crea
.htaccessconOptions -Indexespara bloquear el listado de directorios - Panel de estado: Panel de administración bajo el menú de Medios de WordPress que muestra el estado de protección por directorio
- Verificación HTTP: Comprueba que la protección realmente funciona probando cada URL protegida
- Escaneo automático: Escanea todos los subdirectorios en la activación
- Multi-idioma: Soporta Español (
es_ES), Francés (fr_FR) e Italiano (it_IT) - Desinstalación limpia: Elimina todos los archivos creados cuando el plugin se desactiva
| Requisito | Versión |
|---|---|
| Python | 2.7 o 3.x |
| requests | >= 2.20.0 |
| urllib3 | >= 1.24.0 |
| Requisito | Versión |
|---|---|
| WordPress | 4.0 o superior |
| PHP | 5.6 o superior |
| Apache | (para soporte de .htaccess) |
pip install requests urllib32. Preparar tu archivo de credenciales (ver Formato de Entrada)
python wp.py- Inicia sesión en tu panel de administración de WordPress (
tudominio.com/wp-admin) - Ve a Plugins → Añadir Nuevo
- Haz clic en Subir Plugin
- Selecciona
Files/plugin.zip - Haz clic en Instalar Ahora
- Después de la instalación, haz clic en Activar Plugin
- Extrae
Files/plugin.zip - Sube la carpeta
plugin/a tu servidor en:/wp-content/plugins/protect-uploads/ - Ve a Admin WordPress → Plugins
- Encuentra "Protect Uploads" y haz clic en Activar
wp plugin install /ruta/al/plugin.zip --activatePrepara un archivo de texto plano donde cada línea siga este formato:
dominio.com/wp-login.php#usuario@contraseña
Ejemplos:
ejemplo.com/wp-login.php#admin@contraseña123
miblog.com/wp-login.php#webmaster@MiContraseñaSegura!
tienda.dominio.com/wp-login.php#admin_tienda@entrar2024
192.168.1.20/wp-login.php#admin@admin
Reglas:
- Un conjunto de credenciales por línea
- El formato es estricto:
dominio/wp-login.php#usuario@contraseña - El dominio no debe incluir
http://ohttps://(se agrega automáticamente) - Las líneas que no coinciden con el formato se omiten
- Las líneas en blanco se ignoran
python wp.pySe te pedirá:
Ingresa la ruta al archivo de credenciales: credenciales.txt
python wp.py credenciales.txt$ python wp.py combo.txt
[*] Cargando credenciales desde combo.txt...
[*] Iniciando 50 workers...
[+] ÉXITO → ejemplo.com | admin | contraseña123
[+] PLUGIN → tienda.com | admin | pass456 [puede instalar plugins]
[+] FILEMGR → blog.org | editor | mipass [tiene WP File Manager]
[-] FALLIDO → test.com | admin | contraseñamala
[-] FALLIDO → caido.com | usuario | pass (error de conexión)
[*] Completado. Resultados guardados.
| Archivo | Descripción |
|---|---|
Successfully_logged_WordPress.txt |
Todos los inicios de sesión válidos de WordPress |
plugin-install.txt |
Cuentas con capacidad de instalación de plugins |
filemanager.txt |
Cuentas con acceso al plugin WP File Manager |
Formato dentro de los archivos de salida:
dominio.com | usuario | contraseña
- Cargar archivo: Lee las credenciales, convierte la codificación a UTF-8
- Analizar línea: Extrae dominio, usuario y contraseña del formato
- Normalizar URL: Construye la URL completa con prefijo
https:// - Enviar POST: Envía el formulario de login a
/wp-login.php - Detectar éxito: Verifica en el HTML de respuesta los indicadores del admin de WordPress (
#wpadminbar,/wp-admin/,cerrar sesión) - Verificar capacidades:
- Solicita
/wp-admin/plugin-install.php— verifica acceso a instalación de plugins - Comprueba la presencia del plugin WP File Manager
- Solicita
- Guardar resultados: Escribe en el archivo de salida correspondiente
- Al activar: Escanea
wp-content/uploads/y todos los subdirectorios (2 niveles) - Para cada directorio: Crea:
index.php→ Archivo PHP que redirige a la página de inicio.htaccess→ Contiene la directivaOptions -Indexes
- Panel de administración: Muestra tabla con cada directorio protegido, estado de archivos y código de estado HTTP
- Al desactivar: Elimina todos los archivos
index.phpy.htaccesscreados por el plugin
| Problema | Solución |
|---|---|
ModuleNotFoundError |
Ejecuta pip install requests urllib3 |
| Todos los resultados fallan | Verifica la conexión a internet; comprueba el formato del archivo de credenciales |
| El script es lento | Aumenta el número de workers en el código fuente (por defecto: 50) |
| UnicodeDecodeError | El script convierte la codificación automáticamente; asegúrate de que el archivo sea legible |
| Archivos de salida vacíos | Todas las credenciales pueden haber fallado; revisa la salida de la consola |
| Problema | Solución |
|---|---|
| El plugin no se activa | Verifica la versión de PHP (requiere 5.6+) y WordPress (4.0+) |
| La protección no funciona | Asegúrate de que Apache mod_rewrite esté habilitado y .htaccess esté permitido |
| Menú de administración faltante | Desactiva y reactiva el plugin |
| La verificación HTTP muestra error | El servidor puede no permitir solicitudes HTTP de loopback; deshabilita las reglas del firewall |
This project is licensed under the MIT License. See LICENSE for details.
Este proyecto está bajo la Licencia MIT. Ver LICENSE para más detalles.