WpShellUploader es una aplicación de escritorio WPF (Windows Presentation Foundation) desarrollada en C# (.NET 6) diseñada para la subida automatizada de web shells a sitios WordPress. La herramienta primero valida las credenciales, luego intenta cargar un shell PHP utilizando 9 métodos diferentes de upload, y finalmente verifica que el shell esté accesible.
El proyecto sigue el patrón de diseño MVVM (Model-View-ViewModel):
WpShellUploader/
├── Models/ → Modelos de datos (WpTarget)
├── Views/ → Interfaz gráfica XAML (MainWindow)
├── ViewModels/ → Lógica de la UI (MainViewModel, DynamicSemaphore)
├── Services/ → Servicios de negocio (ShellUploadService, AdaptiveThreadManager, FileService)
├── Converters/ → Conversores de valores para bindings XAML
├── Themes/ → Tema visual oscuro (DarkTheme.xaml)
├── Files/ → Archivos de payload (index.php, plugin.zip, theme.zip)
├── App.xaml → Configuración global de la aplicación
└── WpShellUploader.csproj → Archivo de proyecto .NET 6
La herramienta intenta subir el shell utilizando 9 métodos diferentes en orden de fiabilidad:
| # | Método | Descripción |
|---|---|---|
| M1 | Plugin Upload | Sube un plugin ZIP malicioso vía /wp-admin/update.php?action=upload-plugin |
| M2 | Theme Upload | Sube un tema ZIP malicioso vía /wp-admin/update.php?action=upload-theme |
| M3 | Theme Editor | Inyecta código en el editor de temas (/wp-admin/theme-editor.php) |
| M4 | Plugin Editor | Inyecta código en el editor de plugins (/wp-admin/plugin-editor.php) |
| M5 | Media REST | Sube archivo vía la API REST de WordPress (/wp-json/wp/v2/media) |
| M6 | File Manager | Utiliza plugins de file manager si están instalados |
| M7 | Ajax Upload | Sube vía endpoint AJAX de WordPress (admin-ajax.php) |
| M8 | XML-RPC | Sube archivo vía el método XML-RPC wp.uploadFile |
| M9 | Direct Write | Intenta escribir directamente en el servidor |
Cada método incluye verificación posterior para confirmar que el shell es accesible.
El AdaptiveThreadManager utiliza una estrategia similar al control de congestión TCP:
-
AIMD (Additive Increase, Multiplicative Decrease):
- Incremento aditivo: Aumenta hilos gradualmente cuando la red responde bien
- Decremento multiplicativo: Reduce drásticamente cuando detecta problemas
-
Auto-detección inicial:
- Analiza los cores de CPU del sistema
- Para tareas I/O (HTTP), la concurrencia óptima es mucho mayor que los cores de CPU
- Fórmula base:
cores × 10para mínimo,cores × 30para máximo
-
Ajuste dinámico en tiempo real:
- Monitoriza éxitos/fallos de red
- Diferencia entre errores de login (no es error de red) y timeouts reales
- Ajusta cada intervalo basándose en métricas de rendimiento
-
Modo manual: Se puede especificar un número fijo de hilos (0 = auto-detect)
Implementación personalizada de un semáforo que puede redimensionarse en tiempo de ejecución:
- Incremento: Libera permisos adicionales inmediatamente
- Decremento: Los permisos se consumen naturalmente cuando los workers terminan
- Thread-safe: Protegido con
lockpara operaciones de resize
Antes de intentar el upload, valida las credenciales usando:
wp.getUsersBlogs— Verificación de loginwp.getProfile— Obtención de rol y capacidades- Detección de rol (Administrator, Editor, Author, etc.)
Después de cada método de upload:
- Construye la URL esperada del shell
- Hace una petición GET al shell
- Busca un marcador específico en la respuesta
- Confirma que el shell está operativo
Acepta credenciales en los mismos formatos que WpSiteChecker:
| Formato | Ejemplo |
|---|---|
Hash (# + @) |
https://ejemplo.com#usuario@contraseña |
Pipe (|) |
https://ejemplo.com|usuario|contraseña |
Em-dash (–) |
https://ejemplo.com–usuario–contraseña |
ULP/Colon (:) |
ejemplo.com/wp-login.php:usuario:contraseña |
El proyecto incluye archivos de payload en la carpeta Files/:
| Archivo | Descripción |
|---|---|
index.php |
Shell PHP ofuscado (payload principal) |
plugin.zip |
Plugin WordPress empaquetado con el shell |
theme.zip |
Tema WordPress empaquetado con el shell |
plugin/ |
Directorio del plugin descomprimido |
theme/ |
Directorio del tema descomprimido |
La interfaz muestra:
- Total de targets en el archivo
- Procesados / Login OK / Shell OK
- Login fallido / Upload fallido / Timeouts
- Administradores / Editores / Autores
- Hilos activos / Hilos óptimos
- Tasa de éxito (% shells sobre procesados)
- Tasa de login (% logins sobre procesados)
- Velocidad (sitios/segundo)
- Progreso (barra porcentual)
- Tiempo transcurrido (formato HH:MM:SS)
- Modo de hilos (Auto/Manual)
Los resultados se guardan en Results/Results_YYYY-MM-DD_HH-mm-ss/:
| Archivo | Contenido |
|---|---|
login_ok.txt |
Logins exitosos |
shells.txt |
URLs de shells subidos |
shells_full.txt |
Shells con método y credenciales completas |
login_failed.txt |
Logins fallidos con error |
upload_failed.txt |
Login OK pero upload fallido |
administrators.txt |
Cuentas de administrador |
editors.txt |
Cuentas de editor |
authors.txt |
Cuentas de autor |
method_*.txt |
Resultados por método de upload |
Successfully_logged_WordPress.txt |
Login exitoso formato hash |
- Importar archivo — Seleccionar archivo de credenciales
- Iniciar/Detener procesamiento
- Copiar shells al portapapeles (todas las URLs de shells)
- Abrir carpeta de resultados en el explorador
- Filtrar por rol (All, Administrator, Editor, Author)
- Auto Threads toggle — Activar/desactivar threading adaptativo
- Configurar timeout (5-120 segundos)
- Configurar hilos (0=auto hasta 500)
- Log de actividad con timestamps (máximo 500 entradas, orden inverso)
El sistema diferencia correctamente entre tipos de error:
| Tipo de Error | ¿Es error de red? | Efecto en threading |
|---|---|---|
| Login incorrecto | No — el servidor respondió | No penaliza hilos |
| Timeout | Sí — el servidor no respondió | Reduce hilos |
| Conexión rechazada | Sí — no se pudo conectar | Reduce hilos |
| Host no encontrado | Sí — DNS falló | Reduce hilos |
- Lectura asíncrona del archivo línea por línea
- No carga el archivo completo en memoria
- Producer-consumer pattern con
DynamicSemaphore
- SSL/TLS permisivo: Acepta certificados autofirmados
- User-Agent rotativo: Emula navegadores reales
- Nonce extraction: Extrae tokens de seguridad de WordPress para cada operación
- Descompresión automática: GZip y Deflate
- Manejo de redirecciones y cookies
- Cancelación segura: Soporte completo de
CancellationToken
- Framework: .NET 6 (Windows)
- Tipo de aplicación: WPF (Windows Presentation Foundation)
- Dependencias:
System.Text.Jsonv8.0.5 - Sistema operativo: Windows 10/11
- Requisito: Carpeta
Files/conindex.php(shell PHP)
1. La aplicación carga el shell desde Files/index.php
2. Importar archivo de credenciales (.txt)
3. Configurar hilos (0=auto, 1-500) y timeout (5-120s)
4. Iniciar procesamiento:
a. Inicializar AdaptiveThreadManager
b. Para cada target (streaming):
i. Parsear credenciales (multi-formato)
ii. Validar login vía XML-RPC
iii. Si login OK: detectar rol
iv. Intentar 9 métodos de upload en secuencia
v. Verificar shell accesible
vi. Guardar resultado organizado
c. Ajustar hilos dinámicamente (AIMD)
5. Mostrar estadísticas en tiempo real
6. Al finalizar: resumen final con velocidad y tasas