Desde el último post ha pasado mucho tiempo, pero es que la vida del feriante es así, nunca sabes cuándo y dónde vas a tener unos minutos para escribir algo. Continuando con lo anterior seguimos para ver como descubrir los puertos de un servidor.
Escaneo de SYN
Para descubrir los puertos TCP hay que conocer como es el intercambio de mensajes en cada una de las fases de la conexión TCP.
En la fase de establecimiento de la conexión se produce un intercambio de mensajes como este
Emisor —> SYN(X) —> Receptor
Emisor <— SYN(X)+ACK<— Receptor
Emisor —> ACK —> Receptor
En el caso de que el puerto esté cerrado entonces sería una comunicación tal que:
Emisor —> SYN(X) —> Receptor
Emisor <— RST+ACK <— Receptor
El primer tipo de escaneo que se realiza se basa en simplemente agarrar dos bytes y hacer un bucle for i=0 to 65.536 y lanzar contra una ip SYN(i) y esperar a ver que SYN(i)+ACK te devuelve. Esos “i” serán los puertos que estén abiertos.
Esto es como solucionaba un amiguete mío lo de ligar. Hay quien se curraba a una chica durante toda la noche y hay quien iba una a una “¿quieres?”, “¿quieres?” Conclusión. Este método es rápido pero salta todas las alarmas. Los firewalls, tanto de red, como de host, detectan este intento en base a dos parámetros: Peticiones de conexiones consecutivas y número de peticiones por unidad de tiempo. Además, tiempo atrás, esto era una forma de hacer Denegación de Servicio, pues los equipos mantenían las conexiones abiertas (SYN, SYN+ACK, ACK) y las semi-abiertas (SYN,SYN+ACK) en un mismo buffer circular, así que cuando se llenaba se machacaban por el principio las conexiones que ya existían (que recuerdos de juventud). Hoy en día lo más probable será que no se permitan más de x conexiones.
Escaneo de SYN+ACK
En este caso simulamos que somos el servidor y que atendemos a una petición de conexión que nos ha enviado con anterioridad un servidor, para ello se intercambian los siguientes mensajes.
Emisor —> SYN(X)+ACK —> Receptor
Emisor <— RST <— Receptor
Este tipo de comunicación indica que el servidor no está escuchando por el puerto X y le devuelve un mensaje RST porque presupone que es un error. En el caso de que el puerto esté escuchando simplemente piensa que es un error en el paquete por lo que no contesta a la espera de que salte el time-out y el cliente lo reenvíe correctamente.
Emisor —> SYN(X)+ACK –> Receptor
Emisor <— <— Receptor
Los escaners de SYN+ACK lanzan peticiones SYN+ACK y estarán abiertos aquellos que no contesten. Tienen un alto índice de falsos positivos pues los motivos por los que no se conteste a una petición pueden ser muchos y variados, pero es una forma más de descubrir los puertos de un servidor.
Y hasta pronto que seguiremos con más formas de detectar los puertos.