lunes, 1 de julio de 2013

Deep Into Networks & Protocols [Español]

El propósito de este ánálisis es adentrarnos en el comportamiento de las redes y sistemas computacionales; ver su relación e interacción con otros equipos, personas y/o sistemas.
En el transcurso del presente trabajo, iremos conociendo muchas herramientas.
Lo anterior será algo tan básico que nos remontará al inicio de todo este gran mundo que es la internet, que puede y debe ser uno de los puntos esenciales, los cuales, a pesar de que los sabemos básicos, no les prestamos importancia.

Algunos conocerán los temas a tratar en el mismo, otros no, pero deben tomar en cuenta que es un simple texto donde se tratará de profundizar en tópicos tan simples como una conexión TCP y todo lo que conlleva,
conociendo así su funcionamiento, estructura y reacción en determinadas circunstancias.

AVISO: Estos textos NO son ni serán creados con fines malintencionados.

Comenzaremos por conocer algunas herramientas básicas como lo es un Sniffer/Dumper/Scanner de red. Éste es utilizado frecuentemente por gente muy variada y con distintos propósitos:
Desde una empresa para tener control sobre sus empleados, hasta personas con fines determinados, sean buenos o malos (como obtener información confidencial, entre otros).
Hay infinidad de métodos, herramientas, etcétera, que nos ayudan con algunas funciones dentro de un sistema computacional; en este caso nos enfocaremos en redes y protocolos.
Como sabemos, la comunicacion de Cliente/Servidor es básica, así, en cualquier tipo de comunicaciones y/o tecnologías. Es una forma de comunicarse, una relación máquina-máquina; un lenguaje entendible tanto para ordenadores como para humanos por igual.
Sin embargo, surgen problemas cuando tratamos de entender dicha comunicación. Para ello, gente experta en los temas selectos ha creado y descubierto la forma de comunicarse con dicha tecnología y/o lenguaje,
facilitándonos de este modo un arduo trabajo, como el de crear, desarrollar, sustentar, patentar alguna tecnología y/o protocolo, etcétera.
En la seguridad informática es básico y más que esencial saber sobre qué se está trabajando, cómo y cuáles son los riesgos y la probabilidad de pérdida de datos y/o robo del mismo. Esta vez nos toca enfocarnos en red y protocolos.
Antes de empezar de lleno, aviso que este análisis y las técnicas demostradas en el mismo están siendo recreadas en un entorno Linux, veremos más adelante que esto no influye mucho, pero es importante tenerlo en cuenta.
Ahora sabes que existen infinidad de herramientas, algunas dependen de diversos factores (S.O, dll's, ocx's, librerias, etcétera). Una herramienta esencial en todo lo relacionado con redes es un sniffer/dumper de red, basada en un librería sobre el mismo llamado PCAP.
Cabe recalcar que esta librería es funcional tanto en Windows como Linux/Unix. Algunos muy famosas para Linux serían Dsniff, TCPDump, mientras que para Windows podrían ser Wireshark, Windump, etcétera.
Éstas varían según las necesidad de cada uno y/o de sus objetivos a alcanzar. Asimismo, estaremos usando sniffers en consola.
Les recomiendo que sigan estas prácticas y las puedan recrear ustedes mismos, para después
poder adaptarlas a sus necesidad y/o enfoque.
Como dije anteriormente, todo será bajo un entorno Linux, en tanto siga siendo Linux, no importa la distribución (Debian/Ubuntu/Fedora), la estructura es la misma.
Aclarado el punto anterior, continuemos: utilizaremos TCPDump, ya que la mayoría de las distribuciones lo tienen incluido, no hace falta instalar. Vamos a logearnos en una shell como root e invocamos a tcpdum, de la siguiente forma.:
# > tcpdump
tcpdump: WARNING: eth0: no IPv4 address assigned
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes

 
 Como vemos, dice eth0: no IPv4 address assigned. Esto es provocado principalmente porque mi ethernet divices -o mi trajeta de red ethernet "eth0"- no está conectada , pero es sólo la invocación a la herramienta.
