SET 39 Call For Papers

¿Eres un hacker? Si deseas pasar a formar parte de la historia del hacking hispano, colabora con la próxima edición de SET 39 enviándonos un artículo. No esperes más, esta es tu oportunidad de demostrar lo que sabes. Ayúdanos a construir una revista de hackers para hackers. SET Staff

Paseando por la red

      4264

Autor: Madfran
-[ 0x0A ]--------------------------------------------------------------------
-[ [Paseando por la red] ]---------------------------------------------------
-[ madfran ]----------------------------------------------------------SET-26-

INTRODUCCION

No siempre se encuentra lo que se desea ni se destapa lo que se quiere. La 
mayoria de las veces cuando navegamos por estas redes tenebrosas, lo unico que
encontramos es una coleccion de dibujos, fotografias y montajes, que solo
disparan una cantidad enorme de colores y movimientos sin mas objeto que 
reclamar nuestra atencion pero sin ninguna intencion de darnos nada a cambio.
Normalmente el aburrimiento nos puede y mecanicamente nos encontramos 
introduciendo en los campos que nos presentan las web, codigos que no tienen
ninguna similitud con nuestro nombre y apellidos.

Un observador casual se preguntara para que introducimos esta serie de 
caracteres extravagantes en el sitio donde una pringosa web esta intentando
enterarse de nuestros datos mas intimos. Que pretendemos con esta serie de %20
/, ? y demas cosas que no dicen nada a los comunes mortales, es bastante
evidente. Estamos intentando explotar alguno de los miles de defectos que 
adornan las web de esta tierra (otras no conozco) para enterarnos de algunas
tonterias, como la password del administrador, la cuenta bancaria de algunos 
cientos de confiados usuarios o el numero de la tarjeta VISA de unos miles de
incautos que han comprado alguna tonteria en esta o aquella infame web.


TECNOLOGIA WEB

A pesar del tiempo que lleva en marcha la red de redes, los protocolos sobre
los que se basa la web son todavia de forma fundamental los viejos y queridos
HTTP que trabajan a traves del puerto 80 y su hermano gemelo HTTPS que se
comunica a traves del puerto 443. Ya pueden introducir los firewalls que les
de la gana y las protecciones que deseeen, pero siempre deben dejar estas dos
puertas para poderse comunicar con el exterior y siempre que alguien deja una
puerta abierta,... un indeseable pueda aprovechar el momento.

Si hacemos un poco de historia y recorrido de protocolos, nos encontramos que
existen diversas versiones del mismo protocolo. Para el HTTP, tenemos :

	HTTP/0.9
	Nunca he sabido el porque de este numero de version tan heterodoxo, 
	pero el caso es que fue el primero en salir ahi por el anyo 1990.
	Sus especificaciones se encuentran en el documento RFC1945 que si 
	teneis ganas de leer, podeis encontrar en,
	www.ietf.org/rfc/rfc1945.txt
	Hasta 1996 su uso fue mas bien modesto debido al estado infantil en
	que se encontraba por aquel entonces la red. Eran tiempos en que todo
	se hacia a base de telnet y de menus con nulos contenidos graficos

	HTTP/1.0
	Se presento en sociedad en Mayo de 1994 y a pesar de su avanzada edad
	(en terminos informaticos), sigue siendo el rey de los protocolos
	HTTP en la red. Esta va a ser el arma de aprendizaje para controlar el
	funcionamiento del sistema cliente/servidor. En el mismo documento antes
	mencionado (rfc1945), podreis encontrar las especificaciones.

	HTTP/1.1
	Oficialmente salio en 2001 (no se en que mes) y es la ultima version
	de este protocolo. Esta documentada en el RFC2616, que podeis encontrar 
	en la misma web antes aludida. Existe una diferencia fundamental con
	respecta a las versiones anteriores y es que soporta el paso de
	parametros con el query '?'. Este hecho es el motor de muchas de las 
	aplicaciones que se encuentran en la red y es el principal punto de 
	apoyo para iniciar ataques en toda regla.

Para el HTTPS solo existe una version, que se encuentra especificada en el 
documento RFC2246. En el fondo este protocolo es un trafico HTTP cifrado. Con
lo cual solo emisor y receptor son capaces de entenderse y no existe la
posibilidad de que terceros a la escucha se enteren de nuestro trafico. Los
mensajes se cifran mediante una especificacion SSL (Secure Sockets Layer) de
la cual hay diversas versiones con sus protocolos (SSLv1, SSLv2, SSLv3)

