Compreendendo e Mitigando Vulnerabilidades de Execução Remota de Código (RCE) e Injeção de Comandos

Fundamentos de Testes e Comandos de Sistema

Antes de analisar as vulnerabilidades, é essencial compreender os métodos de avaliação de segurança e os comandos básicos de sistemas operacionais.

Metodologias de Teste

  • Teste de Caixa Branca (White Box): Focado na análise do código-fonte e da arquitetura interna. O avaliador possui conhecimento total da lógica de negócios e do fluxo de dados, assemelhando-se a uma auditoria de código.
  • Teste de Caixa Preta (Black Box): Avalia a aplicação do ponto de vista de um usuário externo ou atacante, sem conhecimento prévio da implementação interna. Foca em requisitos funcionais e de desempenho.

Comandos Essenciais e Operadores de Encadeamento

O conhecimento de comandos de shell é crucial para a exploração de RCE. No Windows, comandos como ipconfig, netstat -ano, tracert e regedit são frequentemente utilizados. No Linux, ifconfig, cat /etc/passwd, uname -a e netstat -pantu são padrão.

Para encadear comandos em shells vulneráveis, utilizam-se operadores específicos:

  • | (Pipe): Executa o comando à direita, passando a saída do comando à esquerda como entrada.
  • || (OR lógico): Executa o comando à direita apenas se o comando à esquerda falhar.
  • & (E assíncrono): Executa ambos os comandos independentemente do sucesso ou falha do primeiro.
  • && (E síncrono): Executa o comando à direita apenas se o commando à esquerda for bem-sucedido.
  • ; (Separador): Executa os comandos em sequência, independentemente do resultado do comando anterior.

Anatomia da Vulnerabilidade RCE

A Execução Remota de Código (RCE) ocorre quando um atacante consegue injetar e executar instruções arbitrárias no sistema operacional ou no interpretador de código do servidor alvo.

Condições para Exploração

  1. Variável Controlável: O atacante deve ter a capacidade de injetar dados na aplicação (via parâmetros HTTP, cabeçalhos, etc.).
  2. Falha na Sanitização: Ausência de validação, filtragem ou escape adequado das entradas do usuário.
  3. Concatenação Direta: Os dados não confiáveis são incorporados diretamente em funções que executam comandos do sistema ou interpretam código.

Injeção de Comandos do Sistema Operacional

Ocorre quando a aplicação passa comandos inseguros para o shell do sistema operacional. As funções perigosas variam conforme a linguagem:

  • PHP: exec, system, passthru, shell_exec, popen, proc_open.
  • Java: Runtime.getRuntime().exec(), ProcessBuilder.
  • .NET: System.Diagnostics.Process.Start.

Exemplos de Funções em PHP

<?php
// Exemplo 1: system() - Executa e exibe a saída, retornando o status
$comando = 'whoami';
$statusRetorno = 0;
system($comando, $statusRetorno);
echo "\nStatus de saída: " . $statusRetorno;
?>
<?php
// Exemplo 2: exec() - Não exibe a saída diretamente, armazena em um array
$saidaCompleta = [];
$codigoRetorno = 0;
exec('hostname', $saidaCompleta, $codigoRetorno);
print_r($saidaCompleta);
?>
<?php
// Exemplo 3: passthru() - Executa e exibe a saída bruta (útil para binários)
passthru('uname -a');
?>
<?php
// Exemplo 4: shell_exec() - Executa e retorna a saída completa como string
$resultado = shell_exec('id');
var_dump($resultado);
?>

Execução de Código Arbitrário (Code Injection)

Diferente da injeção de comandos do SO, a execução de código ocorre quando o atacante consegue fazer com que o interpretador da linguagem (como o PHP) execute trechos de código arbitrários.

Funções e Construtos Perigosos

  • PHP: eval(), assert(), preg_replace() (com modificador /e em versões antigas), create_function().
  • JavaScript: eval(), Function().
  • Python: exec(), eval().

Exemplos de Exploração em PHP

<?php
// Execução via interpolação de variáveis complexas
${system('id')};
?>
<?php
// Execução via eval() - Requer sintaxe válida e ponto e vírgula
$trechoCodigo = '$x = 10; echo $x * 2;';
eval($trechoCodigo);
?>
<?php
// Execução via assert() (Comportamento alterado no PHP 7+)
$funcaoDinamica = 'assert';
$funcaoDinamica('phpinfo()');
?>
<?php
// Execução via funções de callback como array_map
$payloads = ['phpinfo()'];
array_map('assert', $payloads);
?>

Cenários de Exploração e Impacto

Em ambientes de laboratório controlados, a exploração geralmente começa testando os operadores de encadeamento. Se a aplicação não filtra carcateres como |, & ou ;, o atacante pode assumir o controle do shell.

Quando a vulnerabilidade permite a execução de código (como via eval), o impacto é ainda maior, permitindo a leitura de arquivos sensíveis do servidor, bypass de restrições de shell e estabelecimento de backdoors (como web shells).

Leitura de Arquivos Sensíveis

Um atacante pode utilizar funções como file_get_contents() ou readfile() para extrair configurações críticas. Exemplos de alvos comuns:

Windows:

  • C:\boot.ini (Configurações de inicialização)
  • C:\windows\system32\inetsrv\MetaBase.xml (Configuração do IIS)
  • C:\windows\repair\sam (Hashes de senha locais)
  • C:\Program Files\MySQL\my.ini (Configuração do MySQL)

Linux:

  • /etc/passwd (Lista de usuários do sistema)
  • /etc/shadow (Hashes de senha - requer privilégios)
  • /usr/local/apache2/conf/httpd.conf (Configuração do Apache)
  • /etc/php.ini ou /usr/local/etc/php/php.ini (Configuração do PHP)
  • /etc/my.cnf (Configuração do MySQL)

Um payload típico para explorar uma falha de execução de código e ler um arquivo seria: ?input=var_dump(file_get_contents('/etc/passwd'));

Tags: RCE Injeção-de-Comandos Segurança-PHP Execução-de-Código segurança-web

Publicado em 6-15 09:30 por Thomas