Banner Grabbing: El poder de los Banners

Quizas a alguien le parezca medio estupido esto, pero la verdad es que esta muy equivocado. Esta parte de el reconocimiento forma parte de la "etapa" de enumeración o reconocimiento (que suele ser la 3ª etapa) para los que pretenden incursionar en un sistema por medio de la ejecución de vulnerabilidades para realizar un pentest o simplemente hackear el sistema. Que seria de nosotros sin estos amigables "banners" que nos hacen la tarea mas fácil (ya que nuestra tarea es dificultosa), pero si no existieran todavía nos quedaría otro as bajo la manga que es el "fingerprinting", pero ese es otro tema a tratar.
Cuando hablamos de banners en cuanto al reconocimiento de aplicaciones hablamos de strings que nos dicen, explícitamente, su nombre, su versión, su autor y muchas cosas mas. Esto no puede ser muy verosímil, pero puede ser la opción mas rápida y elegida.

Bueno, manos a la obra. Un ejemplo rápido del "Banner Grabbing" puede ser:

$ HEAD www.leetupload.com
200 OK
Connection: close
Date: Thu, 10 Jan 2008 11:25:14 GMT
Server: Apache/2.0.61 (Unix) PHP/4.4.7 mod_ssl/2.0.61 OpenSSL/0.9.7e mod_fastcgi/2.4.2 DAV/2 SVN/1.4.2
Vary: Accept-Encoding
Content-Type: text/html; charset=UTF-8
Client-Date: Thu, 10 Jan 2008 11:25:14 GMT
Client-Peer: 208.113.167.188:80
Client-Response-Num: 1
X-Pingback: http://www.leetupload.com/news/xmlrpc.php
X-Powered-By: PHP/5.2.3
$

Entonces, lo echo aquí es una petición HEAD (no creo que les falte el programa..) a una muy buena web que es leetupload.com. Analicemos lo que nos interesa para reconocer la aplicación (estos datos difieren de cada url, o sea que nos puede mostrar mas info o menos):

#~ Server: Apache/2.0.61 (Unix) PHP/4.4.7 mod_ssl/2.0.61 OpenSSL/0.9.7e mod_fastcgi/2.4.2 DAV/2 SVN/1.4.2
#~ X-Powered-By: PHP/5.2.3

En el primer dato podemos ver claramente que el servidor es Apache 2.0.61 corriendo en un sistema Unix y los demas datos son programas que agregan funcionalidades al servidor. El segundo dato nos informaría que tipo de versión de PHP esta corriendo el servidor en este momento, que seria la 5.2.3. Con esta información ya podríamos correr algún exploit o analizar nosotros mismos las vulnerabilidades creando sus exploits (a trabajar..) ya sabiendo que corre a nivel de aplicación y quizas a nivel de aplicación web.
Pero si queremos descubrir otros servicios, es la misma tecnica, solo hay que conectarce y mirar el banner que nos provee la aplicación. Por ejemplo, ahora (de la misma web) queremos saber que servidor ftp corre, entonces seria asi:

$ ftp
ftp> open www.leetupload.com
Connected to www.leetupload.com.
220 ProFTPD 1.3.1rc2 Server (DreamHost FTP) [208.113.167.188]
Name (www.leetupload.com:c1c4tr1z):

El banner es claro y visible desde el espacio, ProFTPD seria la aplicación que corre como servidor y 1.3.1rc2 seria su versión del software. La forma automática mas usada en estos casos es: amap. Amap es una aplicación que reconoce aplicaciones. Bueno entonces bajamos amap y lo compilamos. Lo que haremos con este simple caso seria:

$ ./amap -B -b www.leetupload.com 21
amap v5.2 (www.thc.org/thc-amap) started at 2008-01-10 10:39:39 - BANNER mode

Banner on 208.113.167.188:21/tcp : 220 ProFTPD 1.3.1rc2 Server (DreamHost FTP) [208.113.167.188]\r\n

amap v5.2 finished at 2008-01-10 10:39:40
$

Aquí el proceso es muy rapido y se puede automatizar para que realice la misma operación en diferentes puertos , además de tener la opción de analizar la aplicación enviando paquetes y checkeando la respuesta aunque no sean aplicaciones ascii (me estoy yendo al carajo..). Para analizar mas puertos solo hay que ir agregándolos, o sea:

$ ./amap -B -b www.leetupload.com 21 22
amap v5.2 (www.thc.org/thc-amap) started at 2008-01-10 11:11:26 - BANNER mode

Banner on 208.113.167.188:21/tcp : 220 ProFTPD 1.3.1rc2 Server (DreamHost FTP) [208.113.167.188]\r\n
Banner on 208.113.167.188:22/tcp : SSH-2.0-OpenSSH_3.8.1p1 Debian-8.sarge.6\n

amap v5.2 finished at 2008-01-10 11:11:27
$

