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

Passo 2: Instale o Oracle Database 19c, link de download: Oracle 19c
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
Execute o arquivo setup.application como administrador

Siga cada etapa passo a passo conforme o guia em Guia de instalação do DB
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

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



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

Execute o arquivo sqldeveloper.application como administrador

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)

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

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

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

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




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

Passo 8: Criar o BI Domain



No passo 4: atualize as informações do domínio para o Database

No passo 8: se o processo for bem-sucedido, o resultado será como na imagem abaixo

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:
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.
![]()
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

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.
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)
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)
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.


Configure a depuração remota
Run -> Edit Configurations -> + -> Remote JVM Debug

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

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.
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.






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

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

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

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).

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().


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:

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.
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

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.

## Reproduzindo a exploração


## 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