Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
INTRODUCCIoN
Si alguna vez has intentado comprender Internet, seguro que has acabado frente a un
libro de TCP-IP. Y seguro que a la sexta página lo has dado por IMPOSIBLE!!!
TCP-IP es el alma de la red, nosotros te ofrecemos un curso MUY ESPECIAL ;)
Si, por ejemplo, eliminásemos de la parrafada Por supuesto, para que dos profesionales se
del doctor PyC todo aquello que no formase entiendan tienen que hablar no sólo el mismo
parte exclusivamente del lenguaje técnico de lenguaje técnico, si no también el mismo
los cirujanos, esta frase: idioma común.
Si el doctor PyC hablase Japonés, sin duda entrar más en profundidad en la comunicación
el doctor Scherzo habría puesto la misma que vimos en las viñetas.
cara de incomprensión.
¿Qué otro medio común han utilizado el doctor
Según lo que hemos visto hasta ahora, la Scherzo y el doctor Pyc para comunicarse?
comunicación entre los dos doctores funciona ¡El habla!
gracias a dos capas independientes: el idioma, Si trasladásemos toda esa conversación a un
y el lenguaje técnico. papel, ¿no tendría el mismo sentido? ¿Y si la
trasladásemos a una conversación telefónica?
¿O a una conversación por IRC (Internet Relay
Chat)?
¿Cuál es el motivo por el cual es esto así? Tanto si esa conversación es hablada como si
Pues, si pensáis un poco, llegaréis vosotros es escrita, seguiría utilizando tanto el lenguaje
mismos a la conclusión. técnico de los cirujanos, como el idioma
castellano. En nada cambiaría, salvo en el
Imaginad que el lenguaje técnico de los hecho de que el medio utilizado sería diferente.
cirujanos fuese un lenguaje completo, con
sus fórmulas de saludos, despedidas, una Ahora bien, igual que un cirujano japonés no
gramática completa para construir las frases, puede entenderse con un cirujano de Jaén, si
palabras para expresar cualquier término el doctor PyC le hubiese soltado la parrafada
común en cualquier comunicación (como los al doctor Scherzo por correo, y éste le hubiese
habituales: me lo repita, ¡habla más respondido a viva voz cuando recibiese la
despacio, que no me da tiempo a apuntarlo!, carta (es decir, que se lo habría contado a las
etc.), e incluso tuviese sus propios nombres, paredes), tampoco habría sido posible una
en lugar de los que tenemos en castellano comunicación.
(doctor Pyc, y doctor Scherzo). ¡Sería una
completa locura! Ambos interlocutores tienen que compartir el
mismo medio físico para comunicarse. Si un
Desde luego, no sería nada práctico que interlocutor está utilizando el teléfono, y el
cualquier cirujano tuviese que aprender un otro está respondiendo por escrito en un papel,
idioma totalmente nuevo sólo para poder jamás podrá haber una comunicación.
comunicarse con sus colegas.
Por supuesto, tampoco sirve de nada que
Lo más práctico, y lo más lógico, es utilizar ambos hablen a viva voz, si cada uno está en
el recurso conocido por todos que es el idioma un lugar diferente, donde no se puedan
castellano, y simplemente ampliarlo con una escuchar mutuamente.
serie de términos que permitan entrar en
detalle en los conceptos manejados por los Podemos considerar, por tanto, al medio físico
cirujanos. como otra capa de la comunicación. En este
caso, esta capa ya no existe por una
Una vez comprendida la necesidad de conveniencia de hacer las cosas más fáciles,
comunicarse utilizando dos capas, vamos a si no por una necesidad natural.
Por ejemplo, un programa que funcione bajo Por el momento, continuaremos con los
Windows no tiene que preocuparse de saber conceptos sin entrar en ningún detalle.
cómo dibujar una ventana en la pantalla, si Ahora que ya habéis comprendido el concepto
no que simplemente le dice al sistema de capas, he de pediros que os olvidéis del
dibújame una ventana de estas ejemplo de los cirujanos, porque mi intención
características y Windows hará el trabajo era únicamente que comprendieseis el
sucio por él. concepto de capas, pero no mostrar
metafóricamente cada capa del protocolo
Todavía recuerdo los tiempos en los que TCP/IP con su equivalente en el mundo real,
programaba aplicaciones gráficas en MS-DOS ya que las capas que forman TCP/IP no tienen
y me tenía que currar desde cero todo el prácticamente nada que ver con las capas que
interfaz... un auténtico infierno. Perdías más forman la comunicación entre dos cirujanos.
tiempo con el interfaz que con el propio
programa. La única capa que sí que tienen en común
tanto las máquinas como los cirujanos es la
Pues lo mismo que ocurre con las ventanas, del medio físico ya que, como dije, esta capa
que son una función común a todas las no surge como una facilidad para la
aplicaciones de Windows, también ocurre con comunicación, si no que es una necesidad
las comunicaciones, que tienen una serie de natural irremediable. Igual que dos cirujanos
funciones comunes a todas las aplicaciones necesitan compartir un mismo medio para
de comunicaciones. Estas funciones comunes, comunicarse, también han de hacerlo dos
que son las que proporciona el idioma TCP/IP, máquinas.
se ubican precisamente en el Sistema
Operativo, para que sea él el que lidie con los
detalles, igual que las ventanas las gestiona
el Sistema Operativo, y es él el único que se
preocupa de
conocer los
detalles para
dibujarlas.
Perico Palotes
C/Pirulin. Nº12. 1º A.
35003 Villapalotes (Huelva).
Gracias a las direcciones postales todo el sistema 3.2. La capa TCP (Transmission
de Correos puede funcionar. Y no sólo gracias a la Control Protocol = Protocolo de
dirección del destinatario, si no también a la del Control de Transmisión) : La
remitente, que será una dirección con el mismo
formato (nombre, calle, código postal, población, y
necesidad de las conexiones para
provincia). tener una comunicación fiable
Gracias a la dirección del remitente se sabrá a quién Volvamos ahora al escenario del hospital. En
informar si la carta no llega a su destino, y el esta ocasión, el doctor PyC recibe un aviso de
destinatario podrá responder a la carta si lo desea. urgencia a través del servicio de megafonía
del hospital.
Pues exactamente lo mismo ocurre con las
direcciones de Internet. Aunque estas direcciones,
las famosas IPs, aparentemente no consten de varios
campos (nombre, calle, población, etc.), en realidad
esos campos sí que existen, y están codificados
dentro del propio número que forma la dirección IP.
Como en algunos casos la comunicación no Sería absurdo que si el frame 7 no llega, se parase la película,
orientada a conexión es suficiente, en las pidiésemos de nuevo al emisor el frame 7, esperásemos su llegada,
máquinas también es utilizada para algunos la comprobásemos y volviésemos a activar la película. Si pensamos
casos concretos. Cuando no necesitamos que llegan entre 15 y 30 frames por segundo, bufff, estaríamos
saber si nuestro interlocutor nos está parando la película cada dos por tres
es mejor despreciar
escuchando, no necesitaremos utilizar un ese frame que no ha llegado y seguir con la peli :)
protocolo de transporte fiable, como es TCP,
si no que nos bastará con utilizar un protocolo En el caso de los programas de intercambio de archivos tipo P2P
no orientado a conexión, que también os (como el eMule, http://www.emule-project.net/), el tema se
sonará bastante, y es el UDP (Protocolo de complica un poquito, pero solo un poquito.
Datagramas de Usuario).
Si estamos descargando un programa llamado officexp.zip (de
Por tanto, UDP es también un protocolo de 650MB) desde 7 usuarios a la vez, este nos llega en trocitos
transporte e, igual que la mayoría de pequeños. Lo importante es que nos lleguen cuanto más trocitos
aplicaciones de comunicaciones utilizan como mejor y en el menor espacio de tiempo. Pero claro, también es
apoyo TCP/IP, también hay varias aplicaciones importante que no perdamos ningún trocito (o después el ZIP
que en lugar de eso utilizan como apoyo nos dará errores).
UDP/IP.
En este caso, podríamos pensar que es mejor utilizar TCP, puesto DOCTOR en un sistema UDP en un mundo P2P :)
que nos asegura que llegan todos los trocitos; pero entonces El doctor (receptor) recibe por megafonía un mensaje (archivo)
estaríamos sobrecargando la red P2P con centenares de peticiones PERO el tipo del megáfono (emisor) es MUY DESPREOCUPADO
de comprobación y la descarga sería muy lenta. ¿Cómo resolvemos y no le importa si el doctor (receptor) recibe o no el mensaje.
esto?
El mensaje (archivo) a transmitir es: PRESÉNTESE
Pues trabajamos con UDP y hacemos que sea el programa P2P INMEDIATAMENTE EN EL QUIRÓFANO.
quien compruebe si faltan trocitos. En caso de faltar algún trozo
se reclama y en caso de no faltar no se reclama. 1.- El tipo del megáfono (emisor) emite la primera palabra
(primera parte del archivo): PRESÉNTESE
PARALELISMO: Por si alguien no lo ha pillado, retomemos el 2.- El doctor (receptor) en teoría recibe la primera palabra
caso del doctor y hagamos un paralelismo con el mundo P2P. (primera parte del archivo): PRESÉNTESE
DOCTOR en un sistema TCP en un mundo P2P :) 3.- El tipo del megáfono (emisor) emite la segunda palabra
El doctor (receptor) recibe por megafonía un mensaje (archivo) (segunda parte del archivo): INMEDIATAMENTE
PERO el tipo del megáfono (emisor) es MUY EXIGENTE y
4.- El doctor (receptor) en teoría recibe la segunda palabra
OBLIGA al doctor (receptor) que confirme la correcta recepción
(segunda parte del archivo): INMEDIATAMENTE
de cada palabra (parte del archivo) que recibe.
pero cada palabra (trozo de archivo) emitida tendrá estará deberíamos poder olvidar. Una cosa es el tipo de protocolo que
precedida de un número correlativo (número de control). Vamos estamos utilizando para nuestras conexiones (TCP o UDP e
a verlo. incluso ambos a la vez) y sus consecuencias sobre la red y, OTRA
MUY DISTINTA, cómo programamos el software para mejorar
DOCTOR en un sistema UDP en un mundo P2P (con control el rendimiento de dichas conexiones.
añadido).
El doctor (receptor) recibe por megafonía un mensaje (archivo) Hemos visto que las carencias de seguridad del protocolo UDP
con un sistema previamente pactado :) (capa de transporte) han sido "salvadas" gracias a cómo hemos
programado el software (nivel de aplicación).
El mensaje (archivo) a transmitir es: PRESÉNTESE
INMEDIATAMENTE EN EL QUIRÓFANO. PARA LOS QUISQUILLOSOS:
- Si, pero
¿y si el doctor (software receptor) no recibe ninguna
Según han pactado, el mensaje a transmitir será: palabra (trocito de archivo) porque está dormido?
UNOPRESÉNTESE DOSINMEDIATAMENTE TRESEN Pues entonces dotamos de un poco más de inteligencia al programa
CUATROEL CINCOQUIRÓFANO. para que la primera palabra (trocito de archivo) se haga por
TCP (confirmacion aobligatoria) y el resto por UDP. De esta
1.- El tipo del megáfono (emisor) emite la primera palabra forma no se emitirán mas palabras (trocitos de archivo) por
( p r i m e r a p a r t e d e l a rc h i v o ) : U N O P R E S É N T E S E megafonía hasta que el doctor llame al Sr. del megáfono
confirmando que la recibido la primera palabra.
2.- El doctor (receptor) en teoría recibe la primera palabra
( p r i m e r a p a r t e d e l a rc h i v o ) : U N O P R E S É N T E S E - Si, pero
¿y si el doctor (software receptor) no confirma la
recepción de esa primera palabra (trocito de archivo)?
3.- El tipo del megáfono (emisor) emite la segunda palabra Pues hacemos que el Sr. de megafonía (software emisor) envíe
(segunda parte del archivo): DOSINMEDIATAMENTE un mensaje al teléfono móvil del doctor cada 5 minutos durante
2 horas hasta que conteste.
4.- El doctor (receptor) en teoría recibe la segunda palabra
(segunda parte del archivo): DOSINMEDIATAMENTE ¿Y si a pesar de todo no contesta? Pues llamamos a otro doctor
mientras el primero está dormido (en un P2P sería el equivalente
5.- Seguiríamos así hasta que el doctor (receptor) en teoría a servir el archivo a otro cliente mientras el primero pasa a una
recibiese la última palabra (último trozo del archivo). En ese lista de espera :)
momento el doctor (receptor/software receptor) comprobaría que
tiene en su poder las palabras (trozos de archivo) y que no falta La intención de esta extensa nota no es otra que ACERCAR ese
ninguna (se puede comprobar gracias a que tienen números extraño mundo de las capas OSI a la realidad, a programas que
correlativos). utilizamos diariamente y que no tenemos ni idea de cómo funcionan
(por ejemplo la visualización de video en tiempo real y los P2P).
Solo en caso de que faltase alguna palabra (trozo de archivo) el Quizás ahora pensemos un poco más en lo que hay detrás de
doctor llamaría por teléfono al emisor pidiéndole UNICAMENTE esas cosas que utilizamos mecánicamente sin pensar :)
la palabra que le falta.
Como podemos ver, ahora la conexión sigue siendo del tipo UDP Olvidándonos ya de UDP, vamos a ver entonces
(cargamos poco la red); pero gracias a que hemos dotado al Sr. qué es TCP, que es el que más nos interesa.
del megáfono y al doctor (software emisor y receptor) de A diferencia de las comunicaciones no
inteligencia (software), hemos conseguido además bastante orientadas a conexión, las orientadas a
seguridad en la comunicación. conexión son aquellas en las cuales hay un
diálogo directo con el interlocutor. Es decir, no
ACABANDO Y PUNTUALIZANDO: es ningún monólogo que sueltas con la
esperanza de que alguien te escuche, si no
Acabamos de aprender algo importantísimo que ya nunca que es una conversación entre dos o más
interlocutores, donde todos saben en todo necesitarás saber que tu servidor de correo
momento si están siendo escuchados por lo está recibiendo (aunque si llega al buzón
los demás. del destinatario o no es ya un asunto
aparte), si estás en un Chat necesitas saber
Como ejemplo de comunicación orientada que la persona o personas con las que
a conexión tenemos el teléfono, donde en hablas están conectadas en ese momento,
todo momento sabes si la persona con la y leyéndote.
que estás hablando está siguiendo el
diálogo. Por el contrario, cuando hablas Hasta donde la capa IP entiende, sólo
con un contestador automático telefónico, existen sobres que circulan desde una
se trata precisamente de una comunicación dirección de remitente hacia una dirección
no orientada a conexión. de destinatario, pero en ningún momento
existe un diálogo entre remitentes y
destinatarios. Es en la capa TCP donde
aparece este nuevo concepto, que engloba
l o s s o b r e s q u e p a ra I P c i r c u l a n p o r
separado, en un único flujo de diálogo
entre las dos partes.
mensaje dijese: Doctor PyC, acuda a la sala Los buzones de correos tienen un tamaño
de cirugía cardiovascular para atender una limitado y, si bien cada fascículo por separado
urgencia de cardiopatía precarótida en un cabe perfectamente en el buzón, la colección
paciente varón de 70 años, diabético, de entera no cabría en ningún buzón.
grupo sanguíneo AB+, y cuyo color preferido Lo mismo ocurre con las máquinas, que tienen
es el fucsia. Si el Doctor PyC no respondiese un buzón de recepción de un tamaño limitado,
a la primera llamada, habría que repetir toda y hemos de ajustarnos a esas limitaciones
la parrafada de nuevo. tecnológicas.
No tiene sentido soltar parrafadas muy largas 3.4. La capa TCP: Las conexiones
si no tienes la certeza de que estás siendo simultáneas
escuchado. Por eso, si lo que tienes que
transmitir es muy largo, lo mejor es que lo Una de las principales funciones de la capa
vayas contando poco a poco, y esperando la TCP es la de permitir que existan varios
confirmación de que cada parte ha sido diálogos simultáneos entre dos interlocutores.
escuchada. Aquí no recurriré a más metáforas, si no que
será más sencillo verlo directamente en nuestro
Cuando hablamos por teléfono, normalmente campo de trabajo.
no soltamos un rollo de varias horas sin parar
(aunque los hay que si...), si no que estamos Si, por ejemplo, está PyC en MSN chateando
pendientes de que cada cierto tiempo nuestro con Scherzo, y a la vez le está enviando un
sufrido interlocutor nos dé las confirmaciones archivo, ¿no estarán manteniendo dos diálogos
de rigor como si, si, o aja, o que te calles simultáneos? Por un lado, están chateando,
ya. Normalmente, si llevamos dos minutos y por otro lado están enviando un archivo.
seguidos hablando y no hemos escuchado un
aja de nuestro interlocutor, nos mosqueamos Suponiendo que un Chat en MSN funcionase
bastante, y decimos oye, ¿sigues ahí?. mediante una conexión punto a punto (que
no es así, como sabréis si habéis leído mi
En resumen, lo natural a la hora de transmitir artículo sobre MSN, pero imaginaremos que
mucha información es hacerlo en pequeños sí), habría una serie de paquetes cuyo
trozos, cada uno de los cuales confirmará su remitente sería PyC y cuyo destinatario sería
recepción por separado. Scherzo, pero de esos paquetes algunos serían
parte del archivo que se está transfiriendo
Lo mismo ocurre en la comunicación entre (que, por supuesto, estaría partido en trozos,
máquinas. Como TCP se encarga de enviar tal y como vimos en el punto anterior), y otros
confirmaciones, es también el que se encarga serían parte de la conversación que mantienen
de partir los paquetes muy grandes en PyC y Scherzo a través del Chat.
paquetes más pequeños para que estas
confirmaciones puedan llegar poco a poco, y Para permitir que esto ocurra, el protocolo de
no tener que retransmitir todo si no llegase transporte, TCP, tiene que tener algún sistema
la confirmación. que identifique qué paquetes son del Chat, y
qué paquetes son del archivo. Esto lo hace
Esto nos permite, además, adaptarnos a la capacidad
asignando un número a cada diálogo
de nuestro interlocutor. Por ejemplo, si nos
simultáneo y, según el número que haya en
suscribiésemos a una enciclopedia por fascículos,
cada paquete, sabrá si éste forma parte del
y nos enviasen toda la colección de golpe,
probablemente el cartero mandaría al garete a los
archivo, o del Chat.
tíos de Espasa, y les diría que los 20 volúmenes
Pues estos números mágicos de los que estoy hablando
los iba a llevar hasta allí su simpática abuela.
no son otros que los archiconocidos PUERTOS.
Un puerto es un campo del protocolo TCP que se abre esta conexión lo detallaremos a lo
permite identificar el servicio al que va largo del curso, pero no en este artículo.
destinado cada paquete en una conexión De momento lo que sí que sabemos es que
entre dos máquinas. la responsable de abrir y mantener las
conexiones es la capa TCP.
Así, cada vez que una máquina reciba un 3. Scherzo escoge el archivo que
paquete con el número de puerto 25, sabrá quiere bajar: comandos CWD, CDUP,
que ese paquete es un e-mail, cada vez que LIST,... todo esto ya lo vimos en los artículos
reciba un paquete con el número de puerto sobre FTP de la serie RAW, y ahora no nos
21, sabrá que ese paquete es un comando interesa mucho.
de FTP, cada vez que reciba un paquete con 4. Scherzo inicia la transferencia del
el número de puerto 80 sabrá que es una archivo: comandos PORT o PASV, y RETR
conexión Web, etc., etc. o REST. También lo vimos en los artículos
de la serie RAW, y tampoco nos interesa
4. Ejemplo: Enviando un archivo. ahora.
5. El archivo se transfiere desde el
Para recapitular todas las ideas mostradas a servidor de PyC hacia el cliente de
lo largo del artículo, termino con un ejemplo Scherzo: Aquí unos enanitos se encargan
bastante completo que muestra paso a paso de llevar el archivo de una máquina a otra,
el envío de un archivo de PyC a Scherzo. cargando los datos en sacos que llevan a
la espalda. Pero... ¡espera! ¡Si esto no es
Estad muy atentos a cada paso, porque espero la serie RAW! En la serie RAW no me
que este ejemplo os ayude a comprender quedaba más remedio que deciros estas
mucho mejor todos los conceptos que cosas, porque al llegar a este punto no
necesitareis para seguir el resto del curso. podía daros más detalles, ya que más de
Fijad también vuestra atención en todas las una vez os mencioné que explicar lo que
ilustraciones, pues muestran gráficamente ocurre en estos momentos sería suficiente
toda la secuencia del ejemplo, y además los para llenar no sólo un artículo, si no una
datos que aparezcan en las propias serie entera. ¡Y al fin ha llegado esa serie!
ilustraciones son también fundamentales. Así que esperad unas cuantas líneas, que
enseguida os explico cómo funcionan las
A lo largo de la serie RAW os he explicado ya cosas realmente. Tampoco quiero chafar
varios sistemas de transferencia de archivos la ilusión a nadie, así que si alguien no
(FTP, DCC, MSN,...). En este ejemplo quiere dejar de creer en los enanitos que
usaremos, por ejemplo, una transferencia transportan paquetes de datos, que no siga
por FTP. leyendo! ;-)
6. Finaliza la transferencia del
Antes de nada, vamos a ver cómo sería el archivo: y a otra cosa, mariposa.
proceso si sólo nos fijásemos en la capa de
arriba, es decir, en la capa sobre la que he ¿Para qué os he mostrado todos estos pasos
ido hablando mes tras mes en la serie RAW. que conocéis ya perfectamente (sobre todo si
habéis seguido la serie RAW)? Pues
1. PyC abre su servidor FTP: pone sencillamente, para que veáis que entre los
un puerto en escucha, gracias a una pasos 5 y 6 ocurren una gran cantidad de
función que da el sistema operativo que cosas que siempre hemos obviado, y que serán
permite a cualquier aplicación realizar las que precisamente detalle en este ejemplo.
estas y otras funciones de TCP/IP.
2. Scherzo abre una conexión con Nos olvidaremos, por tanto, del resto de pasos,
el servidor FTP de PyC: el modo en que y nos centraremos únicamente en lo que ocurre
si no según el número de byte del archivo en La capa TCP ya ha terminado su trabajo inicial,
el que empieza ese trozo. Así, el primer trozo y de momento se puede relajar un poco
tendrá un número de secuencia 0, el segundo mandando los bloques a la capa IP, que sabrá
un número de secuencia 1500, y el tercero qué hacer con ellos a continuación. Pero, a
un número de secuencia 3000. diferencia del programa de FTP, la capa TCP
no se puede dormir en los laureles esperando
Pero, ¿es éste el único dato que ha de asignar a que la transferencia del archivo termine, si
la capa TCP a cada trozo? Pues me temo que no que tendrá que seguir trabajando más
n o, ya q u e s a b e m o s b i e n q u e l a s adelante, tal y como iremos viendo.
responsabilidades de esta capa van más allá
de simplemente partir los paquetes en bloques. 4.3. En el sistema operativo de
Hablamos también de los números de puerto, PyC: La capa IP.
así que tendrá que añadir a cada trozo los
dos puertos implicados en la conexión. En cuanto TCP llama a la capa IP, y le pasa
¿Adivináis cuáles son estos puertos? los 3 bloques, ésta se pone en marcha. Su
labor principal consiste en añadir a cada bloque
Je, je... era una pregunta con trampa. Si
las direcciones IP de PyC y Scherzo para que,
habéis pensado que uno de los puertos era
el 21, puerto asignado al servicio FTP, os una vez que los bloques estén flotando por el
habéis equivocado, aunque he de reconocer ciberespacio, todos aquellos mediadores por
que lo he preguntado a mala leche. 0:-) los que pasen sepan dónde llevarlos.
Como vemos en la ilustración, la única como para que nunca tengan que repetirse.
máquina que se comunica directamente con Estas direcciones, más largas que las
Internet es el router ADSL, y es éste el que direcciones IP, constan de 48 bits, por lo que
tiene que encargarse de llevar todos los teóricamente permiten identificar casi 300
paquetes de PyC y de su hermano a Internet. Billones de dispositivos Ethernet diferentes.
Para ello, ambos ordenadores están Entonces, ¿qué datos añadirá el nivel Ethernet
conectados al router mediante un cable de a cada bloque que queremos transmitir? Pues,
red (si el router sólo tiene un conector RJ-45 al igual que la capa IP, añadirá una dirección
tendría que haber en medio un switch, pero MAC de origen, y una dirección MAC de destino.
esa cuestión la obviamos por salirse del tema). Y, también igual que en la capa IP, tendrá que
añadir un dato más, que es un identificador
El problema aquí es que la comunicación en de la capa superior que le pasó los bloques,
Ethernet es de tipo broadcast. es decir, en este caso la capa IP.
Pero lo que nos interesa aquí es conocer el Los tres paquetes que forman el archivo, con sus cabeceras TCP,
mecanismo utilizado para distinguir unas IP, y Ethernet. En ésta la MAC de origen será la de PyC, y la
máquinas de otras en una LAN. MAC de destino la del router ADSL de PyC, que será el próximo
punto con el que habrá que enlazar la comunicación. El ordenador
Como podéis imaginar, esto se consigue de PyC conoce la dirección MAC del router gracias al protocolo
asignando un número diferente a cada tarjeta ARP, pero eso se sale del tema del artículo.
de red de las máquinas conectadas a la LAN.
Este número es único en el mundo para cada
tarjeta de red.
! ¿No sabes...
Los fabricantes de dispositivos Ethernet tienen
un acuerdo para que nunca se fabriquen dos ¿No sabes la MAC de tu tarjeta de Red? ¿de verdad?...
tarjetas de red con el mismo número. Este
bueno, bueno
tendrías que haber leído los anteriores
número mágico es precisamente la famosa
números de esta revista :)
dirección MAC (comúnmente conocida
como dirección física) de la que
probablemente habréis oído hablar.
Abre una ventana de comandos (Menú inicio --> Todos
los Programas --> Accesorios --> Símbolo del sistema).
Al haber una MAC diferente por cada Escribe IPCONFIG /ALL. Pulsa enter y ZAS!!! Ahí tienes
dispositivo Ethernet del mundo, las direcciones la MAC de tu/s tarjetas Ethernet (Tarjetas de Red).
MAC tienen que ser lo suficientemente grandes
¡Al fin el paquete llegó hasta el último router La capa IP de Scherzo analizará ahora no sólo
del camino! Este, por supuesto, es el router la IP de destino (que es la de Scherzo), si no también
ADSL de Scherzo. Éste analizará el paquete, la de origen (que es la de PyC), ya que tendrá que
y verá que en la capa IP tiene como dirección enviar sus respuestas a esa dirección. Una vez que
IP de destino la IP de Scherzo, así que ahora se queda con estos dos datos, manda el paquete
sólo le falta saber a cuál de los PCs de la LAN a la capa superior que, según la cabecera IP, es la
de Scherzo enviarlo. capa TCP.
En todos los saltos que ha ido dando el paquete de
un router a otro, ninguno ha analizado su cabecera
Todos los PCs de la LAN de Scherzo comparten
TCP, ya que esto es sólo responsabilidad del
una misma IP de cara a Internet, que es la
destinatario final (Scherzo).
IP del router, y éste los diferencia sólo por su
Una vez analizada la cabecera IP, se elimina, y se pasa el resto El sistema de Scherzo construye un nuevo paquete para indicar
del paquete a la capa TCP.
a PyC que recibió el suyo. La cabecera TCP de este nuevo
paquete constará de un campo ACK con el mismo valor que el
número de secuencia del paquete al que quiere responder, e
4.14. En el sistema operativo de intercambiará los puertos de origen y de destino. El contenido
Scherzo: la capa TCP del paquete (zona azul) estará vacío, ya que lo único importante
aquí son las cabeceras.
La capa TCP de Scherzo cogerá el paquete,
y verá que no es un paquete completo, si no
sólo un trozo (recordemos que el archivo se
partió en 3 trozos en la capa TCP de PyC). 4.15. En el sistema operativo de
Scherzo: de vuelta en la capa IP
La capa TCP de Scherzo tiene ahora dos
responsabilidades: responder a PyC diciéndole Esta cabecera la pasaremos a la capa IP, que
que ha recibido el primer trozo, y mandar el conoce la IP de PyC, por lo que construye una
paquete a la capa de arriba, es decir, a la cabecera IP adecuada para ese paquete:
aplicación cliente de FTP, que será la que sepa
qué hacer con los datos contenidos en el
paquete.
PyC envía los tres paquetes y espera un tiempo razonable a Gracias al número de secuencia de cada paquete se puede
que le llegue la respuesta (ACK) de Scherzo diciendo que ha reconstruir el archivo original, uniendo cada fragmento en el
recibido cada uno de los paquetes punto (posición en bytes) indicado por el número de secuencia.
Para todos aquellos que no tienen la primera entrega del Pero, antes de empezar, he de aclararos un
curso de TCP / IP publicada en el número 17 de PC PASO asunto. Supongo que algunos de vosotros os
preguntareis qué ha pasado con la serie RAW.
A PASO, hemos decidido pasarla a formato PDF y liberarla
Mis intenciones no eran de ninguna manera
en la Web de la revista (www.hackxcrack.com).
sustituir la serie RAW por el curso de TCP/IP,
si no desarrollar ambos en paralelo. Pero es
También aprovechamos esta nota para indicar
increíble de qué manera pueden conspirar
a nuestros lectores que todos los artículos juntas las circunstancias de la vida para
liberados y los programas que mencionamos cambiar por completo tu rumbo cuando menos
en los artículos están disponibles en la sección te lo esperas. En poco más de un mes me han
ARTÍCULOS LIBERADOS Y DESCARGAS de la surgido una serie de problemas de todo tipo
Web. (familiares, personales, de salud, laborales,
y académicos) por los cuales ahora (y sin
Para esta primera lección he escogido un plazo definido) dispongo de muchísimo menos
protocolo muy sencillo, el protocolo UDP (User tiempo.
Datagram Protocol --- Protocolo de He barajado un poco mis posibilidades, y creo
Datagramas de Usuario), para así poder que lo que puedo permitirme de momento es
extenderme más en explicaros algunas continuar sólo con el curso de TCP/IP, aunque
herramientas que nos pueden ser útiles a lo no descarto publicar algún otro artículo de la
largo de todo el curso. De momento, estas serie RAW algún mes que consiga juntar algo
herramientas las utilizaremos para manejar más de tiempo. Con esto lo que os quiero
decir es que no os prometo nada con respecto protocolo DNS. Vamos a utilizar este protocolo
a la serie RAW, pero que haré lo que esté en como ejemplo para ver qué ocurre desde que
mi mano para que no termine aquí, aunque un cliente solicita una consulta DNS a un
haya que avanzar ahora mucho más despacio. servidor, hasta que éste cliente recibe la
respuesta pertinente. Os aconsejo que leáis
Gracias por vuestra comprensión. ;-) el artículo sobre DNS de la serie RAW, que se
encuentra en el número 14 de la revista,
! NOTA EDITORIAL aunque voy a empezar haciendo una
introducción sobre este protocolo.
Tal y como nos describe el autor, esperamos poder hacer Os recuerdo que el protocolo DNS es el que
más entregas de la Serie Raw en futuros números, pero de nos permite utilizar las famosas URLs en lugar
forma más dilatada en el tiempo. Mientras tanto disfrutemos de direcciones IP. Es decir, nos permite escribir
de este excelente curso de TCP / IP, una serie de artículos en nuestro navegador http://www.google.com
ampliamente reclamada y esperada por nuestros lectores. en lugar de tener que escribir
http://216.239.39.99, que es la dirección IP
de Google.
Gracias a esto, a continuación nuestro A grandes rasgos, son cuatro los problemas
navegador podrá acceder a la máquina que que hemos encontrado para conseguir llevar
contiene la página Web que deseamos visitar, a cabo esta comunicación. Y, por supuesto,
ya que sólo puede existir una comunicación no es coincidencia que sean cuatro las capas
directa entre dos máquinas si cada una conoce de protocolos utilizadas en una comunicación
la dirección IP de la otra. UDP: capa física, capa de enlace, capa de
red, y capa de transporte.
Ahora vamos a pensar un poco en cómo se
podría conseguir todo este mecanismo del Si no fuese gracias a la existencia de estas 4
DNS, en el cual un cliente solicita un nombre capas diferenciadas, el protocolo DNS debería
a un servidor, y el servidor le responde con encargarse por sí sólo de solucionar todos
la IP correspondiente. ¿Qué problemas se nos estos problemas. Es decir, el protocolo DNS
presentan a la hora de llevar a cabo este debería tener sus propias conexiones físicas
proceso aparentemente tan sencillo? Pensadlo entre máquinas, sus mecanismos para
un poco, y después mirad la lista de problemas encontrar un camino entre todas las máquinas
a salvar que os pongo a continuación, para que están conectadas simultáneamente, sus
ver si habéis llegado a las mismas propias direcciones IP, y sus propios
conclusiones: mecanismos para diferenciarse de
otros servicios (como la Web o el correo
En primer lugar, por supuesto, hay que electrónico).
conseguir que ambas máquinas (cliente y
Esto convertiría al aparentemente sencillo
servidor) tengan una conexión física, ya
protocolo DNS en un sistema de una
sea por cables, por radio, o por cualquier otro
complejidad inabarcable, y lo mismo ocurriría
medio físico que les permita establecer una
con cualquier otro protocolo que tuviese que
comunicación bidireccional.
lidiar él solito con todos los problemas de origen, en cambio, servirá para que el
existentes en una comunicación. servidor pueda responder a nuestra consulta,
utilizando como puerto de destino el que para
Vamos a ver entonces cómo se reparte el n o s o t r o s e ra u n p u e r t o d e o r i g e n .
trabajo de la comunicación para permitir que
En resumen, lo que el protocolo UDP ha
el protocolo DNS se abstraiga de todo lo que
conseguido es identificar una comunicación
no sea su misión directa.
entre dos máquinas, entre las cuales podría
haber simultáneamente varias comunicaciones
Empezamos escribiendo una url en nuestro
establecidas.
navegador:
http://neworder.box.sk/home.html Lo que hace UDP es envolver el paquete con
una pequeña cabecera que añade la
En primer lugar, nuestro navegador quitará información necesaria, es decir, los puertos.
la parte de la URL que no corresponda al
nombre, que es: neworder.box.sk.
Exactamente lo mismo ocurre en el teléfono, Una vez que nuestro paquete está ya circulando
lo cual podemos ver claramente si recordamos por los cables físicos (u ondas de radio físicas),
a las telefonistas de antaño. Antiguamente terminará llegando hasta el servidor DNS. El
(y hoy también ocurre, pero con la diferencia servidor analizará el paquete, verá que se
de que está automatizado) en el instante en trata de una consulta DNS, y hará lo que tenga
que marcabas un número de teléfono no se que hacer para conseguir el resultado pedido
establecía una comunicación. Para conseguir (explicado en detalle en el artículo sobre DNS
esto hacía falta un procedimiento intermedio, de la serie RAW, en el número 14 de la revista).
que era el de las telefonistas. Las telefonistas
se encargaban de ir conectando y Una vez encontrada la respuesta, tendrá que
desconectando cables en sus paneles para construir un sencillo paquete de respuesta
conseguir enlazar los dos puntos de la DNS que simplemente contendrá la dirección
comunicación. IP pedida como resultado de la traducción del
nombre neworder.box.sk. Este paquete, para
En el caso de Internet, a pesar de lo que os poder circular hasta nosotros de vuelta,
hayan contado vuestros padres, no existe también tendrá que tener sus propias
una raza de enanitos encargada de conectar cabeceras UDP, IP, y Ethernet.
y desconectar cables, así que todo esto ocurre
El paquete completo (con las cabeceras) de
de forma automática y virtual, es decir, no
respuesta podría ser parecido a este:
se conecta ni se desconecta nada físicamente,
si no que simplemente se establecen
RESPUESTA DNS:
conexiones lógicas.
IP = 66.250.131.132
sobraba con lo que hace UDP, si no por motivos gruñones que se dedican a desconectar cables
de seguridad, como ya vimos al hablar en la de vez en cuando, ocasionando así la pérdida
s e r i e R AW s o b r e l o s a t a q u e s p o r de paquetes.
envenenamiento de DNS.
No cabe duda de que ninguna tecnología es
En la práctica, hay casos en los que el puerto perfecta, y por eso siempre puede haber
de origen es irrelevante, por lo que no siempre pérdidas de datos en cualquier comunicación.
es obligatorio especificarlo. En estos casos, ¿Qué ocurriría, por ejemplo, si no nos llegase
lo que se hace es usar el puerto 0 como la respuesta del servidor DNS, a pesar de que
origen. éste la hubiera enviado? Si, por cualquier
motivo, la respuesta se perdiese por el camino,
no pudiendo llegar hasta nosotros, ¿habría
2.2.2. Corrección en los datos
alguna forma de detectar y solventar esta
Imaginad que por cualquier problema en la situación?
línea los datos llegasen corruptos hasta
nosotros, y uno de los números que forman Analizando el funcionamiento básico del
la IP que hemos solicitado al servidor DNS protocolo UDP, tal y como lo hemos visto,
es incorrecto. no habría ninguna manera. En UDP cada
máquina envía sus paquetes a la red, sin tener
Sería un gran problema no tener una cierta ninguna certeza de si llegarán o no a su
seguridad de que los datos que nos llegan de destino. Una vez que el servidor DNS envíe
un servidor DNS son correctos. Estaríamos su respuesta, se desentenderá del asunto, al
cada dos por tres estableciendo conexiones no tener forma de saber si la respuesta nos
con direcciones IP incorrectas. ha llegado o no.
UDP no puede garantizar que los datos lleguen, Este es el principal problema de los protocolos
pero si que nos da cierta garantía de que, si no orientados a conexión, como es el caso
han llegado, son correctos. Para ello incorpora de UDP. Como ya vimos en el artículo sobre
en su cabecera un dato que no hemos visto DNS, en el caso de TCP esto es muy diferente,
antes (ya que estabamos viéndolo sólo a ya que TCP es un protocolo orientado a
grandes rasgos), que nos permite comprobar conexión. Por cada paquete transmitido en
que los datos son correctos, tal y como TCP es obligatorio que el receptor envíe un
veremos más adelante. acuse de recibo para que el emisor sepa con
certeza que los datos han llegado al destino.
Este problema de la corrección de los datos Esto no es así en UDP.
perfectamente podría haberlo incluido en la
lista de problemas de la comunicación, pero En UDP no hay manera de saber si los datos
no lo hice a propósito para que saliesen justo llegan al destino. Esto es una gran desventaja
cuatro. :-P pero, por otra parte, tiene la gran ventaja de
hacer la comunicación mucho más fluida, al
2.3. LO QUE NO
NOS DA EL no verse interrumpida constantemente por
miles de paquetes de acuse de recibo.
PROTOCOLO UDP FRENTE A TCP
Esta característica convierte a UDP en un
2.3.1. Fiabilidad en la
p r o t o c o l o d e t ra n s p o r t e i d e a l p a ra
comunicación comunicaciones sencillas (como DNS, o TFTP
(Trivial File Transfer Protocol --- Protocolo
Aunque antes desmentí el mito de los enanitos
Trivial de Transferencia de Ficheros)), y para
telefonistas de Internet, unos enanos que sin
envíos masivos de flujos de datos (como en
duda si que existen en la red son los enanos
Para los ALERGICOS al inglés, tienes al final de este El campo Tamaño paquete son otros 16 bits,
artículo el RFC en perfecto castellano ;) así como el campo Suma de comprobación.
u16 prot_tcp=17;
4. UDP EN LA PRÁCTICA
A continuación, escribimos cualquier cosa: una de las máquinas a las que tienen que dar
servicio.
hola
Wrote 33 byte UDP packet. ¿Y cual puede ser la utilidad de utilizar una IP
que no es la tuya? Pues ya hablaremos sobre
UDP Packet Injected todo eso a lo largo del curso, pero os adelanto
que esto puede servir para llevar a cabo gran
Vamos a analizar lo que hemos hecho. número de ataques.
En primer lugar, al llamar a Nemesis con la
En nuestro caso no queremos atacar a nadie,
opción udp en primer lugar (nemesis udp)
simplemente queremos comprender de forma
le decimos que queremos enviar un paquete
práctica el funcionamiento del protocolo UDP.
UDP, de entre todos los protocolos que
Por lo tanto preferimos utilizar nuestra IP
soporta Nemesis.
como IP de origen:
Por último, os habréis dado cuenta de que no falsa que tenemos almacenada en el archivo
es nada práctico meter los datos directamente envenenamiento.txt. La forma de lanzar
desde teclado, ya que es bastante complicado esta respuesta falsa sería:
generar una consulta DNS a pelo e introducirla
nemesis udp x 53 y 1200 S
desde el teclado. En la mayoría de los casos,
194.220.51.2 D 194.224.52.6 P
os será mucho más útil construir primero la
envenenamiento.txt
consulta con algún editor hexadecimal (por
ejemplo, podéis utilizar UltraEdit, que además
Podemos automatizar esto mediante un script
de ser un magnífico editor y visor de textos,
que haga un bucle en el cual vaya utilizando
es también un editor hexadecimal básico),
distintos Transaction ID y, tal y como vimos
guardarla en un fichero, y luego cargarla
en el artículo sobre DNS, según la versión de
directamente en Nemesis con la opción P.
BIND que utilice el servidor DNS de la víctima
Por ejemplo, si nuestro fichero se llama
tendremos una mayor o menor probabilidad
consulta.txt haremos:
de éxito.
nemesis udp v x 1000 y 53 S
192.168.1.2 D 194.224.52.6 P 4.2. HPING PARA LINUX
consulta.txt
Existe también versión de Nemesis para Linux,
pero os enseñaré mejor una herramienta
Podemos, por ejemplo, capturar una consulta
bastante más potente, que es Hping. Podéis
DNS real con un sniffer, después modificarla
bajar Hping de www.hping.org. Para instalarlo
a nuestra voluntad con el editor hexadecimal,
tendréis que compilarlo primero. Los pasos a
guardar la consulta modificada en un archivo,
seguir son los típicos:
y después enviarla a través de Nemesis.
si no que además implementa sencillos bucles Una opción curiosa de hping es la opción --badcksum
para poder generar muchos paquetes sin que genera una suma de comprobación inválida en el
necesidad de programar scripts. Si queremos paquete enviado, lo cual puede ser útil para comprobar la
que envíe un único paquete tendremos que reacción de un sistema ante un paquete malformado.
usar la opción --count 1. Aunque mejor que
veamos directamente un ejemplo: A lo largo del curso, entraremos en más detalle en el
funcionamiento de éstas y otras herramientas. Por el
hping2 193.224.52.6 --udp --destport 53
momento, os animo a que vayáis investigando por vuestra
--file envenenamiento.dat --data 14 --
cuenta.
count 1
Formato 0 7 8 15 16 23 24 31
0 7 8 15 16 23 24 31 +--------+--------+--------+--------+
+--------+--------+--------+--------+ | dirección de origen |
| Puerto de | Puerto de | +--------+--------+--------+--------+
| Origen | Destino | | dirección de destino |
+--------+--------+--------+--------+ +--------+--------+--------+--------+
| | | | cero |protocol| longitud UDP |
| Longitud | Suma de Control | +--------+--------+--------+--------+
+--------+--------+--------+--------+
|
| octetos de datos ... Si la suma de control calculada es cero, se
+---------------- ... transmite como un campo de unos (el equivalente
en la aritmética del complemento a uno). Un
Formato de la Cabecera de un Datagrama de Usuario valor de la suma de control trasmitido como
un campo de ceros significa que el emisor
Campos no generó la suma de control (para depuración
o para protocolos de más alto nivel a los
El campo Puerto de Origen es opcional; cuando que este campo les sea indiferente).
tiene sentido, indica el puerto del proceso
emisor, y puede que se asuma que ése sea el
puerto al cual la respuesta debería ser Interfaz de Usuario
dirigida en ausencia de otra información. Si
no se utiliza, se inserta un valor cero. Un interfaz de usuario debería permitir:
Febrero ES:
Se indican otros números de protocolo en [5].
Referencias
Las conexiones de las que hemos hablado Para poder realizar este chat entre 3
son siempre conexiones entre dos personas mediante cables de 2 conectores
puntos, y así son todas las conexiones se hace imprescindible la presencia de un
en TCP. Aunque puedas estar en un chat intermediario que gestione todas las
hablando con 100 personas a la vez, en conexiones de todos los usuarios. Esta es
realidad toda esa comunicación se realiza precisamente la misión de un servidor
a través de pares de conexiones. de chat.
Esto en realidad no es tal y como lo pinto. Este Una solución mucho más eficiente es
número cambiante realmente existe, pero su principal englobar en un sólo paquete los datos
finalidad no es la de identificar conexiones, si no transmitidos y la confirmación de los datos
más bien la de mantener el estado de evolución de recibidos.
una conexión, y saber así en todo momento qué
paquetes se pueden enviar y qué paquetes se pueden
recibir a través de esa conexión.
la máquina B, que recibe los paquetes. comunicación, a no ser que sea un mal-
Por tanto, la máquina A empieza a enviar nacido (que los hay), tendrá que actuar
paquetes a toda velocidad y sin en consecuencia, relajándose un poco y
compasión, esperando las confirmaciones dándonos tiempo a asimilar lo que ya nos
de la máquina B. Como B no da abasto, ha enviado.
no es capaz de enviar las confirmaciones
de recepción a tiempo. Al no llegar las Más adelante veremos en detalle cómo
confirmaciones, A se pondrá a reenviar se implementa el control de flujo en TCP.
los paquetes anteriores, al mismo tiempo
que continúa enviando paquetes a diestro
y siniestro, por lo que la congestión, ! Todo esto que...
sumando los paquetes nuevos y los viejos,
será muchísimo mayor. Todo esto que estamos explicando después lo tocaremos
en la realidad. Veremos los paquetes TCP y dónde está
localizado cada concepto del que hablamos.
Por el canal de entrada irán llegando los servidor el resto de nuestros intentos de
paquetes uno tras otro. Se irán conexión, el servidor nos responderá con
almacenando en el buffer de recepción, RST a cada nuevo intento de conexión,
y no serán procesados hasta que llegue para que nos olvidemos de esa conexión
el último paquete, que contiene el flag y nos centremos en la que ya tenemos.
PSH. Como este paquete es el que
completa el archivo de 400B, para cuando 4.7.5. Flag SYN (Synchronization)
llegue, el sistema receptor ya podrá
procesar los datos de los 4 paquetes y Cuando este flag está activo (vale 1, en
reconstruir el archivo original. lugar de 0), estamos indicando al otro
extremo que deseamos establecer una
Como decíamos, el flag PSH debe nueva conexión. Este flag se utiliza
combinarse con el flag URG cuando haya únicamente al abrir una nueva conexión.
datos urgentes. El flag URG será el
encargado de decir al receptor que ha Más adelante veremos el mecanismo
de atender los datos con máxima exacto por el que se establecen las
prioridad, y el flag PSH se asegurará de conexiones, así como algunas cuestiones
que el paquete no se retrase esperando de seguridad relacionadas con este flag.
en los buffers.
4.7.6. Flag FIN (Finish)
4.7.4. Flag RST (Reset)
Cuando este flag está activo (vale 1, en
Cuando este flag está activo (vale 1, en lugar de 0), indicamos al otro extremo
lugar de 0), estamos indicando al otro de la conexión de que, por lo que a
extremo de la conexión que algo no anda nosotros respecta, la conexión ya se
bien, ya que los datos que nos han llegado puede cerrar.
no coinciden con nuestra conexión, por
lo que se ha perdido la sincronización Normalmente, una vez que enviemos
entre ambas partes. nuestro propio FIN, tendremos que
esperar a que nuestro compañero nos
Ante cualquier campo incorrecto que envíe el suyo. Una vez puestos los dos
recibamos (números de secuencia de acuerdo en que no hay más que hablar,
inválidos, o flags no esperados) se puede cerrar la conexión pacíficamente.
tendremos que responder con un paquete
con este flag activo, para que el otro
Tanto RST como FIN se utilizan para
extremo se entere del problema, y se
finalizar conexiones, pero la diferencia es
cierre la conexión para re-sincronizar
que RST avisa de una situación de error,
ambas partes.
mientras que FIN avisa de una
terminación sin problemas.
Un uso típico de este flag es cuando
estamos intentando conectar con un
servidor, enviando varios paquetes para Ante una terminación con RST,
establecer la conexión, y al final uno de normalmente las aplicaciones avisarán al
ellos tiene éxito. Si después de ese usuario, por ejemplo con una ventana
paquete de conexión siguen llegando al avisando que se ha perdido la conexión.
además, el próximo paquete tendrá que mensaje (vacío si hace falta) cuya única
ser como máximo de 250 bytes. finalidad sea precisamente avisar del
cambio de la ventana. Por otra parte, la
En respuesta, A envía un nuevo paquete, responsabilidad del emisor (el que ha
comenzando en el byte 2500, y congestionado al otro) es dejar de enviar
conteniendo tan sólo 250 bytes. más datos, y esperar un tiempo prudencial
para continuar la transmisión pasados
Todo esto es muy bonito, A y B son muy unos dos minutos, si es que el receptor
amigos, y A le va enviando a B las cosas no ha enviado una nueva ventana antes.
poco a poco cuando éste se agobia. Pero
esto en realidad no es una idea muy 4.9. Suma de comprobación
buena. Si A va haciendo caso a B según Al igual que en el caso de UDP, la suma
éste le vaya diciendo lo que puede de comprobación se calcula mediante una
manejar, y B va avisando a A según vaya operación de aritmética binaria (suma en
liberando hueco en su buffer de recepción, complemento a uno de 16 bits) que se
los paquetes que se transmitan irán realiza sobre una cabecera especial que
siendo cada vez más pequeños. contiene los datos más relevantes.
En el peor de los casos, podría llegar a Cada vez que se recibe un paquete TCP,
ser 0 la ventana de B, y en el instante hay que realizar esta misma operación
en que hiciese hueco para un mísero con los datos recibidos, y comparar el
byte, avisar a A, por lo que A le enviaría número obtenido con el campo suma de
un paquete con un único byte de datos. comprobación del paquete. Si ambos
Esto daría lugar a una transferencia muy números no son iguales, los datos son
poco efectiva de los datos, donde muchos incorrectos, y será necesaria una
de los paquetes serían de un tamaño retransmisión de los mismos. En ese caso,
ridículo. no enviaremos la confirmación de
recepción pertinente, esperando a que el
Por tanto, es aconsejable no ir emisor decida retransmitir el paquete al
ajustándose literalmente al tamaño de ver que no les respondemos.
la ventana, si no dejar unos pequeños
márgenes. Por ejemplo, cuando se detecte Aunque ya lo comenté en el anterior
que la ventana va decreciendo por artículo, os recuerdo que tenéis detallada
momentos, lo mejor es esperar un tiempo la operación de la suma de comprobación
para dejar que la ventana vuelva a en el RFC 1071, y que tenéis un código
recuperar toda su capacidad, y continuar de ejemplo en C en la siguiente URL:
entonces la transmisión. Si fuésemos con http://www.netfor2.com/tcpsum.htm
prisas, empeñándonos en enviar más y
más datos, la reducción de tamaño de la En este caso no tenéis que realizar ninguna
ventana sería cada vez mayor, y la modificación sobre el código, ya que sirve
transferencia cada vez menos eficiente. precisamente para calcular la suma de
comprobación de TCP.
En el caso de que la ventana llegue a ser
La cabecera que se forma para llevar a
cero, la responsabilidad del receptor (el
cabo la suma de comprobación es la
que se ha congestionado) es avisar
siguiente:
cuando su ventana se recupere, con un
4.11. Opciones
Pero, ¿significa esto que los datos tienen La opción definida se utiliza únicamente
que ir en un único paquete para ellos al establecer una nueva conexión. Lo que
solos? Esto podría ser poco eficiente, ya indica este campo opcional es el máximo
que los datos urgentes podrían ser tan tamaño de los segmentos que estamos
sólo unos pocos bytes, y nos obligaría a dispuestos a recibir. Un segmento es cada
enviar paquetes casi vacíos sólo para una de las partes en las que se dividen
poder transmitir el dato urgente. los datos, por lo que nuestro compañero
de conexión no debe enviarnos nunca
Por ejemplo, el CONTROL-C del que paquetes más grandes de lo que
hablábamos, es un comando muy breve, indiquemos con esta opción. En el caso
y sería un desperdicio enviar paquetes de que no usemos este campo opcional,
vacíos que sólo llevasen ese comando. nos podrá enviar paquetes de cualquier
Por tanto, TCP permite combinar en tamaño ajustándose, eso sí, a nuestra
un mismo paquete datos urgentes ventana de recepción.
con datos no urgentes.
¿Y qué relación hay entonces entre la
Para conseguir esto, el campo puntero
ventana de recepción y el tamaño máximo
de urgencia nos indica el punto a partir
de segmento?
del cual terminan los datos urgentes.
Si, por ejemplo, nuestro paquete contiene Pues la ventana es un parámetro dinámico,
1000 bytes de datos, y el puntero de que va variando según la congestión que
urgencia es 150, sabremos que los 150 hay en cada momento, mientras que el
primeros bytes del paquete son urgentes, tamaño máximo de segmento es una
y los otros 850 son datos normales. constante para toda la sesión, que se
Por supuesto, esto sólo tendrá sentido si establece de antemano. Muchas veces,
el flag URG está activo. Si no es así, el el tamaño máximo de segmento será
campo puntero de urgencia menor que la ventana. Esto puede parecer
simplemente será ignorado. absurdo, pero no es así, ya que el tener
Este mes nos metemos de lleno en los paquetes de Internet. Crearemos un paquete desde
cero, nos adentraremos en el código binario y para rematar comprenderemos de una
vez por todas el significado de algunos ataques ya conocidos por todos.
Cuando empecé con el curso de TCP/IP, cuya De momento, nos quedaremos con una
cuarta entrega tenéis ahora mismo en vuestras simplificación de la idea de qué es exactamente
manos, ya os advertí de que, cansado de ver un cero y un uno. Como sabemos, los datos
una y otra vez las mismas técnicas para que circulan en una red lo hacen siempre a
explicar los conceptos en todos los libros y través de un medio físico. Este medio,
tutoriales, este curso pretendía ser una normalmente, será un cable eléctrico, pero
apuesta arriesgada, orientando la explicación puede ser también, por ejemplo, una onda de
de los mismos conceptos desde un punto de radiofrecuencia, un cable óptico, o cualquier
vista bastante diferente. otro medio físico empleado en la interconexión
de máquinas. Quedémonos con el caso más
Siguiendo en esta línea un tanto experimental, común, el del cable eléctrico, aunque todo lo
voy a dar otro nuevo paso que no he visto explicado se puede extrapolar, por supuesto,
en ningún libro sobre TCP/IP, para tratar de a cualquier otro medio físico.
que os familiaricéis más aún con TCP/IP.
Como es lógico, por un cable eléctrico circula
Lo que pretendo conseguir ahora es que electricidad. La electricidad por si misma no
convirtáis esos misteriosos paquetes TCP que contiene mucha información. Un medio de
tenéis rondando ahora mismo por vuestras transmisión de información será más versátil
cabezas, en algo tangible, de carne y hueso, cuantos más parámetros posea.
o más bien debería decir de unos y ceros.
Por ejemplo, una imagen puede transmitir
Para ello, vamos a ver con un ejemplo cómo una gran cantidad de información (ya se sabe
está construido exactamente un paquete TCP. que una imagen vale más que mil palabras),
Mi intención es que después de este ejemplo, ya que posee muchísimos parámetros, como
los paquetes TCP dejen de ser al fin para son los colores en cada punto, la iluminación,
vosotros unos entes teóricos de los cuales etc. En cambio, la electricidad posee pocos
conocéis el funcionamiento, pero no su parámetros propios, como pueden ser la
constitución física. tensión eléctrica (voltaje), y la intensidad
eléctrica (corriente). Para colmo, estos dos
Por supuesto, esta constitución física no parámetros están directamente relacionados
podremos terminar de comprenderla hasta entre sí (¿recordáis la famosa ley de Ohm, o
que lleguemos a la capa inferior de la jerarquía vosotros también suspendíais física en el cole?
de capas de TCP/IP: el nivel físico. Así que
habrá que esperar aún unos cuantos meses Por tanto, una primera solución intuitiva para
antes de que veamos qué son exactamente transmitir información por medio de la
electricidad sería hacer variar esos parámetros Siempre habréis escuchado el término
en función de lo que quisiéramos transmitir. analógico como opuesto al término digital.
Vamos a ver ahora mismo en qué consisten
Por ejemplo, si queremos transmitir un las diferencias entre analógico y digital.
número, podemos ajustar el voltaje del cable
en relación directa con el valor de ese número. Si bien la tecnología analógica aprovecha la
Por ejemplo, para transmitir un 5 pondríamos tensión eléctrica, uno de los parámetros que
5 voltios en el cable, y para transmitir un 7 caracterizan la electricidad que circula por un
pondríamos 7 voltios en el cable. Si, en cable, la tecnología digital no utiliza ninguno
cambio, queremos transmitir el número de los parámetros de la electricidad para
250000, más nos vale no tocar el cablecito, transmitir la información.
a no ser que queramos seguir este curso
desde el más allá (allí también llega, desde ¿Cómo puede transmitirse la información
que la revista cambió de distribuidor). entonces? Evidentemente, siempre es
imprescindible la presencia de una variable
Supongo que las mentes más despiertas que se pueda modificar convenientemente
habrán descubierto ya aquí una de las más para codificar la información que se desea
destructivas técnicas de hacking. Si algún día transmitir. La diferencia es que en el caso de
os encontráis por un chat al <malnacido> ese la transmisión digital el parámetro que se
que os robó la novia, basta con que le enviéis utiliza para portar la información no es
un paquete que contenga un número tocho inherente a la propia electricidad, si no que
con ganas, como el 176874375618276543, es un parámetro más sencillo: el tiempo.
y por su módem circulará tal tensión eléctrica,
que en el lugar que ocupaba su casa veréis Evidentemente, el tiempo es siempre un
un cono atómico que ni el de Hiroshima. parámetro fundamental en toda comunicación,
ya que es imprescindible que haya una
Bueno, antes de que se me eche alguien sincronización temporal entre transmisor y
encima por decir semejantes estupideces, receptor.
tendré que reconocer que, como es lógico,
las cosas no funcionan así en la práctica. Volviendo al caso de la transmisión analógica,
¡Pero no os creáis que sea algo tan pensemos por ejemplo en el caso en el que
descabellado! ¿Y si en lugar de una proporción se transmitan sólo números del 0 al 9 y, para
1/1 utilizamos otra clase de proporcionalidad conseguir representar números más altos lo
para transmitir los números? que se hace es transmitir cada una de sus
cifras por separado (unidades, decenas,
Por ejemplo, supongamos que no queremos centenas, etc.). Si, por ejemplo, quisiéramos
superar los 10 voltios y, en cambio, queremos t ra n s m i t i r e l n ú m e r o 5 2 3 , p r i m e r o
transmitir números entre 1 y 1000. Pues basta transmitiríamos 5 voltios, luego 2 voltios, y
con que establezcamos el convenio de que por último 3 voltios.
10 voltios equivalen al número 1000 y, por
tanto, 5 voltios al 500, 25 voltios al 250, etc., En la imagen podemos
etc. ver la transmisión del
número 523 por una
Esta solución no sólo es mucho más realista,
línea analógica. En el eje
si no que incluso ha sido el sistema de
X (el horizontal) se
transmisión de información en el que se ha
representa el tiempo, por
basado toda la electrónica hasta que llegó la
ejemplo, en segundos, y
revolución digital. Y el nombre de esto os
en el eje Y (el vertical)
sonará mucho, ya que a esto es a lo que se
se representa la tensión en voltios.
llama comunicación ANALÓGICA.
4
palabra de 4 bits podemos representar 2 = 2.1. P a s a n d o d e b i n a r i o a
16 valores diferentes, con una palabra de 8
8 16 decimal
bits 2 = 256 valores, con 16 bits 2 =
65536, etc.
Vamos a ver en primer lugar cómo traducir
una secuencia de ceros y unos en algo
Ahora podéis comprender por qué todo lo
comprensible para nuestras mentes decimales.
relacionado con la tecnología digital sigue
siempre estos números. La memoria RAM que
En la base decimal, que es la que nosotros
compras para el PC, las tarjetas de memoria
utilizamos, llamamos a cada cifra de una
para la cámara digital, la velocidad del ADSL,
manera diferente según el orden que ocupa:
siempre son los mismos números; 8, 16, 32,
unidades, decenas, centenas, etc. Como nos
64, 128, 256, 512, 1024, 2048... Todos esos
explicaron en los primeros años del cole, para
números son las diferentes potencias de 2.
calcular un número a partir de su
representación decimal, tenemos que sumar
El caso más sencillo es el de 1 único bit,
1 las unidades a las decenas multiplicadas por
donde tenemos 2 = 2, es decir, se pueden
diez, las centenas multiplicadas por 100, etc.,
representar sólo 2 valores con 1 bit. Estos 2
etc. Es decir: 534 = 5 * 100 + 3 * 10 + 4 * 1.
valores son, por supuesto: cero, y uno.
2
En realidad, 100 es una potencia de 10 (10
En el caso, por ejemplo, de 3 bits, tenemos
3 = 100). Y por supuesto 10 también es una
2 = 8 valores diferentes, que son todas las 1
potencia de 10 (10 = 10). pero también el
posibles combinaciones de 3 cifras, donde
1 lo es, ya que 1 es potencia de cualquier
cada cifra puede ser un uno o un cero, tal y 0
número, pues X = 1, donde en este caso, es
como vemos en la tabla.
X = 10, es decir, 10 elevado a cero es uno.
Como vemos, no
Por tanto, el número 534 se puede representar
quedan más 2 1 0
como: 534 = 5*10 + 3*10 + 4*10 .
p o s i b l e s
combinaciones de
Esta regla se puede aplicar a cualquier otra
ceros y unos con
base que no sea 10. Volvamos a la tabla
sólo 3 cifras, y
anterior, y veremos que el número 7 se
esto nos permite
representa como 111 en base 2.
representar tan
sólo los números Si aplicamos la fórmula anterior, pero en este
del 0 al 7. caso utilizando base 2, tendremos:
2 1 0
1 * 2 + 1*2 + 1*2 = 7. En efecto, se
Como ya dije antes, para un matemático estos 2 1 0
cumple, ya que 2 = 4, 2 = 2, y 2 = 1,
convenios para representar los números luego: 1*4 + 1*2 + 1*1 = 7.
decimales mediante cifras binarias no son
ningún misterio, ya que basta con aplicar las Con esta sencilla fórmula de las potencias de
bases de la aritmética modular. 2 se puede convertir cualquier número binario
a su equivalente en decimal. Por ejemplo,
Voy a tratar de explicar rápidamente en qué vamos a traducir a decimal el número
consisten estas fórmulas porque, aunque al 10011010.
principio os puedan parecer complicadas, en 7
Empezamos aplicando la fórmula: 1*2 +
realidad son realmente sencillas y, como todo, 6 5 4 3 2 1
0*2 + 0*2 + 1*2 + 1*2 + 0*2 + 1*2
es sólo cuestión de práctica el aplicarlas de 0
+ 0*2 . Ahora, sabiendo los valores de cada
forma natural.
potencia de dos (cualquier geek que se precie
tiene que conocer como mínimo todas las
potencias de 2 con exponentes de 0 a 16), Pero nosotros no nos conformamos con hacer
podemos traducir esa fórmula en: 1*128 + las cosas, si no que nuestro auténtico interés
0*64 + 0*32 + 1*16 + 1*8 + 0*4 + 1*2 + es el saber cómo se hacen. Así que os explico
0*1. Es decir, nos queda la siguiente suma: rápidamente un algoritmo para convertir
128 + 16 + 8 + 2 = 154. Por tanto, el número cualquier número decimal a binario.
binario 10011010 representa al número 154
en decimal. Usemos para el ejemplo el número 137.
Por si queréis practicar, os dejo como ejercicio El proceso a seguir será ir dividiendo el
algunos números más, con su traducción, número (en este caso 137) por 2 y, en cada
para que lo comprobéis vosotros mismos: división, quedarnos con el resto de la división
(que sólo podrá ser cero o uno). Ahora te
10110101 = 181
quedará claro.
00111100 = 60
111010001010101010100101 = 15248037
El resultado de la primera
división (llamado cociente, en
2.2. Pasando de decimal a
verde) es 68, y el resto (en
binario.
rojo) es 1. Este 1 será el bit
Aquí la cosa ya se pone más chunga. Aun así, menos significativo, es decir, la cifra binaria
juraría que esto ya lo expliqué en alguno de que está a la derecha del todo.
mis artículos.
Continuamos el proceso con el nuevo cociente
Hay varios trucos para convertir de decimal que hemos obtenido:
a binario. El más sencillo, por supuesto, es
meter el número en la calculadora de windows, Ahora hemos obtenido un 0,
y luego pinchar en donde pone BIN para que que será la siguiente cifra
lo pase automáticamente, jeje. binaria. Continuamos el proceso
con el nuevo cociente, 34:
3 4 / 2 = 1 7 , con re st o 0.
17 / 2 = 8, con resto 1.
8 / 2 = 4, con resto 0.
4 / 2 = 2, con resto 0.
2 / 2 = 1, con resto 0.
! Para que...
! Si tienes...
Para que a nadie se le ocurra enviar un mail diciendo que la
calculadora de Windows no puede hacer eso, venga, lo explicamos Si tienes interés en avanzar por tu cuanta en cálculo binario, hay
muy rápido. Abre la calculadora, Menu Ver y pulsa sobre Científica. miles de páginas en Internet que te lo explican perfectamente y
Ya está por supuesto de forma gratuita. Busca en www.google.com y
Ahora introduce cualquier número y pulsa sobre Bin avanza tanto como quieras
En este caso, el número completo de 32 cifras Esto habrá que concatenarlo a lo que
sí que tiene significado para nosotros, ya que llevábamos ya construido de esta fila, por lo
el tamaño de la palabra es precisamente de que nos quedaría: 0110000000000010
32 bits.
Vamos ahora con el campo tamaño de la
La tercera fila corresponde al campo número
ventana. Un valor típico es, por ejemplo,
de confirmación. En nuestro caso tiene que
8192. Este número es una potencia de 2,
ser cero, ya que es una conexión que aún no 13
se ha establecido, por lo que el primer paquete concretamente 2 . Por tanto, la traducción
no llevará confirmación de otro paquete a binario es instantánea. Basta con poner 13
anterior. Para representar el 0 con 32 bits, ceros a la derecha, y poner un único 1 a la
basta con meter 32 ceros. izquierda del todo: 10000000000000. Esto
nos da un número de 14 cifras, por lo que
00000000000000000000000000000000 tenemos que ajustarlo al tamaño de la palabra
de 16 bits con dos ceros a la izquierda:
Ahora nos toca el campo comienzo de datos.
0010000000000000.
Como ya vimos, el valor más habitual para
este campo es 5, en el caso de que no haya
Por tanto, finalmente, la cuarta fila de la
ninguna opción. Pero nosotros vamos a incluir
cabecera TCP nos quedará:
una opción, que ocupará 32 bits, como
veremos más adelante. Como el campo
01100000000000100010000000000000
Comienzo de datos indica el número de
palabras de 32 bits que ocupa la cabecera
El próximo campo es el campo suma de
TCP, al tener una palabra más para la opción,
comprobación, y es el que más quebraderos
tendrá que ser 6, es decir: 110. Como el
de cabeza nos va a dar. Si habéis seguido el
campo tiene una palabra de 4 bits, añadimos
resto del curso, habréis visto que hasta ahora
un cero a la izquierda: 0110.
he eludido un poco el tema, dándoos sólo
una URL donde teníais un código en C ya
A continuación, la cabecera TCP tiene un
hecho para calcular automáticamente los
campo vacío de 6 bits, que hay que rellenar
checksums (sumas de comprobación). Si lo
con ceros: 000000. Por tanto, de momento
hice así hasta ahora era porque sabía que más
esta fila de la cabecera nos va quedando:
adelante llegaría el momento de enfrentarse
0110000000.
cara a cara con los checksums, y ese
momento ya ha llegado.
Ahora le toca el turno a los flags. Como vimos
en el artículo anterior, siempre que se desee
Quizá os estaréis preguntando, ¿y por qué
establecer una nueva conexión el paquete ha
hay que enfrentarse al checksum si tenemos
de tener activado su flag SYN. El resto de
ya un código que nos lo calcula? ¿Para qué
flags estarán desactivados. Es decir, éste será
sirven todas estas vueltas y revueltas que
el valor que tomarán todos los flags:
estoy dando a los paquetes TCP cuando
bastaría con conocer lo necesario para poder
URG = 0
manejarlos?
ACK = 0
PSH = 0
Creo que es importante que hablemos aquí
RST = 0
acerca del significado original de la palabra
SYN = 1
HACK, que forma parte del nombre de esta
FIN = 0
revista, y que justifica el hecho de que
profundicemos hasta el más mínimo detalle
Si los colocamos todos juntitos en su orden
en lo que explicamos.
nos quedará: 000010.
El término Hacker ha sido muy desvirtuado Por último, tenemos el campo DATOS. Como
con el paso del tiempo. Originalmente, un el paquete es sólo para establecer una
hacker era una persona cuya pasión era conexión, no habrá ningún dato, por lo que
conocer el funcionamiento de las cosas. Para este campo estará en blanco (ya no con ceros,
las personas normales una máquina es sólo si no que directamente no habrá nada).
una herramienta que se utiliza para algún fin
concreto. En cambio, un hacker no se Pero... ¡un momento! ¡Si habíamos dicho que
conforma sólo con usar las máquinas, si no íbamos a meter una opción! Entonces el campo
que además ansía conocer su funcionamiento DATOS no será el último, si no que tendremos
interno. antes el campo de opciones TCP. Para el
caso nos va a dar igual, porque al fin y al cabo
Hace años, se llamaba hackers a los grandes no hay campo de DATOS, así que en cualquier
programadores, a los gurús de cualquier caso el campo opciones iría inmediatamente
campo de la informática, y a toda esa clase después del campo puntero de urgencia.
de chiflados (a los cuales aspiro
orgullosamente a pertenecer). Posteriormente, La opción que vamos a incluir es la única
los medios de comunicación tergiversaron definida en el RFC de TCP, aunque ya vimos
todo, y dieron a la palabra hacker el significado que existen muchas más: Maximum
que antiguamente tenía la palabra cracker, y Segment Size (MSS).
después estos términos han seguido
evolucionando hasta el punto actual, en el Todas las opciones empiezan con un byte que
cual hay mil y una definiciones para cada uno indica el tipo de opción. En nuestro caso, el
de los términos. código para la opción MSS es el 2, es decir:
00000010.
La cuestión es que si realmente queréis ser
hackers, de los de toda la vida, vuestra pasión En el caso de la opción MSS, el siguiente byte
debe ser conocer hasta el mínimo detalle de contendrá la longitud en bytes de la opción
cómo funcionan las cosas, y no sólo saber que, contando con los dos primeros bytes que
manejarlas sin más. Un tío que dedique a ya hemos mencionado (el que indica el código,
entrar en sitios donde teóricamente le estaba y el que indica la longitud) será siempre 4.
prohibido el paso, será un hacker sólo si su Por tanto, el segundo byte de la opción MSS
motivación para hacerlo sea explorar el será siempre fijo: 00000100.
funcionamiento de los sistemas, en caso
contrario, su calificativo más apropiado será Por último, los otros dos bytes que completarían
lamer, script kiddie, o el que más os guste. la fila de 32 bits serán los que contengan el
dato que queremos transmitir: el tamaño
Pero bueno, ya he vuelto a salirme del tema... máximo de segmento. Si, por ejemplo,
estábamos con el checksum. Pues me temo queremos un tamaño máximo de segmento
que de momento tenemos que dejar este de 1460 bytes, codificaremos este valor en
punto en blanco, porque para calcular el 16 bits: 0000010110110100.
checksum tenemos que tener terminada el
resto de la cabecera, así que vamos a ver Por tanto, toda la fila de 32 bits para la
antes el resto de campos, y luego volvemos opción MSS nos quedaría:
atrás sobre este punto. 00000010000001000000010110110100.
Calculando la suma de
El siguiente campo es el puntero de
comprobación (checksum).
urgencia. Como el flag URG no está activo,
este campo puede ser 0. Como son 16 bits, Ya podemos volver atrás un poco y calcular
tendremos aquí: 0000000000000000. el último campo que nos falta para completar
la cabecera TCP de nuestro paquete. hay en la cabecera TCP, y todos los bytes
El primer paso a seguir es coger todo lo que de DATOS. Como en nuestro paquete no hay
tenemos hasta ahora, y agruparlo en palabras datos, bastará con contar los bytes (grupos
de 16 bits. Es decir, partimos de todos estos de 8 bits) que ocupa la cabecera. Cada fila de
chorizos binarios: la cabecera son 4 bytes (32 / 8 = 4), y tenemos
0000 0101 0100 0001 = puerto de origen un total de 6 filas, por lo que el tamaño de
0000 0000 0001 0101 = puerto de destino paquete será de 6 * 4 = 24.
0000 0001 0100 0110 = primeros 16 bits del número de secuencia
1110 0111 0111 1010 = últimos 16 bits del número de secuencia
0000 0000 0000 0000 = primeros 16 bits del número de confirmación
Ahora tenemos que pasar todo esto a binario:
0000 0000 0000 0000 = últimos 16 bits del número de confirmación
IP de origen = 1100 0000 . 1010 1000 . 0000 0001 . 0000 0001
0110 0000 0000 0010 = comienzo de datos, y flags
IP de destino = 1000 0010 . 1100 1110 . 0000 0001 . 0000 0101
0010 0000 0000 0000 = tamaño de la ventana
Protocolo = 0000000000000110
0000 0000 0000 0000 = puntero de urgencia
Tamaño de paquete = 0000000000011000
0000 0010 0000 0100 = código y longitud de la opción MSS
0000 0101 1011 0100 = opción MSS
Lo que hay que hacer ahora con todos estos
Por si todas estas ristras de ceros y unos os chorizos binarios es simplemente sumarlos
parecen pocas, todavía tenemos que añadir (de ahí el nombre de suma de comprobación).
unas cuantas más, y es aquí cuando entra en El problema es que, si no tenéis práctica,
juego esa pequeña cabecera de la que os sumar en binario os puede resultar complicado.
hablé que se utilizaba a la hora de calcular Sería ya demasiado explicaros ahora toda la
el checksum. aritmética binaria, así que eso os lo dejo como
ejercicio para que lo estudiéis por vuestra
Recordemos esta cabecera: cuenta (www.google.com o utiliza la
calculadora de Windows).
Por último, el tamaño del paquete TCP Este no es todavía el resultado, entre otros
lo calculamos contando todos los bytes que motivos porque el checksum ha de ocupar
sólo 16 bits, y un número hexadecimal de ¿Que cómo he hecho todas esas sumas en
5 cifras, como el 2BB6A, ocupa 20 bits. Por hexadecimal? Pues, por supuesto, no de
tanto, lo que hacemos es coger la primera cabeza, si no usando una calculadora científica
cifra (el 2) y sumarla al resto: que admita hexadecimal.
BB6A + 2 = BB6C
Ya tenemos completada la
operación conocida como suma
en complemento a uno.
checksum + resto de cabecera = 0 En cambio, el que sí que tiene que ver con
nuestro número de secuencia es su número
Ya que, insisto: de confirmación. Al no contener datos
nuestro paquete, el próximo byte que
checksum = - (resto de cabecera). enviaríamos sería el inmediatamente posterior
al número de secuencia de nuestro paquete
Os propongo como ejercicio que comprobéis anterior. Por tanto, el servidor de Rediris estará
todo esto con un sniffer. Capturad un paquete esperando recibir en el próximo paquete un
TCP, sumad todos los datos de la cabecera número de secuencia que sea el que enviamos
T C P, d e l c a m p o D AT O S , y d e l a antes, + 1.
pseudocabecera utilizada en el checksum, y
comprobaréis que, si el paquete no contiene Vemos que su campo comienzo de datos es
errores, el resultado es siempre cero. el mismo que el nuestro, ya que el paquete
también contendrá una única fila de opciones
(de 32 bits).
Resumiendo
Donde vemos que sí que hay un cambio es
Al final, este es el paquete que nos queda, y en los flags, ya que aquí no sólo está activado
que será enviado tal cual desde nuestro PC el flag SYN, si no también el flag ACK. En el
hasta el receptor (en este caso, el servidor próximo punto veremos en detalle a qué se
FTP de Rediris): debe esto.
paquete. En ese caso, pasaremos a un que tengan como respuesta un SYN, ACK
estado que podemos llamar SYN corresponderán a los puertos abiertos de la
RECIBIDO. Ahora nos falta esperar al máquina. Los paquetes que no tengan
último paso del establecimiento, que respuesta, o bien que sean respondidos con
es el último ACK. un flag RST, estarán cerrados.
Una vez recibido el último ACK,
nuestra conexión pasará finalmente al Lo interesante aquí es que nosotros no
estado de conexión ESTABLECIDA. responderemos a ninguno de los SYN, ACK,
por lo que ninguna conexión quedará
establecida, ya que sería necesario que
respondiésemos con un nuevo paquete ACK
por cada paquete SYN que enviásemos.
netstat
Podréis ver otros estados como Ya que hemos empezado hablando de cosas
CLOSE_WAIT, FIN_WAIT, LISTEN, etc. divertidas, como el escaneo de puertos, vamos
En breve explicaremos todos ellos. a rematar la faena hablando de una técnica
de hacking realmente interesante, aunque
Escaneo de puertos con SYN más por el interés de su funcionamiento que
por su utilidad práctica, ya que es un ataque
Os propongo como experimento que pongáis de tipo DoS (Denial of Service), es decir, que
en marcha alguna aplicación de escaneo de sólo sirve para fastidiar y tirar abajo un servidor.
puertos, y a continuación hagáis un netstat.
¿Por qué hablamos de diferentes estados en
Probablemente (dependiendo del tipo de
una conexión? Pues porque es necesario tener
escaneo que utilice la aplicación), veréis que
en cuenta los diferentes estados a la hora de
hay montones de conexiones en estado
llevar a cabo todos los pasos necesarios para
SYN_SENT, es decir, lo que nosotros hemos
conseguir llevar a cabo la comunicación.
llamado SYN ENVIADO.
Esto se debe a que un sistema clásico de Por ejemplo, en el momento en que pasamos
escaneo consiste en hacer solicitudes al al estado SYN_SENT, tenemos que crear una
servidor para establecer conexiones en cada estructura de datos que necesitaremos para
uno de los puertos, es decir, enviamos un mantener controlado el estado de la conexión
paquete SYN a cada puerto. Los paquetes en todo momento. Sería absurdo tener estos
datos creados de antemano, ya que ocuparían bastante pacientes, y suelen esperar en torno
una gran cantidad de memoria innecesaria y, a unos 3 minutos antes de dar por perdida
además, tampoco podríamos saber cuántas una conexión. Por tanto, si saturamos al
estructuras de este tipo necesitaríamos, pues servidor a base de SYNs, en unos 3 minutos
depende en todo momento de cuántas nadie podrá conectarse legítimamente al
conexiones tengamos establecidas. Por tanto, servidor, ya que su memoria para nuevas
al cambiar un sistema al estado SYN_SENT, conexiones estará llena en espera de completar
creará una estructura de datos para mantener las que tiene pendientes.
la conexión inminente. Esta estructura de
datos se llama TCB (Transmision Control Si este bombardeo de SYNs se repite
Block). constantemente, el servidor quedará inutilizado
mientras dure el bombardeo.
Por tanto, cada vez que
intentamos conectar con un
servidor, estamos haciéndole
crear una estructura que ocupa
lugar en su memoria. En el
momento en que se cierre esa
conexión, el servidor podrá
borrar el TCB correspondiente,
recuperando así el espacio que
había ocupado en su memoria.
Si pensamos un poco, nos daremos cuenta caso de que tuviéramos que reenviar un
de que hay un pequeño problema inherente paquete anterior porque no recibiésemos su
a cualquier conexión full-duplex, es decir, confirmación), y lo único que debemos hacer
las conexiones en las que cualquiera de las es seguir recibiendo los datos de nuestro
dos partes puede tanto transmitir como recibir. compañero, hasta que éste también nos envíe
El problema es que, si ambos quieren su paquete con el flag FIN.
transmitir datos, ambos tendrán que ponerse
de acuerdo para decidir en qué momento hay
que cerrar la conexión.
que el puerto de origen se vaya incrementando fastidiando por fastidiar. Además, es poco
automáticamente, tal y como vimos con UDP. probable que funcione un IP spoofig a pelo
--win: fija el tamaño de la ventana TCP. como el que voy a explicar, ya que los routers
--tcpoff: envía un valor falso para el campo que haya en el camino desde vosotros hasta
Comienzo de Datos de la cabecera TCP. vuestra víctima probablemente rechacen los
--tcpseq: especifica el Número de Secuencia. paquetes si no provienen de una IP que forme
--tcpack: especifica el Número de parte de su red.
Confirmación.
--badcksum: igual que en UDP, envía un Recordemos que para explotar la técnica de
checksum erróneo. SYN Flood simplemente hay que enviar gran
--fin: el paquete que enviamos tiene activo cantidad de paquetes con flag SYN, cada uno
el flag FIN. con una dirección IP de origen falsa y, a
--syn: el paquete que enviamos tiene activo ser posible, diferente. Hping2 casualmente
el flag SYN. tiene opciones para automatizar todo esto,
--rst: el paquete que enviamos tiene activo por lo que nos basta con esta línea:
el flag RST.
hping2 192.168.1.1 --rand-source --
--push: el paquete que enviamos tiene activo
destport 21 --syn --count 100
el flag PUSH.
--ack: el paquete que enviamos tiene activo
Con esta línea enviaremos 100 paquetes (--
el flag ACK.
count 100) al puerto 21 de la IP 192.168.1.1,
--data: especifica el tamaño del campo
utilizando como IP de origen una aleatoria en
DATOS, sin contar con la cabecera.
cada paquete (--rand-source), y con el flag
--file: igual que en UDP, permite rellenar el
SYN activado.
campo DATOS con los contenidos de un archivo
que especifiquemos.
Os puedo asegurar que esta línea funciona,
--safe: nos permite asegurarnos de que los
ya que acabo de probarla ahora mismo con
paquetes que enviamos llegan a su destino
el puerto de telnet (--destport 23) de mi router
ya que, tal y como ha de hacerse en TCP, si
ADSL, y ahora me es imposible conectar con
no recibimos la confirmación de alguno de
el telnet del router.
los paquetes, hping2 lo reenviará
automáticamente.
¿Significa esto que yo, que precisamente estoy
Vamos a ver todo esto y mucho más con un explicando estas cosas, tengo un grave
ejemplo muy interesante, que es para poner problema de seguridad? Realmente no, por
en práctica la técnica de SYN Flood explicada tres motivos. En primer lugar, porque el puerto
anteriormente. de Telnet lo tengo abierto sólo hacia mi red
local, por lo que sólo podría atacarme... yo
SYN Flood mediante Hping2. mismo. En segundo lugar, porque no es un
servicio de importancia crítica, es decir, me
Esta técnica sólo debéis utilizarla para hacer da igual tirarme el tiempo que sea sin poder
pruebas con vosotros mismos, para acceder al telnet de mi router, ya que sólo lo
comprender el funcionamiento de la técnica, uso muy rara vez, cuando tengo que modificar
y también para poner a prueba la seguridad algo en la configuración. En tercer lugar, al
de vuestra red, por si queréis hacer una tratarse de un router hardware y no de un
auditoría de seguridad y arreglar los agujeros simple programa de PC, tendría que esperar
que tengáis. a que saliese una nueva actualización del
firmware que solucionase este problema, así
Cualquier otro uso que le deis, al margen de que en cualquier caso no está en mi mano la
que pueda ser ilegal, éticamente será solución, si no en la del fabricante del router.
indeseable, ya que no estaréis más que Ya que la cosa se está calentando un poco,
vamos a probar alguna técnica más de hacking conexión de FTP (puerto de destino 21) con
relacionada con TCP. la máquina B, con IP 192.168.1.5, utilizando
como puerto de origen el 3560, nos bastaría
Ataques por adivinación de con saber el número de secuencia que está
número de secuencia con Hping2. utilizando la máquina A para poder inyectar
p a q u e t e s e n s u c o n e x i ó n d e F T P.
Vamos ahora con una técnica realmente Supongamos que sabemos que su número de
interesante que, de hecho, utilizó incluso el secuencia es el 24560.
propio Kevin Mitnick (uno de los hackers más
famosos de la historia) como parte de las Bastará con hacer:
andanzas que le hicieron terminar en la cárcel hping2 192.168.1.5 --spoof 192.168.1.2
(aplicaos el cuento, jeje). --baseport 3560 --destport 21 --tcpseq
24560 --file comandos.txt --data 14 --
En este caso, no se trata de un simple ataque count 1
DoS, como el SYN Flood, si no de un ataque
mucho más versátil que nos permitirá Con esto enviamos un único paquete (--count
colarnos en conexiones ajenas, con todo 1) enviando como IP spoofeada la de la
lo que ello implica. máquina A (--spoof 192.168.1.2), e inyectando
como datos unos comandos de FTP que hemos
Conseguir un ataque de este tipo con éxito
metido previamente en el archivo
es realmente complicado, así que lo que voy
COMANDOS.TXT.
a contar, que en la teoría puede parecer tan
sencillo, en la práctica choca con mil y un
Por supuesto, el gran problema de esto es
inconvenientes, empezando por la dificultad
que es realmente complicado conocer el
que comenté antes de hacer un IP Spoofing
número de secuencia de una conexión ya que,
sin que se enteren los routers que transportan
además de ser un número realmente grande
el paquete.
(32 bits), va cambiando constantemente a lo
Como lo importante es comprender la teoría largo de una conexión.
de las cosas, y no meternos en líos, voy a
explicar las bases de este tipo de ataques. Hping2 nos ofrece una herramienta para
ayudarnos a la hora de adivinar el número de
Para comprender el funcionamiento de estos secuencia, comprobando si un determinado
ataques debemos recordar qué es lo que sistema utiliza números de secuencia fáciles
define exactamente una conexión, es decir, de predecir. Para ello nos da la opción --
lo que identifica unívocamente a una conexión seqnum, que hace un análisis de los números
para diferenciarla de cualquier otra de Internet. de secuencia utilizados por un sistema:
Pues son estos los parámetros: una IP de
origen, una IP de destino, un puerto de hping2 192.168.1.5 --seqnum --destport
origen, un puerto de destino, y los 21 --syn
números de secuencia de cada una de
las dos partes. Con esto veríamos cómo varían los números
de secuencia de la máquina B cada vez que
Por tanto, si conociéramos todos estos datos, intentamos conectar con su puerto de FTP.
teniendo una herramienta como Hping2 que Hping2 nos mostrará el número de secuencia
nos permite crear paquetes a medida, utilizado, y el incremento con respecto al
podríamos insertar cualquier dato en una
utilizado anteriormente. Si este incremento
conexión ajena.
es siempre el mismo, entonces estaremos
ante una máquina con números de secuencia
Por ejemplo, si sabemos que la máquina A,
fácilmente predecibles.
con IP 192.168.1.2, tiene establecida una
¿Y por qué es tan importante ICMP para Pues por supuesto que se usa, y mucho,
IP? Pues porque IP no es un protocolo aunque es normal que no os suene,
100% fiable (como nada en esta vida), teniendo en cuenta que es un protocolo
e ICMP es precisamente el que se encarga que no suele usar la gente en su casita,
de manejar los errores ocasionales que si no que es usado sobre todo por los
se puedan dar en IP. routers.
Con esta breve explicación de paso he Por ejemplo, si enviamos un paquete UDP
explicado los dos primeros códigos. Sólo a una máquina que no tiene implementado
queda comentar que el código 1 sólo lo UDP. Como la capa IP es la encargada de
enviará el último router dentro del camino reconocer al protocolo de nivel superior,
que lleve desde nuestra máquina hasta será responsabilidad suya, y por tanto de
el host de destino, ya que éste último ICMP, el notificar de los errores de
router será el que sepa qué máquinas protocolos no implementados.
en concreto existen dentro de su red. En
El mensaje de Puerto inalcanzable
cambio, el código 0 puede ser enviado
(código 3) se genera cuando se intenta
por cualquiera de los routers que haya
acceder a un puerto en un protocolo de
en el camino entre tu máquina y el host
transporte (por ejemplo, TCP o UDP), y
de destino, ya que en cualquier punto
ese puerto no está accesible en el host
del camino se podría detectar que la red
de destino. En muchos casos, el propio
de destino es inalcanzable.
protocolo de transporte se encargará de
notificar este error (por ejemplo, en TCP
mediante el flag RST), pero siempre que
el protocolo de transporte no tenga
implementado un mecanismo para
notificar esta situación, será
responsabilidad de ICMP hacerlo.
otro checksum, como los que ya vimos asegurarnos de que se trata de nuestro
en anteriores entregas cuando tratamos paquete, se incluyen también los 64
el UDP y TCP. En el artículo anterior primeros bits del campo de DATOS del
detallé cómo generar un checksum para datagrama, por lo que el paquete puede
TCP, y también como realizar su quedar identificado sin lugar a dudas.
comprobación para un paquete recibido.
Por ejemplo, imaginemos que enviamos
En el caso de ICMP, los checksums (sumas el siguiente paquete:
de comprobación) se generan mediante
la misma operación, pero en este caso
no es necesario añadir una
pseudocabecera, si no que directamente
la operación se realiza únicamente con
todos los bits que componen la cabecera
ICMP.
En el caso de que este paquete genere,
Campo: Unused por ejemplo, un error de Destino
inalcanzable, éste será el paquete ICMP
Pues eso, ¿qué queréis que os cuente que nos llegará en respuesta:
sobre un campo que no se usa?
Simplemente lo rellenáis con ceros, y ya
está.
señal de alarma en relación con los ser ejecutados para infectar una máquina
mensajes Destination Unreachable. (por ejemplo mediante un correo
electrónico), si no que basta con que den
Si observamos los logs de nuestra
con una máquina vulnerable (es decir,
conexión... ¿que qué es eso? Pues en un
que tenga cierta versión de Windows sin
sistema que tenga implementada una
parchear).
buena política de seguridad es habitual
tener un mecanismo de monitorización
Por supuesto, si el gusano genera
que guarde un registro (un log) de lo que
direcciones IP que no existen, recibiremos
ocurre con las conexiones de nuestra
un mensaje Destination Unreachable
máquina.
cada vez que el gusano intente infectar
En caso de que no tengáis nada de esto una de estas IPs. Por tanto, encontrar
montado (sería motivo para varios varios mensajes ICMP de este tipo cuyo
artículos el explicar cómo hacerlo bien origen desconocemos puede ser un
hecho), podéis hacer pruebas síntoma de que tenemos un visitante no
simplemente poniendo en marcha un deseado en nuestro PC.
sniffer, como los que he explicado ya
en otros artículos (por ejemplo, Iris para No sólo eso, si no que además analizando
Windows, o Ethereal o Snort para Linux). en detalle la cabecera ICMP podremos
seguramente extraer información acerca
Pues como decía, si observamos lo que
del gusano, ya que estos mensajes ICMP,
ocurre en nuestra conexión con Internet,
tal y como acabamos de ver, incluyen en
y detectamos que nos llegan una gran
su cabecera toda la cabecera IP del
cantidad de mensajes ICMP de tipo
mensaje que generó el error, así como
Destination Unreachable, podría ser
los primeros 64 bits de datos.
síntoma de que estamos infectados con
algún gusano (Worm).
Este sistema no es definitivo, por
Un gusano es un tipo de virus informático supuesto, ya que no todos los gusanos
cuya principal función consiste en utilizan este sistema para buscar víctimas,
reproducirse a toda costa al mayor así que el hecho de no recibir mensajes
número de víctimas posible. La gran Destination Unreachable no significa
mayoría de los virus que existen hoy día ni mucho menos que no podamos estar
pueden ser calificados como gusanos, contaminados con algún otro tipo de
siendo buenos ejemplos los conocidos gusano más inteligente.
virus Sasser, MyDoom, etc.
Podría comentar muchos otros aspectos
Algunos de estos gusanos intentarán oscuros de este tipo de mensajes ICMP,
reproducirse por un sistema tan burdo como los ataques Smack, Bloop,
como es el generar direcciones IP WinNewK, etc. Pero como el espacio es
aleatorias, e intentar acceder a todas limitado, y además tengo que despertar
ellas para tratar de infectar una nueva un poco en vosotros la capacidad y el
máquina. ánimo de investigar por vuestra cuenta,
ahí os he dejado los nombres, para que
Esto es especialmente útil en gusanos vuestro amigo Google os dé más detalles.
como el Sasser (y, de hecho, el Sasser
utiliza este sistema), que no necesitan
Sobre el Code 2 no hay mucho que decir, Como su nombre indica, este mensaje
ya que se explica por sí sólo. permite calmar al transmisor cuando está
Campo: Pointer enviando demasiados paquetes, y estos
no pueden ser procesados debido a la
Si el campo Code tiene valor 0, este excesiva velocidad.
campo especifica la posición en bytes
dentro de la cabecera IP donde se Cuando un paquete no pueda ser
encuentra el parámetro erróneo. procesado adecuadamente debido a la
Este mecanismo es más efectivo si el Por otra parte, el Source Quench mismo
receptor empieza a enviar los Source puede servir para realizar ataques DoS.
Quench antes de que haya realmente Si enviamos mensajes Source Quench
un problema, es decir, cuando esté cerca a la víctima le estaremos pidiendo que
del límite, pero sin haberlo superado aún. limite su ancho de banda porque
supuestamente nos está saturando. Si
El formato del mensaje nos es ya muy conseguimos suplantar la personalidad
familiar: de una máquina a la que esté conectada
la víctima (mediante spoofing) podremos
echar abajo esa conexión, limitando cada
vez más el ancho de banda.
Ve a m o s p o r e j e m p l o e s t e c a s o :
Aquí es siempre 0.
Campo: Code
Si no notificase esta situación a H1 toda
la comunicación entre H1 y H2 seguiría De nuevo, tenemos varios posibles valores
el siguiente camino: para este campo:
Echo Reply (lo veremos a continuación), mensaje concreto de Echo Request, para
que contendrá los mismos datos de que el Echo Reply correspondiente pueda
muestra (el abecedario de nuevo, por especificar a qué petición de eco en
ejemplo). concreto está respondiendo.
Todos los campos de la cabecera deben Como ya sabemos, todas las máquinas
llevar una copia exacta de los campos de una red están interconectadas, por lo
del mensaje Echo Request al que están que teóricamente todos los paquetes que
respondiendo, excepto el campo Type, circulan por la red llegan a todas las
que debe ser 0, que es el número máquinas de la red. Cada máquina tendrá
asignado al tipo de mensaje ICMP Echo que ser capaz de discernir qué paquetes
Reply. van dirigidos a ella y cuales no. Este es
el motivo por el que un sniffer puede
La invasión de los pitufos funcionar.
mensajes Echo Reply a la víctima, con Para evitar convertir nuestra red en una
lo que podríamos llegar a saturar su amplificadora de ataques smurf, tenemos
conexión. que configurarla para que las máquinas
no respondan a mensajes ICMP dirigidos
a la dirección broadcast.
El ping de la muerte
una de sus variables el tiempo exacto en directamente en red, y nada más arrancar
el que se está generando el número (en necesitaban conocer la red en la que
milisegundos, o cualquier otra medida). entraban.
Esto permite que dos números generados
consecutivamente con la misma fórmula El mecanismo consistía en enviar un
den resultados diferentes. datagrama que tuviese ceros en las
direcciones IP de origen y de destino
Por tanto, el permitir que cualquier (Information Request). Este paquete,
máquina nos pregunte la hora exacta al ser recibido por la máquina que se
(con precisión de milisegundos) que encargase del asunto dentro de la red,
tenemos en nuestra máquina, es facilitarle sería respondido con otro mensaje que
en gran medida la explotación de sí que tuviese direcciones IP de origen y
cualquier sistema que maneje números de destino (Information Reply). La
aleatorios. Recordemos por ejemplo lo dirección IP de destino del Information
que conté en el artículo sobre TCP acerca Reply sería la IP asignada a la máquina
de los números de secuencia, y de las que la solicitó.
graves consecuencias que tendría que
un atacante conociese los números
pseudoaleatorios que hemos utilizado
para generar los números de secuencia
en nuestras conexiones TCP.
Ya conocemos el significado de todos los
También conté algo sobre la adivinación campos, así que sólo hay que decir que
de números pseudoaleatorios en el el campo Type para Information
artículo sobre DNS de la serie RAW, así Request es 15, y para Information
que a los aficionados a las matemáticas Reply es 16. El campo Code para ambos
les recomiendo que le echen un vistazo. será 0.
encontrarse con sistemas que tengan Yo personalmente tengo abiertos sólo los
cerrados los mensajes de Echo, por lo mensajes Echo Reply (para poder hacer
que no responderían al Echo Request, ping y traceroute), Time Exceeded (para
aunque la máquina estuviese vivita y poder hacer traceroute), y Destination
coleando. Un escaneo de pings nos diría Unreachable (para poder hacer P-MTU-
que esas máquinas no existen, ya que D, entre otras cosas).
no han respondido a nuestra llamada.
Si queréis asegurar de verdad vuestro
Existen herramientas que aprovechan sistema o vuestra red os aconsejo que
otros tipos de mensajes ICMP menos investiguéis bien el tema y lleguéis a
comunes para hacer exactamente lo establecer una decisión sobre vuestra
mismo, con la ventaja de que, al ser un política de seguridad con ICMP.
mensaje poco conocido y, aparentemente
inocente, es más probable que el 2.10. Otros mensajes ICMP.
administrador no los haya cerrado en el
firewall. Un ejemplo de estas Aunque el RFC 792 ni siquiera los
herramientas es ICMPEnum, que utiliza menciona, existen otros tipos de mensaje
precisamente no sólo Echo Request para ICMP definidos. Al no formar parte del
hacer los escaneos, si no también estándar definido en el RFC, sólo nombraré
Timestamp Request, e Information alguno de ellos por si os interesa buscar
Request. información sobre alguno en concreto.
Buscando huellas
Header + 64 bits of Original Data claro que no todo el mundo consulta estas
Datagram. Por ejemplo, este parámetro páginas para protegerse, y en cambio
es para especificar el número de basta con que una sola persona consulte
protocolo del datagrama que originó el esta lista con fines perversos para que
mensaje ICMP. pueda atacar a cualquier otra persona
que no haya tenido en cuenta la lista. Así
--icmpcksum : nos permite generar un que, una vez más, no se sabe si es peor
checksum inválido. Por defecto, si no el remedio o la enfermedad.
ponemos esta opción, hping2 generará
automáticamente el checksum correcto. Espero que este artículo os haya resultado
interesante, y que por lo menos haya
--file : permite especificar un fichero despertado en vosotros la curiosidad por
para el campo de DATOS. muchísimas cosas que he esbozado para
que vosotros ampliéis información de lo
Vamos a ver un ejemplo sencillísimo, que más os haya llamado la atención.
para realizar un ataque smurf a la IP
217.138.2.2, utilizando como Por este artículo han circulado muchos
amplificadora la red 209.5.x.x : nombres que pueden ser fácilmente
consultados en Google, así que os animo
hping2 209.5.255.255 --icmp -- a que lo hagáis.
verbose --spoof 217.138.2.2
Autor: PyC (LCo)
¡Así de simple! Por cierto, que tenéis
disponibles listas de redes que han sido
probadas y se sabe que pueden funcionar
como amplificadores smurf (es decir,
que responden a paquetes Echo Request
a la dirección broadcast). Podéis
encontrar un registro de estas redes por
ejemplo en:
http://www.powertech.no/smurf/ .
Este mes vamos a descubrir qué es realmente una IP, qué es una Dirección de Red, qué son
y cómo funcionan las Máscaras de Red, cómo un paquete es encaminado en una red, cómo
se reparten el pastel de los rangos de IPs los ISPs y muchas cosas mas.
personas dejan de estudiar estos temas una comunicación entre sólo dos de ellos,
porque no llegan a entender lo que leen
será imprescindible asignar a cada uno
vamos a ver si conseguimos arrojar un una dirección única que permita
poco de luz!!! identificarles unívocamente.
¿Y por qué se utiliza esta base tan Para lo que voy a explicar a continuación
rara cuando estamos acostumbrados es imprescindible que conozcáis la forma
a utilizar la base decimal de toda la de convertir una IP en su formato clásico
vida? Pues porque, aunque las (192.168.2.15) a su formato real, con
personas estemos acostumbrados a
todas las cifras binarias. Así que ruego
la base decimal, ésta no es muy
un poco de paciencia a los que estáis ya
apropiada para las máquinas, que son
un poco hartos de mi insistencia con el
las que realmente tienen que lidiar con
las direcciones IP. Concretamente, a tema de la aritmética binaria, porque voy
las máquinas sólo les gusta la base 2 a explicar de nuevo cómo convertir
(binaria), y sus derivadas. números de decimal a binario, aunque en
esta ocasión no voy a explicar el método
Una base muy íntimamente ligada a la matemático, si no el sistema que utilizo
base 2 es la base 256, que es la que yo para poder hacerlo de cabeza, sin
da lugar a la existencia de los famosos necesidad de lápiz y papel
bytes, u octetos. Por tanto, cada una de
las cifras de una dirección IP corresponde La gran ventaja de esta forma de cambiar
a un byte, por lo que cada dirección IP de base decimal a binaria es que no es
tiene un tamaño de 4 bytes. Un byte necesario realizar ninguna división, ni
es, en cierto modo, el tamaño elemental ninguno de los engorros que expliqué en
de información que puede manejar una aquel otro artículo.
máquina (esto no es del todo así, pero
es para que nos entendamos). Si no te En cambio, la desventaja es que es
ha quedado claro sigue leyendo necesario estar bastante familiarizado con
la aritmética binaria, hasta el punto de
Como he dicho, las máquinas sólo
que hay que conocer de memoria todas
entienden el lenguaje binario, pero esa
las potencias de 2, con exponentes de 0
IP que os he mostrado (192.168.2.15)
a 8.
está en realidad representada de forma
que sea fácilmente comprensible para un
humano (con cada cifra expresada en el Quizá esto os suene a una especie de
clásico formato decimal). ¿Cuál es locura propia de un friki que sólo sale de
entonces el auténtico aspecto de una su casa para comprar más memoria RAM
dirección IP? Pues es, por supuesto, o más cafeína, pero en realidad aprenderse
una fantástica ristra de ceros y unos, de estos números es mucho más fácil de lo
esas que aparecen en las pelis de que parece, ya que estos números nos
hackers. rodean a diario sin que nos demos cuenta.
Las 9 primeras potencias de 2 son estas:
Veamos por ejemplo el auténtico aspecto
de la dirección del ejemplo: 20 = 1
21 = 2
11000000 . 10101000 . 00000010 . 00001111 22 = 4
23 = 8
Como vemos, cada cifra en base 256
24 = 16
está formada de 8 cifras binarias (cero
25 = 32
o uno), por lo que una dirección IP
26 = 64
consta de un total de 32 cifras
27 = 128
binarias (bits).
28 = 256
¿A que os suenan todos esos números? Para el caso de 168 hacemos lo mismo:
Los veréis cada vez que veáis cualquier 168 está entre 128, y 256, por lo que
cosa relacionada con la informática (la marcamos la cifra 7; 168 128 = 40,
velocidad del ADSL, la capacidad de las que está entre 32 y 64, por lo que
tarjetas de memoria, etc, etc). marcamos la cifra 5, correspondiente al
32; 40 32 = 8 que está entre 8 y 16,
Lo que yo hago para convertir un byte por lo que marcamos la cifra 3,
en su formato decimal al formato binario
correspondiente al 8, y tenemos ya el
es: (mientras lees los pasos fíjate en la
número completo, pues 8 8 = 0. Nos
imagen)
queda 10101000
longitud del prefijo. Por tanto, sabemos Hemos visto una forma de representar la
que este número sería 5758976, y las longitud del prefijo de la dirección
dos primeras cifras, el 91, serían el IP, que consiste en acompañar a la
prefijo. dirección de una barra separadora y un
número que representa el número de bits
Esta misma representación se utiliza con que ocupa este prefijo. Esta forma se
las direcciones IP, pero contando el suele utilizar bastante, pero también se
número de cifras binarias (bits). Por utiliza otra representación, quizá más
ejemplo, la IP 192.168.2.15 / 24, conocida, que veremos ahora mismo.
estaría compuesta por un prefijo de 24
bits (24 cifras binarias), y el resto sería En cualquier caso, se use la representación
la dirección IP de la máquina, es decir, que se use, a este número que especifica
ésta constaría de 8 bits (ya que el total el tamaño del prefijo se le llama
de bits en una dirección IP hemos dicho máscara de red. Y esto que hasta ahora
que es 32). hemos estado llamando prefijo es lo que
en realidad se denomina dirección de
Viendo la IP en su formato binario: red. Fíjate en la imagen para que no te
pierdas y a partir de ahora, mientras lees,
11000000 . 10101000 . 00000010 . 00001111 consulta continuamente la imagen.
tiene asociada una dirección de red (un Quizá os preguntéis ahora por qué es tan
prefijo), cuya longitud viene determinada habitual escribir las máscaras de red en
por la máscara de red. este formato binario, que es menos
intuitivo que el anterior. El motivo es que
Antes dijimos que había otra forma (quizá la máscara de red sirve para realizar
más conocida) de representar la máscara
determinadas operaciones de aritmética
de red. Vamos a ver ahora cuál es esa
binaria que han de ser realizadas viendo
otra forma y, para el que piense que
la máscara de red en su formato binario.
con aprenderse una es suficiente, ya
Y
qué operaciones son esas y para qué
puede ir cambiando de opinión
las dos
son ampliamente utilizadas en libros sirven? Eso es precisamente lo que
técnicos, textos, etc. veremos en el próximo punto.
Veamos en primer lugar qué ocurre si Una vez en el router central, éste tendrá
queremos enviar un correo electrónico que decidir qué hacer con el paquete.
directamente desde la oficina de Madrid Para ello tiene que mirar en las tablas
a una máquina de la oficina de que tiene configuradas, que son las
Barcelona. siguientes:
que cualquier paquete que coincida imagen siguiente mientras lees las
con la dirección de red siguientes líneas):
172.16.0.0/12 debe ser dirigido al El router tendrá la dirección IP
interfaz eth1 192.168.1.1 en el interfaz eth0. Esta
que cualquier paquete que coincida es la red donde tenemos la DMZ.
con la dirección de red El router tendrá la dirección IP
192.168.2.0/24 se enviará al interfaz 172.16.0.2 en el interfaz eth1. Esta
eth2 es la red donde tenemos el ordenador
y, por último, que cualquier paquete de Barcelona.
que no coincida con ninguna de las El router tendrá la dirección IP
anteriores direcciones de red, tendrá 192.168.2.1 en el interfaz eth2. Esta
que coincidir por narices con la es la red donde tenemos nuestro PC
dirección de red 0.0.0.0/0, por lo (Red Interna).
que irá al interfaz ppp0.
De esta forma, se podrá acceder al router
Por tanto, el interfaz ppp0 será para el central desde las tres redes de la
router central el equivalente a la puerta organización (la red interna, la red DMZ,
de enlace predeterminada, donde van y la red de la oficina de Barcelona), ya
todos los paquetes que no se sabe cómo que tendrá una IP diferente para cada
encaminar. Normalmente, estos paquetes una de estas redes.
serán los que vayan a Internet y, de
hecho, el interfaz ppp0 estará conectado Esta es una de las bases para comprender
a un modem que conectará con Internet. el trabajo de un router. Un router es como
una araña que tiene una pata en cada
¿No os suena eso de los interfaces eth0, red que desea enrutar. Un router nunca
eth1, etc? Para que os hagáis una idea, podrá enrutar (dirigir) una red a la que
serían como diferentes tarjetas de red: no pertenezca.
Un router tendrá una tarjeta de red
por cada red a la que esté conectado.
En cada tarjeta, por supuesto, habrá
un cable que lo unirá con cada red,
por eso es necesaria la tabla, para
saber por qué cable tiene que enviar
cada paquete según su destino.
El interfaz ppp0 es otro tipo de interfaz
que no corresponde a una tarjeta de Y ahora viene lo realmente
red, si no a una conexión PPP. Para interesante:
no liaros, basta con que os quedéis con Nosotros estamos intentando enviar
la idea de que el interfaz PPP es una un paquete desde nuestro PC con la
interfaz con un modem. IP 192.168.2.5 al un PC de la oficina
de Barcelona con la IP 172.16.1.23
Como cada tarjeta de red tiene una El router solo sabe la IP de origen
dirección IP asociada, el router tendrá (192.168.2.5) y la IP de destino
por tanto 3 direcciones IP diferentes, (172.16.1.23). ¿Cómo sabe el router
una por cada interfaz eth (mira la a partir de la dirección IP del
Tenemos que comprobar ahora si Por tanto, este paquete será enviado al
172.16.1.0 es igual a 192.168.1.0, que interfaz PPP0, que es el que nos conecta
es la dirección de red correspondiente con Internet a través del modem.
a la primera de las máscaras, con la que
acabamos de realizar el AND. Por Como vemos, es fácil realizar la operación
AND en formato decimal cuando la
supuesto, no son iguales, por lo que el
máscara de red divide la dirección en
paquete no pertenece a esta primera
bytes (es decir, la máscara sólo tiene 255
red.
o 0). En este caso, bastará con poner a
En cambio, una red de clase C se utiliza Las redes de clase B tienen una máscara
en pequeñas organizaciones, y existen de red /16 (255.255.0.0), es decir, la
más de 2 millones de direcciones de clase mitad de la dirección de red especifica la
C. red, y la otra mitad la máquina dentro de
la red.
Pero vamos a ver en detalle en qué
consiste cada una de las clases de redes. Los dos primeros bits de la dirección
de red han de ser 10, por lo que al final
5.1. CLASE A nos quedan sólo 14 bits para identificar
la red. Esto da lugar a que haya 16382
Las redes de clase A son aquellas que direcciones de red de clase B diferentes,
tienen una máscara de red /8 que abarcan desde la 128.1.*.* hasta la
(255.0.0.0), es decir, sólo los 8 primeros 191.254.*.*
Cada red de clase B puede direccionar Dentro de las diferentes redes destacan
65534 máquinas diferentes, por lo que las llamadas clase D y clase E, muy poco
estas redes siguen siendo utilizadas tan utilizadas:
sólo por grandes organizaciones. Las de clase D, utilizadas para
multicast, son las que empiezan por
1110.
Las de clase E, direcciones para uso
experimental, son las comprendidas
entre 240.0.0.0 y 247.255.255.255.
5.3. CLASE C
! No debemos...
Las redes de clase C tienen una máscara
de red /24 (255.255.255.0), por lo No debemos asustarnos si encontramos direcciones de red
que sólo los últimos 8 bits de la dirección con máscaras de red como esta: 255.255.255.128. Las
permiten especificar una máquina dentro máscaras de red no siempre están construidas con 255 o 0,
de la red. es decir, las direcciones de red no constan siempre de un
número entero de bytes. Por ejemplo, la máscara de red
Los 3 primeros bits de una dirección 255.255.255.128 sería en binario:
de clase C tienen que ser 110, por lo
que al final nos quedan sólo 21 bits 11111111 . 11111111 . 11111111 . 10000000
para direccionar la red, lo cual da lugar
a que haya más de 2 millones de redes Con este número en binario ya podemos operar con la
de clase C diferentes. operación lógica AND exactamente igual a como lo
hacíamos con las máscaras más "clásicas". Ya vimos un
Dentro de cada red de clase C se pueden ejemplo de este tipo de máscaras en el punto anterior
direccionar 254 máquinas diferentes, por (255.240.0.0).
lo que estas redes ya no son válidas para
grandes organizaciones.
5.5. DIRECCIONES DE RED
RESERVADAS
Las redes de clase C abarcan desde la
192.0.1.* hasta la 223.255.254.*.
Hay algunas direcciones de red reservadas
para ciertos fines, y que no pueden ser
asignadas a ninguna máquina de Internet.
Esto puede dar lugar a la existencia de Para simplificar, dije que una dirección
IPs dinámicas, que ya mencioné al broadcast se formaba poniendo un 255
principio del artículo. Según una serie de en el último byte de la IP, pero esto no
criterios, el servidor DHCP podrá decidir es del todo cierto, ya que éste es sólo el
en un momento dado asignar a una caso más común.
máquina una dirección IP diferente a la
que le asignó la última vez que esta Para comprender la formación de la
máquina se conectó. dirección broadcast tenemos que volver
al tema de los operadores lógicos binarios,
En una red local no sólo será necesario por lo que voy a introducir un nuevo
un protocolo que facilite la configuración operador, el más simple de todos, que es
automática de cada equipo, si no que el operador NOT.
hará falta también otro protocolo que
permita a los diferentes equipos de la El operador NOT lo único que hace es
red conocerse entre sí, es decir, saber invertir todos los bits del número
qué dirección IP tiene no sólo él mismo, binario, es decir, cambiar todos los ceros
si no también sus compañeros a los que por unos, y todos los unos por ceros.
quiera acceder. Así:
NOT 1001110101 = 0110001010
El protocolo más conocido para este fin
es el ARP (Address Resolution Protocol), El primer paso para obtener la dirección
que permite asociar direcciones IP con broadcast de una red, será aplicar el
direcciones MAC, tal y como veremos operador NOT sobre la máscara de red.
en el curso más adelante, cuando E s d e c i r, s i t e n e m o s l a r e d
hablemos del nivel de enlace. 172.16.0.0/12, ésta será la máscara de
red en formato binario:
Por último, sólo me queda mencionar el
funcionamiento de las direcciones
11111111 . 11110000 . 00000000 . 00000000
broadcast, de las cuales ya hablé un
poco a lo largo del curso de TCP/IP.
Y ésta será la máscara despues de aplicar
el operador NOT:
Por si no lo recordáis, una dirección
broadcast es una dirección IP especial 00000000 . 00001111 . 11111111 . 11111111
que se refiere no a una sola máquina, si
no a todas las máquinas de una Teniendo ya esta máscara invertida, sólo
misma red. tenemos que aplicar un operador OR
entre la máscara invertida y la
Si, por ejemplo, enviamos un ping a una
dirección de red. Os recuerdo aquí cual
dirección IP, recibiremos respuesta
era el funcionamiento del operador OR:
únicamente de una máquina. En cambio,
si esa dirección IP es la dirección
broadcast de la red, todas las máquinas
que estén conectadas a la red en ese
momento responderán a nuestro ping Por tanto, si la dirección de red en nuestro
(con los consiguientes problemas de ejemplo es:
seguridad de los que ya hablé en artículos
172.16.0.0 = 10101100 . 00010000 . 00000000 . 00000000
anteriores).
Realizamos la operación:
¿QUIERES COLABORAR CON PC PASO A PASO?
PC PASO A PASO busca personas que posean conocimientos de
informática y deseen publicar sus trabajos.
10101100 . 00010000 . 00000000 . 00000000
SABEMOS que muchas personas (quizás tu eres una de ellas) han creado
OR textos y cursos para consumo propio o de unos pocos.
Por tanto, la dirección broadcast para la SABEMOS que hay verdaderas obras de arte creadas por personas
red 172.16.0.0/12 será 172.31.255.255. como tu o yo y que nunca verán la luz.
SUSCRIBETE A
PC PASO A PASO
45 EUROS (10% DE DESCUENTO)
SUSCRIPCIÓN POR: +
1 AÑO = SORTEO DE UNA CONSOLA XBOX
+
11 NUMEROS SORTEO 2 JUEGOS PC (A ELEGIR)
Solo tienes que enviarnos un mail a preferente@hackxcrack.com Envíanos un GIRO POSTAL por valor de 45 EUROS a:
indicando: CALLE PERE MARTELL20, 2º 1ª.
- Nombre CP 43001 TARRAGONA
- Apellidos ESPAÑA
- Dirección Completa IMPORTANTE: En el TEXTO DEL GIRO escribe un mail de contacto
- Población o un número de Teléfono.
- Provincia
- Cógigo Postal Y enviarnos un mail a preferente@hackxcrack.com indicando:
- Mail de Contacto y/o Teléfono Contacto - Nombre
Es imprescindible que nos facilites un mail o teléfono de contacto. - Apellidos
- Tipo de Subscripción: CONTRAREEMBOLSO - Dirección Completa
- Número de Revista: - Población
Este será el número a partir del cual quieres subscribirte. Si deseas - Provincia
(por ejemplo) subscribirte a partir del número 5 (incluido), debes poner - Cógigo Postal
un 5 y te enviaremos desde el 5 hasta el 15 (ambos incluidos) - Mail de Contacto y/o Teléfono Contacto
Es imprescindible que nos facilites un mail o teléfono de contacto.
APRECIACIONES: - Tipo de Subscripción: GIRO POSTAL
* Junto con el primer número recibirás el abono de 45 euros, precio - Número de Revista:
de la subscripción por 11 números (un año) y una carta donde se te Este será el número a partir del cual quieres subscribirte. Si deseas
indicará tu número de Cliente Preferente y justificante/factura de la (por ejemplo) subscribirte a partir del número 5 (incluido), debes poner
subscripción. un 5 y te enviaremos desde el 5 hasta el 15 (ambos incluidos)
* Puedes hacernos llegar estos datos POR MAIL,tal como te hemos
indicado; rellenando el formulario de nuestra WEB APRECIACIONES:
(www.hackxcrack.com) o enviándonos una carta a la siguiente dirección: * Junto con el primer número recibirás una carta donde se te indicará
CALLE PERE MARTELL Nº20, 2º-1ª tu número de Cliente Preferente y justificante/factura de la subscripción.
CP 43001 TARRAGONA * Puedes hacernos llegar estos datos POR MAIL,tal como te hemos
ESPAÑA indicado; o enviándonos una carta a la siguiente dirección:
* Cualquier consulta referente a las subscripciones puedes enviarla CALLE PERE MARTELL Nº20, 2º-1ª
por mail a preferente@hackxcrack.com CP 43001 TARRAGONA
ESPAÑA
* Cualquier consulta referente a las subscripciones puedes enviarla
por mail a preferente@hackxcrack.com
CURSO DE TCP/IP: LA CAPA IP
(segunda parte)
Los datagramas
En el numero anterior empezamos con uno de los puntos mas interesantes de este curso:
La -Capa IP- y en concreto tratamos las -Direcciones IP-.
Este mes seguimos con la -Capa IP- pero nos centraremos en los -datagramas- y los
cambios que sufren en sus "andares" por Internet (fragmentación, etc).
Una vez que la capa IP tiene el paquete Una vez que el datagrama ya está en la
y los parámetros necesarios, tendrá que capa de enlace, junto con los parámetros
construir su propia cabecera que necesarios, esta capa se encargará de
añadirá al paquete, formando así un añadir al datagrama su propia cabecera
datagrama. Bueno... uno o varios, pues y, una vez
podría decidir fragmentar el paquete por hecho esto,
ser demasiado grande, pero en este ya sólo
ejemplo simple f a l t a r á
vamos a enviar el
suponer que no paquete a través del cable físico.
es necesaria la
fragmentación. Una vez en el cable (medio físico) que
conecta con la red local, el paquete
Ahora que ya tenemos el datagrama llegará a todas las máquinas que hay
formado, tenemos que enviarlo a la capa conectadas a esa red local. Una de esas
inferior, que nosotros conocemos como máquinas será el router G, que al
capa de enlace. A esta capa de enlace comprobar que la dirección de red de
no sólo tendremos que darle el destino del paquete es la suya, será el
único que se quede con el paquete no complicar las cosas), por lo que lo
(bueno, claro, a no ser que en la red único que tendrá que hacer será generar
haya alguna máquina maligna que esté una nueva cabecera de enlace para
en modo promiscuo, por ejemplo si está que éste llegue hasta B.
usando un sniffer para capturar todo el
tráfico de la red, aunque no vaya dirigido Para ello, pasa el datragrama a su propia
a ella). capa de enlace, indicándole la dirección
de red de B.
destruye y pasa el resto del paquete (el Con respecto al direccionamiento contaré
datagrama) a su propia capa IP. poco, ya que para ello dediqué el artículo
anterior sólo a este tema.
Direccionamiento
y/o poco fiables, al menos sí que ancho de banda (flag T), pero en cambio
garanticen que la respuesta será lo más no se puede exigir que para colmo la
inmediata posible. comunicación tenga máxima fiabilidad
(flag R) y no se pierda ni un sólo detalle
Si el flag T (Throughput) está activo de la imagen por el camino.
significa que el tipo de servicio que está
ofreciendo este datagrama requiere el Longitud Total (Total Length):
máximo ancho de banda que se le 16 bits
pueda ofrecer. Por ejemplo, este flag es
útil para transmisiones de contenidos
Si bien el campo IHL sólo media la
multimedia, donde lo importante es
longitud de la cabecera IP para saber en
poder transmitir a toda velocidad, al
qué punto comienzan los datos, este
margen de que se pueda perder algún
campo indica, en bytes, la longitud total
dato (por ejemplo, un simple fotograma
de todo el datagrama, para saber
de una película), es decir, aunque el
dónde terminan los datos.
servicio tenga baja fiabilidad, y también
al margen de que los datos lleguen en
Al ser 16 bits, el tamaño máximo de
tiempo real, es decir, que el retardo no
paquete será de 65536 bytes, lo cual
sea un factor crítico.
está muy por encima del tamaño de
paquete que puede circular por cualquier
Si el flag R (Reliability) está activo
red normal.
significa que el tipo de servicio que está
ofreciendo este datagrama requiere una
máxima fiabilidad, al margen de que
Identificación (Identification):
la comunicación sea en tiempo real 16 bits
(retardo), o del ancho de banda de la
misma. Cualquier aplicación que requiera Este es el campo que se utiliza para
precisión en los datos, como la identificar el datagrama al que pertenece
transferencia de archivos binarios, un fragmento. Como ya dije, la
entraría dentro de este tipo de servicios. combinación de este campo con la ip de
origen, la ip de destino, y el número de
En realidad estos flags no suelen utilizarse protocolo, identifica unívocamente un
por muchas aplicaciones, ya que requieren datagrama para permitir su reensamblaje
un coste adicional en el procesamiento a partir de sus fragmentos.
de los datagramas. Aún así, cabe destacar
que hay tipos de servicio que pueden Indicadores (flags): 3 bits
tener requisitos tan fuertes que tengan
activados dos de los tres flags, pero Aquí tenemos 2 indicadores de los que
activar los 3 sería absurdo, ya que ya he hablado:
estaríamos pidiendo que se optimizasen
3 parámetros relacionados inversamente
entre sí.
no puede ser fragmentado, por lo que, Cada gateway por el que pase el
en caso de que el datagrama no quepa datagrama tendrá que restar en 1 este
en una red, tendrá que ser descartado. valor, y si en algún caso llega a valer 0,
En otros artículos ya hemos visto algunas el gateway que diódio este valor tiene
aplicaciones de este tipo de datagramas, que interrumpir en ese punto la
como el mecanismo de Path MTU transmisión del datagrama, y devolver a
Discovery (PMTUD) que expliqué en su transmisor original un mensaje ICMP
el artículo sobre ICMP. Os recomiendo de tipo Time Exceeded.
que volváis a leer ahora ese apartado
para que lo comprendáis mejor Si estáis bien despiertos habréis observado
conociendo ahora el mecanismo de en este punto un detalle importante, y
fragmentación. es que (a pesar de que en el ejemplo del
punto 2.2 dije que los gateways no
El flag MF (More Fragments), en caso modifican la cabecera IP original) los
de estar activo, indica que este gateways que actúan como intermediarios
fragmento NO es el último de los que en la transmisión de un datagrama
forman el datagrama original. En caso pueden, y en casos como éste deben,
de que sí que sea el último, se indicará modificar algún campo de la cabecera IP.
poniendo a 0 este flag. Por supuesto, si
está activo al mismo tiempo el flag DF, Protocolo (Protocol): 8 bits
no tendrá sentido el uso de este flag,
por lo que se podrá dejar a 0 Este campo identifica el protocolo de
tranquilamente. nivel superior en la jerarquía, para que
el módulo de la capa IP del receptor sepa
Desplazamiento del fragmento cómo debe procesar el datagrama. Como
(Fragment Offset): 13 bits ya sabemos, por ejemplo, el protocolo
TCP se identifica con el valor 6
(00000110 en binario).
Indica la posición del fragmento dentro
del datagrama original, en unidades de
8 octetos, es decir, 64 bits. Suma de comprobación de la
cabecera (Header Checksum):
El primer fragmento tendrá siempre un 16 bits
desplazamiento 0. Si, por ejemplo, el
primer fragmento tenía un tamaño de Ya sabemos bien cómo funcionan las
512 bytes, el segundo fragmento tendrá sumas de comprobación. El algoritmo es
un desplazamiento de 512/8 = 64. el mismo que en el caso de TCP, UDP,
o ICMP. El problema aquí es que, como
Tiempo de Vida (TTL: Time To los gateways que procesan el datagrama
a lo largo de todo el camino modifican la
Live): 8 bits
cabecera (como acabamos de ver al hablar
del campo TTL), es necesario recalcular
Ya hablé bastante sobre este campo,
una nueva suma de comprobación en
sobre todo en el artículo sobre ICMP.
cada gateway por el que pasa el
Como ya sabemos, indica el número
datagrama.
máximo de gateways que puede
atravesar el datagrama antes de Por tanto, cada gateway, en primer lugar
considerarse caducado. comprueba el checksum del datagrama
Opciones de seguridad
(Security)
Definiciones específicas de
Esta opción está definida por el
las opciones departamento de defensa de los estados
unidos, e incorpora información de
Fin de lista de opciones (End distintos niveles de confidencialidad a los
of options list) datagramas (desde información
desclasificada, hasta alto secreto).
Esta opción consta de un
único byte, con 8 ceros Tampoco creo que os enteréis de mucho
(00000000), y se coloca
leyendo el RFC 1108 así que, teniendo
siempre como última opción, para marcar
en cuenta que esta opción no os la vais
que ya no hay más opciones.
a encontrar habitualmente, en principio
No será necesaria en caso de que el podéis ignorarla. Por supuesto, animo al
tamaño de las opciones se ajuste a un que tenga interés a que investigue por
múltiplo de 32 bits, por lo que el fin de su cuenta (aunque os advierto de
las opciones vendrá delimitado por el antemano que no os bastará con el RFC
campo IHL. 1108).
Esta opción obligatoriamente tiene que El primer byte, por supuesto, es el option-
tener activo el flag copied, es decir, el type que, como vemos, tiene que tener
primer bit del option-type, por lo que su obligatoriamente activo su flag copied
byte option-type siempre será (el primer bit).
10000010 (130 en decimal). Aparte del
option-type, los 10 próximos bytes El segundo byte indica la longitud en
pertenecerán a esta opción (ya que tiene bytes de toda la opción LSRR, incluyendo
una longitud total de 11 bytes). el option-type y el propio byte de longitud
(length).
Encaminamiento débilmente
especificado por el transmisor El tercer byte, es el puntero (pointer)
que permite ir rastreando la lista de
(LSRR: Loose source and
gateways según el datagrama va
record route)
recorriendo su camino.
Esta opción permite especificar el camino El cuarto campo, de longitud variable, los
que debe seguir el datagrama para llegar datos de enrutamiento (route data)
hasta su destino, es decir, una lista de es donde se encuentra la lista de
gateways por los que debe pasar gateways que debe atravesar el
obligatoriamente el datagrama en el datagrama.
camino hacia su destino.
Para comprender el funcionamiento del
Cada uno de estos gateways puede decidir LSRR vamos a verlo con un ejemplo.
hacer pasar el datagrama por otros Supongamos que tenemos esta opción
gateways intermedios no especificados LSRR:
en la lista, pero al final el datagrama
tiene que haber pasado por todos los
gateways de la lista. Si bien es obligado
que el datagrama pase por todos los
Y nuestro datagrama tiene como IP de
gateways de la lista, el datagrama
también puede pasar además por otros destino la IP 217.15.12.100.
gateways que no estén en la lista, motivo
por el cual se habla de encaminamiento En primer lugar, vamos a comprobar el
DEBILMENTE especificado. byte length. Como vemos, vale
00001111, que es 15 en decimal. En
Como veremos después, la diferencia con efecto, si tenemos 3 direcciones IP en
el encaminamiento ESTRICTAMENTE el campo route data, con 4 bytes por
especificado es que en este segundo caso IP tenemos un total de 3 x 4 = 12 bytes
el datagrama sólo podrá pasar por los para el campo route data. Si a esos
gateways de la lista, y no podrá haber 12 le sumamos los 3 bytes que ocupan
otros intermedios.
los campos option-type, length, y pointer,
tenemos un total de 15 bytes para toda
Para implementar esta función, la opción
la opción.
LSRR consta de 4 campos:
Con todo esto (además de conseguir que, Inicialmente, el campo route data estará
por los motivos que sean, nuestro en blanco, y tendrá un tamaño lo
datagrama atraviese un camino prefijado) suficientemente grande como para que
además al destinatario del datagrama le quepa toda la ruta que se estima que siga
llegará un registro de estos gateways
el datagrama.
por los que ha ido pasando el datagrama
que le ha llegado, ya que la lista se
Si bien en las opciones LSRR y SSRR hay
mantiene íntegra en el campo route
data, y es sólo el puntero el que se va que activar el flag copied, para que todos
modificando para ir rastreando la lista. los fragmentos puedan encaminarse
correctamente a través del camino
Encaminamiento estrictamente prefijado, en el caso de la opción record
especificado por el transmisor route ocurre lo contrario. No tendría
(SSRR: Strict Source and sentido repetir la misma información en
Record Route) todos los fragmentos, por lo que esta
opción sólo se incluirá en el primer
fragmento y, por tanto, tendrá a 0 su
flag copied.
Esta imagen es
En este caso, esta opción se podría
similar, pero con la
diferencia de que en
acompañar de una opción Record Route,
este caso los pero sería absurdo, ya que se obtendría
gateways sólo el mismo resultado que utilizando
incluyen su sello de
directamente la opción Timestamp pero
tiempo, y no su
dirección IP.
incluyendo las direcciones IP en los
propios timestamp. Aquí el datagrama,
Si en lugar de una opción SSRR fuese
además de los sellos
una opción LSRR, no tendríamos manera de tiempo, lleva una
El único motivo para hacer esto sería que
de saber qué gateways han incluido su opción SSRR que nos
el camino entre las dos máquinas fuese
sello de tiempo, ya que no podemos saber dice de antemano las
demasiado largo (muchos gateways), ya IPs de todos los
por qué gateways intermedios ha pasado
que la longitud máxima de la opción gateways que dejarán
el datagrama aparte de los especificados su sello de tiempo.
timestamp es de 40 bytes y, por tanto,
en el route data de la opción LSRR.
si se incluyen las direcciones IP en los
timestamp sólo podríamos incluir sellos
En este ejemplo, de tiempo para 4 gateways, mientras
quien se encarga de
que si las direcciones IP se incluyen
incluir las direcciones
IP de los gateways es aparte (con una opción Record Route)
una opción Record podríamos incluir sellos de tiempo para
Route, mostrada en la 9 gateways. Más adelante veremos el
imagen como RR.
Como vemos en la
Por tanto, una tercera forma de
imagen, aquí no todos
funcionamiento de la opción los gateways que han
Internet Timestamp consiste en dejado su sello de
que el transmisor del datagrama tiempo están en el
route data de la opción
i n c l u ya l a l i s t a d e l o s g a t e w a y s
LSRR (concretamente
cuyo sello de tiempo desea el gateway 82.15.1.1),
conocer, lo cual sería una buena por lo que no hay
por qué de estos números.
combinación junto con la opción manera de saber a
En el caso de que el datagrama venga qué gateway
LSRR, aunque también sería útil
acompañado de una opción SSRR ya pertenece cada uno
independientemente. de los 4 sellos de
sabríamos de antemano los gateways
tiempo.
La fragmentación da la oportunidad a un
Pero, igual que quedamos en que íbamos a
hacker de llevar a cabo un gran número de
tratar de comprender todo el RFC, también
ataques, como ataques DoS, o técnicas para
tenéis que recordar que lo que nos diferencia
saltarse la protección de un firewall o un
a nosotros del resto de los usuarios de
IDS.
ordenadores son precisamente estas cosas.
Por ejemplo, vamos a ver un algoritmo sencillo Paso 7: Miramos a la derecha. La diferencia
que tenemos todos implementados en nuestro de este paso con el 4, es que como aquí
cerebro, y lo usamos a diario: el algoritmo permaneceremos un tiempo mirando a la
para cruzar una calle. derecha, durante este tiempo podría volver a
haber coches en el lado izquierdo, por lo que
Un algoritmo suele venir detallado por una antes de cruzar tendremos que volver a
serie de pasos secuenciales. Se empieza en comprobar este lado, tal y como veremos
un primer paso, en el que se llevan a cabo ahora mismo.
unas acciones. Cuando se termina este paso
se sigue en el paso siguiente, y así Paso 8:
sucesivamente. --> Si no viene ningún coche por la derecha,
entonces volvemos al Paso 2.
En algunos pasos puede haber saltos que te --> Si viene algún coche por la derecha,
lleven atrás a un paso que ya hicimos entonces volvemos al Paso 7.
anteriormente, o bien adelante, saltándonos
así varios pasos que no es necesario que No creo que haya ninguna duda sobre el
llevemos a cabo por los motivos que sean. funcionamiento de este algoritmo, ya que
todos lo utilizamos casi inconscientemente.
En cada paso puede haber acciones a realizar, Un programador se tiene que encontrar
o bien preguntas a responder acerca del constantemente con este problema de
estado del problema. Las respuestas a estas racionalizar y detallar en un algoritmo muchas
preguntas nos llevarán por un camino u otro cosas que hacemos de forma inconsciente sin
dentro del algoritmo, moviéndonos de un reparar en la complejidad de lo que estamos
paso a otro no siempre de forma secuencial, haciendo.
hasta que lleguemos a algún paso que termine
el algoritmo (un paso de FIN). Por supuesto, este algoritmo para cruzar una
calle es muy simple, y el que utilizamos
Veamos, por tanto, el algoritmo que utilizamos nosotros realmente es mucho más complejo.
nosotros para cruzar la calle: Nuestro cerebro tiene en cuenta mil factores
más: que la calle sea de doble o único sentido,
Paso 1: Buscamos un paso de peatones y
que haya semáforos, que los coches estén
nos acercamos a él, situándonos en el borde
atascados, etc, etc.
de la acera.
Ahora que ya comprendemos el mecanismo
Paso 2: Miramos a la izquierda. básico de un algoritmo, podemos enfrentarnos
al algoritmo de fragmentación planteado
Paso 3: en el RFC.
--> Si viene algún coche por la izquierda,
entonces volvemos al Paso 2. Para ello, en primer lugar tenemos que dar
-->Si no viene ningún coche por la izquierda, nombres a una serie de variables que se van
entonces continuamos por el Paso 4. a utilizar en el algoritmo.
MTU Más adelante hablaremos mucho más Vamos a ver ahora el algoritmo detallado. Os
sobre la MTU. La MTU es el tamaño máximo recomiendo que según lo voy explicando
que puede tener un datagrama según la vayáis siguiendo cada paso del algoritmo tal
tecnología de la red que va a tener que
y como viene en el RFC (bastante más
atravesar en su próximo paso. [Maximum
ofuscado de lo que lo explicaré yo aquí), para
Transmission Unit]
que os acostumbréis a la notación utilizada
DF Flag de la cabecera IP que obliga a que en los RFCs.
un datagrama no pueda ser fragmentado.
[Dont Fragment] El algoritmo del RFC muestra sólo el caso más
simple, de un datagrama que se divida en
IHL Campo de la cabecera IP que especifica
sólo dos fragmentos.
el tamaño de esta cabecera. A lo largo del
algoritmo, se referirá en unos momentos al
IHL del datagrama original, o al IHL del Empecemos viendo el primer paso, que
fragmento, tal y como veremos. [Internet llamaremos Paso 0 para que se correspondan
Header Length] el resto de pasos con los del RFC:
OIHL Variable de uso auxiliar, que nos Paso 0 Si TL es menor o igual que la MTU,
permite recordar el tamaño de la cabecera entonces el datagrama cabrá por la red y no
IP que tenía el datagrama antes de ser habrá que fragmentarlo. FIN.
fragmentado. [Old Internet Header Length]
En el caso contrario (TL > MTU), entonces
OTL Variable de uso auxiliar, que nos tenemos que comprobar el flag DF.
permite recordar el tamaño total del
Si el flag DF está activo, no podemos
datagrama antes de ser fragmentado. [Old
Total Length] fragmentar, por lo que tenemos que descartar
este datagrama, y enviar un ICMP para notificar
FO Campo de la cabecera IP Fragment el problema. FIN.
Offset, que nos permite saber qué posición
ocupa un fragmento dentro del datagrama
Si el flag DF no está activo, entonces podemos
original. [Fragment Offset]
continuar por el Paso 1.
Paso 0 Paso 2
SI TL es menor o igual que la MTU ENTONCES
El datagrama cabrá por la red y no Damos valor a las variables auxiliares, ya que
habrá que fragmentarlo. necesitamos seguir conociendo los datos del
FIN. datagrama original, pero tenemos que
SI NO, ENTONCES modificar las variables TL, IHL, FO, y MF para
Comprobar el flag DF. nuestro nuevo fragmento.
SI el flag DF está activo ENTONCES
OIHL = IHL.
No podemos fragmentar.
OTL = TL.
Descartar el datagrama.
OFO = FO
Enviar un ICMP para notificar OMF = MF
el problema.
FIN. Paso 3
SI NO, ENTONCES
NFB = (MTU IHL x 4) / 8.
Continuar por el Paso 1.
Calculamos el tamaño de los datos del
fragmento. El tamaño máximo para todo el
¿Verdad que esto es mucho más claro una
datagrama está determinado por la MTU.
vez que nos acostumbramos a leerlo así?
Como, además de los datos, hay que incluir
la cabecera, el tamaño de los datos estará en
Además, tal y como está escrito esto, se
función de la MTU y del tamaño de la cabecera
puede escribir de forma casi directa en (IHL).
cualquier lenguaje de programación, por lo
que facilitamos mucho el trabajo a los Paso 4-
programadores que tengan que implementar
este algoritmo en una máquina. Añadir al fragmento NFB x 8 bytes de datos.
Paso 8
El fragmento ya está listo, y lo podemos enviar
Como este algoritmo sólo explica como dividir a la capa de enlace para que lo procese. FIN.
en 2 fragmentos, asumimos que éste es el
último, por lo que añadimos después de la Bueno, bueno, bueno... Os dije que esto no
cabecera todos los datos que faltaban (los iba a ser fácil.
que había en el datagrama original a partir
de la posición NFB x 8). Pero llevamos ya el suficiente tiempo dando
caña a los protocolos como para que os pueda
Paso 9 exigir ya a estas alturas que os lo curréis bien
y analicéis paso a paso el algoritmo para
Ahora ajustamos varios campos de la cabecera
comprenderlo. Es difícil darlo ya más masticado
del fragmento, en 5 pasos:
de lo que os lo he dado yo, así que mucho
más no puedo hacer. Lo que es complicado,
IHL = ((OIHL x 4) L + 3) / 4.
TL = OTL (NFB x 8) ((OIHL IHL) x 4). es complicado.
FO = OFO + NFB.
MF = OMF. 2.2. Algoritmo de reensamblado
de datagramas del RFC 791.
Calculamos el checksum. Vaya formulitas,
¿eh?
Este algoritmo es bastante más denso y
complicado de entender, así que en este caso
En primer lugar, vemos que el IHL del nuevo
es casi mejor contar con la descripción general
fragmento, como dijimos, podría ser menor
del algoritmo que viene en el RFC antes de
que el del datagrama original, porque podría
detallar sus pasos.
haber opciones que no se han copiado. La
variable L que he puesto en la fórmula es la
Esta descripción nos aclara algunos detalles
longitud de las opciones que no han sido
que quizá nos quedaban como lagunas hasta
copiadas en el fragmento.
ahora. Por ejemplo, el mecanismo para
diferenciar un datagrama fragmentado
En el caso del TL del fragmento, lo obtenemos
de uno no fragmentado, es que los no
a partir del TL del datagrama original,
fragmentados siempre tendrán su FO
restándole todo lo que ocupaba el primer
(Fragment Offset) a 0, y al mismo tiempo el
fragmento, y la diferencia del tamaño de las
flag MF (More Fragments) a 0 también.
La variable Total Data Length ahora puede Una de las grandes ventajas es que el algoritmo
ser calculada. Cogemos el Offset de nuestro de reensamblado del RFC 815 consume menos
fragmento, y le sumamos su Longitud. En recursos, lo cual veremos más adelante que
este ejemplo la Longitud de este último puede suponernos una ayuda contra ciertos
fragmento es de 350 bytes, por lo que: 4500 tipos de ataques, aunque en cualquier caso si
+ 350 = 4850 bytes. se proponen hacernos un DoS con alguna de
las técnicas que explicaremos, de poco nos
Además, hemos podido reducir el tamaño de va a servir ahorrarnos unos cuantos bytes en
la mesa del puzzle, ya que sabemos que no los buffers...
vamos a necesitar más espacio a la derecha.
Os dejo como ejercicio empollaros este RFC,
Ahora nos llega un fragmento más. Su Offset que es muy cortito, a ver si conseguís
es 0, y su Longitud es 1500 bytes. Por comprender más o menos los algoritmos que
supuesto, el flag MF está activado. Sin lugar explica.
a dudas se trata del primer fragmento y,
además, al sumar su Offset y su Longitud, 3. Problemas de seguridad de la
nos damos cuenta de que ya no faltan más fragmentación de datagramas.
fragmentos, ya que encaja perfectamente
en el puzzle a la izquierda del que ahora
Llegamos ya a la parte más divertida.
ya sabemos que es el segundo fragmento.
Los ataques que aprovechan la fragmentación
IP han estado siempre muy extendidos, y esto
ha dado lugar incluso a la aparición de un par
de RFCs tratando exclusivamente este
problema.
815 son propensos a gran cantidad de y con eso: hop! la máquina 80.12.1.4 quedaba
problemas ya que, como ocurre con la mayoría petada.
de los protocolos básicos de Internet, fueron
pensados para situaciones de buena fe, donde Dependiendo del sistema operativo de la
todo funciona como debería. víctima, la máquina podía reiniciarse, colgarse,
o, sólo en los casos más raros, salir indemne
Por tanto, no se tienen en cuenta muchas (la mayoría de los sistemas operativos eran
situaciones anómalas, como valores imposibles vulnerables).
para los offsets de los fragmentos, flujos de
datagramas incompletos, o fragmentos que La opción -l en el comando ping de Windows
forman datagramas demasiado grandes. sirve para especificar la longitud del campo
DATOS del mensaje ICMP Echo Request
Vamos a ver en detalle algunas de las técnicas que enviará el ping. Los pings normales (el
DoS que permiten explotar este exceso de valor por defecto) envían tan sólo 64 bytes
confianza de los algoritmos de reensamblado. de datos. Con esta opción -l le estamos
Los sistemas operativos modernos están diciendo que envíe 65510 bytes de datos
protegidos contra muchas de estas técnicas, por cada ping. Cualquier valor igual o mayor
pero aún siguen quedando servidores sin que 65510 puede servir para llevar a cabo el
actualizar que pueden ser vulnerables. En DoS. Más adelante veremos por qué esto
cualquier caso, siempre es interesante conocer causa un problema.
todo lo que se puede hacer gracias a un
algoritmo mal diseñado. En el caso de Linux, la longitud del campo
de datos se especifica con la opción -s, pero
Estad preparados, porque aquí hay mucha en este caso está limitado a un máximo de
chicha. 65507 bytes, lo cual no permite llevar acabo
este ataque (si, esos 3 bytes son
3.1.1. Ping of Death f u n d a m e n t a l e s , c o m o ya v e r e m o s ) .
Este ataque, el ping de la muerte, fue muy Hoy día dudo que queden muchas máquinas
popular cuando fue descubierto en 1996. conectadas que todavía sean vulnerables al
Ping of Death, pero me parece un ejemplo
Durante un par de años fue el paraíso sobre muy didáctico de en qué puede consistir un
todo para los scriptkiddies (o lamers, para ataque DoS que explote la fragmentación IP.
que nos entendamos) que encontraron una
forma universal de destruir cualquier Vamos a ver paso a paso qué es lo que pasa
máquina con sólo escribir un simple comando. con un ICMP Echo Request que contenga
65510 bytes de datos. Para ello os
Este comando se podía escribir directamente recomiendo que reviséis el artículo anterior
desde Windows 95 o Windows NT, que (que trataba sobre la cabecera IP), así como
eran los sistemas operativos de Microsoft que el artículo sobre ICMP de este mismo curso.
había en el momento, sin necesidad ni siquiera
de instalar ninguna aplicación para explotar En primer lugar, vamos a calcular el tamaño
el ataque. En cambio, para los usuarios de total de este paquete.
Linux era necesario compilar un pequeño
código. La cabecera del mensaje ICMP Echo
Request son 8 bytes (como vimos en el
Si un usuario de Windows 95/NT quería petar artículo sobre ICMP), mientras que la
a un tío cuya ip fuese 80.12.1.4, sólo tenía cabecera IP sin opciones es de 20 bytes.
que escribir en una ventana MS-DOS: Por tantos, si sumamos estos 28 bytes de
cabeceras a los 65510 bytes del campo de
ping -l 65510 80.12.1.4 datos, tenemos un total de 65538 bytes.
¿Por qué el ping de algunos sistemas De momento, ningún problema: cada paquete
operativos como Linux no permiten hacer es correcto por separado. Pero el problema
este ping? Pues porque, si recordamos del viene cuando el sistema trata de reensamblar
artículo anterior el campo Total Length de estos dos fragmentos. Al unir los fragmentos
la cabecera IP, sabremos que este campo el sistema ha de computar el tamaño del
especifica con sólo 16 bits el tamaño del datagrama original (el Total Length). Para
datagrama, por lo que el tamaño máximo de ello se hace una suma de 16 bits de los
un datagrama tendría que ser 65536 bytes. tamaños de cada fragmento. El resultado de
Precisamente en este punto es donde está la esta suma en este caso sería 32768 + 32770
clave del ataque. = 65538, lo cual se sale del rango de la suma,
que estaba limitada a 16 bits.
Sólo hay una forma en la que este datagrama
puede enviarse, ya que el campo Total Esta suma fuera de rango no estaba prevista
Length de la cabecera IP no da más de si. por el sistema operativo y, por tanto, producirá
El único medio es fragmentar el datagrama, resultados inesperados que, en la mayoría de
y ajustar de forma adecuada el tamaño de los casos, daban lugar a que el sistema se
cada fragmento. colgase, o bien se reiniciase.
En el caso más sencillo, el datagrama sería ¿Por qué se utilizaba precisamente un ping
fragmentado en dos de la siguiente forma: cuando cualquier otro tipo de datagrama
h a b r í a s e r v i d o p a ra e l m i s m o f i n ?
Pues bien, en efecto hay variantes del POD
(Ping Of Death) que utilizan otro tipo de
datagramas, como datagramas UDP, u otros
tipos de ICMP. Pero las grandes ventajas de
usar ping son dos: por una parte, que ICMP
es un servicio no orientado a conexión, por
lo que no es necesaria ninguna información
para colarse en una conexión como podría ser
el caso de TCP. El hecho de no tener que
colarse en una conexión nos da la gran ventaja
de que podemos enviar el ataque sin
preocuparnos de tener que recibir ninguna
Estos fragmentos siguen siendo demasiado respuesta. Al no tener que esperar respuestas,
grandes para pasar por cualquier red, por lo podemos perfectamente enviar el ataque con
que sin duda serían fragmentados a su vez un IP-Spoofing, tal y como veremos en el
para ajustarse a la MTU de la red por la que próximo artículo, en el cual entraremos en
tuviesen que circular. Pero esto lo vamos a todo detalle en las técnicas de IP-Spoofing.
obviar, por lo que supondremos que lo que Esto permitía realizar el ataque de forma
llega a la víctima son directamente estos dos totalmente anónima.
paquetes (para simplificar mucho el ejemplo).
La otra ventaja de utilizar el ping es que,
El sistema operativo de la víctima recibirá el hasta el momento en que surgieron este tipo
primer fragmento, con Offset 0, tamaño de de ataques, prácticamente ningún firewall
paquete (TL) de 32768 bytes, y el flag MF filtraba los mensajes ICMP Echo Request,
activado. A continuación (aunque no tendrían al considerarlos totalmente inofensivos.
por qué llegar necesariamente en este orden,
como ya sabemos) recibirá el segundo Después de la aparición de estos ataques
paquete, con Offset 32768, tamaño de basados en el ping, la mayoría de los firewalls
paquete de 32770 bytes, y el flag MF empezaron a filtrar los mensajes ICMP Echo
desactivado (ya que es el último fragmento). Request. Esto fue una medida de defensa
bastante ingenua, ya que enseguida surgieron nuevas variantes del POD que utilizaban cualquier otro tipo
de datagramas, ya que el fin último al fin y al cabo era simplemente conseguir hacer llegar un datagrama
fragmentado, fuese de la naturaleza que fuese.
¿Cómo puede ser entonces que hoy día la inmensa mayoría de los sistemas sean inmunes a este tipo de
ataques, si no se pueden evitar filtrando el ping en un firewall?
Pues sencillamente, la solución al problema se implementó en el propio sistema operativo. Salieron parches
para los sistemas existentes en el momento, y además todos los sistemas que se hicieron después eran
ya inmunes de fábrica, es decir, tenían prevista la situación de que un datagrama pudiese medir más de
65536 bytes tras ser reensamblados sus fragmentos. Como ejemplo, los kernels de Linux posteriores al
2.0.23 son ya todos inmunes a estos ataques.
En cualquier caso, no sólo nos tenemos que resignar a confiar en lo que haga nuestro sistema operativo,
si no que también podemos nosotros tomar parte activa en la protección de nuestra máquina ante estos
ataques.
A la hora de implementar protecciones en nuestro firewall contra ataques específicos es fundamental conocer
con detalle el funcionamiento del ataque.
Si habéis seguido el curso de implementación de firewalls de la revista, sabréis que estas líneas son
una serie de reglas de IPTABLES, el firewall implementado en el kernel de Linux. Si conocemos el
funcionamiento de iptables (man iptables) sabremos que lo que hacen estas líneas es limitar a que sólo
podamos recibir un máximo de un ping por segundo (protocolo ICMP, tipo de mensaje Echo Request, y
limite de 1/segundo).
Aunque estas reglas de iptables presuman de ser una protección contra el POD, nada más lejos de la
realidad. Lo único que hacen es evitar un flood de pings, que podría ser resultado de algún ataque DDoS
(DoS distribuido).
Lo que os quiero decir con esto es que no podemos fiarnos de las soluciones que encontremos por ahí, ya
que si bien muchas veces encontraremos soluciones adecuadas, en cualquier caso siempre tenemos que
estar preparados para analizar con nuestros propios conocimientos si esa es realmente una solución
para nuestro problema, o si más bien el tío que lo escribió (probablemente con toda su buena fe) no tenía
mucha idea de en qué consiste realmente el ataque.
Seguramente alguno de vosotros en este punto habrá pensado que, si bien esa protección no sirve contra
el POD, si que podría servir contra un ataque Smurf, que consiste precisamente en un flood de pings
(tal y como expliqué en el artículo sobre ICMP).
Pues para todos los que hayáis pensado eso, os pongo un punto positivo, ya que demuestra que habéis
estado bastante atentos al curso.
Ahora bien... para quien pongo ya no uno sino tres puntos positivos es para el que se haya dado cuenta
de que los que hayan pensado eso están equivocados, ya que falla un pequeño detalle. El ataque smurf,
en efecto, se lanza mediante pings, pero lo que la víctima recibe no son los pings, si no los pongs, es decir, no recibe
un flood de Echo Request, si no de Echo Reply. Por tanto, esta sí sería una protección contra Smurf con iptables:
Esto, por supuesto, no nos serviría para evitar convertirnos en un amplificador Smurf, es decir, convertirnos en
colaboradores involuntarios del ataque contra otra persona.
Como ya vimos, el ataque Smurf depende de máquinas inocentes que respondan a los mensajes de ping a la dirección
broadcast de la red.
La solución a este problema es mejor implementarla a otro nivel, que no es el de las iptables, diciéndole directamente
a nuestro sistema operativo que ignore cualquier ICMP Echo Request que tenga como destino la dirección broadcast
de la red. Esto lo podemos hacer con la siguiente línea:
Esta línea la podemos incluir como parte de los scripts de arranque del sistema (los clásicos de /etc/rc.d), o bien en
el archivo /etc/sysctl.conf.
Pero no nos salgamos del tema, y pensemos cómo podemos protegernos contra el POD con iptables. Una solución
específica contra POD sería esta:
Aquí estamos rechazando cualquier fragmento que pertenezca a un datagrama ICMP Echo Request. No hay ningún
motivo legal por el que nadie quisiese enviarnos un Echo Request fragmentado, por lo que no estamos impidiendo el
correcto funcionamiento de nuestra red por añadir esta regla.
Como podemos suponer, esta regla no es lo suficientemente restrictiva, ya que si bien evitaría el ataque POD, alguna
de sus variantes (las que utilicen otros tipos de mensaje ICMP, o bien otros protocolos, como UDP o TCP) sí que pasarían
por el firewall.
Para evitar las variantes que utilicen otro tipo de mensajes ICMP podríamos ser menos específicos en la regla, y filtrar
cualquier ICMP fragmentado, ya que en general no existe ningún uso legal para ningún tipo de ICMP fragmentado:
Con esto aún no solucionaríamos el problema El flood consiste en tirar un sistema a base
de los ataques tipo POD que utilicen otros de saturar sus recursos por fuerza bruta,
protocolos distintos a ICMP. Por lógica mientras que el nuke consiste en explotar un
podríamos pensar que otros protocolos, como bug concreto de un sistema que no es capaz
TCP, que transportan protocolos de nivel de responder bien ante cierta situación.
superior que pueden llevar un gran flujo de
datos (como FTP), no podrían funcionar Por ejemplo, el POD es un claro ejemplo de
correctamente sin la fragmentación. nuke, en el cual con un sólo datagrama
podemos tirar un sistema. En cambio, el smurf
Por tanto, de momento dejamos aquí el tema, es un claro ejemplo de flood, en el cual se
y nos conformamos con haber encontrado tira el sistema a base de saturarlo con miles
una solución para que nuestro firewall filtre de ICMPs.
los ataques POD clásicos (con mensajes
Con respecto a jolt2 hubo ciertas discusiones
ICMP), y más adelante iremos viendo cómo
sobre si realmente era un nuke, o si en realidad
solucionar el problema con el resto de
era un simple flood, ya que el exploit que
protocolos. circulaba (jolt2.c, lo podéis buscar en Google)
enviaba paquetes a toda pastilla, tanto incluso
3.1.2.Jolt y jolt2
que saturaba la conexión del propio atacante.
Estos dos exploits explotan dos bugs En cambio, poco después circuló una nueva
diferentes, pero ambos relacionados con la versión de jolt2 (jolt2mod.c, también lo
fragmentación. podéis buscar) que ralentizaba el envío de
paquetes para no saturar la conexión del
Jolt es más antiguo, y os costará encontrar atacante.
alguna máquina vulnerable hoy día, pero
Cada vez que hablo de un tema diferente me
Jolt2 se supone que puede tirar a varios
gusta contarlo de una forma diferente, así que
sistemas, incluido Windows 2000.
os voy a hablar en primer lugar de los
retoques que he tenido que hacer al código
No hay mucho que explicar sobre estos
fuente de ambos exploits.
exploits, ya que lo que hacen simplemente
es enviar una serie de paquetes fragmentados En primer lugar, al tratar de compilar el código
que muchos sistemas operativos no saben de Jolt (jolt.c, lo podéis buscar también),
cómo tratar y, por tanto, pueden colgar el con:
sistema.
gcc jolt.c -o jolt
¿Y por qué no hay mucho que contar? Pues
Descubro que no compila, ya que da un error
porque son unas técnicas más empíricas que
con un campo de una estructura que no existe.
lógicas. Al menos hasta donde yo he podido
Así que edité el código:
documentarme, no he encontrado ninguna
explicación convincente de por qué estos
vi jolt.c
paquetes pueden colgar un sistema. De hecho,
lo que sí que he encontrado han sido
Y busqué cualquier referencia a ese campo,
discusiones en foros de seguridad sobre qué
y vi que aparecía una única vez, en una línea
hace o deja de hacer cada uno, y por qué lo
que sólo le daba un valor 0. Así que comenté
hace o lo deja de hacer.
esa línea (la metí entre /* y */), salvé el
archivo, y lo volví a compilar, esta vez sin
En cualquier caso, sea magia o sea ciencia,
problemas.
el caso es que ambos exploits han sido de
los más famosos en la historia de los nukes.
No os he dicho los pasos exactos para
Como ya conté en otro artículo, existen
proponeros que lo hagáis vosotros mismos
básicamente dos tipos de DoS: el flood y el
como ejercicio.
nuke.
Para usar el exploit sólo tenéis que decir la de esas líneas era nulo. Una vez corregido el
ip de destino y la de origen (permite ip- código es así como queda esa parte:
spoofing):
src_addr = host_to_ip(optarg);
./jolt ip.victima ip.spoofeada if (!src_addr)
quit("Bad source address given.");
Lo más probable es que esta técnica no os
break;
funcione, ya no sólo porque queden pocos
sistemas vulnerables, si no porque
Os dejo como ejercicio también que os las
probablemente ni siquiera pueda atravesar
apañéis vosotros para hacer esta corrección.
alguno de los routers que haya en la ruta, al
ser un paquete malformado que podría ser
Una vez corregido esto, vemos el mismo
rechazado.
problema. Los paquetes están malformados
y es probable que no puedan pasar por todos
Aún así, por si tenéis curiosidad, podéis
los routers. Si analizamos su funcionamiento
analizar con un sniffer lo que hace Jolt. Os
con un sniffer (o analizando el código fuente)
ahorro el trabajo si os cuento que simplemente
veremos que lo que hace es enviar una y otra
envía una serie de fragmentos solapados,
vez el mismo fragmento, con todos los campos
es decir, fragmentos en los que el campo
exactamente iguales. ¿Por qué esto puede
offset de un fragmento no se corresponde
tirar un Windows? Sinceramente, no tengo ni
con el total length del anterior fragmento.
Más adelante veremos usos mucho más idea; eso que se lo pregunten a Bill Gates.
interesantes para el solapamiento de
fragmentos. 3.1.3. Ataques de flood de
fragmentos
Con respecto a Jolt2, también tuve que hacer
una modificación al código fuente. En este Si vuestras mentes están despiertas
caso usé la variante jolt2mod.c. probablemente se os haya ocurrido pensar
que Jolt2 funciona porque cada vez que
Supuestamente, el exploit debería permitir Windows recibe un fragmento reserva unos
un ip-spoofing utilizando la opción -s, tal y recursos para ese paquete (como ya vimos
como podéis ver si después de compilarlo: antes), y al no recibir el resto de fragmentos
llega un momento en el que los recursos del
gcc jolt2mod.c -o jolt2mod sistema se agotan.
Lo ejecutáis, para que os muestre su Esta es una deducción muy buena, pero tiene
funcionamiento: un pequeño fallo, y es que el identificador
es el mismo para todos los fragmentos. Por
Bellatrix:/home/pyc/hackxcrack/ip3# ./jolt2mod tanto, cada fragmento nuevo no obligaría al
Usage: ./jolt2mod [-s src_addr] [-p port] dest_addr
sistema (en teoría) a reservar nuevos recursos.
Note: UDP used if a port is specified, otherwise ICMP
Y vamos al sniffer a ver qué ha hecho. Repito 3.2. Saltando firewalls e IDSs.
una vez más que también se puede analizar
el comportamiento mirando el código fuente Vamos a ver aquí un problema de compromiso
en lugar del sniffer. a la hora de configurar nuestro firewall, ya
que muchas veces las soluciones contra los
Si lo analizamos vemos en primer lugar que
ataques DoS favorecen este otro tipo de
sólo son dos fragmentos (increíble poder
ataques, y viceversa. Aún así, en el último
tirar un sistema con sólo dos paquetitos), y
punto del artículo explicaré la que podría ser
que ambos pertenecen al mismo datagrama
una solución definitiva contra ambos tipos de
(mismas ips de origen y destino, ambos con
ataques.
protocolo udp, y ambos con el mismo
identificador). Este problema de seguridad es, en mi opinión,
mucho más serio y más interesante que el de
Lo que cambia entre los dos fragmentos son
los ataques DoS. De hecho, es esta cuestión
los campos Total Length y Offset, y aquí
la que dio lugar a la aparición de los RFCs
es donde está la clave.
1858 y 3128.
El primer fragmento tiene:
Un ataque DoS puede ser un complemento
Total Length = 56 bytes
para llevar a cabo un ataque más complejo,
Offset = 0 (flag MF activado)
como vimos por ejemplo en el caso del
El segundo fragmento tiene: envenenamiento DNS. En cambio, esta
Total Length = 24 técnica es ya una forma concreta de saltarse
Offset = 24 la seguridad de una red.
Como el segundo fragmento no tiene activado La técnica más conocida que explota esta
el flag MF, es de suponer que es el último vulnerabilidad es la conocida como Tiny
fragmento. El sistema operativo que recibe Fragment Attack. Personalmente, me parece
estos fragmentos tratará de computar el Total una de las formas más elegantes de explotar
Length del datagrama original sumando los las potencialidades de un protocolo.
campos Total Length y Offset del último
fragmento: 24 + 4 = 48 bytes. La idea básica del Tiny Fragment Attack (TFA)
consiste en hacer picar al firewall con un cebo
Esto da lugar a una situación imposible, ya falso, como un caballo de troya, para luego
que el primer fragmento tiene una longitud soltar a todo el ejército una vez que el firewall
mayor que la que supuestamente tiene el nos ha abierto sus puertas.
datagrama original (56 bytes). El código que
realiza el reensamblado del datagrama Un firewall clásico de filtrado de paquetes
encuentra aquí una situación en la que tiene funciona básicamente analizando ciertos
que reservar memoria para un número de campos de la cabecera de un paquete, y
bytes negativo. Este número negativo será comparándolos con sus reglas de filtrado. En
interpretado como un número positivo muy
caso de que haya una coincidencia, ese paquete
grande (por cómo son tratados los números
deberá ser rechazado o aceptado, según lo
negativos en variables en las que no son
que indique la regla.
esperados), por lo que el sistema trataría de
reservar demasiada memoria y, por tanto, se
Veamos como ejemplo una lista de reglas de
colgaría.
un firewall muy simple:
Estos cuelgues no ocurren cuando es una Iptables A FORWARD p tcp --destport 21 j ACCEPT
aplicación la que trata de reservar demasiada
Iptables A FORWARD p tcp j DROP
memoria, ya que el sistema operativo se
encarga de que esto no ocurra, pero cuando
Con estas dos líneas, en primer lugar
es el propio sistema operativo el que realiza
analizaríamos cualquier paquete TCP entrante
esta operación imposible, entonces no hay
para ver si el puerto de destino es el 21.
santo que nos proteja.
Veamos qué ocurre si enviamos este paquete: Como vemos, el datagrama que resulta tras
terminar el reensamblado es totalmente
diferente del que pasó felizmente por las
defensas del firewall, ya que este nuevo
datagrama tiene como puerto de destino el
80, y no el 21.
En cualquier caso, si continuamos leyendo, script de iptables de 358 líneas, hace unos
encontraremos la que podría ser la solución años), aunque trataban el tema de los
universal para todos nuestros problemas. fragmentos, eran mucho menos restrictivas.
grandes rasgos en qué consiste el PMTUD máquina con la que queremos conectarnos.
(Path MTU Discovery). Una vez que la conocemos, serán los protocolos
de nivel superior los que se encarguen de
El PMTUD es un mecanismo relativamente dividir sus datos de forma conveniente, en
simple que permite encontrar el PMTU de lugar de dejar esa responsabilidad a la capa
una ruta entre dos máquinas. IP.
¿Y qué es el PMTU? Pues bueno, hasta el Pero, ¿es que los protocolos que están por
momento sabemos lo que es la MTU. La MTU encima de IP también dividen sus datos?
(Maximum Transmission Unit) es el tamaño
máximo de paquete que puede transportar ¡Pues claro! ¿Acaso pensáis que cuando
una red de una tecnología concreta (por queremos enviar un archivo de 650MBs (como
ejemplo, 1500 bytes para el caso de redes una ISO de un CD) lo que hace nuestra capa
Ethernet). TCP es enviar de golpe los 650MBs a la capa
IP para que ésta se apañe y los fragmente
El problema es que Internet es una red como pueda?
terriblemente heterogénea, donde conviven
todo tipo de tecnologías de red diferentes. Esta claro que la capa TCP también tiene sus
En el camino que puede haber entre dos limitaciones y no puede andar trasteando con
máquinas conectadas a Internet puede haber paquetes de cualquier tamaño. De hecho, algo
routers que interconecten tecnologías de lo sabemos acerca de esta limitación, pues ya
más variopintas. hablamos en este curso acerca de la opción
MSS (Maximum Segment Size) de la
Así, en el camino entre nuestro PC y un cabecera TCP. Precisamente en este campo
servidor web nos podemos encontrar MSS es donde se apoya el mecanismo de
fácilmente con que nuestros paquetes circulan PMTUD.
por redes Ethernet, PPPoE (tecnología utilizada
en ADSL), y muchas otras tecnologías Como ya vimos, la opción MSS se incluye sólo
diferentes. Cada una de las redes por las que en el primer paquete de una conexión
pase el paquete tendrá su propia MTU. TCP, es decir, en el paquete que lleva el flag
SYN. En el caso del cliente, será el paquete
Pero lo que a nosotros nos importa realmente inicial de la conexión, que llevará solo el flag
a la hora de enviar nuestro paquete, si no lo SYN, y en el caso del servidor será el segundo
queremos fragmentar, es cuál es LA MENOR paquete de la conexión (primero que envía el
de todas esas MTUs que nos encontraremos servidor), que es el que lleva los flags SYN y
por el camino (path, en inglés). A la menor ACK.
de las MTUs que hay en un camino (path)
entre dos máquinas, la denominamos Este primer paquete es la primera pista para
Path MTU, o PMTU. Si nuestros paquetes el mecanismo de PMTUD. Pero mejor vamos
no superan en tamaño a la PMTU, no habrá a ir viendo esto paso por paso con un ejemplo
ningún motivo por el que nuestros datagramas concreto.
tengan que ser fragmentados para llegar a
su destino. Tenemos 2 máquinas: cliente, y servidor.
Cliente establece una conexión TCP con
Entonces, ¡aquí tenemos la solución para Servidor, para lo cual tiene que enviar su
evitar la fragmentación! Nos basta con paquete TCP inicial (con el flag SYN, y la
encontrar de alguna manera cuál es la PMTU opción MSS). Este paquete circulará a través
de la ruta que hay entre nuestro PC y la otra de toda la ruta que une ambas máquinas.
En principio, éste podría ser el valor que daríamos al campo MSS, indicando
que TCP puede procesar paquetes de hasta 64KB. Pero, ¿qué utilidad
tendría esto si sabemos de antemano que otras capas inferiores no van
a poder con ese paquete? Vale, nosotros no sabemos cual es la PMTU,
es decir, no sabemos cómo de pequeños tendrán que ser los paquetes
para poder recorrer toda la ruta, pero lo que sí que sabemos es cuál es
NUESTRA MTU, es decir, el tamaño máximo de paquete para la red
a la que nosotros estamos conectados.
He aquí la necesidad de estas líneas que vimos antes:
Por tanto, lo más lógico es partir ya en principio de una primera
iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
aproximación a la PMTU, ya que sabemos de antemano que la
iptables -A FORWARD -p icmp --icmp-type destination-unreachable -j ACCEPT
PMTU nunca podrá ser mayor que nuestra propia MTU (ya que Ya que ante este mensaje ICMP, nuestra máquina tendrá que
la PMTU es la menor de todas las MTUs que haya en toda la ruta,
responder, sabiendo que de ahora en adelante los paquetes
incluida la nuestra, por supuesto).
tendrán que ser más pequeños para poder pasar al menos el
Pongámonos en el caso de que nuestra red sea una Ethernet, primer tramo del camino. Pero... ¿cómo de pequeños?
que tiene una MTU de 1500 bytes. ¿Debemos poner entonces
1500 en el campo MSS? ¡Pues no! ¡No tan rápido! Hay que tener Pues aquí es donde entra en juego un nuevo RFC, el RFC 1191
en cuenta que 1500 bytes es el tamaño máximo para un (http://www.ietf.org/rfc/rfc1191.txt) que, como vemos, tiene por
datagrama, es decir, para un paquete IP. título precisamente Path MTU Discovery.
Pero la opción MSS no se refiere a paquetes IP, si no a paquetes
TCP. Un paquete TCP es un paquete IP al cual le hemos quitado Por lo que vimos en el artículo sobre ICMP, éste es el formato
(o más bien, aún no le hemos añadido) la cabecera IP. Y el campo de un ensaje ICMP Destination Unreachable:
MSS se refiere al tamaño de los datos de un paquete TCP (es
decir, sin la cabecera TCP).
Lo que especifica este RFC es un pequeño añadido a este formato, El mensaje ICMP llegará hasta nosotros, donde reajustaremos de
que consiste en utilizar parte del campo UNUSED para incluir el nuevo el tamaño de nuestros datagramas, esta vez a 576 bytes,
y reenviaremos una vez más el paquete.
dato que nosotros necesitamos: la MTU de la red a la que hemos
intentado acceder.
al seguir i n s i s t i e n d o en enviar paquetes tan pequeños como ataque sin que nos suponga a nosotros ningún consumo de ancho
los que debíamos enviar antes en función de la PMTU antigua. de banda, enviando el mismo paquete, por ejemplo, una vez por
minuto.
Para estos casos, el RFC 1191 recomienda que cada cierto tiempo
se vuelva a intentar enviar paquetes grandes, a ver si cuela esta Los detalles de este ataque espero poder mostrarlos en el próximo
vez (sólo colará si la ruta ha cambiado sin que nos diéramos artículo, donde haré un compendio de técnicas que utilicen ip-
cuenta, claro). Como la probabilidad de que cambie la ruta no es spoofing, incluida ésta.
muy alta, no merece la pena estar reintentando paquetes grandes
cada dos por tres, ya que supondría estar constantemente Aún así, a pesar de este peligro potencial que se nos presenta al
reajustando el tamaño de nuestros datagramas. Por eso, el RFC utilizar el PMTUD, son muchas más las ventajas que los
recomienda hacer estos reintentos aproximadamente cada 10 inconvenientes, por lo que en principio parece una buena opción
minutos. añadir estas líneas a nuestras iptables:
Si vuestras mentes son tan retorcidas como las mías, habréis
# PMTUD
encontrado aquí una idea para un ataque DoS.
iptables -A INPUT -p tcp --fragment -j DROP
No he visto prácticamente nada documentado acerca de este tipo iptables -A FORWARD -p tcp --fragment -j DROP
de ataque. Únicamente he encontrado un documento que compendia iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
los ataques que explotan el protocolo ICMP, y comentaban como iptables -A FORWARD -p icmp --icmp-type destination-unreachable -j ACCEPT
curiosidad la posibilidad de este ataque, indicando que no ha En caso de que veamos que algo no funciona como debería,
sido probado. entonces tendríamos que revisar nuestras iptables y hacerlas
menos restrictivas, tal y como fuimos viendo en los puntos
En el próximo artículo os contaré mis resultados prácticos con este anteriores, donde comentábamos técnicas concretas para filtrar
experimento. cada tipo de ataque específico. De encontrar algún problema lo
encontraríamos en algún protocolo que utilizase grandes flujos
Pero bueno, ¡deja de enrollarte ya, y cuéntanos en qué consiste de datos, y que por algún motivo requiriese fragmentación
esa técnica DoS que te has inventado! obligatoriamente. Yo no utilizo NFS, pero por lo que he leído es
posible que por ejemplo con este protocolo sí que pudiesen surgir
Pues imaginad qué pasaría si se nos ocurriese suplantar a uno problemas al rechazar toda la fragmentación.
de los routers que hay en el camino entre dos máquinas. Hacemos
Resumiendo
un simple ip-spoofing para que la IP de origen de nuestro paquete
sea la del router, y enviamos a una de las dos máquinas (la que
Esta es la solución que propongo yo para implementar un firewall
queramos DoSear) un mensaje ICMP type 3 code 4 trucado a
con iptables protegido contra los ataques de fragmentación.
mano, en el cual le haremos creer que la PMTU ha cambiado a
un valor todo lo bajo que podamos indicarle.
Por supuesto, estoy abierto a todo tipo de mejoras, dudas, críticas, o
En teoría podríamos poner aquí un 0, por lo que se creería que comentarios de cualquier tipo:
no puede enviar ni un mísero byte, y no podría continuar enviando
ningún dato. En cambio, el RFC 1191 obliga a que el valor mínimo # Bloqueo de ataques con ICMP fragmentados
para este campo sea de 68 bytes. Ahora bien, una cosa es lo que iptables A INPUT p icmp --fragment j LOG --log-prefix ICMP Frag:
diga el RFC y otra lo que implementen los programadores de los iptables A INPUT p icmp --fragment j DROP
sistemas, así que habría que probar si realmente alguien ha hecho iptables A FORWARD p icmp --fragment j LOG --log-prefix ICMP Frag:
caso a esta recomendación del mínimo de 68 bytes. iptables A FORWARD p icmp --fragment j DROP
Dentro de ese plan entraba el dedicar un artículo a las iptables una vez que terminase de ex
plicar toda la teoría del protocolo IP y todos los que tiene por encima (TCP, UDP, e ICMP). Pero
claro, no contaba con que éste es un tema tan interesante, que la probabilidad de que alguien se
me adelantase era bastante alta.
Y con lo que tampoco contaba era que, para colmo, el curso de firewalls se desarrollase de una
forma tan magnífica y completa, así que desde aquí mis felicitaciones para Vic_Thor.
Dando vueltas al asunto llegué a la conclusión de que, si sabía aprovechar la situación, podría ser
una ventaja más que un obstáculo para mis planes. Podía aprovechar que Vic_Thor ya os dio toda
la base necesaria para comprender las iptables y, por tanto, podía ir directamente al meollo del
asunto sin tener que escribir tropecientas páginas explicando detalles de las iptables que, en reali
dad, se salen de la temática del curso de TCP/IP.
Por tanto, si consigo mis objetivos con este artículo, habremos conseguido una combinación perfec
ta: un curso de firewalls para explicar el funcionamiento de las iptables, y un curso de TCP/IP que
aprovecha esos conocimientos para aplicarlos a lo explicado en el curso.
Lo que no os puedo prometer es que este artículo sea complementario al curso de diseño de firewa
lls, ya que no puedo ir tachando todo lo que ya ha sido contado para contar sólo cosas nuevas, pues
el artículo quedaría totalmente inconexo y perdería toda su utilidad.
Así que podéis tomarlo de dos formas: para los que no seguisteis el curso de firewalls, será esta
vuestra segunda oportunidad para conocer este apasionante tema en profundidad, y para los que
sí lo seguisteis, tenéis aquí un nuevo punto de vista sobre el mismo tema.
Este nuevo punto de vista consistirá en ir repasando todo lo explicado a lo largo del curso de TCP/IP,
y también algunas cosas de la veterana serie RAW, y aplicando lo que vimos entonces al diseño de
un firewall completo, de arriba a abajo, que implemente protección para prácticamente todos los
ataques que he ido explicando durante casi 2 años (ya he perdido la cuenta de cuanto tiempo llevo
en la revista...).
30/68
Protección con iptables en una red corporativa
Pero antes de que llegase mi hermano apareció un tío con
una furgoneta y empezó a cargar todo lo rápido que podía,
Ya que de esto se encargó el curso de firewalls, no os voy a mientras yo iba sacando como podía cualquier cosa que en
ir presentando una serie de escenarios, empezando por el contrase aprovechable hasta que llegasen los refuerzos.
más sencillo para ir complicando cada vez más la cosa.
De aquella oportunidad única, aparte de varias broncas de
Directamente os voy a plantear un escenario complicado y mi madre y la novia de mi hermano, salió material para
terminamos antes, jeje. abastecer a varias personas (que si no se quién quiere un
teclado, que si este monitor cutre para no se cuantos...).
Os voy a plantear un escenario muy típico en cualquier
corporación, pero no tan típico en un ambiente doméstico. Resumiendo, que si realmente te lo curras, a pesar de que
Aún así, el montaje que tengo yo en mi propia casa es bas no tengas un duro, tu principal limitación a la hora de montar
tante parecido al que voy a plantear (aunque no exactamen una red de estas características ya no será la falta de equi
te igual, ya que tampoco me gusta revelar los detalles inter pos, si no, como en mi caso, la falta de espacio y (también
nos de mi red a todo el planeta), por lo que es perfectamente hay que tenerlo en cuenta) el incremento en la cuenta de
viable para un usuario normal que, más que dinero (ya que Iberdrola que supondrá tener todas esas máquinas encendi
de eso no me sobra precisamente), lo que tenga sean las su das 24 horas (eso sí, por lo menos lo que gastas en electrici
ficientes ganas. dad luego te lo puedes ahorrar en calefacción).
Hoy día es muy habitual tener 2 pcs: el pc viejo que utilizaste Pero bueno, ya estoy otra vez contando mi vida. Vamos a ver
hasta hace x años, y el pc relativamente nuevo que es el que en primer lugar con una imagen el escenario que estamos
utilizas normalmente. planteando:
31/68
Protección con iptables en una red corporativa
A esta red que une a Zeus y Cerbero la llamaremos Como podemos deducir por la imagen, la red Olimpo está
Olimpo. definida por las direcciones 192.168.1.0/24. La red
Hades por las direcciones 192.168.2.0/24, y la red Gaia
La tercera red está formada de momento por sólo dos má por las direcciones 192.168.3.0/24.
quinas: Cerbero, y un servidor web al que hemos llama
do Persefone. Esta red es, por supuesto, una DMZ, ya Por supuesto, la primera red, que es Internet, tiene sus
que aquí es donde se encuentran nuestros servidores. propias direcciones, entre las cuales se encuentra la
Cualquier otro servidor que quisiéramos poner (de correo, 80.15.13.100, que es la dirección IP de Zeus de cara a
de dns, etc) tendríamos que ubicarlo aquí. Internet (Zeus tendrá otra IP, que será la que tenga en la
red Olimpo).
A esta red, la DMZ, la llamaremos Hades.
Para quien no le haya quedado claro, la máscara de red
La cuarta y última red es nuestra red interna, y está for para las 3 redes, Olimpo, Hades, y Gaia, es
mada de momento por 3 máquinas: Cerbero, y dos PCs 255.255.255.0.
llamados Eolo y Poseidon.
También vemos en la imagen que Cerbero tiene 3 tarjetas
A esta red, la red interna, la llamaremos Gaia. de red: eth0, eth1, y eth2. La tarjeta eth0 es la que co
necta a Cerbero con la red Hades, la tarjeta eth1 conecta
¿Y a qué viene esta tontería de poner nombres a las má
a Cerbero con la red Olimpo, y la tarjeta eth2 conecta a
quinas y a las redes? El que pregunte esto probablemente
Cerbero con la red Gaia.
nunca habrá tenido que manejar redes con más de dos
máquinas. Cuando diseñas una red lo tienes que hacer Nos vamos a centrar únicamente en la configuración de la
siempre en previsión de que ésta pueda crecer y cambiar. m á q u i n a m á s i m p o r t a n t e d e l e s c e n a r i o, q u e s e r í a
Cerbero. A lo largo del artículo iremos recordando lo que
Con respecto al primer punto (el crecimiento de la red),
he ido explicando en la serie RAW y en el curso de TCP/IP,
sería absurdo llamar a las máquinas: SERVIDOR,
y aplicando estos conocimientos a la configuración de
FIREWALL, ROUTER, y PC. En cuanto añadiésemos otro
Cerbero. Os muestro aquí la configuración completa de
servidor, otro router, o cualquier otro elemento a la red,
IPTABLES de Cerbero, e iremos recorriendo esta
ya empezaría a haber ambigüedades que terminarían con
configuración a lo largo de todo el artículo:
tribuyendo al caos que ya es de por sí el mantener una red
corporativa. #! /bin/sh
32/68
Protección con iptables en una red corporativa
# HADES do
Persefone=192.168.2.2 echo 1 > $f
Cerbero_Hades=192.168.2.1 done
#################################### ############
# BORRAMOS LA CONFIGURACION ACTUAL DE IPTABLES # TABLA NAT
#################################### ############
33/68
Protección con iptables en una red corporativa
iptables -t nat -A PREROUTING \ iptables -A flags_tcp -p tcp --tcp-flags ALL FIN,URG,PSH \
-p tcp --dport 4662 -i $olimpo -j DNAT --to $Poseidon -m limit --limit 5/minute -j LOG --log-prefix "NMAP-XMAS SCAN: "
iptables -A flags_tcp -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
# ENMASCARAMIENTO HACIA EL EXTERIOR
# RECHAZAMOS Y LOGEAMOS ESCANEO SYN/RST
# ENMASCARAMIENTO PARA LA RED HADES iptables -A flags_tcp -p tcp --tcp-flags SYN,RST SYN,RST \
iptables -t nat -A POSTROUTING \ -m limit --limit 5/minute -j LOG --log-prefix "SYN/RST SCAN: "
-s 192.168.2.1/24 -o $olimpo -j SNAT --to $Cerbero_Olimpo iptables -A flags_tcp -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
34/68
Protección con iptables en una red corporativa
# CADENA DE REGLAS DE HADES A GAIA # PERMITIMOS DNS
################################### iptables -A olimpo_gaia -s $ServidorDNS \
# DMZ -> INTERNA -p udp --sport domain -j ACCEPT
35/68
Protección con iptables en una red corporativa
# RECHAZAMOS Y LOGEAMOS TODO! Poseidon:
iptables -A gaia_cerbero -j LOG --log-prefix "GAIA->CERBERO: "
iptables -A gaia_cerbero -j DROP Tiene acceso total hacia Internet, pero muy restringi
do desde Internet.
#########################################
# REGLAS PARA EL PROPIO CERBERO (OUTPUT) El usuario de Poseidon utiliza emule.
#########################################
Tiene abiertos 6 puertos para DCC, ya que el usuario
# PERMITIMOS LA SALIDA DE CONSULTAS DNS de Poseidon quiere también utilizar IRC.
iptables -A OUTPUT -o $olimpo -d $ServidorDNS \
Responde a un conjunto mínimo de mensajes ICMP.
-p udp --dport domain -j ACCEPT
Zeus:
# RECHAZAMOS Y LOGEAMOS EL RESTO DEL TRAFICO
iptables -A OUTPUT -j LOG --log-prefix "OUTPUT: " Es un router ADSL que hace NAT a todos los puertos que
iptables -A OUTPUT -j DROP utilizarán todas las redes, para que los gestione Cerbero.
Por tanto, la tabla NAT de Zeus será parecida a esta:
#########################
# NOS PONEMOS EN MARCHA!
#########################
iptables -D INPUT 1
iptables -D FORWARD 1
iptables -D OUTPUT 1
;;
*)
echo "Uso: $0 {start|stop|restart|status}"
exit 1
;;
esac
Responde a un conjunto mínimo de mensajes ICMP. Ahora que ya hemos visto a grandes rasgos el escenario,
vamos a ir analizando paso a paso todas las líneas de es
Cerbero:
tas iptables.
Su única comunicación con cualquier red son las consultas
al servidor DNS, y respuesta a un conjunto mínimo de
mensajes ICMP.
En esta primera sección del archivo de configuración de ip
Eolo: tables vemos una serie de definiciones que nos serán útiles
para todo el script.
Tiene acceso total hacia Internet, pero muy restringi
do desde Internet. Podemos comprobar que algunos de los valores definidos
no son usados luego en el script. Aún así, conviene definir
Tiene acceso a Persefone como cliente ssh, para ad los también, pues definimos así todo el contexto, y nos
ministrar remotamente el servidor web. permitirá hacer cualquier modificación o ampliación en el
futuro sin tener que preocuparnos de si teníamos definido
Tiene abiertos 6 puertos para DCC, ya que el usuario
o no tal elemento que hasta el momento no habíamos uti
de Eolo quiere utilizar IRC.
lizado.
Responde a un conjunto mínimo de mensajes ICMP.
36/68
Protección con iptables en una red corporativa
La primera línea: Las opciones que damos a nuestro comando de iptables
son (suponiendo que el script se llama iptpyc):
ServidorDNS=193.15.25.1
./iptpyc stop : Borra toda la configuración de ipta
Indica la dirección IP del servidor DNS que utilizamos (pro
bles.
bablemente el que nos haya dado nuestro ISP).
Normalmente, esta dirección IP, así como probablemente ./iptpyc start : Configura las iptables con todas las
también las del resto de máquinas a las que nos referimos reglas que hemos incluido en el script.
en el script, se encontrarán ya en la configuración del sis
tema. ./iptpyc restart : Hace un stop y un start, reinician
do así toda la configuración de iptables.
Concretamente, los servidores DNS los tendremos en
/etc/resolv.conf, y el resto de máquinas en /etc/hosts. ./iptpyc status : Muestra la configuración actual de
iptables.
Depende de la decisión de cada administrador el incluir
aquí o no todas estas variables. Si no las incluimos el Para implementar estos comandos hacemos un CASE sobre
script puede ser menos legible, al no tener en el propio el parametro $1. En un script de shell el parámetro $0 es
script toda la información necesaria para ser interpretado. siempre el propio nombre del parámetro (en este caso ip
Como contrapartida, si las incluimos en el script tenemos tpyc), y el parámetro $1 es el primer parámetro que hay
el problema potencial de que en algún momento pueda ha justo detrás del nombre del script.
ber incoherencia entre la información almacenada en
/etc/hosts y el script de iptables. Un CASE es una sentencia condicional que, a la diferencia
de un IF THEN ELSE, que sólo permite seleccionar una
Yo personalmente prefiero incluir las definiciones en el pro opción u otra según dos posibles condiciones sobre la va
pio script de iptables, a pesar de que estén ya definidas riable de entrada (SI cumple, y NO cumple), el CASE nos
todas las máquinas en el sistema. permite seleccionar tantas condiciones como queramos.
Para los que prefiráis no incluir las definiciones, simple En este caso nuestro CASE considera las condiciones de
mente tenéis que eliminar el símbolo $ que precede a los que $1 sea stop, start, restart, status, o cualquier
nombres de máquinas en todo el script. Por ejemplo, la lí otra cosa que no sea ninguna de las anteriores. Es decir,
nea: tenemos 5 condiciones sobre la variable $1, por lo que la
estructura básica de nuestro CASE es la siguiente:
iptables -A olimpo_hades -s $ServidorDNS \
case $1 in
-p udp --sport domain -j ACCEPT
restart)
** acciones para la opción restart **
Quedaría:
;;
iptables -A olimpo_hades -s ServidorDNS \ stop)
** acciones para la opción stop **
-p udp --sport domain -j ACCEPT ;;
status)
Como vemos, también incluyo definiciones para las 3 tar
** acciones para la opción status **
jetas de red: eth0, eth1, y eth2. Esto es fundamental, ya
;;
que la mejor forma de asegurarnos de por dónde están cir
start)
culando los paquetes es utilizar como referencia el propio
** acciones para la opción start **
dispositivo físico, es decir, la tarjeta de red. Si utilizásemos
;;
direcciones IP como referencia para identificar cada red,
*)
podríamos ser engañados por algún tipo de spoofing (aun
** acciones para cualquier otro valor **
que tengamos protección contra IP-spoofing, como ya ve
;;
remos).
esac
37/68
Protección con iptables en una red corporativa
STOP) En realidad, el sitio adecuado para incluir cualquier módulo
sería el archivo /etc/modules, pero nosotros lo hemos
Esta opción vacía toda la configuración de iptables, tanto incluido en el script de iptables, para que tengamos todo
si fue previamente ejecutado nuestro script (con start), co junto, y así tener una visión más global.
mo si no.
Por cierto, que ya que hablo de visión global, no estaría de
STATUS) más que os mostrase aquí también el resto de
configuración básica de Cerbero:
Tan sencillo como llamar a la opción --list del comando ip
tables. hostname Cerbero
Ahora os pido que bajéis hasta el final del script para ver ifconfig eth1 192.168.1.1 netmask 255.255.255.0
esta opción, ya que tiene que ser incluida después de to
das las demás. ifconfig eth2 192.168.3.1 netmask 255.255.255.0
Como vemos, si se introduce cualquier opción que no sea route add default gw Zeus
una de las que reconoce nuestro script, mostraremos el tí
pico mensaje que indica al usuario las opciones disponi Con los comandos ifconfig estamos configurando las 3
bles. tarjetas de red, asignando una IP y una máscara de red a
cada una. Con el comando route estamos definiendo la ru
START) ta por defecto hacia Zeus (lo que Windows llama puerta
de enlace predeterminada).
Todo el resto del artículo está dedicado a la opción de Pero, volviendo a nuestro script, vamos a ver más sobre
start, así que aquí viene la chicha. el módulo que estamos cargando en Cerbero.
38/68
Protección con iptables en una red corporativa
Si al instalar nuestra distribución de Linux escogimos ins Al soportar ambos comandos también el protocolo ipv4, la
talar también los paquetes de sources (código fuente), idea es que vayan siendo implementados por todos los ser
tendremos el código del módulo ip_conntrack_ftp.c en el vidores y clientes FTP, para ir preparándonos para un futu
directorio /usr/src/linux/net/ipv4/netfilter/. Por si ro que está siendo ya implantado.
no instalasteis los fuentes, podéis ver igualmente el código
f u e n t e d e e s t e m ó d u l o e n # Habilitamos el forward de paquetes
http://joshua.raleigh.nc.us/docs/linux-
echo 1 > /proc/sys/net/ipv4/ip_forward
2.4.10_html/577570.html.
Las principales responsabilidades de Cerbero serán dos:
Podemos ver en el fuente cómo analiza los paquetes en
servir de cortafuegos para todas las redes, y encaminar y
busca de PORT o 227, que correspondería respectiva
reenviar todos los paquetes de una red a otra. Para que
mente a los comandos PORT y PASV (ya que 227 es el
pueda hacer esta segunda función, tenemos que activar el
código de respuesta de PASV). También analiza los co
forward de paquetes, lo cual hacemos escribiendo un sim
mandos EPRT (Extender PoRT) y EPSV (Extended
ple 1 en el archivo /proc/sys/net/ipv4/ip_forward.
PaSsiVe), que no vimos en la serie RAW.
Probad desde una shell de root a escribir estos dos coman
Los comandos EPRT y EPSV fueron propuestos en el RFC
dos:
2428, para facilitar la futura sustitución del actual proto
colo ipv4 por el nuevo ipv6 (del que ya hablaremos a lo echo 1 > /proc/sys/net/ipv4/ip_forward
largo del curso).
cat /proc/sys/net/ipv4/ip_forward
Las direcciones IP de ipv6 son diferentes a las de ipv4, por
lo que los actuales comandos PORT y PASV no podrían ser Como veis, lo único que se hace es escribir un 1 en el ar
directamente portados a ipv6, al utilizar las clásicas direc chivo ip_forward, como si fuese un simple archivo de
ciones de 32 bits. texto.
Los comandos EPRT y EPSV tienen la misma funcionalidad # Habilitamos proteccion anti-spoofing
que sus predecesores, pero añaden además la posibilidad
for f in /proc/sys/net/ipv4/conf/*/rp_filter
de utilizar direcciones ipv6.
do
Analicemos, por ejemplo, el comando EPRT. Para conse
guir lo que he mencionado, este comando tiene 3 paráme echo 1 > $f
tros:
done
EPRT |protocolo|direcciónIP|puerto|
Todavía nos falta hablar más sobre ip-spoofing en este
El primer parámetro, protocolo, puede valer 1 ó 2. En el curso, pero de momento ya sabemos bastante bien en qué
caso de que sea 1, indicamos que se trata del protocolo consiste esta técnica tan versátil, que se suele usar en
ipv4 y, por tanto, igual al clásico PORT que ya conoce combinación con gran cantidad de ataques.
mos. Si es un 2, se tratará del protocolo ipv6 y, por tanto,
el siguiente parámetro (direcciónIP) vendrá en el formato Este bucle recorre varios directorios, cada uno correspon
de direcciones IP v6. diente a un dispositivo de red (eth0, eth1, eth2, y lo, bási
camente). En cada uno de estos directorios tendremos una
El segundo parámetro, direcciónIP, en el caso de que el serie de opciones de configuración para el correspondiente
anterior parámetro sea 1 (ipv4) será simplemente una dispositivo (es decir, una configuración independiente para
dirección IP de las de toda la vida, pero con la diferencia cada tarjeta de red). En este caso, nosotros activaremos
(con respecto al comando PORT) de que los dígitos no ven una opción que tenemos en el archivo rp_filter. Si escri
drán separados por comas, si no por puntos. bimos un 1 en este archivo, impedimos que el dispositivo
acepte direcciones IP que no pertenezcan a su red.
El tercer y último parámetro, puerto, tendrá también una
diferencia con respecto al comando PORT, y es que no ha Esta es una sencilla protección contra ip-spoofing, aunque
brá que hacer cálculos para hallar el número de puerto, si no nos protege contra otras técnicas, como el source-route
no que éste vendrá especificado tal cual. spoofing.
Es decir, aquí tenemos un ejemplo de comando EPRT que Cuando hablemos más en profundidad sobre ip-spoofing
haría la misma función que un comando PORT mostraremos esto con más detalle.
80,15,13,100,10,15:
# Habilitamos proteccion anti-smurf
EPRT |1|80.15.13.100|2575|
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
Ya que, como sabemos, el puerto 10,15 del comando
PORT se traduciría en: 10*256 + 15 = 2575. Esto ya lo vimos en el artículo sobre fragmentación.
Escribiendo un 1 en este archivo estamos anulando la res
39/68
Protección con iptables en una red corporativa
puesta a pings a la dirección broadcast, lo cual impide Durante el segundo en que estemos cargando las iptables,
que nos convirtamos en un amplificador para un ataque nuestra red no funcionará, ya que estaremos rechazando
smurf. todos los paquetes.
echo 1 > /proc/sys/net/ipv4/conf/all/log_martians Como vemos, para identificar el tráfico local no hemos uti
lizado la opción -s 127.0.0.1, que sería como decir: tráfi
Bueno... en realidad el proyecto SETI no tiene mucho que
co que tenga como IP de origen la dirección de loopback.
ver con todo esto, pero no he podido resistirme a poner
Aunque tengamos protecciones contra ip-spoofing, sería
alguna chorrada en este artículo (es que si no, no me que
una temeridad absurda hacer esto, pudiendo directamente
do a gusto).
reconocer la fuente por el DISPOSITIVO, y no por la
Esta opción lo que hace es logear cualquier paquete que dirección IP, que es mucho más fácil de ser suplantada. Por
tenga como dirección IP de origen o destino una dirección tanto, en lugar de -s 127.0.0.1 utilizaremos: -i lo.
imposible. Esto también incluye las direcciones IP spo
ofeadas, ya que una dirección que no pertenece a la red
en la que estamos es en realidad una dirección imposible. Empezamos ya con las reglas. Todo lo que hay a partir de
aquí podría ser modificado según fuese cambiando nuestro
escenario.
Mientras el script se esta cargando hemos de asumir que Los paquetes a los puertos 5000 a 5005 para que
estamos totalmente desprotegidos por lo que, antes de to Eolo pueda tener DCC.
car nada, tenemos que asegurarnos de que se cierran to
das las puertas, y no las abriremos hasta que no hayamos Los paquetes a los puertos 5010 a 5015 para el DCC
terminado de configurar todo. de Poseidon.
Para ello, insertamos una regla en la primera posición de Los paquetes al puerto 4662 para el emule de
cada cadena (INPUT, OUTPUT, y FORWARD), que directa Poseidon.
mente rechace todos los paquetes.
40/68
Protección con iptables en una red corporativa
Una vez que ya se han establecido los caminos para cada permitimos los mensajes Time Exceeded para que funcio
paquete, luego tendremos que analizar la cadena ne el traceroute.
FORWARD, para ver cómo se trata independientemente
cada uno. El resto de mensajes ICMP pueden ser prescindibles, y
cualquier otro mensaje ICMP que se reciba o se envíe será
Por último, tenemos aquí las reglas de enmascaramien logeado, y podremos encontrarlo fácilmente en el log bus
to, las cuales son imprescindibles para que el router adsl cando la cadena ICMP, ya que hemos incluido ese pre
(Zeus) permita el tráfico de todas las máquinas que hay fijo para el log.
detrás de Cerbero. Con estas reglas, cualquier paquete
que tenga como IP de origen alguna que pertenezca a las
redes Hades o Gaia, su IP de origen se convertirá en la
única que Zeus conoce, que es la IP de Cerbero en la
red Olimpo (192.168.1.1). Como ya explicó Vic_Thor, hay que mantener las conexio
nes ya establecidas, y rechazar las inválidas (paquetes con
Por si alguien se lía con el símbolo \, sirve simplemente
algún parámetro que no se corresponda con ninguna
para cortar una línea y poder continuarla en la línea si
conexión establecida).
guiente (como el guión que usamos en castellano para
cortar las palabras). Por tanto, los paquetes TCP serán analizados sólo si son
para establecer una nueva conexión (flag SYN), pero una
vez que la conexión ya ha sido aceptada, el resto de pa
¿Qué más me queda por decir sobre las reglas de ICMP en quetes de la misma circularán libremente a través de
iptables después de todo lo que conté ya en artículos ante nuestras iptables.
riores?
Por ejemplo, el PING podría permitirse desde Hades y Gaia Con esta serie de reglas estamos rechazando todos los pa
hacia Cerbero, para que las máquinas de estas redes pu quetes que tienen los flags que se sabe que son utilizados
diesen comprobar que el firewall/router está vivo. Pero no para este tipo de escaneos, y por otra parte estamos lo
habría motivo para permitir un PING desde la red Olimpo, geando el escaneo. Como un escaneo completo suelen ser
ya que no tenemos por qué dar ninguna información al ex 65535 paquetes (uno por cada puerto TCP), sería una lo
terior, donde están todos esos hackers malos. cura almacenar todo esto en el log. Por eso limitamos a
que sólo guarde registro de 5 de estos paquetes por minu
Como las consecuencias de esto son mínimas, he preferido
to. Con eso tenemos suficiente para detectar el intento de
ahorrar trabajo y crear unas reglas genéricas de ICMP, pe
escaneo, pero sin saturar nuestros logs.
ro insisto en que, si queréis perfeccionar vuestro firewall,
tendríais que definir reglas independientes para cada posi
ble camino. También insisto en que las iptables que tengo
yo no son estas, por lo que el hecho de que me haya aho
rrado trabajo en las iptables de este artículo, no significa
Las tres cadenas anteriores, reglas_icmp, keep_state, y
que lo haya hecho en las mías.
flags_tcp, sólo quedaron definidas, pero no se especificó
Os propongo como ejercicio que modifiquéis estas iptables en ningún momento sobre qué paquetes debían ser aplica
para que haya reglas independientes de ICMP para cada das.
cadena. En esta sección de nuestro script indicamos que estas 3
cadenas han de ser aplicadas en todos los sentidos:
Aparte de los ping y pong también tenemos los clicks de
INPUT, OUTPUT, y FORWARD.
playmobil, esto.... quiero decir.... que aparte de los ping y
los pong también permitimos los mensajes Destination Si quisiésemos aplicar reglas diferentes de icmp para cada
Unreachable, para que funcione el mecanismo de camino, tendríamos que eliminar estas reglas, ya que pre
PMTUD que ya hemos visto a lo largo del curso. También valecerían sobre las que pusiésemos después.
41/68
Protección con iptables en una red corporativa
También es posible que quisiéramos aplicar reglas diferen
tes para los flags TCP, permitiendo así por ejemplo que no
sotros podamos hacer NMAP al exterior, pero que no nos
lo puedan hacer a nosotros desde el exterior. Si bien Gaia puede acceder a los servicios de Hades, Hades
de ninguna manera puede acceder a Gaia.
En cambio, las reglas de keep_state si que las necesitare
Precisamente aquí es donde se encuentra la esencia de las
mos siempre para cualquier camino.
redes con DMZ. Una DMZ es básicamente una zona sus
Propongo como ejercicio también que modifiquéis esta ceptible de ser hackeada. Si un hacker lograse hacerse con
sección a vuestro gusto. el control absoluto de la red DMZ, estaríamos perdidos si
hubiese algún acceso desde ésta hacia la red interna. Ya
se nos pueden colar todos los hackers que quieran en
nuestros servidores (Hades), que desde ellos no lograrán
llegar a nuestra red interna (Gaia), a no ser que consigan
además hackear nuestro firewall (Cerbero).
En nuestro escenario tenemos 3 redes: Gaia, Hades, y
Olimpo. Por tanto, habrá 6 posibles caminos entre estas ¿Cómo puede entonces funcionar la comunicación de Gaia
redes: hacia Hades si todo el tráfico de Hades hacia Gaia está ce
rrado? ¿No tendríamos que permitir al menos las respues
De Gaia a Hades
tas que tenga que enviar Hades a Gaia cuando por ejemplo
De Gaia a Olimpo Eolo se conecta por SSH a Persefone?
De Hades a Gaia Pues claro que sí, pero esta situación ya la tenemos con
De Hades a Olimpo templada en la cadena keep_state. Es Eolo quien envía
el paquete SYN que establece la conexión entre Eolo y
De Olimpo a Gaia Persefone. Una vez establecida la conexión, nuestra cade
De Olimpo a Hades na keep_state prevalecerá sobre la regla que tenemos
aquí:
A partir de esta sección, vamos detallando las reglas que iptables -A hades_gaia -j DROP
tendrá que seguir cada uno de estos 6 caminos. El primero
de estos, De Gaia a Hades, es el que describimos aquí. ¿Y por qué prevalece? Pues lógicamente, porque la inser
tamos antes, concretamente en este punto:
Como sabemos, Gaia es la red interna, y Hades la red
DMZ. iptables -A FORWARD -p tcp -j keep_state
Típicamente, en una configuración con DMZ, la red interna Normalmente, si vemos en el log alguna línea con el prefi
puede tener acceso a la DMZ para poder utilizar los mis jo HADES->GAIA: , que es el que hemos puesto para
mos servicios que la DMZ está dando al exterior (es decir, este camino, tendremos que estar alertas porque es una
a Internet o, en nuestro escenario, la red Olimpo, que es posible señal de que hemos sido atacados a través de la
la intermediaria directa con Internet). DMZ.
42/68
Protección con iptables en una red corporativa
En una configuración totalmente paranoica, esto sería im
pensable. Pero como estamos considerando una
configuración más bien doméstica, es normal que los usua
rios de la red interna utilicen ciertos servicios como IRC,
Aquí es donde se encuentra reflejada la funcionalidad de
redes P2P, ...
la red DMZ.
Así que en primer lugar, por supuesto, tenemos que dejar
En primer lugar, para cualquier camino que venga desde
que pasen las respuestas a nuestras consultas DNS,
Olimpo tenemos que permitir los paquetes que tienen co
tal y como vimos antes.
mo IP de origen la de nuestro servidor DNS (o servido
res, si tenemos configurado más de uno), como protocolo Ahora tenemos que recordar el artículo sobre DCC de la
UDP, y como puerto de origen el 53 (el puerto de DNS, serie RAW. Cuánto tiempo hace de aquello ya, ¿verdad?
llamado con el alias domain).
En nuestro caso, hemos abierto 6 puertos de DCC para ca
Por supuesto, igual que tenemos que dejar entrar las res da máquina de la red interna. Tanto Eolo como Poseidon
puestas a nuestras consultas DNS, también tenemos que tendrán que configurar sus clientes de IRC (mIRC, xchat,
dejar salir nuestras consultas. Esto sería responsabilidad o el que sea...) para que el DCC vaya sólo a través de los
de los caminos que van hacia Olimpo, y no los que vie 6 puertos que tienen asignados.
nen desde Olimpo, como este. Por ejemplo, el camino an
terior, hades_olimpo, iba hacia Olimpo, pero al permitir Aparte de esto, sólo nos queda el Emule de Poseidon, que
todo el tráfico, implícitamente estamos permitiendo tam necesitará tener abierto el puerto 4662 de TCP para fun
bién las consultas DNS. cionar correctamente.
Aparte del DNS, tenemos que permitir la entrada de co Por supuesto, todo lo demás tendrá que ser rechazado.
nexiones hacia los puertos de ftp y web. El puerto de ssh, Aunque en realidad será difícil que nos lleguen paquetes
por supuesto, no estará abierto hacia la red Olimpo, ya que no encajen aquí, ya que previamente la tabla NAT se
que sólo Eolo (que pertenece a la red Gaia) puede admi encargó de redireccionar hacia Gaia sólo los puertos que
nistrar remotamente a Persefone. ya hemos tratado.
Aquí de nuevo estamos permitiendo que los usuarios de la Aquí creamos 3 nuevas cadenas de reglas, que se aplica
red interna tengan acceso de salida total hacia Internet. rán a cualquier paquete que tenga como IP de destino la
del propio Cerbero: una cadena para los paquetes que
También os dejo como ejercicio que limitéis este acceso, provienen de la red Olimpo, otra para los de la red Gaia,
si queréis, aunque en general en una red doméstica lo más y otra para los de la red Hades.
conveniente será dejarlo abierto, para que podamos mo
vernos a nuestras anchas por Internet desde nuestro PC. En el caso de la red Olimpo, sólo permitimos que nos trai
ga de vuelta la respuesta a las consultas DNS que poda
En cambio, en una red corporativa, podría ser interesante mos hacer desde el propio Cerbero. En realidad, hasta esto
limitar el acceso de los empleados, para que por ejemplo podríamos quitarlo, ya que normalmente nunca nos senta
no puedan conectarse a chats, o a otros servicios no de remos a los mandos de Cerbero para hacer nada, por lo
seados. que no hay motivo para necesitar hacer consultas DNS.
En cualquier caso, la mejor forma de limitar este acceso al En el caso de Hades, no permitimos ningún trafico hacia
exterior no serían las iptables, si no un proxy, como por Cerbero, faltaría más... Si hemos dicho que la DMZ (Ha
ejemplo el famoso Squid que, entre otras cosas, nos per des) es la red potencialmente más vulnerable, de ninguna
mitirá por ejemplo limitar qué paginas web pueden ver los manera podemos permitir ningún tipo de acceso desde es
empleados, y cuáles no (evitamos así una de las mayores ta red hacia el corazón de nuestro sistema de seguridad,
pérdidas de tiempo de los empleados, que es la pornogra que es Cerbero.
fía).
Si vemos en los logs alguna línea que empiece por el pre
fijo que hemos puesto para este camino,
"HADES ->CERBERO: ", entonces sí que nos podemos
mosquear, porque es probable que alguien haya entrado
en la red DMZ, y esté intentando penetrar en el firewall a
través de ahí.
Nuestra configuración no es muy purista que digamos.
¡Puertos abiertos en la red interna! Bastante buenos estamos siendo ya permitiendo que des
de la DMZ se pueda hacer ping al firewall (por la cadena
43/68
Protección con iptables en una red corporativa
44/68