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
- Variável Controlável: O atacante deve ter a capacidade de injetar dados na aplicação (via parâmetros HTTP, cabeçalhos, etc.).
- Falha na Sanitização: Ausência de validação, filtragem ou escape adequado das entradas do usuário.
- 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/eem 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.iniou/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'));