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
CVE-2022-21445-for-12.2.1.3.0-Weblogic | Kitploit
Ferramentas/GitHubGitHub/hienkiet/cve-2022-21445-for-12.2.1.3.0-weblogic
Análise de VulnerabilidadesAnálise de CódigoExploraçãoExploração de Aplicações WebTestes de PenetraçãoFerramenta de Acesso RemotoDesenvolvimento de Payloads
GitHubhienkiet/cve-2022-21445-for-12.2.1.3.0-weblogic

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

CVE-2022-21445-for-12.2.1.3.0-Weblogic

Ver Repositório
53há 2 anosAinda não revisado

Visão geral

CVE-2022-21445 (pontuação CVSS 9,8), a vulnerabilidade é uma desserialização de dados não confiáveis, identificada como existente no componente ADF Faces, que pode ser explorada remotamente por hackers sem necessidade de autenticação (pre-authentication) para executar RCE.

A vulnerabilidade acima foi descoberta por 2 especialistas em segurança cibernética, PeterJson da VNG Corporation e Nguyen Jang da VNPT. A Oracle recebeu esse relatório em outubro de 2021 e levou cerca de 6 meses, ou seja, até abril de 2022, para lançar a correção.

Neste artigo, a exploração concentra-se no Oracle Bussiness Intelligence versão 12.2.1.4.0

Análise - Reprodução da vulnerabilidade

Configuração do ambiente

Lado da máquina vítima/alvo

Pré-requisito: Instale Windows 10+ Pro ou Windows Home (x64) com licença ativada ou use Windows Server (de preferência, use o da Oracle)

Passo 1: Instale o Java, versão jdk 8u112 ou superior (8Ux), link de download: JDKv8U112

  • Adicione JAVA_HOME com o caminho apontando para o diretório jdk (não jre) Imagem 1.1: Instalar Java

Passo 2: Instale o Oracle Database 19c, link de download: Oracle 19c

  1. Prepare uma pasta para instalar o banco de dados, crie um caminho como o abaixo e extraia o arquivo zip do banco de dados recém-baixado para C:\app\oracle\product\19c\db_home1

  2. Execute o arquivo setup.application como administrador Imagem 2.1: Executar setup do DB

  3. Siga cada etapa passo a passo conforme o guia em Guia de instalação do DB

  4. Muita atenção: No passo 8/17, lembre-se de marcar Create as Container database para abrir um pluggable db a fim de atender ao processo de instalação do Fusion Middleware que virá a seguir Imagem 2.2: Criar Pluggable Database

No passo 9/17, escolha o conjunto de caracteres como Unicode (AL32UTF8) Imagem 2.3: Selecionar Unicode

  1. Após a conclusão da instalação, verifique cuidadosamente nos Serviços do Windows para garantir que os 4 serviços principais, como na imagem abaixo, estejam com status RUNNING Imagem 2.4: Instalado com sucesso

Imagem 2.5: Verificar serviço

  1. Crie uma nova conta de banco de dados Oracle seguindo os passos:
  • Terminal como Administrador -> sqlplus / as sysdba
  • Criar o usuário de sistema system: alter user system identified by system_password account unlock;
  • Verificar a existência do usuário system: select username from dba_users;
  • Configurar o ambiente: alter session set “_oracle_script”=true;
  • Criar usuário comum hr: create user hr identified by user_password;
  • Conceder privilégios: grant all privileges to hr;
  • Desbloquear a conta – ajustar senha: alter user hr identified by hr_pass account unlock;
  • Criar nova conta de sistema: alter user sys identified by sys_pass account unlock;

Passo 3: Instale o SQL Developer, versão no-jre, link de download: SQLDev-NoJRE Imagem 3.1: Baixar SQL Developer

  • Execute o arquivo sqldeveloper.application como administrador Imagem 3.2: Iniciar o SQL Developer

  • Configure os parâmetros para uma nova conexão como na imagem abaixo, lembrando de alterar Username e Password (como no exemplo acima, hr), Hostname (padrão é localhost), Port (padrão é 1521), SID (é o global database name instalado no passo 2) Imagem 3.3: Configurar parâmetros do SQL Developer

  • Se ao selecionar Test aparecer a mensagem Success, a conexão foi bem-sucedida; selecione Connect

