TCP, UDP…¿SCTP?

Día a día nuestras máquinas se comunican utilizando protocolos de transporte ampliamente conocidos como TCP o UDP y otros que no lo son tanto, recientemente he tenido la oportunidad de «pegarme» con uno de estos últimos, concretamente con SCTP. A lo largo de esta entrada pretendo condensar información util que he ido encontrando sobre el protocolo, su funcionamiento, cómo levantar un servicio SCTP, escaneos, establecer una conexión y transferir información a través de este sin morir en el intento.

Pero vamos al turrón, Stream Control Transmission Protocol o SCTP (RFC 2960 y RFC 3286) para los amigos, es un protocolo del nivel de transporte con unas características muy interesantes que lo diferencian de TCP y UDP.

Características principales

  • Orientado a la conexión: Al igual que TCP, SCTP requiere establecer una conexión antes de transferir datos.
  • MultiHoming: Significa que uno o dos de los endpoints de la conexión pueden tener más de una dirección IP. Esto permite que en caso de que una de las direcciones caiga el tráfico sea recibido en la otra dirección IP, este proceso es automático y transparente. Gracias a esta característica y aunque se trate de un protocolo punto a punto, se puede generar tráfico multicast.
  • MultiStreaming: TCP transmite la información en un único stream , asegurándose de que cada paquete llega en el orden correcto, en caso de que falte un paquete se interrumpirá el envío del resto de información. SCTP por el contrario envía la información a través de múltiples streams, de este modo si se pierde un paquete este no afecta al envío del resto de paquetes, el orden en que llegan los paquetes ya no influye en su funcionamiento, como si lo hace en TCP.

Diferencias entre TCP, UDP y SCTP

Fuente: https://doi.ieeecomputersociety.org

Funcionamiento

Al igual que TCP (SYN,SYN-ACK, ACK) SCTP tiene un proceso de negociación de conexión, en este caso compuesto por un Four Way Handshake, el funcionamiento es el siguiente:

  1. El cliente envía una solicitud INIT para iniciar la conexión con el servidor.
  2. Si el servidor está a la escucha, este responde con INIT-ACK, enviando una Cookie de sesión, compuesta por un Message Authentication Code (MAC), junto al time stamp correspondiente a la creación de la cookie y el tiempo de vida. El MAC es almacenado en el servidor.
  3. Respondiendo a este INIT-ACK, el cliente envía un mensaje COOKIE-ECHO, el cual contiene la Cookie de la sesión recibida en el paso anterior.
  4. Tras verificar la cookie de sesión, el servidor envía un mensaje COOKIE-ACK respondiendo a COOKIE-ECHO, es en este momento cuando se establece la conexión entre el cliente y el servidor.

Una vez se ha enviado toda la información se lleva a cabo el cierre de sesión.

  1. El cliente envía un mensaje SHUTDOWN hacia el servidor.
  2. El servidor comprueba la conexión y envía un mensaje SHUTDOWN-ACK hacia el cliente.
  3. Si el proceso es correcto el cliente envía un mensaje SHUTDOWN-COMPLETE hacia el servidor, finalizando la conexión.

¿Para qué se utiliza?

Teniendo en cuenta sus características principales y sus diferencias con TCP y UDP, el uso de SCTP es habitual en el mundo de las telecomunicaciones, concretamente en el establecimiento y finalización de llamadas utilizando protocolos de señalización telefónica como los comprendidos en SS7