Este problema se podría arreglar de una forma simple:
# > tcpdump -i wlan0
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on wlan0, link-type EN10MB (Ethernet), capture size 65535 bytes
19:04:13.558095 IP r00t.local.1024 > http://www.fladong.com.www: Flags [.], ack 1567703567, win 501, options [nop,nop,TS val 1047859 ecr 341248369], length 0

 
 Bien, ahora con -i estamos indicando la interface a utilizar, en este caso wlan0, que es mi tarjeta wireless.
Trataré de hacerlo menos complicado y poco a poco ir aumentando la dificultad: ahora indicamos a tcpdump que capture todo el tráfico de la red con la interface wlan0
(esto lo veremos más adelante, sólo aclaro esta parte: que el paquete con ACK es un "aviso" de que alguna información ha llegado correctamente).
La librería PCAP proporciona una forma de interpretación de los datos, dependiendo el tipo de protocolo que se utilice en la captura, porque no es lo mismo una captura ICMP a una conexión UDP, pero tranquilos, ya lo iremos viendo poco a poco.
# >

09:24:00.494825 r00t.local.1024 > FLANDONG.8080: S 2407685239:2407685239(0) win 64240 (DF)

09:24:00.495018 r00t.local.8080 > FLANDONG.1024: S 3913045143:3913045143(0) ack 2740385269 win 64240 (DF)

09:24:00.495039 r00t.local.1024 > FLANDONG.8080: . ack 1 win 64240 (DF)

 
 Lo anterior indica un inicio de una conexion TCP, donde r00t.local.1024 es el host que se trata de comunicar, es decir, quiere iniciar una session con FLANDONG con el proxy establecido, y así poder "visitar" una web por el potrocolo http.
Analizando completamente una sentencia de éstas, quedaría de las siguiente forma:
date src > dst: flags data-sqno ack window urgent options
 
*Date: Imprime la hora en que se produjo cierta comunicación: Hora/minutos/segundos/microsegundos
*src: Es el source o dirección fuente de la conexión, un "." seguido del puerto .
*>: Es la dirección del flujo de los datos .
*dst: Destination o dirección de destino, un "." y seguido del puerto .
*flags: Son "banderas" o indicadores de un datagrama/segmento , ej: TCP/UDP: F (FIN), R (RST), P(PUSH), S(SYN); cuando es un "." (punto), es que no hay flag/indicador.
*data-sqno: Número de secuencia del dato y/o pedazo de dato.
*ack: Número de secuencia que indica el próximo byte donde se recibirá el otro pedazo de paquete y/o dato TCP/UDP.
*windows: Es el tamaño de la ventana que indica el receptor al transmisor.
*urgent: Señal la urgencia del dato o datos.
*options: Opciones TCP que están entre corchetes; ej: el tamaño máximo de un segmento.
*DF: Don't Fragment o no fragmentar o fragmentación.

¿Cómo se realiza una conexión TCP? Son básicamente tres pasos para establecer una conexión TCP


Three-Way Handshake: 

    1.- El host o cliente indica la conexión (r00t.1024). Se envía un paquete SYN con el número que inicializa la secuencia (2407685239) y el final (2740385268) con relación a la conexión.
    Host receptor o server (FLANDONG.8080) y número de secuencia inicial, final.

    2.- Se responde con un paquete SYN-ACK, confirmando que se recibió correctamente el SYN enviado por el host(r00t.1024),
    y también se envía su número de secuencia inicial (3913045143) y final (3913045143), y ACK+1 (2407685240).

    3.- El cliente o host (r00t.1024) acepta la recepción del SYN del server (FLANDONG.8080), esto genera el envío de un ACK(1).
    Y si nos fijamos bien, notamos un "." que indica que no hay indicadores/flags.
    En este paso QUEDA ESTABLECIDA la conexión y se puede inciar una tranferencia de datos entre el host (r00t.1024) y el server (FLANFONG.8080).



Bueno antes de profundizar mas y poder dar un enfoque sobre a la seguridad, tendremos que conocer un par de cosas. Una de ellas es el formato de la cabecera TCP.

Que significa TCP, bueno es la abreviación de Transmission Control Protocol que en español significa Protocolo de Control de Transmicion. Es un protocolo de capa 4 basado en el modelo OSI.

Vale pues debemos saber que los segmentos TCP son utilizados en muchos programas y son indispensables para realizar una conexión y pasar así a una transmisión de flujos de datos.