Passo 4: Instale o Fusion Middleware Infrastructure (FMW) versão 12.2.1.3.0, link de download FMW_ver_12.2.1.3.0 Imagem 4.1: Baixar FMW

  • Crie o caminho para o diretório de instalação do FMW no formato C:\Oracle\Middleware\Oracle_Home
  • Siga os passos conforme o guia: Guia de instalação do FMW

Passo 5: Instale o Oracle Bussiness Intelligence (OBIEE) versão 12.2.1.4.0, link de download: OBIEE_ver_12.2.1.4.0

  • Execute o arquivo setup_bi_platform-12.2.1.4.0_win64.exe como administrador Imagem 5.1: Executar o arquivo de instalação do OBIEE

  • Instale passo a passo conforme o Guia de instalação do OBIEE

  • Atenção: o caminho do BI deve ser igual ao caminho onde o FMW foi instalado, como aqui: Oracle/Middleware/Oracle_Home Imagem 5.2: O caminho do BI deve ser igual ao do FMW

Passo 6: Configure o BI Schema usando o utilitário Repository Creation Utility (RCU)

  • No caminho C:\Oracle\Middleware\Oracle_Home\oracle_common\bin, execute o arquivo rcu.bat como administrador

  • Execute os passos a seguir na ordem

Imagem 6.1: Criar Repositório

Imagem 6.2: Detalhes da Conexão com o Banco de Dados

Imagem 6.3: Selecionar Componente

Imagem 6.4: Senha do Schema

  • Por fim, clique em Create para o sistema criar o BI Schema

Passo 7: Configure as variáveis de ambiente para o OBIEE

  • Acesse Painel de Controle > Sistema > Configurações avançadas do sistema > Avançado > Variáveis de Ambiente > Nova Variável de Sistema Imagem 7.1: Variáveis de ambiente

Passo 8: Criar o BI Domain

  1. No caminho C:\Oracle\Middleware\Oracle_Home\bi\bin, execute o arquivo config.cmd como administrador

Imagem 8.1: Executar o arquivo config

  1. No passo 1: selecione os 3 componentes, em que Essbase é o servidor OLAP, Business Intelligence Enterprise Edition é o BI Analytics e Business Intelligence Publisher é o BI Publisher

Imagem 8.2: Selecionar componente

  1. No passo 3: configure um novo domínio como na imagem abaixo, !! LEMBRE-SE DA SENHA DO DOMAIN, POIS SERÁ MUITO DIFÍCIL RECUPERÁ-LA. e deixe o domínio como bi, pois é o padrão.

Imagem 8.3: Conta do domínio

  1. No passo 4: atualize as informações do domínio para o Database Imagem 8.4: Atualizar informações

  2. No passo 8: se o processo for bem-sucedido, o resultado será como na imagem abaixo Imagem 8.5: Configuração bem-sucedida

  3. Se tudo estiver concluído, salve o arquivo de informações do OBIEE para o próximo passo e faça login abrindo as URLs:

  • http://localhost:9500/console*
  • http://localhost:9500/em*
  • http://localhost:9502/xmlpserver*
  • http://localhost:9502/analytics*
  1. Alguns erros podem ocorrer
  • No passo 4, se o sistema exibir "fail to logon", verifique se a senha do domínio está correta

  • No passo 8, se o sistema apresentar um erro como o da imagem abaixo, verifique se você ativou a licença do Windows e se o seu Windows atende aos pré-requisitos descritos.

Imagem 8.6: Erro de licença

  • Erro por não ter adicionado BI_HOME_PRODUCT, revise o Passo 7
  • Atualizar erro ...

Passo 9: Após concluir a configuração, acesse o BI domain recém-criado no caminho $Oracle_Home\user_projects\domains\bi\servers\AdminServer\tmp_WL_user\adf.oracle.domain.webapp\i83uao

  • Copie todos os arquivos jar daqui para uma pasta separada e compartilhe com a máquina do atacante (em ambiente de laboratório faça isso; em um ataque real, a máquina do atacante também precisa ter a mesma instalação da máquina alvo para obter o código-fonte)

  • Adicione também a biblioteca coherence.jar do caminho $Oracle_Home\coherence\lib a essa pasta.

  • Esta é uma pasta importante que determina se o payload terá sucesso, pois cada versão do FMW, do BI ou o ambiente de cada máquina costuma ser diferente, então é necessário ter a versão exata para reduzir o risco de exceções durante a transmissão do payload.

