sábado, 22 de marzo de 2008

Bug2 and exploit2 for destar

Destar es una interfaz web (programada en python) para manejar Asterisk.
La parte interesante es que unos colombianos son los que han estado liderando el proyecto en los ultimos años. (Buena por esa!!!).

Este otro bug lo encontre despues de encontrar el primero, antes de que se acabaran los caballeros del zodiaco y cuando ya tenia mucho sueño.

Este bug es un poco mas peligroso que el anterior, pues no se requiere tener usuario valido dentro de destar para ingresar como "administrador".

Se encuentra en el archivo Publisher.py, el cual maneja la conexión entrante.
exactamente en las líneas:

65
66 # Determine IP of originator, keep Squid in mind :-)
67 try:
68 ip = request.environ['HTTP_X_FORWARDED_FOR']
69 except:
70 ip = request.environ['REMOTE_ADDR']
71

Cual es el problema?, el problema puede ser no manejar sesiones, sabiendo que el quixote las soporta. segun el autor (que no los colombianos):

22 DeStarPublisher also has it's own session management. For simplicity, I put
23 the session stuff directly into the Publisher object, so I don't use
24 Quixote's classes 'Session' and 'SessionPublisher'.
25
26 Reasons:
27
28 a) they set a cookie, some browsers don't allow cookies
29
30 b) if you stop and start DeStar (which happens very often during
31 Development) Quixote's session handler would give you ugly error messages
32
33 c) Keeping the session data in the publisher object scales quite ok, because
34 DeStar will usually only be used inside the LAN anyway
35
36 But keep in mind that a session here is not a (user, host, browser_process)
37 tuple, but a (user, host) tuple.
38
39 TODO: the default implementation provided here is not persistent. There is
40 also no cleanup code to remove old sessions.
41
42
43 The Session holds several values:
44
45 request.session.user User name
46 request.session.level User level (0=disabled/not logged in
47 1=normal PBX user
48 2=PBX Administrator
49 3=PBX Configurator
50 4=Programmer
51 request.session.language User language

O sea que la cookie que conocemos normalmente se reemplaza por una dupla (ip,usuario). Esto no es del todo malo, si se toman las precauciones del caso.

Pero ...

El primer llamado lo hace a una variable que se encuentra en los encabezados y se llama: HTTP_X_FORWARDED_FOR

Como todos sabemos desde el colegio, esta variable se añade a las comunicaciones cuando hay proxies de por medio. Que pasaria entonces si le hacemos creer a destar que pasamos por un proxy y por eso llevamos esa variable puesta?

Uhmmm ...

Que el software creeria que nuestra IP es igual a lo que pongamos en la variable y ya tendriamos control. (yo se que tu tambien lo pensaste!)

Si un usuario tiene control de las variables internas, lo tiene todo.

Una vez conseguida la IP, creamos una sesión valida.

95 session.language = 'en'
96 else:
97 for user in users:
98 if user.pc == ip:
99 session.user = user.name
100 session.level = int(user.level)
101 session.phone = user.phone
102 session.language = user.language
103 break
104
105 language.setLanguage(session.language)
106 session.lastaccess = t
107 request.session = session

El for de la linea 97 lo que hace es buscar el primer usuario que tenga la IP que acabamos de ingresar por medio de la variable HTTP_X_FORWARDED_FOR
por lo tanto si queremos hacer un "auto login" solo necesitamos saber la IP de un usuario validado en el sistema y ponerla en la variable. :)

Pero para poner las cosas mejor, cuando se monta el software, destar trae un usuario por omisión que no tiene variable "pc" configurada.

Por lo tanto para el script esta variable tiene un valor ="" (nulo), entonces si hacemos un script que ponga la HTTP_X_FORWARDED_FOR="", estariamos ingresando como usuario administrador (Configurator). !Simple lógica!

Listo eso es todo, una posible solucion es validar las cadenas de entrada y obviamente mejorar el script que captura la IP.

Un ejemplo del uso del exploit:

debian:~# python destar_exploit2.py
Target host: i.e: http://127.0.0.1:8080/
Target host ( include http and /): http://127.0.0.1:8080/
Ok, now go and test your user at: http://127.0.0.1:8080/

Y ya tenemos un usuario valido en ese sistema. Si quieres cambiar los parámetros por defecto configura el exploit, estudialo, portate bien, no hagas daños, estos exploits son pruebas de concepto, solo buscan que aprendas un poco, nada mas.

Nos vemos en la próxima (cuando tenga tiempo) ...

Entradas populares