Cuando un atacante decide probar su suerte contra nuestro sistema, lo primero que requiere es recopilar cuanta información le sea posible acerca de éste. Todo puede serle útil - Sistema operativo, versión, servicios que ofrecemos, versión de los programas que tenemos... Cualquiera de estos datos puede ser suficiente para que su ataque sea exitoso. Basta con que el atacante vea, por ejemplo, que tenemos una versión vieja de un programa, aunque no tenga éste ninguna vulnerabilidad importante, para que se dé cuenta que no somos administradores muy cuidadosos y probablemente tengamos otros servicios descuidados.
La manera más común en que un atacante va a intentar obtener información acerca de nosotros es el barrido de puertos: Intentar conectarse a cada uno de los puertos que tiene abiertos nuestro servidor, anotando qué es lo que tiene activo y analizando dicha información. Una de las herramientas más comunes para realizar barridos de puertos es el nmap, como lo muestra la siguiente sesión ejemplo.
[gwolf@hostname gwolf]$ nmap 192.168.1.2 -O
Starting nmap V. 2.12 by Fyodor (fyodor@dhp.com, www.insecure.org/nmap/)
Interesting ports on ejemplo.dominio.com (192.168.1.3):
Port State Protocol Service
21 open tcp ftp
22 open tcp ssh
23 filtered tcp telnet
25 open tcp smtp
80 open tcp http
110 open tcp pop-3
113 open tcp auth
135 filtered tcp loc-srv
139 filtered tcp netbios-ssn
TCP Sequence Prediction: Class=random positive increments
Difficulty=5286692 (Good luck!)
Remote operating system guess: Linux 2.1.122 - 2.2.14
Nmap run completed -- 1 IP address (1 host up) scanned in 25 seconds
[gwolf@hostname gwolf]$
Tras haber hecho esta prueba, el atacante puede intentar entrar a cada uno de los puertos abiertos, revisando si encuentra alguna versión vieja o vulnerable:
[gwolf@hostname gwolf]$ telnet 192.168.1.3 21
Trying 192.168.1.3...
Connected to 192.168.1.3.
Escape character is '^]'.
220 ejemplo.midominio.com FTP server (Version wu-2.4.2-academ[BETA-18](1)
Mon Jan 18 19:19:31 EST 1999) ready.
quit
quit
221 Goodbye.
Connection closed by foreign host.
[gwolf@hostname gwolf]$ telnet 192.168.1.3 22
Trying 192.168.1.3...
Connected to 192.168.1.3.
Escape character is '^]'.
SSH-1.5-1.2.23
Protocol mismatch.
Connection closed by foreign host.
[gwolf@hostname gwolf]$ telnet 192.168.1.3 25
Trying 192.168.1.3...
Connected to 192.168.1.3.
Escape character is '^]'.
220 ejemplo.midominio.com ESMTP Sendmail 8.8.7/8.8.7; Tue, 26 Sep 2000
17:13:04 -0500
quit
quit
221 ejemplo.midominio.com closing connection
Connection closed by foreign host.
[gwolf@hostname gwolf]$
Con esto, en menos de un minuto, el atacante puede ya haber inferido lo siguiente:
Detectar un barrido de puertos es muy fácil: Muchas conexiones casi simultáneas a una gran cantidad de puertos originadas en la misma dirección. Si bien los programas barredores se han vuelto muy sofisticados y cada vez es más difícil detectarlos por diferentes estrategias que emplean (nmap sabe hacer desde una sencilla conexión TCP hasta un barrido silencioso con SYN, FIN, Xmas, Null, UDP, paquetes fragmentados, barridos paralelos de diferentes tipos), el principio básico es el mismo. Hay un excelente programa dedicado precisamente a encontrar éste patrón y tomar la acción que le indique el administrador del sistema: Portsentry, de Psionic.