También se han implementado otro tipo de servicios como FTP a través de SCTP gracias a su capacidad MultiStreaming por citar algún ejemplo (https://www.eecis.udel.edu/~amer/PEL/poc/pdf/TR2003-06.FTP.over.SCTP.Ladha.pdf)

¿Cómo levanto un servicio?

Para levantar un servicio SCTP podemos hacer uso de la siguiente librería: https://gist.github.com/zonque/7d03568eab14a2bb57cb

Esta librería en C permite levantar un servicio de forma sencilla y además incluye un pequeño cliente para realizar pruebas de conexión. Para esta prueba de concepto utilizaremos dos máquinas Kali (cliente-servidor) ya que posiblemente más adelante utilicemos estas máquinas como atacantes.

Antes de comenzar instalaremos la librería libsctp-dev en nuestro servidor.

Una vez descargada y descomprimida la librería procedemos a su compilación, la cual generará el archivo server.

Una vez compilado ya podremos levantar el servicio ejecutando el archivo server generado.

Podemos realizar cualquier modificación en la librería como el puerto a la escucha y posteriormente volverlo a compilar para volver a generar el archivo server.

Escaneo SCTP

Para escanear un servicio SCTP podemos utilizar varias herramientas, dos de ellas son nmap y sctpscan.

Para escanear con Nmap utilizaremos el escaneo INIT con la opción -sY y además podemos activar el envío de COOKIE_ECHO con -sZ para hacernos pasar por una conexión real.

Si analizamos el tráfico generado en Wireshark vemos como nmap envia paquetes INIT para iniciar la conexión SCTP y en caso de recibir un paquete INIT_ACK confirmariamos que el puerto está  a la escucha.

Por supuesto, también es posible realizar un escaneo de puertos completo. Si no lo veis necesario podéis quitar la opción -sZ para no enviar paquetes COOKIE_ECHO.

Una alternativa a NMAP es SctpScan la cual viene preinstalada en Kali y podéis descargar desde aquí: https://github.com/philpraxis/sctpscan

Su uso es muy sencillo, para escanear todos los puertos utilizaremos la opción -m, con la opción -r definimos la IP o IPs que queremos escanear.

SctpScan también utilza un paquete INIT para iniciar la conexión pero incluye flags que pueden hacer que el servidor no responda, es aconsejable utilizar al menos nmap y sctpscan para evitar falsos negativos.

Envío de datos a través de SCTP

En nuestro cliente lo primero que haremos será modificar la dirección IP del servidor (por defecto 127.0.0.1) con el cual establecer conexión.

A continuación, repetiremos los pasos anteriores instalando la librería libsctp-dev y sctptest.c añadiendo el siguiente paso, en el cual establecemos un enlace simbólico de client apuntando a server.

Ahora sí, con el servidor corriendo lanzamos el cliente.

Comprobamos la conexión en el servidor.

Y sobretodo, lo que a nosotros más nos interesa…analizamos el tráfico generado, visualizando el proceso completo de conexión y el cierre correspondiente.

PySCTP

Para el envío de información existen otras herramientas que permiten mayor flexibilidad, una de ellas es PySCTP (https://github.com/philpraxis/pysctp), una vez descargada y descomprimida veremos los siguientes archivos y procedemos a la instalación (si es necesario, instalar las dependencias con make installdeps).

En el archivo test_remote_cnx.py nos encontramos un archivo con el ejemplo de conexión, podemos modificar el contenido enviado en SCTP.

Una vez modificado podemos proceder al envío con la siguiente instrucción, definiendo la IP destino (-H), el puerto origen (-p) y el puerto destino (-P):

Analizamos con Wireshark:

Vemos la información enviada en el paquete DATA:

Para el envío de información utilizando protocolos para la telecomunicación como DIAMETER o el ya referenciado FTP será necesario obtener su valor en «crudo» e incluirlo en nuestro arhivo test_remote_cnx.py.

Analizamos el envío, ya no vemos DATA sino DIAMETER, la información viaja sobre SCTP.

Espero que esta breve introducción al protocolo os resulte de utilidad y os permita valorar si sus características pueden ser de utilidad en vuestro trabajo, desarrollos y demás (por ejemplo, tenemos los backdoor a través de SCTP, su detección es menos habitual: https://github.com/infodox/python-pty-shells)

Un saludo y hasta la próxima.

Metalex

2 comentarios en «TCP, UDP…¿SCTP?»

Los comentarios están cerrados.