Passo 10 (execute apenas se precisar de depuração remota; lembrando que, ao testar fora de um ambiente real, como não é possível configurar a máquina da vítima como quiser, o atacante precisa também reproduzir a configuração da máquina alvo em sua própria máquina para poder depurar remotamente e verificar os erros)

  • Instale o Mozilla e adicione o Burp Proxy na porta 8181

  • Habilite a depuração remota no servidor de BI

    Acesse localhost:9500/console

    Em Domain Structure -> selecione bi -> Environment -> Servers

Imagem 10.1: Estrutura do Domínio

Dois servidores serão exibidos: o AdminServer do WebLogic e o bi_server1 do BI

Imagem 10.2: Lista de servidores exibidos

Clique em Lock & Edit no canto superior esquerdo, marque bi_server1 para editar a configuração. Em seguida, acesse Configuration -> Server start -> role até o final, selecione Advanced (se houver) -> selecione para inserir em Arguments -> insira os parâmetros de depuração:

-Xdebug -Xnoagent – Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=n

(você pode tentar com 0.0.0.0:5005 se depois houver erro ao reiniciar o bi_server1)

Digite a senha do WebLogic (definida anteriormente na seção Config do BI Domain) -> Apply change & Restart

Abra o terminal como Administrador -> Navegue até o caminho $Oracle_Home\user_projects\domains\bi\bitools\bin e execute ./stop.cmd e ./start.cmd para reiniciar o bi_server1. Durante a reinicialização, se nenhum erro ocorrer, a depuração foi ativada e está ouvindo na porta 5005, como acima. Se ocorrer algum erro, verifique novamente os parâmetros de depuração acima para ver se há espaços extras ou erro no endereço.

Lado da máquina atacante

Passo 1: Baixe o IntelliJ IDEA Ultimate e ative usando um código encontrado no GitHub.

Passo 2 (Faça este passo apenas se durante o ataque ocorrerem erros como 500 Server Error, ..., pois isso se deve a uma exceção no payload)

  1. Ajuste a versão do jdk/sdk do projeto para a mesma versão da máquina alvo (a instalação é como no Lado da máquina alvo - Passo 1)

  2. Crie um projeto vazio para analisar o código-fonte, servindo para depuração remota, 3. Adicione todos os arquivos jar da pasta recebida da máquina alvo a este projeto

    Project Structure -> Modules -> Selecione o sinal de + -> 1 JARS or Directories -> Add a pasta inteira de jars.

Imagem 11.1: Adicionar arquivo jar

Imagem 11.2: Resultado

  1. Configure a depuração remota

    Run -> Edit Configurations -> + -> Remote JVM Debug

Imagem 12.1: Configurar depuração remota

root@kitploit:~
 Execute a depuração remota; se houver uma mensagem no console: Connected … , foi bem-sucedido.

Imagem 12.2: Executar depuração remota

Passo 3:

  • Clone o código deste repositório para a máquina, remova o arquivo coherence.jar antigo da pasta lib e substitua pelo arquivo que você recebeu da máquina alvo no passo anterior.

  • Em seguida, adicione a um projeto executado no IntelliJ os arquivos jar da pasta lib com a opção Add as library

  • Verifique novamente o nome da classe LambdaIdentity$.... para que corresponda à versão do WebLogic; se houver alteração, faça refactor no arquivo e ajuste o nome dele.

    Weblogic 12.2.1.3: LambdaIdentity$E12ECA49F06D0401A9D406B2DCC7463A

    Weblogic 12.2.1.4: LambdaIdentity$423B02C050017B24DB10DFF759AA56BF

  • Edite o caminho para o arquivo LambdaIdentity$....class no arquivo Main.java. Para obter o caminho exato, há duas maneiras: você pode executar javac no arquivo jar para gerar o arquivo .class; outra abordagem é comentar o código da função main e, em seguida, executar o projeto normalmente; o caminho do arquivo de classe pode ser encontrado no diretório target.

  • Verifique novamente se o jdk e o sdk do projeto são iguais aos da máquina alvo.