Si nos centramos en los protocolos HTTP sin cifrar, lo primero de todo es
comprobar que version esta corriendo en la maquina que deseamos visitar. Todo
el mundo debiera saber que lo que vemos en nuestro navegador no es lo que
realmente recibe nuestra maquina sino una interpretacion de lo que le llega. En
el fondo es como las personas, no decimos lo que vemos o hemos visto, sino que 
damos nuestra interpretacion particular, de forma gratuita. Dejando a parte
las digresiones que tanto me gustan pero que a ninguna parte llevan, lo que nos
hace falta es un interprete que no ponga nada de su parte, eso existe (al menos
en el mundo de la informatica de redes) y se llama netcat. Es una herramienta
que podeis encontrar en el disco duro de mi PC, pero como no tengo intencion de
daros acceso al mismo, lo mejor es que lo busqueis en algun sitio de confianza
tipo www.l0pht.com o algo por el estilo, en todo caso podeis buscar en google
pero tened cuidado con lo que os bajais porque hay versiones con troyanos 
incluidos gratis en el paquete.

Una vez teneis el netcat en vuestras manos solo teneis que teclear,

nc.exe www.ejemplo.com 80
GET / HTTP/1.0 
y darlo dos veces al return

Como respuesta el servidor os devolvera una informacion parecida a esta,

HTTP/1.1 200 OK
Server: Microsoft-IIS/5.0
Content-Location: http://191.11.12.2/
default.htm

.... y otras informaciones

Con todo esto ya podeis saber conque tipo de maquina os enfrentais (tambien
han podido falsear los header, pero esto es otra historia) y podeis empezar
a planificar el ataque. De momento es bueno saber que tipo de comandos podeis
emplear.

Si os enfrentais a servidor HTTP/1.0 podeis utilizar,

GET	Devuelve el contenido del archivo solicitado. Si se pide un archivo
	html devolvera el contenido pero si es un archivo ASP, el servidor
	procesara el archivo y enviara el resultado de la ejecucion del archivo
	Atentos a la diferencia !

HEAD	En este caso no devuelve el contenido del archivo sino el resultado
	de informacion generica del servidor. COn esta informacion se puede 
	empezar a trabajar !

POST	Solicita al servidor aceptar una cierta informacion para realizar
	algunas tareas con ella. Normalmente se utiliza en contexto de scripts
	CGI.

Si estais frente a un HTTP/1.1 , hay mas opciones,

CONNECT	Utilizado si queremos jugar con un proxy que tiene las suficientes
	habilidades para hacer switch dinamico.

DELETE	Sirve para borrar cosas, pero casi nunca esta activada en los 
	servidores modernos, por motivos obvios.

GET	Mismas funciones que en el caso del protocolo HTTP/1.0.

HEAD	Mismas funciones que en el caso del protocolo HTTP/1.0.

OPTIONS	Informa de las opciones disponibles. Si ponemos un *, nos informara de
	todo lo que esta implementado en el servidor. Por tanto es sumamente
	practico como punto de partida.

POST	Mismas funciones que en el caso del protocolo HTTP/1.0.

PUT	Crea un fichero con el contenido (casi) que le solicitemos. Para
	registrar salidas que luego van a ser entradas de otras scripts es
	bastante practico.

TRACE	Envia una peticion de mensaje loopback. Es muy util para descubrir los
	proxys en linea.


ALGO SOBRE CARACTERES ESPECIALES

Despues de conocer que tipo de adversario tenemos, es bueno conocer que tipo de
informacion podemos utilizar. Cualquier tipo de archivo html no es otra cosa
que un conjunto de caracteres alfanumericos, pero como de costumbre e incluso
entre los seres humanos ocurre, no todos los caracteres son iguales ni tienen
la misma importancia ni siquiera un comportamiento parecido.

En el caso de la tecnologia HTTP es bueno repasar algunos caracteres,

?	Es un separador query. Todo lo que se encuentra a su derecha se 
	interpreta como una peticion query a una base de datos o de entrada a un
	programa.

&	Separador de parametros. Muy util si queremos enviar varios parametros
	al mismo tiempo y no deseamos que se mezclen de una forma obscena e
	inutil para nuestros propositos.

=	Separa el nombre de un parametro de su contenido y de paso lo asigna
	para que posteriormente pueda ser tratado de forma decente.

+	Se transforma en un espacio (casi siempre).

:	Separador de protocolo. Ya sabeis, lo que esta antes normalmente es un
	http, pero a veces es un https e incluso ftp.

#	Se utiliza para indicar un punto concreto de arranque dentro de un
	mismo archivo. O sea .....index.html#1 es distinto de ...index.html#2
	pero se encuentra dentro del mismo archivo index.html

%	Es un caracter de escape para indicar que a continucion se encontrara
	una notacion hexadecimal.