La cabecera del protocolo proporciona datos básicos para que esta acción se pueda realizar, algunas de estas acciones pueden ser:
    +Nombre del host
    +Dirección de origen
    +Dirección de destino
    +etc... (veremos a continuación mas profundo)


La cabecera TCP, al igual que otros protocolos de transmisión siguen un estándar, proporcionando así los datos básicos para que un paquete llegue a su destino.
Estos comparten las mismas características, permitiendo así que aya una interacción entre distintos hosts.

Se preguntaran que función tiene TCP.
Bueno TCP, es como algo intermedio entre el protocolo IP y la aplicación que desee interactuar. Entonces entra TCP,aumentando las funciones que IP ofrece, como seguridad, fiabilidad, evitar perdida de datos, etc.
Ahora TCP es un protocolo para conexión de punto a punto, es decir no en la red y estas conexiones reciben el nombre de circuitos virtuales.

En el texto anterior explique el Three Way HandShake, ahora explicare un poco como funciona.

Dos host's establecen una conexión para el intercambio, si esto se cumple, son aptos para que se logre un flujo de datos.
A una conexión TCP se le denomina circuitos virtual. Como seguridad, implementan una técnica para verificar que los bytes no se hayan dañado o modificado en el camino.
Se regreso un reconocimiento de que se recibieron correctamente los paquetes, de lo contrario se indica igualmente para indicar el fallo y terminar en dado caso el flujo de datos.
Si el emisor esta transfiriendo demasiado rápido y sobrepasa el buffer del receptor, tiene el privilegio de descartar paquetes, por ende puede pedir la retransmisión posterior del mismo.

La aplicación envía flujos de bytes a la capa TCP, y estos son enviado a la red.
TCP se encarga de dividir el flujo y enviarlo en tamaños apropiados (MTU) y se añade la cabecera.
TCP transporta lo anterior al protocolo IP y por medio de la red llega a la capa TCP de destino.
Entra checksum y se revisa la perdida de datos y/o modificación del mismo.
TCP comunica que todo llego correcto o no, entra un time limit o tiempo limite, igualmente para verificar que no se pierda un dato en el camino o que este sucediendo un bufferoverflow.
Si resulta time-out, significa que el segmento tcp/ip que se tenia que haber recibido, no llego, tardo demasiado según la aplicación o se perdió en el camino y el receptor pide la retransmision del mismo.
También checksum se encarga de revisar que no se dañaron bytes en la transferencia.

Ahora si, después de tanta teoría vamos a analizar el la cabecera TCP

Cabecera TCP

Ahora tratare de explicar cada uno de los siguientes.

    +Puerto de Origen: Es el puerto por el cual se comunicara el host que quiere iniciar el flojo de datos (cliente).

    +Puerto de Destino: Es el puerto por el cual se comunicara el host que aceptara el flujo de datos (remoto).

    +Numero de secuencia: Sirve como control para evitar a l perdida de bytes en el segmento y en el orden correcto. También varía dependiendo el valor SYN. Si SYN esta activo (1) sera ISN + 1. Si SYN no lo esta (0), indica el numero de secuencia del primer bytes de datos.

    +Numero de Acuse De Recibo o ACK: Si ACK esta activo, indica que el numero de secuencia que se espera recibir. Se suele enviar continuamente, una vez establecida la conexión.

    +Longitud de la Cabecera TCP: Este indica el tamaño de la cabecera TCP en palabras, cuantos bytes hay entre el inicio del paquete TCP y el inicio de los datos.

    +Reservado: Son guardados para que se utilicen después.

    +Bits de Control o Flags: Son 8 "indicadores", y se hace referencia cuando se les necesita. Activo (1), Desactivo(2).

    +Ventana: Indica el numero de bytes que el receptor esta esperando recibir.

    +Suma de Verificación o Checksum: Se utiliza para comprobar si hay errores en la cabeceras o en los datos.

    +P. Urgente: Cuando el flag URG esta en 1 (activo), indica el desplazamiento con respecto al numero de secuencia que indica el ultimo byte de datos marcados como urgentes.

    +Opciones: Este puede variar, e indica que el largo de la cabecera debe estar de forma correcta.

    +Datos: Este es el payload o "carga", es la parte con datos del paquete TCP. Pueden ser cualquier dato o datos de otros protocolos (HTTP, SSH, FTP, TELNET, etc).


