|
Para esta ocacion les traemos una platica que se expuso en uno de
los eventos organizados para la difusion del S.L.
------------------------------------------------------------------------------------------------------------------
>> UN HOST BAJO LA MIRA <<
RTM Security Group || www.zonartm.org
//vendetta || vendetta@zonartm.org
Licencia: Creative Commons 2.5
Este texto fue echo a partir de una platica que me invitarón a dar en el
Congreso de Software Libre de la Frontera Sur 2006 que se celebró en la Ciudad de
Chetumal en el mes de Abril.
Se trata sobre el escaneo de puertos, y para que entiendan que es lo que pasa
pues he tratado algunos aspectos como concepto de puerto, protocolo, como se hace
una conexión, etc.
Y bueno, el proposito de esto es para que la información se extienda un poco
mas de lo que pude dar en la conferencia y los que no tuvierón oportunidad de ir
a este congreso puedan no solo ver las diapositivas si no entenderlas.
Vale, empezemos!
¿QUE ES UN HOST?
Host traducido al español es "Anfitrión" y si nosotros hacemos memoria ese es
el nombre que le dan a los que organizan una fiesta o cosa similiar, ellos son
los anfitriones.
Actualmente las computadoras andan enredadas todas con todas, ya sea con las
de su vecindario (redes locales) o hasta con las Brasileñas por algo que se llama
Internet. Cada que una se conecta a la otra, la que recibe la conexión será el
anfitrion para la que se le ha conectado. Entonces y para no meternos en mucho
detalle técnico, diremos que un host es cualquier computadora que esta conectada
a una red.
Ahora, ¿por que llamarle host?, bueno, simplemente por que para conquistar
mujeres hay que vernos refinados y si usamos palabras raras como "host" pensaran
que somos muy cultos ;)
¿QUE ES UN SOCKET?
Bueno, ahora ya hablamos de computadoras conectadas a redes, pero en esas
conexiones hay mucho que aprender, y empezaremos con un termino medio raro, el
socket.
Pues el socket recibe los datos de la Pc y esta los manda a un puerto. Para
mejor compresion un diseño.
__________________________________________________________ |_host_| (socket)---> puerto <-------- RED --------> puerto
<-----(socket) |_host_|
¿QUE ES UN PUERTO?
Los puertos, son enlaces de comunicacion para manejar la informacion, estan
númerados y bien definidos, hay 65535 y mas o menos estan dividos en dos grupos.
Uno de ellos es el grupo de puertos estandares y de sistema que son del 0 al
1024. La caracteristica de estos puertos es que normalmente en ese rango sera
donde encontraremos los servicio comunes de las redes como FTP, SSH, telnet, etc
y los servicios del sistema en el que estamos. El otro grupo es... eh!... pues
esos puertos se usan para lo que quieran, de echo los servicios comunes se pueden
hacer correr sobre esos puertos, por ejemplo, el puerto estandar de FTP es 21,
pero si yo quiero correrlo en el 1025 es valido, y lo mas seguro es que no tenga
ningún problema, pero si el IRC que usualmente se maneja en el puerto 6667 y lo
coloco en el 21, pues es valido también, sin embargo aqui es muy probable que
tenga problemas pues todo mundo toma al 21 como puerto de FTP.
¿QUE ES UN PROTOCOLO? conjunto de reglas que controlan la secuencia de
mensajes que ocurren durante una comunicación entre entidades que forman una red
. En este contexto, las entidades de las cuales se habla son programas de pcs
o automatismos de otro tipo, tales y como dispositivos capaces de interactuar
en una red.
¿QUE ES TCP/IP?
Como mencione antes, existen sus diferencias en la forma en que cada quien se
comunica para decir lo mismo. Pues en el caso de las computadoras esto también
pasa. La forma mas usada de comunicación entre las computadoras es mediante
TCP/IP.
TCP/IP es un conjunto de protocolos orientados a la comunicación de las
computadoras en una red. Ademas TCP/IP es el protocolo que soporta a
Internet.
TCP/IP es compuesto por muchosprotocolos, para el objeto del escaneo de
puertos no necesitamos conocer todos (que son muchos), asi que me centrare en
describir los tres que usaremos aqui: TCP, UDP e ICMP.
TCP (TRANSMISSION CONTROL PROTOCOL / PROTOCOLO DE CONTROL DE
TRANSMICIÓN)
Este se encarga de ver que toda la conexión funcione como debe, asegurando el
correcto envio de datos, el transporte de los paquetes entre las capas de una
conexion, verifica si hay errores, y se encarga de enumerar y unir los fragmentos
de nuestros paquetes. 
Como ven en el diagrama anterior
hay muchas cosas interesantes, en su mayoria todas por intuicion se puede saber
que hacen, pero las que son muy importantes son las letras verticales
que estan en el centro, a estas se les llama TCP Flags y estas hay que revizarlas
a mayor detalle, por que estas son indicadores de los paquetes TCP.
URG (Urgent): en TCP podemos manejar datos urgentes y normales, con URG
podemos indicar en donde inician los datos urgentes y donde los
normales.
ACK (Acknowledgement): ACK sirve para confirmar la recepción de un
paquete.
PSH (Push): indica cuando se debe de vaciar el buffer.
RST (Reset): indica algún problema en la conexión y que esta debe de
reiniciar.
SYN (Synchronization): marca el intento de inicio de nuevas
conexiones.
FIN (Finalization): Indica al host remoto que queremos cerrar la conexion y
espera confirmacion de este.
UDP (USER DATAGRAM PROTOCOL / PROTOCOLO DE DATAGRAMA DE USUARIO)
UDP a diferencia de TCP que espera respuestas y cosas similares del host
remoto, no esta orientado a conexión, esto quiere decir que a UDP le vale que el
de haya le llego bien las cosas o no, el ya lo mando y no le importa lo demas.
Ustedes pensaran que esto es inutil pues asi podriamos asegurar un correcto
funcionamiento de las conexiones, pero en la realidad es muy util pues no todo
necesita respuesta. Un ejemplo muy sencillo es el video en demanda, alli se
necesitan enviar datos continuos y rapidos, el echo de por cada paquete enviado
recibir respuesta haria todo muy lento, asi que seria
inaplicable.
 Como ven este si es muy intuitivo, asi que no me dentendre
