
Ferramenta de enumeração e ataque Java RMI.
BaRMIe é uma ferramenta para enumerar e atacar serviços Java RMI (Remote Method Invocation).
Serviços RMI frequentemente expõem funcionalidades perigosas sem controles de segurança adequados, no entanto, serviços RMI tendem a passar despercebidos durante avaliações de segurança devido à falta de ferramentas de teste eficazes. Em 2008, Adam Boulton falou na AppSec USA (YouTube) e lançou algumas ferramentas de ataque RMI que desapareceram logo em seguida, mas mesmo com essas ferramentas, um ataque bem-sucedido de conhecimento zero depende de um ataque de força bruta significativo (~64 bits/9 quintilhões de possibilidades) sendo realizado pela rede.
O objetivo do BaRMIe é capacitar profissionais de segurança a identificar, atacar e proteger serviços RMI inseguros. Usando interfaces RMI parciais de software existente, o BaRMIe pode interagir diretamente com esses serviços sem primeiro forçar 64 bits pela rede.
Baixe a versão mais recente compilada e pronta para executar aqui: https://github.com/NickstaDB/BaRMIe/releases/latest
BaRMIe foi escrito para ajudar profissionais de segurança a identificar serviços RMI inseguros em sistemas nos quais o usuário tem permissão prévia para atacar. O acesso não autorizado a sistemas de computador é ilegal e o BaRMIe deve ser usado em conformidade com todas as leis relevantes. O não cumprimento pode levar a processo judicial. Os desenvolvedores do BaRMIe não assumem nenhuma responsabilidade e não se responsabilizam por qualquer uso indevido ou dano causado por este programa.
O uso do BaRMIe é direto. Execute o BaRMIe sem parâmetros para obter informações de uso.
$ java -jar BaRMIe.jar
▄▄▄▄ ▄▄▄ ██▀███ ███▄ ▄███▓ ██▓▓█████
▓█████▄ ▒████▄ ▓██ ▒ ██▒▓██▒▀█▀ ██▒▓██▒▓█ ▀
▒██▒ ▄██▒██ ▀█▄ ▓██ ░▄█ ▒▓██ ▓██░▒██▒▒███
▒██░█▀ ░██▄▄▄▄██ ▒██▀▀█▄ ▒██ ▒██ ░██░▒▓█ ▄
░▓█ ▀█▓ ▓█ ▓██▒░██▓ ▒██▒▒██▒ ░██▒░██░░▒████▒
░▒▓███▀▒ ▒▒ ▓▒█░░ ▒▓ ░▒▓░░ ▒░ ░ ░░▓ ░░ ▒░ ░
▒░▒ ░ ▒ ▒▒ ░ ░▒ ░ ▒░░ ░ ░ ▒ ░ ░ ░ ░
░ ░ ░ ▒ ░░ ░ ░ ░ ▒ ░ ░
░ ░ ░ ░ ░ ░ ░ ░
░ v1.0
Ferramenta de enumeração Java RMI.
Escrito por Nicky Bloor (@NickstaDB)
Aviso: BaRMIe foi escrito para ajudar profissionais de segurança a identificar
o uso inseguro de serviços RMI em sistemas nos quais o usuário tem
permissão prévia para atacar. O BaRMIe deve ser usado em conformidade
com todas as leis relevantes. O não cumprimento pode levar a processo
judicial. Os desenvolvedores não assumem nenhuma responsabilidade e
não se responsabilizam por qualquer uso indevido ou dano causado por
este programa.
Uso:
BaRMIe -enum [opções] [host] [porta]
Enumera serviços RMI no(s) endpoint(s) fornecido(s).
Nota: se -enum não for especificado, este é o modo padrão.
BaRMIe -attack [opções] [host] [porta]
Enumera e ataca o(s) alvo(s) fornecido(s).
Opções:
--threads O número de threads a usar para enumeração (padrão 10).
--timeout O timeout para operações de socket bloqueante (padrão 5.000ms).
--targets Um arquivo contendo alvos para escanear.
O arquivo deve conter um único host ou par host e porta
separados por espaço por linha.
Alternativamente, todos os formatos de saída do nmap são suportados. O BaRMIe irá
analisar a saída do nmap em busca da porta 1099, 'rmiregistry' ou
serviços 'Java RMI' para atacar.
Nota: [host] [porta] não suportado quando --targets é usado.
Confiabilidade:
Um sistema +/- é usado para indicar a confiabilidade do ataque da seguinte forma:
[+ ]: Indica um ataque específico da aplicação
[- ]: Indica um ataque JRE
[ + ]: Ataca métodos inseguros (como 'writeFile' sem autenticação)
[ - ]: Ataca desserialização Java (ou seja, parâmetros Object)
[ +]: Não requer dependências não padrão
[ -]: Dependências não padrão são necessárias
O modo de enumeração (-enum) extrai detalhes de objetos expostos por meio de um serviço de registro RMI e lista quaisquer ataques conhecidos que afetam o endpoint.
O modo de ataque (-attack) primeiro enumera os alvos fornecidos e, em seguida, fornece um sistema de menu para lançar ataques conhecidos contra serviços RMI.
Um único alvo pode ser especificado na linha de comando. Alternativamente, o BaRMIe pode extrair alvos de um arquivo de texto simples ou da saída do nmap.
Ótimo! Esta é sua oportunidade de ajudar a melhorar o BaRMIe! O BaRMIe depende de algum conhecimento das classes expostas via RMI, então contribuições ajudarão muito a melhorar o BaRMIe e a segurança dos serviços RMI.
Se você tiver acesso a arquivos JAR ou código-fonte da aplicação alvo, produzir um ataque é tão simples quanto compilar código contra os arquivos JAR relevantes. Recupere o objeto remoto relevante usando as classes LocateRegistry e Registry e chame os métodos desejados. Alternativamente, procure por métodos remotos que aceitam objetos arbitrários ou parâmetros não primitivos, pois estes podem ser usados para entregar payloads de desserialização. Mais documentação sobre ataque a RMI e produção de ataques para BaRMIe estará disponível em breve.
Alternativamente, entre em contato, fornecendo o máximo de detalhes possível, incluindo a saída do BaRMIe -enum e, idealmente, os arquivos JAR relevantes.
O BaRMIe é capaz de realizar três tipos de ataques contra serviços RMI. Uma breve descrição de cada um segue. Mais detalhes técnicos serão publicados em breve em https://nickbloor.co.uk/. Além disso, apresentei os resultados da minha pesquisa na 44CON 2017 e os slides podem ser encontrados aqui: BaRMIe - Poking Java's Back Door.
O primeiro e mais direto método de atacar serviços RMI inseguros é simplesmente chamar métodos remotos inseguros. Frequentemente, funcionalidades perigosas são expostas via RMI, que podem ser acionadas simplesmente recuperando a referência do objeto remoto e chamando o método perigoso. O código a seguir é um exemplo disso:
//Obtém uma referência ao serviço de registro RMI remoto
Registry reg = LocateRegistry.getRegistry(hostAlvo, portaAlvo);
//Obtém uma referência ao objeto RMI alvo
Foo bar = (Foo)reg.lookup(nomeObjeto);
//Chama o método remoto executeCommand()
bar.executeCommand(cmd);
Alguns serviços RMI não expõem funcionalidades perigosas, ou implementam controles de segurança como autenticação e gerenciamento de sessão. Se o serviço RMI expõe um método que aceita um Object arbitrário como parâmetro, então o método pode ser usado como ponto de entrada para ataques de desserialização. Alguns exemplos de tais métodos podem ser vistos abaixo:
public void setOption(String name, Object value);
public void addAll(List values);
Devido ao uso de serialização e ao tratamento inseguro de parâmetros de métodos no servidor, é possível usar qualquer método com tipos de parâmetro não primitivos como ponto de entrada para ataques de desserialização. O BaRMIe consegue isso usando proxies TCP para modificar os parâmetros dos métodos no nível da rede, essencialmente acionando invocações de método ilegais. Alguns exemplos de métodos vulneráveis podem ser vistos abaixo:
public void setName(String name);
public Long add(Integer i1, Integer i2);
public void sum(int[] values);
Os parâmetros de cada um desses métodos podem ser substituídos por um payload de desserialização à medida que a invocação do método passa por um proxy. Este ataque é possível porque o Java não tenta verificar se os parâmetros de método remoto recebidos pela rede são compatíveis com os tipos de parâmetro reais antes de desserializá-los.