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