
Um write-up sobre a box Steel Mountain do TryHackMe.com e exploit para CVE-2014-6287
Um write-up sobre a máquina Steel Mountain do TryHackMe.com e exploit para CVE-2014-6287
Não levo crédito pela descoberta e exploração original desta vulnerabilidade. Obrigado às seguintes pessoas!
Descoberta:
Daniele Linguaglossa
Autor do Módulo Metasploit:
Muhamad Fadzil Ramli
Sala e Autor do TryHackMe:
https://tryhackme.com/room/steelmountain
https://tryhackme.com/p/tryhackme
Referências:
https://nvd.nist.gov/vuln/detail/CVE-2014-6287
https://github.com/rapid7/metasploit-framework/blob/master/modules/exploits/windows/http/rejetto_hfs_exec.rb
https://subscription.packtpub.com/book/networking_and_servers/9781786463166/1/ch01lvl1sec20/vulnerability-analysis-of-hfs-2-3
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-6287
https://www.tutorialspoint.com/pascal/pascal_functions.htm
Não sou, de forma alguma, um profissional de segurança experiente. Isso significa que posso fornecer algumas informações incorretas. Se você é um profissional experiente/pesquisador experiente e vê algo que está incorreto, por favor me avise para que eu possa voltar, estudar o que errei e fornecer a informação correta. Isso é benéfico para mim e também para outros pesquisadores novatos que possam tropeçar neste write-up. Se você encontrar informações erradas que eu escrevi, entre em contato comigo pelo e-mail [email protected] para que eu possa corrigi-las. Obrigado!
O Rejetto file server (também conhecido como HFS) é um programa de compartilhamento de arquivos usado para publicar e compartilhar arquivos em uma rede. Na versão 2.3, havia uma vulnerabilidade que permitia a um atacante executar comandos do sistema inserindo um byte nulo no parâmetro de busca, conforme descrito em CVE-2014-6287. O código não processa corretamente um byte nulo com sua configuração de regex (Expressão Regular) e, portanto, leva a uma vulnerabilidade de execução remota de código.
A vulnerabilidade pode ser encontrada na função findMacroMarker, que se origina do arquivo parserLib.pas. .pas é a extensão de arquivo da linguagem de programação Pascal. No momento em que escrevo isto, ainda não codifiquei nada em Pascal. Vamos dar uma olhada no trecho de código e analisar o que ele faz!
function findMacroMarker(s:string; ofs:integer=1):integer;
begin result:=reMatch(s, '\{[.:]|[.:]\}|\|', 'm!', ofs) end;
A primeira linha de código é uma declaração de uma função chamada findMacroMarker que recebe dois parâmetros. Em Pascal, o tipo de dado dos parâmetros deve ser declarado, portanto s:string significa que a variável s é uma string. Isso também é o caso da variável ofs com o tipo de dado integer. À direita dos parâmetros, vemos um caractere de dois-pontos seguido por integer. Isso é conhecido como o tipo da função. O ponto e vírgula marca o fim dessa linha de código. A primeira palavra na próxima linha de código é begin. Isso diz ao compilador onde a função começa. Continuando, vemos uma variável chamada result seguida do operador de atribuição :=. A variável result é atribuída à função reMatch. Não encontrei nada sobre reMatch na internet, então presumo que seja uma função personalizada escrita em algum outro lugar do HFS. Felizmente para nós, a função é autoexplicativa. reMatch é claramente uma abreviação de correspondência de expressão regular (regular expression match), seguida pelo padrão regex que ela procura, o que é considerado no parâmetro da função reMatch, bem como nos parâmetros variáveis iniciais definidos na primeira linha de código. No final da segunda linha, a palavra end é usada para definir o fim da função para o compilador.
A vulnerabilidade é encontrada no padrão regex, conforme descrito acima na função reMatch. O regex não consegue lidar corretamente com um byte nulo %00. Quando passamos um comando de sistema com um byte nulo prefixado, a função encontrará o bug e executará o comando no computador host. Para explorar essa vulnerabilidade, tudo o que precisamos fazer é passar o byte nulo no parâmetro de busca de uma requisição GET seguido por {.exec|code.} (code sendo o comando que você deseja executar) via URL, desta forma:
http://(IP-Address/DomainName)/?search==%00{.exec|CommandGoesHere.}.
Vamos começar com uma varredura de portas via rustscan. Prefiro o rustscan para obter uma visão rápida da superfície de ataque.

Temos uma quantidade considerável de portas abertas aqui. Agora vamos nos aprofundar com o nmap e descobrir quais serviços estão escutando nessa variedade de portas para encontrar nosso serviço explorável.

Temos um serviço chamado Microsoft Windows RPC rodando nas portas mais altas. RPC é uma chamada de procedimento remoto (remote procedure call). Isso permite que processos do Windows se comuniquem através de uma rede ou internamente dentro do próprio computador. Continuando, temos alguns servidores web diferentes rodando nas portas 80 e 8080. Nas portas 5985 e 47001, o Microsoft Httpapi Httpd está presente, o que permite que aplicativos se comuniquem via HTTP sem a necessidade do Microsoft IIS (Internet Information Server). O Nmap detecta um servidor web potencialmente rodando na porta 3389; no entanto, não consegui me conectar via HTTP ou SSL. Vamos nos conectar ao servidor web na porta 80, já que é a porta padrão para o protocolo HTTP.

Na porta 80, somos apresentados a uma página web que exibe o logotipo da empresa Steel Mountain e uma foto rotulada como funcionário do mês. Se abrirmos as ferramentas de desenvolvedor web, podemos ver que a foto está identificada como BillHarper.png, o que nos dá a resposta para nossa primeira pergunta. Vamos nos conectar aos outros serviços em escuta e ver o que podemos encontrar.

Quando nos conectamos ao serviço na porta 5985, recebemos o código de erro HTTP 404. O código de erro 404 significa que o servidor não consegue encontrar o recurso solicitado. Não há nada de interessante aqui. Vamos para o próximo.

SIM! Agora isto parece interessante. Na porta 8080, temos algum tipo de serviço de compartilhamento de arquivos. Vamos explorar e ver se conseguimos encontrar mais informações sobre esse serviço. Se olharmos no canto inferior esquerdo, podemos ver um nome e o que parece ser um número de versão, assim: HttpFileServer 2.3. Vamos enumerar mais.

Se clicarmos no link rotulado como HttpFileServer 2.3, somos direcionados para uma página web com o nome do software que está rodando na porta 8080. Nesse caso, temos o Rejetto HFS HTTP File Server. Vamos verificar a outra porta, a 47001, para cobrir todas as bases. Se não encontrarmos nada útil, podemos voltar ao Rejetto e começar a procurar CVEs conhecidos.

Parece que temos outro 404 na porta 47001. Vamos começar a procurar CVEs para o Rejetto HFS 2.3.