@	Bastante famoso, no? Se utiliza para direccion de correo electronico

~	En ambientes tipo unix, indica un directorio personal


Tambien es bueno saber algo de los metacaracteres,

*	Es un caracter comodin

;	Su significado difere en funcion de la aplicacion. Para lenguajes como 
	C o perl es un indicador de final de linea. En scripts Bourne o queries 
	SQL es un separador de comandos.

|	Es un caracter pipe para encadenar el resultado de un comando con la 
	entrada de otro.


'	El caracter acento grave se utiliza como comando de substitucion de
	salida. Poniendo un ejemplo clarificador si conseguimos que el servidor
	trague con un comando tal como 
		files='ls -la'
	conseguira que el resultado de la instruccion ls -la pase a engrosar
	el contenido del fichero files.

Todo programe que corra en un servidor que se precie de serlo, debe controlar
que no se le envien este tipo de caracteres, pero esto no es el caso de 
muchisimas aplicaciones que todavia se encuentran activas. Si encontramos
alguno de estos servidores con exceso de espiritu de colaboracion y capaz de 
prestar todo tipo de informacion, solo hace falta saber un poco sobre el sistema
operativo a atacar y en poco tiempo se tendra completo acceso.

Sin embargo estos son tiempos pasados y salvo los servidores carentes de 
cualquier interes, los mas serios han aprendido la leccion y cuidan sus scripts,
sin embargo al poco tiempo aparecio otro tipo de problema. Los caracteres
Unicode.


CODIFICACION UNICODE

La codificacion ASCII hexadecimal es mas que suficiente para dar servicio al
alfabetico latino (con todas sus variantes) a la numeracion arabiga y a algunos
caracteres mas de uso normal, como los operadores matematicos. El problema
empezo cuando se quiso dar servicio a todo tipo de alfabetos y caracteres
esotericos para lo cual hubo que hechar mano de la codificacion UTF-8 
(Universal Character Set Translation Format). A pesar que UCS esta mantenido
por ISO, hubo un grupo de empresas (fundamentalmente vendedores de software)
que se dedicaron a estudiar la posibilidad de unificar la representacion de
una serie de codigos bajo un unico esquema. Este grupo se conoce como el
Unicode Consortium (www.unicode.org).

Sin entrar en como funciona este galimatias, lo importante es darse cuenta
(como se dieron cuanta algunos) que el mismo caracter se puede representar
en un unico byte, con dos o con tres. Fue asi como un avispado, hacia el 
Octubre de 2000, descubrio que el caracter '/' se representa como el 00101111
en binario, como 47 en decimal y 2F en hexadecimal.

Todo esto en un unico byte, pero queria decir lo mismo 1100000 10101111, o
49327 o C0 AF si se emplean dos bytes. Reflexionando sobre el tema se le ocurrio
poner en el navegador %C0%AF y el servidor que solo controlaba el paso de un
escualido 2F, dejo pasar el '/' y el tipo en cuestion consiguio entrar en muchos
sitios que antes le estaban vedados y seguidores suyos crearon el gusano Code 
Red. Este es la famosa vulnerabilidad Unicode.

Un ejemplo muy sencillo de la explotacion de la vulnerabilidad es,

http://www.servidor.com/scripts/..%C0%AF../winnt/system32/cmd.exe?/c+dir+d:\

Esta sencilla conbinacion, nos lista el contenido del directorio raiz del
disco d: de un servidor con windows NT con su software sin actualizar (ya hay
pocos de esos, tampoco os molesteis conmogo si no encontrais ninguno a las
primeras de cambio).


ALGO MAS QUE APRENDER

Los programadores que tienen que crear los pesados conjuntos de caracteres que
configuran los modernos programas, se valen normalmente de tecnologias bastante
standard. Siempre es bueno saber de estamos hablando antes de empezar a teclear
codigos a diestro y siniestro. He ahi una forma basica de reconocer la 
tecnologia empleada.

Si vemos que en la URL del navegador hay algo que termina con una cierta
extension, podemos deducir lo que tenemos al otro lado de los cables.

Extension	Technologia		       Plataforma
.pl	        Perl CGI script	       Generico. Normalmente UNIX
.asp        Active Server Pages    Microsoft IIS
.aspx       ASP+                   Microsoft .NET
.php        PHP script             Generico. Normalmente Apache
.cfm        CodFusion              Generico. Normalmente Microsoft IIS
.nsf        Lotus Domino           Servidor Lotus Domino


CASO PRACTICO

Supongamos una URL de aquellas cutres de hace anyos que tiene un aspecto tal
como,  www.servidor.com/cgi-bin/login.cgi