mas.
ICMP (INTERNET CONTROL MESSAGE PROTOCOL /PROTOCOLO DE CONTROL DE MENSAJES DE
INTERNET)
Es el atalaya de las conexiones, este protocolo nos reportara todo lo que
pase en una conexion. Si se fijan en
el diagrama hay una parte que dice "Campo especial de datos", alli es donde va
el feeling de este protocolo, por de acuerdo a lo que este alli sera el tipo de
mensaje que nos esta dando el paquete. Pero bueno, ahora los describo cada
uno.
-> ICMP: TIME EXCEEDED MESSAGE
Osea algo en la conexión ya se tardo mas de lo que pensabamos esperarlo. -> ICMP: PARAMETER PROBLEM
MESSAGE Notese que hay un campo que dice
puntero, pues ese nos indicara en donde se produjo el error.
-> ICMP: SOURCE QUENCH MESSAGE ->
ICMP: REDIRECT MESSAGE
Este mensaje nos dice que por alguna razón (que se especificara en el campo
código) hay que redirgir, las causas son por el host, por la red, por el tipo de
servicios del host o por los de la red.
-> ICMP: ECHO REPLY MESSAGE
Pues un eco desde el origen. -> ICMP:
TIMESTAMP REPLY MESSAGE
Este es un mensaje de solicitud de marca de tiempo o de respuesta de marca de
tiempo. -> ICMP: INFORMATION REQUEST
Mensaje para solicitar mas información.
Ahora pararemos a ver como es que todas esas cosas de arriba hacen que el mundo
siga funcionando.
¿COMO SE LLEVA ACABO UNA CONEXION? (THREE WAY HANDSHAKE)
Bueno, pues para que entiendan como se lleva a cabo una conexión les póngo
primero este diagrama, chequen las letras que aparecen, eso ya lo explique
antes.
|_host A_|-------- SYN --------> |_host B_| |_host A_|<----- SYN/ACK
------- |_host B_| |_host A_|-------- ACK --------> |_host B_| Ahora, que esta pasando alli ?
A: Oye! quiero conectarme contigo te mando mi petición (SYN) B: Vale acepto
(ACK) también te mando la mia (SYN) A: ok! (ACK)
Espero que con eso lo hayan entendido, pues si las computadoras hablaran
eso es lo que dirian xD
¿COMO FINALIZA UNA CONEXION?
|_host A_|-------- DATOS --------> |_host B_| _host A_|-------- FIN
----------> |_host B_| |_host A_|<------- ACK ----------- |_host B_| |_host A_|<-- DATOS RESTABTES ---> |_host B_| |_host
A_|<------- FIN ----------- |_host B_| |_host A_|-------- ACK
----------> |_host B_| con esto acabamos la introducción de concepto
básicos de TCP/IP, ahora pasaremos a lo que en verdad ibamos, el escaneo de
puertos.
Hay mucho software enfocado para esto, a mi me gustan dos, uno es Nmap y otro
es ScanLine. ScanLine es para Windows. Pero bueno, aqui del que hablaremos es de
Nmap, por que es el mejor que hay.
Y ademas esta disponible para todos los S.O. que se les ocurra.
No me detendre mucho en las opciones, por que son muchas y esto se supone debe
de ser un texto corto, para que aprendan mas descarguen Nmap
(http://www.insecure.org/nmap/) ya instalado podran checar toda la documentación,
por ejemplo con el comando:
$man nmap
TECNICAS DE ESCANEO
oK!, empezemos con las tecnicas de escaneo. Pero ¿que es un escaneo?, esto es
una prueba para ver el estado de como se encuentra un puerto. Y no son mas que
simples conexiones en las que nos fijamos de las respuetas o de las no
respuestas.
Algo que es importante saber es que los puertos pueden estar en tres estados,
uno abierto que es cuando recibe conexiones, otro cerrado cuando no acepta
conexiones y silencioso que pues solo esta alli haciendo cosas sin interes.
-> TCP CONNECT()
Consiste en hacer conexiones completas con el host remoto.
--> Puerto abierto:
|_host A_|-------- SYN --------> |_host B_|
|_host A_|------ ACK/SYN ------> |_host B_|
|_host A_|-------- ACK --------> |_host B_|
En caso de estar abierto se lleva a cabo la conexión completa. Sin embargo
pues como se imaginaran esta es la razón por la que este escaneo no es muy
bueno, pues despues de un rato de estar haciendo tantas conexiones el host remoto
nos rechazara las conexiones.
--> Puerto cerrado |_host A_|-------- SYN --------> |_host
B_|
|_host A_|-------- RST --------> |_host B_|
Aqui intentamos establecer la conexion, pero nos manda un RST por que algo esta
raro alli que no permite que se conecte, :P a pues claro, que el puerto esta
cerrado
--> Puerto silencioso
|_host A_|-------- SYN --------> |_host B_| Aqui intamos hacer una
conexion, pero el otro anda de icognito y no pela nuestro SYN
-> TCP SYN
Este se basa en intentos de conexion, pero sin completar. Pero aun asi es
bastante detectable y lento.
--> Puerto abierto: |_host A_|-------- SYN --------> |_host B_| |_host A_|------ ACK/SYN ------> |_host B_| _host
A_|-------- RST --------> |_host B_| Aqui todo lleva a que se va a
llevar la conexion completa, cuando B manda su ACK y SYN para completarla, A
manda un RST para evitar la conexion.
--> Puerto cerrado
|_host A_|-------- SYN --------> |_host B_| |_host A_|-------- RST
--------> |_host B_| Aqui A hace de todo, pero B no le
responde.
--> Puerto silencioso |_host A_|-------- SYN --------> |_host B_|
Aqui B como si no existiera, sigue de incognito :P
-> TCP FIN (STEALTH SCAN)
Discreto y confiable, se basa en el envio de solicitudes de finalizar
conexiones (FIN)
--> Puerto abierto: |_host A_|-------- FIN --------> |_host B_| Aqui A envia un paquete para finalizar la conexion, pero como no hay
ninguna conexion establecida B no hace nada.
--> Puerto cerrado |_host A_|-------- FIN --------> |_host B_| |_host A_|<------- RST --------- |_host B_| Aqui A intenta
de nuevo finalizar la conexión, pero B se enoja y le responde "Eh! tu que estas
loco ¿como jodidos termina una conexion si estoy cerrado y no tenemos nada" xD,
que agresivo es B!
--> Puerto silencioso
|_host A_|-------- SYN --------> |_host B_| Cricket-criket (grillito
cantando)
-> UDP SCAN
Usa paquetes UDP, es lento, excepto en MS Windows que no respeta el estandar de
TCP/IP.
--> Puerto abierto: |_host A_|-------- UDP --------> |_host B_| Aqui hay que recordar que UDP no es orientado a conexión, por o que el
paquete es enviado y si todo va bien no hay respuesta ni nada.
--> Puerto cerrado |_host A_|-------- UDP --------> |_host B_| |_host A_|-------- ICMP -------> |_host B_| Aqui A manda un
paquete UDP pero B le manda un ICMP diciendole que no puede aceptar
paquetes.
--> Puerto silencioso
|_host A_|-------- UDP --------> |_host B_| aqui sigue sin pasar
nada. Pero vean el problema que este escaneo nos da, el UDP es enviado pero no
sabemos a ciencia cierta si B esta abierto o silencioso, aunque si podemos
identificar cuando esta cerrado. Piensen en esto como un juego en donde tendran
que ir mezclando tecnicas hasta tener todo identificado a la perfección.
-> ACK SCAN
Por ejemplo, para hicismos un UDP SCAN y queremos separar los puertos abiertos
de los silenciosos podemos echar mano del ACK SCAN que nos dira cuales son los
puertos silenciosos.
--> Puerto abierto:
|_host A_|-------- ACK --------> |_host B_| |_host A_|<------- RST
--------- |_host B_| Aqui A manda una confirmación y B le responde
"He! ¿que tu estas loco o que?, ¿que me confirmas si yo no te he mandado
nada?"
--> Puerto cerrado
|_host A_|-------- ACK --------> |_host B_| |_host A_|<--------RST
--------- |_host B_| Aqui B esta cerrado y simplemente le dice "No
jorobes!!"
--> Puerto silencioso |_host A_|-------- ACK --------> |_host B_| Como B esta silencioso no hace nada ante el ACK, pero de esta forma
sabemos que esta silencioso por que solo los silenciosos no responderan.
-> NULL SCAN
Ya vimos como depurar puertos abiertos y silenciosos, ahora veremos como
depurar puertos cerrados.
--> Puerto abierto: |_host A_|-------- [ ] --------> |_host B_| Aqui A manda un paquete deforme a B, este no le entiende y no hace
nada.
--> Puerto cerrado
|_host A_|-------- [ ] --------> |_host B_| |_host A_|<------- RST
--------- |_host B_| A manda su paquete malformado y aunque B no
entiende como esta cerrado le dice "Ya te dije que no me estes
molestando!!"
--> Puerto silencioso |_host A_|--------- [ ] -------> |_host B_| B sigue incognito,, :| ¿no se habra aburrido ya?
- PING
Consiste en enviar un paquete ICMP para ver si el host responde y esta alli
"Host ¿estas alli?
- OTRAS
Hay técnicas que son mezclas de esto y otras cosas mas, por alli encontraran
probablemente diagramas de como hacerlas, pero ustedes ya pueden leer y entender
las conveersaciones entre computadoras, bueno casi!
- FINGERPRINTING
Esto se refiere a detectar información del host remoto, por ejemplo su sistema
operativo. Pues de esa forma podemos empezar a ver por donde atacar :P ya les
dije que piensen en que es un juego.
xDD ahora se preguntaran ¿y como hago todo eso con Nmap?, pues es la verdad es
que cada triada de diagramas se resumen a un comando con unas opciones, y lo
importante es que aprendar que es lo que pasa, mas que memorizarse el comando.
Pero para saber como hacerlo descarguen las diapositivas de la platica que podran
encontrar en la seccion des descargas/ presentaciones.
Alli estan estos mismos diagramas pero mas detallado y el comando para cada
uno.
Espero les haya sido de utilidad esto, cualquier comentario, critica, etc., no
duden en hacermela llegar; si quieren tomar el texto y mejorarlo, copiarlo, etc.
tienen total libertad de hacerlo siempre que incluya su autor original y la web
de procedencia. |