Falha ICMP Tunneling!
Autor: Paulo Cesar | Publicado: 2010-08-03T10:48:00-07:00

Irei descrever uma "falha" no ICMP, permitindo que uma pessoa utilize de um tunel ou canal
existente no protocolo para trafego de dados arbitrarios.


Internet Control Message Protocol

O ICMP eh um protocolo que faz parte do conjunto de protocolos designados pelo TCP/IP.Esse protocolo esta no nivel 3 do modelo OSI.
Ele eh utilizado para einviar menssagens aos hosts por anomalias na rede, tambem pode ser usado para obter informacao sobre a rede.
Em sistemas do tipo "connection less" os roteadores operam por si soh distribuindo os datagramas sem nenhum tipo de verificacao.

O IP falha a intrega dos datagramas quando:

-A maquina destino esta temporariamente ou permanentemente desligada da&nbsp;rede;
-O contador de tempo de vida (time-to-live) expira; 
-Quando os roteadores estao tao congestionados que nao podem processar&nbsp;mais trafego;

Inicialmente projetado para permitir que os routeadores reportassem erros de entrega aos hosts, o ICMP nao se restringe so a roteadores.
Ainda que haja restricoes na utilizacao de algumas mensagens ICMP, uma maquina arbitraria pode enviar uma mensagem ICMP para qulquer outra maquina.

Uma explicacao mais pratica:

Os cabecalhos IP apenas contem campos que especificam o emissor original e o destinatario final, estes nao contem um registo completo da sua viagem ao longo das redes (exceto em casos onde a opcao de registo do caminho eh utilizada). Alem disso, os roteadores podem apenas estabelecer e modificar as suas PROPRIAS tabelas de roteamento, nao existe um conhecimento "global" dos caminhos. Dessa forma, qdo um datagrama chega a um determinado roteador, eh impossivel conhecer o caminho que percorreu para chegar alih. Se o
roteador detecta um problema, este nao pode saber o conjunto das maquinas intermediarias que processaram o datagrama e, por isso, nao pode informa-las sobre o problema. Em vez de descartar o datagrama, o roteador utiliza o ICMP para informar o emissor original da ocorrencia de um problema e aguardar que os administradores do host cooperem com os administradores da rede na
procura e resolucao do problema.

Menssagens ICMP:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
Os datagramas que transportam mensagens ICMP sao encaminhados exatamente como os datagramas que transportam informacao para os utilizadores, nao existe confianca ou prioridade adicional. Assim, as proprias menssagens de erro podem causar congestionamentos adicionais no trafego da rede. 

Os pacotes ICMP ficam encapsulados dentro dos datagramas IP.
Os primeiros 3 campos do header sao os mesmos para todos os tipos de menssagens ICMP, resultando um total de 4-bytes.

-TYPE (8 bits): Identifica a mensagem, o valor desse campo determina o
formato do datagrama;

-CODE (8 bits): Fornece mais informacoes sobre o tipo de mensagem;

-CHECKSUM (16 bits): Verifica a integridade dos valores do cabecalho (header).
Tipos de menssagens:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp; Type&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ICMP Message&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Echo reply&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp; Destination unreachable&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Sorce Quench&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; 5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Redirect&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; 8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Echo request&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; 11&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Time exceeded&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; 12&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp; Parameter(IP) unintelligible&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; 13&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Timestamp request&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; 14&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Timestamp reply&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; 15&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; Information request&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; 16&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; Information reply&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; 17&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp; Address mask request&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; 18&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; Address mask reply&nbsp;&nbsp;
&nbsp; 
Os tipos que estamos interessados sao os tipos ICMP_ECHO listados abaixo:

- ICMP ECHO_REQUEST (Tipo = 8): Eh o query dado por um client (um ping p.ex.) 
- ICMP_ECHOREPLY (Tipo = 0): Eh a resposta que o servidor retorna ao emissor&nbsp;do
ECHO (esse "servidor" normalmente eh a propria kernel do OS).
&nbsp;&nbsp;&nbsp; 
Estes pacotes tem uma parte onde pode se incluir dados adicionais que sao normalmente dados sobre a rota ou sobre o tempo levado pela "Round Trip".
Estes dados nao sao checados pelo seu conteudo e veracidade, sendo assim esses mesmos podem ter conteudo arbitrario desiginado pelo usuario que envia esse pacote, fazendo assim o uso de um canal&nbsp; escondido em meio aos pacotes.

&nbsp;O canal&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
A nao ser que o trafego do ICMP_ECHO seja barrado por algum tipo de filtro o canal existe !
Teoricamente quase todo tipo de dado pode ser escondido num canal e pode ser usado logicamente para transportar dados que vao variar do que o usuario deseja, podendo ser um Troia, uma backdoor, voce pode usar uma maquina como intermediaria de outras para capturar informacoes, pode ateh mesmo montar um metodo de comunicacao mais seguro e secreto para
se enviar pacotes para um destinatario (um host, um roteador, etc), entre outras utilidades que irao variar de acordo com a capacidade e criatividade do seu criador.
Logicamente esses dados irao precisar de quem os transporte, que pode ser um firewall, filtros, roteadores, etc.

Esse canal eh de dificil deteccao. Pode se desconfiar de que o tunel eseteja ativo por vista de um excecivo numero de pacotes do tipo ICMP ECHO_REPLY no seu sistema.

Algumas pessoas diriam que para se anular esse canal bastaria simplesmente restringir os direitos de uso dos ICMP_ECHO, o que eh ridiculo para um protocolo da cadeia IP ou qual quer outro "connection less". Sendo assim o unico sistema imune ao tunelamento eh aquele que nao possue trafego de ICMP_ECHO.


*** OBS ***&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 
* Essa pratica eh aplicada a diversos outros protocolos como o RDP que possue uma falha interessante que consiste em dependendo das condicõess em que eh aplicado, pode se adicionar uma rota nao existente a rota default remotamente por meio de um spoof, e varios outros da camada IP.

* A melhor exploitação dessa falha seria feita utilizando o kernel space e mantendo a quantidade de dados que transitam o canal baixa.

By SeQ Anj0...