La pantalla de nuestro navegador muestra la tipica ventana donde se pide el 
nombre de usuario y el password invitando a validar todo mediante un boton
standard login. Supongamos que introducimos como usuario 'pepe' y como password
'nena'. Si, a continuacion, en lugar de dar al login le damos en el menu a 
Ver/Fuente (suponiendo que nuestra configuracion sea en castellano) veremos el 
listado del fichero html y cuyo aspecto puede parecerse a este.

<form method=POST actions="/cgi-bin/login.cgi">
<table border=0>
<tr>
<td>Nombre:</td> <td>input name=user type=text width=20></td>
</tr>
<tr>
<td>Password:</td> <td>input name=pass type=password width=20></td>
</tr>
</table>
<input type=submit value="login">
</form>

O sea estamos intentando pasar las variables 'user' y 'password' y cada una de
ellas tendra el valor de 'pepe' y 'nena'. La primera variable es de tipo text
y la segunda de tipo password, aunque la unica diferencia es que el contenido
de la primera variable se ve en la pantalla y la segunda no, impidiendo que
cualquier fisgon mire por encima de tu hombro. Por lo demas no ofrece ningun
tipo de proteccion adicional.

Lo importante de esta historia es que se puede enviar la informacion a traves
de la ventana del navegador o bien mediante la siguiente URL

http://www.dominio.com/cgi-bin/login.cgi?user=pepe&password=nena

Poder lanzar peticiones de login sin tener que pasar por la pantallita es el
punto de partido para poder planificar ataques de fuerza bruta en linea.


RECUENTO FINAL

No vamos a explicar con detalle todo lo que se puede hacer, se ha hecho, se esta
haciendo y se hara en el futuro. Como en casi todos mis articulos, lo unico que 
pretendo (con escualidos resultados) es despertar la curiosidad de alguien para
que continue el camino que yo solo he senyalado. 

Solo hace falta quedarse con unos pocos conceptos.

- Lo que veis en el navegador solo es la interpretacion de un codigo.
- Este codigo puede ser by-pasado mediante caracteres insertados directamente
  en la URL del navegador.
- Los codigos pueden construirse con distintos esquemas, pero los programadores
  preferentemente utilizan tan solo unos pocos por aquello de 'que inventen ellos'.

Para que no os quedeis con mal sabor de boca, os dare algunas direcciones
utiles que os pueden servir tanto para profundizar un tema concreto como para
descargar herramientas automaticas.

		UTILIDADES

www.foundstone.com	
	SuperScan	Un scaner de puertos TCP muy popular bajo Windows
	FScan		Un scaner en linea de comando. Tambien bajo Windows

www.wiretrip.net/rfp/
	Whister		Un scaner para vulnerabilidades de web. Escrito en PERL

www.nstalker.com/stealth/
	Stealth Scanner	Scanner de vulnerabilidades de web.

www.nessus.org
	Nessus Scanner	Scanner de vulnerabilidades.

www.cerberus-infosec.co.uk
	Cerberus 	Scanner de vulnerabilidades de web y de bases de datos.

www.nextgenss.com
	Typhon I 	Similar a Cerberus

www.insecure.org/nmap/
	Nmap		Creo que es el mejor scanner que incluye todo tipo de
			servicios e identificacion de sistemas operativos


		LINK Y RECURSOS

http://www.packetstormsecurity.org
http://www.securityfocus.com
http://www.securiteam.com
http://neworder.box.sk
http://www.cert.org
http://www.wiretrip.net/rfp/


		HERRAMIENTAS AUTOMATICAS

Netcat	Herramienta para efectuar conexiones sin ningun tipo de interface. Es
	muy util para automatizar ataques o para ver codigos ocultos.

Whisker	Es un buscador de vulnerabilidades que corre bajo Unix y Windows. Puede
	utilizarse para realizar ataques de fuerza bruta.

Brutus	La ultima vez que lo busque lo encontre en www.hoobie.net/brutus
	Es uno de los automatas de ataque mas completos

Achilles
	Actua como un proxy, de forma que permite modificar la informacion que
	recibe antes de devolver la respuesta. Las posibilidades posibilidades
	son las siguientes :
		- Servidor proxy (puerto configurable)
		- Interceptacion de trafico HTTP y SSL
		- Insercion y modificacion de datos en linea
		- Recalculo de campos HTTP
		- Chequeo de buffer overflow
		- Registro de sesiones HTTP y SSL

Cookie Pal
	Se utiliza para controlar los cambios que se producen en los cookies 
	que recibimos.

Teleport Pro
	Muestra todas las referencias que existen bajo una direccion URL


 *EOF*