Análise do código do BI e do código que gera o payload

Análise do código do BI

  1. No caminho $Oracle\Middleware\Oracle_Home\user_projects\domains\bi\servers\AdminServer\tmp_WL_user\em\fw8wi5\war\WEB-INF

Vemos o arquivo web.xml, que descreve os relacionamentos de mapeamento relativos ao servlet-mapping. "resources" é o servlet relacionado aos recursos do sistema, contendo dados e informações importantes; por isso, é o local que os atacantes costumam mirar.

Imagem 13.1: Relação servlet-mapping

  1. Aprofundando na classe ResourceServlet, especificamente org.apache.myfaces.trinidad.webapp.ResourceServlet, veremos o método doGet com a função de processar a requisição get enviada ao servidor.

Imagem 13.2: método doGet

  • Aqui, por meio do método _getResourceLoader(), um novo loader é criado a partir da requisição de entrada. Ao mesmo tempo, um resourcePath também é inicializado e recebe os valores servletPath e servletInfo por meio do método getResourcePath com o parâmetro request. Esse loader chama a função getResource(resourcePath), tentando carregar o recurso da requisição de entrada e localizá-lo por meio da função org.apache.myfaces.trinidad.resource.ResourceLoader.getResource.findResource(); por fim, o valor encontrado é passado para uma instância url da classe URL.class.

Imagem 13.3: método getResource

  • O _getResourceLoader mantém um ConcurrentMap para armazenar o relacionamento de mapeamento entre servletPath e loaders. Esse relacionamento é claramente definido em oracle.adfinternal.view.resource.rich.RenderKitResourceLoader

Imagem 13.3: classe RenderKitResourceLoader

  • O método _register na função RenderKitResourceLoader() é chamado e recebe as regex + o loader correspondente, depois retorna super.register, que é a função pai. Essa função adiciona ao concurrentmap_loaders o valor padrão e o loader correspondente. Portanto, quando o loader é inicializado na função doGet() e recebe o parâmetro request de entrada, o valor servletPath da URL da requisição é obtido e passado para _loader.get() a fim de recuperar o servlet correspondente.

Imagem 13.4: método _register

Imagem 13.5: método register (método pai)

  • O autor da vulnerabilidade acredita que, entre as classes que sobrescrevem o método findResource(), a oracle.adfinternal.view.resource.rich.RemoteApplicationResourceLoader é a classe que apresenta risco de desserialização. Vamos analisá-la para encontrar o motivo.

Análise do método findResource() em RemoteApplicationResourceLoader.class

Imagem 13.6: método findResource()

Essa função retorna um método que contém o protocolo personalizado RAStreamHandler(). O RAStreamHandler cria um objeto URLConnection com o valor new RAURLConnection

Imagem 13.7: método RAStreamHandler()

A função RAURLConnection chama a função _getPathBean

Imagem 13.8: método RAURLConnection ()

a função _getPathBean contém um objeto bean criado por meio da chamada à função getInstanceFromString(), responsável por processar a string recebida para extrair as chaves correspondentes (filtro).

Imagem 13.9: função _getPathBean

A string bean de entrada é convertida por meio da classe SerializationUtils do formato URL encoded em um objeto URLEncoderPathBean. Se tudo estiver correto, a entrada seguinte será passada para a função fromURLEncodeString().

Imagem 13.10: função getInstanceFromString()

Imagem 13.11: função fromURLEncodedString()

Caso a string de entrada encontre um erro, uma exceção será lançada. A exceção vem principalmente da biblioteca usada no payload, devido a divergência de versão ou a um caminho incorreto para o arquivo Lambda.

Na função fromURLEncodedString(), uma função fromString é retornada com o parâmetro url, e seu código é o seguinte:

Imagem 13.12: função fromString()