De este modo se puede escanear de forma rapida los puertos 21(ftp) y 22(ssh), capturando sus banners. Se puede agregar la opción -v verbose (dos veces tambien) para que se explique paso a paso el proceso. Otra alternativa recurrida es el mayormente conocido: Nmap. Este pequeño amigo dudo que falte en cualquiera de sus computadoras, ya que es la pieza mas útil que se puede encontrar para el reconocimiento de un sistema. Ya todos lo conocen, asi que no tengo que explicar sus funciones y/e opciones, sino usen google. Para nuestra mision a nuestro nmap lo usaremos asi:

$ nmap -P0 -sV -F www.leetupload.com

Starting Nmap 4.20 ( http://insecure.org ) at 2008-01-10 11:07 ARST

Interesting ports on www.leetupload.com (208.113.167.188):
Not shown: 1246 closed ports
PORT STATE SERVICE VERSION
21/tcp open ftp ProFTPD 1.3.1rc2
22/tcp open ssh OpenSSH 3.8.1p1 Debian 8.sarge.6 (protocol 2.0)
23/tcp open telnet Linux telnetd
25/tcp filtered smtp
80/tcp open http Apache httpd 2.0.61 ((Unix) PHP/4.4.7 mod_ssl/2.0.61 OpenSSL/0.9.7e mod_fastcgi/2.4.2 DAV/2 SVN/1.4.2)
111/tcp filtered rpcbind
113/tcp open auth?
548/tcp open afpovertcp?
587/tcp open smtp Postfix smtpd
1720/tcp filtered H.323/Q.931
Service Info: OSs: Unix, Linux

Service detection performed. Please report any incorrect results at http://insecure.org/nmap/submit/ .
Nmap finished: 1 IP address (1 host up) scanned in 90.002 seconds
$

Y al mirar el resultado de nmap nos damos mayor cuenta de el poder que nos brindan los banners, sin la necesidad de instalar nada y con la impotencia de los sysops o admins. Aunque es la opcion mas recurrida y especifica en relación a la otra (amap) es mas lenta, aun así usando el tiempo -T al máximo. Pero nunca se fien de los banners por completo, ya que pueden ser modificados como vamos a ver ahora.

Contraataque:

Me apena poner esto en esta web, pero es algo que deben saber para poder entender como evitar la técnica del Banner Grabbing. En el ejemplo usaremos a nuestro querido servidor Apache, para esto tendremos que bajarlo, descomprimirlo, pero no compilarlo.. sino ir a la carpeta include y abrir el archivo ap_release.h, busquen algo como esto:

#define AP_SERVER_BASEVENDOR "Apache Software Foundation"
#define AP_SERVER_BASEPROJECT "Apache HTTP Server"
#define AP_SERVER_BASEPRODUCT "Apache"

#define AP_SERVER_MAJORVERSION_NUMBER 2
#define AP_SERVER_MINORVERSION_NUMBER 2
#define AP_SERVER_PATCHLEVEL_NUMBER 6
#define AP_SERVER_DEVBUILD_BOOLEAN 0

Este archivo header define los datos de versión, producto, compañía, etc. Entonces para hacer a lo que pensamos hacer debemos cambiar estas lineas para que quede algo como esto (puede ser a su gusto):

#define AP_SERVER_BASEVENDOR "MyServersito Soft"
#define AP_SERVER_BASEPROJECT "MyServersito HTTP Server"
#define AP_SERVER_BASEPRODUCT "MyServersito"

#define AP_SERVER_MAJORVERSION_NUMBER 1
#define AP_SERVER_MINORVERSION_NUMBER 1
#define AP_SERVER_PATCHLEVEL_NUMBER 0
#define AP_SERVER_DEVBUILD_BOOLEAN 8

Lo compilamos e instalamos, lo corremos (no es necesario que explique todo esto..). Despues de todo esto, hacemos el primer ejemplo del articulo:

$ HEAD 127.0.0.1
200 OK
Connection: close
Date: Thu, 10 Jan 2008 11:25:14 GMT
Server: MyServersito/1.1.0.8 (Unix)
Content-Type: text/html
Client-Date: Thu, 10 Jan 2008 13:36:24 GMT
Client-Peer: 127.0.0.1:80
Client-Response-Num: 1
$

Se pueden modificar varias cosas, pero eso se lo dejo a ustedes. Y otro ejemplo puede ser el servidor ftp ProFTPD visto en el banner de www.leetupload.com, que es el mismo mecanismo a excepcion que el archivo header se llama version.h, pero es mas cortito y conciso:

#define PROFTPD_VERSION_TEXT "1.3.1rc3"

Por (ejemplo):

#define PROFTPD_VERSION_TEXT "6.2.8"

Esto no lo probe personalmente, pero dudo que haya un problema (XD) ya que lo compile y no ocurrió ningún problema de ningún tipo. Bueno! Espero que les haya gustado leer hasta aca el articulo, sino es asi pues jodanse.. Si bien no es una técnica dificultosa, encontre muy pocos sitios que lo expliquen con mas de "3" palabras. Por alguna sugerencia o arreglo posteen.

1 comentarios:

Alfonso Alfonso dijo...

La verdad me ha servido bastante te felicito, no hay buenas explicaciones por ningún lado.