Command Injection

Command Injection

O que é Command Injection?

Antes de começar a explicação, é bom lembrar que command injection e code injection são duas falhas diferentes. Basicamente command injection pode ocorrer, caso haja a interação de forma insegura, entre a aplicação web e o sistema operacional sobre o qual a aplicação estiver rodando. Essa interação pode ocorrer por exemplo, através de funções como o exec no PHP ou wscript.shell no ASP. A falha ocorre quando a aplicação envia comandos para o sistema operacional, juntamente com dados que o usuário enviar para a aplicação (através de formulários, cookies, HTTP headers etc) sem nenhum tipo de validação. Com isso, se a aplicação web em questão não realizar de forma correta a validação daquilo que o usuário enviar, a aplicação poderá ser atacada por um usuário malicioso, que irá injetar comandos de sistema operacional através do parâmetro vulnerável. Nesse ataque, o comando que o usuário malicioso enviar, será executado utilizando os privilégios que a aplicação web possuir. Geralmente aplicações web rodam com privilégios de servidor web(apache, tomcat…). Por exemplo, se o servidor web for o apache, o atacante terá privilégios do apache.

Mas o que isso significa exatamente?

Por exemplo, a aplicação web disponibiliza ao usuário um serviço de nslookup. Se a aplicação web não realizar de forma correta a verificação do valor passado para o nslookup, o usuário malicioso pode injetar comandos que serão executados com privilégios que a aplicação web vulnerável possuir, o que pode levar ao comprometimento total do sistema.

Exemplo prático de Command Injection

Vamos analizar o código abaixo:

<?php
   $host = 'google';
   if (isset( $_GET['host'] ) )
      $host = $_GET['host'];
   system("nslookup " . $host);
?>

<form method="get">
   <select name="host">
      <option value="google.com">google</option>
      <option value="yahoo.com">yahoo</option>
   </select>
   <input type="submit">
</form>

O código acima aceita a requisição via GET do parâmetro “host”, depois executa o nslookup e por fim exibe o resultado ao usuário. O importante aqui, é analisarmos como o valor passado para o parâmetro “host” é enviado direto para a função system() sem realizar nenhum tipo de filtro ou validação.

Uma requisição legítima seria algo como “http://website.com/cmd.php?host=google.com”, mas como vimos no código acima não existe nenhum tipo de filtro ou validação, ou seja, nada impede que o usuário malicioso tente a seguinte requisição “http://website.com/cmd.php?host=google.com;cat /etc/passwd”, o que irá fazer com que a aplicação web vulnerável retorne o conteúdo do arquivo passwd.

Aqueles familiarizados com linha de comando em ambiente Unix/Linux, sabem que podemos juntar comandos utilizando o “;“.

O ataque também pode ser realizado através do método POST. Nesse caso será necessário a utilização de ferramentas como o Burp Suite ou OwaspZap.

Lembre-se de que essa vulnerabilidade permite ao atacante executar comandos no servidor alvo, logo, um shell reverso pode causar um estrago maior ainda.

No exemplo a seguir iremos criar um shell reverso. Para facilitar vamos utilizar o Commix que é uma ferramenta muito útil na hora de encontrar e explorar falhas de command injection. Caso você não tenha a ferramenta, execute o comando: git clone https://github.com/commixproject/commix.git

Shell reverso com o Commix

No exemplo a seguir o IP 192.168.1.9 pertence ao servidor alvo e o IP 192.168.1.10 pertence ao atacante.

Referências:
resources.infosecinstitute.com/commix-an-automated-tool-for-command-injection/#gref
www.owasp.org/index.php/Command_Injection
The Web Application Hacker’s Handbook

_________________________________

Preocupado(a) se sua empresa pode estar correndo esse risco? Entre em contato agora mesmo

[CONTACT_FORM_TO_EMAIL id=”1″]