Na função fromString, os dados são passados por readObject() e retornados. Percebe-se que a entrada não passa por nenhum filtro, flui por várias funções e, por fim, é desserializada em fromString(). Este é o sink que serve para a exploração. Com o sink encontrado, agora basta localizar a source.

  1. Encontrar a source: como analisado acima, para encontrar a source é necessário identificar a URL da requisição de entrada. Vemos que, para chamar a função findResource(), é preciso ter acesso para navegar até a classe RemoteApplicationResourceLoader. Na classe RenderKitResourceLoader isso está muito bem definido:```bash this._register("/./remote/(.)", new RemoteApplicationResourceLoader());
root@kitploit:~
Portanto, para chamar a classe mencionada, precisamos de um regex no formato “/.*/remote/(.*)”. Por isso, quando o router ou o caminho de entrada tem a forma /em/afr/foo/remote/payload, ele satisfaz a estrutura definida neste arquivo; assim, RemoteApplicationResourceLoader será usado como loader no  doGet, e o arquivo de classe correspondente oracle.adfinternal.view.resource.rich.RemoteApplicationResourceLoader chamará a função findResource() sobrescrita nele. Dessa forma, se o payload for enviado para o endereço correto, os dados serão transmitidos facilmente sem esbarrar no filtro.

Esta é a URL final usada para exploração:
__hostname:port/contextApp/afr/foo/remote/payload/__

Onde contextApp é um dos paths que existem logo após a instalação do OBIEE, como /em; /bicomposer; ….

Foo é uma string qualquer

Payload é a string gerada ao executar a função Main do Project de ataque preparado.

### Análise do código usado para criar o payload

Este projeto segue a gadget chain do CVE-2020-14644

![Arquivo Lambda](https://raw.githubusercontent.com/hienkiet/CVE-2022-201145-12.2.1.3.0-Weblogic/main/image/payload2.png)

A classe LambdaIdentity$E12ECA49F06D0401A9D406B2DCC7463A, herdada de AbstractRemotable, é usada para interagir com o sistema remoto.

Usando a Java Reflection API, o invasor pode facilmente obter o WorkAdapter do thread de execução atual.

Em seguida, obtém o campo connectionHandler do WorkAdapter e 
realiza a consulta para obter o ServletRequest e o ServletResponse do connectionHandler.

Em seguida, obtém o valor do cabeçalho "cmd" da requisição (ServletRequest), então verifica se "cmd" não está vazio e executa um comando shell correspondente ao sistema operacional em execução (Windows ou Linux/Unix).

Lê o resultado do comando shell e envia esse resultado na resposta (ServletResponse).

Se qualquer erro ocorrer durante a execução, ele será exibido no console por meio do método printStackTrace().

O ID após o nome da classe LamdaIdentity depende da versão do weblogic server, é uma string codificada de acordo com o hash MD5 da classe com.tangosol.internal.util.invoke.ClassIdentity, e como essa classe é diferente em cada versão, como já mencionado, para o payload não falhar é necessário verificar isso cuidadosamente.

Aqui, uma variável cmd é obtida do header da requisição de entrada e, em seguida, adicionada à instrução Runtime.getRumtime.exec() abaixo, sendo codificada e decodificada no formato hex md5; após ser transmitida ao sistema OBIEE, retorna o valor desserializado.

Por fim, na função Main, um objeto RemoteConstructor é criado e, por meio da biblioteca SerializationUtils, é convertido em uma string URL encoded. Essa string é passada diretamente na url source, dando aos invasores a oportunidade de injetar o comando __cmd__ arbitrário.

![Função Main](https://raw.githubusercontent.com/hienkiet/CVE-2022-201145-12.2.1.3.0-Weblogic/main/image/payload1.png)

## Reproduzindo a exploração

![Exploração /em](https://raw.githubusercontent.com/hienkiet/CVE-2022-201145-12.2.1.3.0-Weblogic/main/image/exploit1.png)


![Exploração /em](https://raw.githubusercontent.com/hienkiet/CVE-2022-201145-12.2.1.3.0-Weblogic/main/image/exploit2.png)


## Referências

1. https://peterjson.medium.com/miracle-one-vulnerability-to-rule-them-all-c3aed9edeea2

2. https://testbnull.medium.com/oracle-access-manager-pre-auth-rce-cve-2021-35587-analysis-1302a4542316

## Autor da Vulnerabilidade: Jang Nguyen & Duc PeterJson
Baixar ferramenta