Vale estos son todos los puntos que había que aclarar, faltan algunos e inspeccionar con un poco mas de la cabecera y su tamaño, etc.
Pero lo seguiremos viendo en el siguiente.

Bien tenemos el formato nuestra cabecera TCP:


Ahora analisaremos un poco mas.


    +Puerto de Origen: 16 bits
    +Puerto de Destino: 16 bits
    +Numero de Secuencia: 32 bits
    +Acuse de Recibo o ACK: 32 bits
    +Longitud de la Cabecera TCP: 4 bits
    En este caso se especifica en palabras 32 bits.
    Minimo 5 palabras(20 bytes)
    Maximo 15 palabras(60 bytes)
    +Reservado: 4 bits
    +Bits de Control o Flags: 8 bits
    +Ventana: 16 bits
    +Suma de control o Checksum: 16 bits
    +P. Urgent: 16 bits
    +Opciones: La longitud de este campo tiene que ser multiplo de una palabra de 32 bits
    +Datos: Su longitud varia.

Bien entonces tenemos con que se divide en dos la cabezera,
en el eje de las X, y en el eje de las Y.
Donde la longitud en el eje de la X es de 32 bits,
y en Y es variable dependiendo de algunos campos como lo son
Opciones y Datos, que su tamaño varia.

Bueno pero necesitamos conoser los Flags que son muy importantes.
Estos nos indicaran cosas distintas en cada caso, pero son esenciales.
Veamos la funcion de cada uno:


IMPORTANTE

Cada Flags cuando esta activo se indica con 1 y cuando no lo esta con 0
    +CWR: Significa "Congestion Window Reduced" y se activa (1), cuando el cliente a recibido un paquete TCP
    con el Flag ECE activo.

    +ECE:"ECN-Echo" Sirve para indicar que se pueden hacer notificaciones ECN. Se activa en el Three Way Handshake

    +URG: "urgent" Este activa la seccion urgente dentro de la cabecera TCP, sino se ignora.

    +ACK: Significa "acknowledge", se activa cuando un host (cliente o servidor), an recibido un mensaje o varios
    mensaje y correctamente. De lo contrario no se activa.

    +PSH: "push" Sirve para que los datos de ese segmento y los datos y los almacenados en el buffer del receptor
    deben ser trasnferidos a la cliente lo antes posible.

    +RST: "rest" Sirve para detener la conexion sin esperar respuesta algun, o para reinciar la conexion.

    +SYN: "synchronize" se utiliza para sincronizar los ISN durante el Three Way Handshake.

    +FIN: Sirve para terminar la conexion entre cliente / servidor, y siempre se activa en el ultimo paquete
    para terminar la conexion.

Ahora algo importante igualmente es que dentro de la suma de control o Checksum, apesar de ser de 16bits tienes una "cabecera" de 96 bits prefija. Esta cabecera tienes la direccion de origen, direccion de destino, protocolo y longitud del segmento TCP.
Es como una medida de seguridad que implementaron.
+--------+--------+--------+--------+
| Dirección de origen |
+--------+--------+--------+--------+
| Dirección de destino |
+--------+--------+--------+--------+
| cero | PTCL | Longitud TCP |
+--------+--------+--------+--------+ 
 Vale pues si nos damos cuenta y leemos el primer paper, podemos darnos
cuenta de que entenderemos un poco mejor como funciona el Three Way Handshake.
Que lo volvere a explicar pero muy sintetizado por si caben algunas dudas.

Recordemos un poco 
 
 
Three Way Handshake:Son 3 etapas
    1.- Se establece la Conexion
    2.- Transferencia de Datos
    3.- Fin de la Conexion


Generalmente uno de los dos abre un socket en algun puerto TCP y escucha por incoming connections(pasivo). El host cliente hace una apertura activa de algun puerto TCP y envia
un paquete SYN incial al host Servidor.
EL host Servidor comprueba si el puerto esta abierto o esta cerra y/o ocupado.
Al estar abierto responde a SYN que recibio con un paquete SYN+ACK.
El host Cliente responde con al host Servidor con un ACK y se completa el Three Way Handshake

En resumen: Se envia SYN, se responde SYN+ACK, y se envia ACK.

No hay comentarios:

Publicar un comentario