Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2025-49132-PoC — Exploit de prueba de concepto para CVE-2025-49132 que permite la ejecución remota de código sin autenticación en Pterodactyl Panel <= 1.11.10 mediante inyección del parámetro locale. Incluye modos de verificación y explotación. | Kitploit
Herramientas/GitHubGitHub/kerburenthusiasm/cve-2025-49132-poc
Generación de PayloadsAnálisis de VulnerabilidadesAnálisis de CódigoExplotaciónExplotación de Aplicaciones WebPruebas de Penetración
GitHubkerburenthusiasm/cve-2025-49132-poc

CVE-2025-49132-PoC

Exploit de prueba de concepto para CVE-2025-49132 que permite la ejecución remota de código sin autenticación en Pterodactyl Panel <= 1.11.10 mediante inyección del parámetro locale. Incluye modos de verificación y explotación.

Ver Repositorio
2hace 7 mesesAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

CVE-2025-49132-PoC

Prueba de concepto para CVE-2025-49132 para Ejecución Remota de Código en Pterodactyl Panel <= 1.11.10

Este PoC toma referencias de

  • https://www.exploit-db.com/exploits/52341
  • https://github.com/63square/CVE-2025-49132

Uso

root@kitploit:~
# Check if the web application is vulnerable
python3 poc.py -u <url> -m check

# Do something funny 
python3 poc.py -u <url> -m exploit -p <path_to_pear_dir> -t <path_to_write_to>

Detalles técnicos

Analizando el git diff de LocaleController.php entre v1.11.10 y v1.11.11 (link), podemos ver que el controlador acepta los parámetros locale y namespace sin ninguna validación ni sanitización.

Para entender por qué esto es peligroso, veremos el enrutamiento configurado en panel/routes/base.php. La ruta elimina explícitamente el middleware relacionado con la autenticación, permitiendo a usuarios no autenticados llamar a /locales/locale.json y proporcionar los parámetros de consulta requeridos como locale y namespace. Esto significa que estos parámetros ahora están controlados por el usuario.

root@kitploit:~
Route::get('/locales/locale.json', Base\LocaleController::class)
    // Remove authentication middleware for this endpoint
    ->withoutMiddleware(['auth', RequireTwoFactorAuthentication::class]);

Volviendo a LocalController.php, la siguiente línea de código proporciona la magia de RCE.

root@kitploit:~
$this->loader->load($locale, str_replace('.', '/', $namespace))

La función load proviene del framework de traducción de Laravel (aquí):

root@kitploit:~
public function load($locale, $group, $namespace = null) # 1
{
    if ($group === '*' && $namespace === '*') { # 2
        return $this->loadJsonPaths($locale);
    }

    if (is_null($namespace) || $namespace === '*') { # 3
        return $this->loadPaths($this->paths, $locale, $group); # 4
    } 

    return $this->loadNamespaced($locale, $group, $namespace);
}
  • En #1, vemos que la función load toma 3 argumentos. Aunque confuso al principio, el valor str_replace('.', '/', $namespace) en realidad se pasa al segundo argumento $group.
  • En #2, $namespace nunca será * ya que siempre será NULL. De manera similar, $group nunca será * ya que podemos controlar lo que se pasa aquí.
  • En #3, dado que $namespace es null, se tomará la rama resultando en la ejecución de loadPaths en #4.

Entendiendo lo anterior, pasamos a analizar loadPaths donde ocurre la magia real

root@kitploit:~
protected function loadPaths(array $paths, $locale, $group)
{
    return (new Collection($paths))
    ->reduce(function ($output, $path) use ($locale, $group) {
        if ($this->files->exists($full = "{$path}/{$locale}/{$group}.php")) { # 1
            $output = array_replace_recursive($output, $this->files->getRequire($full)); # 2
        }

        return $output;
    }, []);
}
  • En #1, el cargador construye el nombre de archivo de traducción esperado añadiendo .php.
  • En #2, si ese archivo existe, se carga mediante getRequire(), que ejecuta el archivo PHP y devuelve su array.

Dado que controlamos el parámetro de URL namespace, podemos influir en qué archivo intenta cargar la aplicación. Al proporcionar un valor que corresponde a un script .php, podemos lograr que el servidor ejecute ese script. Por ejemplo, para cargar phpinfo.php, podemos establecer el parámetro en: namespace=phpinfo

Explicaciones del PoC

El PoC intenta realizar escritura arbitraria de archivos a través de pearcmd.php. Este método ha sido utilizado en muchos PoCs similares y en investigaciones de seguridad

  • https://labs.watchtowr.com/form-tools-we-need-to-talk-about-php/
  • https://medium.com/@lashin0x/local-file-inclusion-to-remote-code-execution-rce-bea0ec06342a

Tenga en cuenta que pearcmd.php puede estar ubicado en diferentes directorios como

  • /usr/share/php/pearcmd.php
  • /usr/share/php/PEAR/pearcmd.php
  • /usr/lib/php/pearcmd.php

y muchos más.

El archivo que se escribirá contendrá el típico código PHP malicioso.

Descargo de responsabilidad / Uso responsable

Solo para pruebas autorizadas. No lo use en sistemas que no posea o para los que no tenga permiso explícito para probar.
Usted es responsable de cumplir con todas las leyes aplicables; los autores no asumen ninguna responsabilidad por el mal uso.

Problema

La biblioteca requests de Python es demasiado útil, ya que codifica caracteres en la URL proporcionada. Pasé mucho tiempo tratando de resolver este problema y terminé usando curl directamente. Agradecería si alguien puede brindar ayuda para solucionar este problema.

Descargar herramienta