martes, febrero 17, 2009

Ataque al UPnP en Red (y III)

Una Introducción a Miranda

Miranda es una herramienta de administración de UPnP escrita en Python. Incorpora una línea (shell) de comandos que soporta autocompletado e historial de últimos comandos, se puede guardar el trabajo en un archivo que puede ser recargado para su posterior análisis. También puedes alterar las configuraciones del programa sobre la marcha, y registrar todos tus comandos en un archivo log, de manera que puedas saber exactamente lo que ejecutaste y cuándo lo ejecutaste.

Miranda puede descubrir hosts UPnP tanto activamente como pasivamente, y con un simple comando pueden ser enumerados todos los tipos de dispositivos, servicios, acciones y variables. Las variables de estado del servicio pueden ser automáticamente correlacionadas con sus acciones asociadas, e identificadas tanto sus variables de salida y/o entrada para cada acción. Miranda almacena la información de todos los hosts en una estructura única de datos y te permite desplegar directamente toda la información y ver su contenido.

Finalmente, puedes ejecutar cualquier acción soportada por el host UPnP; si la acción requiere algún valor de entrada, se te informará su nombre y su tipo (string, 4 byte entero, 2 byte entero, etc), así como los valores permitidos o rangos de valores que el host UPnP ha suplido, y se te pedirá que ingreses el valor.




Descubriendo hosts UPnP con Miranda




Cuando inicias Miranda por primer vez, te llevará a una shell interactiva con un prompt ‘upnp>’ a la espera de ejecución de comandos. La primera cosa que probablemente quieras hacer es descubrir si hay algún host UPnP en tu red; esto puede ser realizado con los comandos ‘pcap’ o ‘msearch’. Cuando es ejecutado el comando ‘pcap’, Miranda se pondrá en escucha (modo pasivo) buscando mensajes SSDP NOTIFY, mientras que el comando ‘msearch’ consultará los dispositivos UPnP usando un mensaje M-SEARCH. Por defecto, ‘msearch’ buscará todos los dispositivos UPnP, pero también se le puede especificar que busque un determinado tipo de dispositivo o servicio si así se desea. En este ejemplo, simplemente buscaremos algún dispositivo:
Código:
upnp> msearch

Entering discovery mode for 'upnp:rootdevice', Ctl+C to stop...

****************************************************************
SSDP reply message from 192.168.0.1:5678
XML file is located at http://192.168.0.1:5678/igd.xml
Device is running Embedded UPnP/1.0
***************************************************************

Discover mode halted...

Aquí podemos ver que hay un host UPnP en la red, el cual resulta ser un router DI-524. También podemos ver que nos informa del tipo de servidor UPnP (’Embedded UPnP/1.0¿), y la ubicación del archivo XML raíz.

Ejecutando el comando ‘host list’ nos muestra la lista de todos los hosts UPnP descubiertos y el número índice de cada uno (el número índice es usado en los comandos para hacer referencia a un host específico, en el ejemplo queda más claro):
Código:
upnp> host list

[0] 192.168.0.1:5678

Aquí tenemos un host UPnP, ahora necesitamos enumerar sus capacidades. Ejecutando el comando ‘host get 0′ obtendremos toda la información UPnP del host con el índice 0:
Código:
upnp> host get 0

Requesting device and service info for 192.168.0.1:5678 (this could take a few seconds)...

Host data enumeration complete!

Ahora buscamos en todos los datos que hemos recogido de este host usando el comando ‘host info’. Este comando nos permite desplegar los datos del host interno de Miranda y ver la información que este almacena. Observa también que todos estos comandos se autocompletaran automáticamente, de manera que no tendrás que escribirlos por completo:
Código:
upnp> host info 0

xmlFile : http://192.168.0.1:5678/igd.xml
name : 192.168.0.1:5678
proto : http://
serverType : Embedded HTTP Server 3.23
upnpServer : Embedded UPnP/1.0
dataComplete : True
deviceList : {}

Código:
upnp> host info 0 deviceList

InternetGatewayDevice : {}
WANDevice : {}
WANConnectionDevice : {}

Código:
upnp> host info 0 deviceList WANConnectionDevice services WANIPConnection actions

AddPortMapping : {}
GetNATRSIPStatus : {}
GetGenericPortMappingEntry : {}
GetSpecificPortMappingEntry : {}
ForceTermination : {}
GetExternalIPAddress : {}
GetConnectionTypeInfo : {}
GetStatusInfo : {}
SetConnectionType : {}
DeletePortMapping : {}
RequestConnection : {}

Dependiendo del host, puede haber muchos datos en esta estructura, así que si quieres ver el resumen de los datos para un host en particular, ejecuta el comando ‘host summary’:
Código:
upnp> host summary 0

Host: 192.168.0.1:5678
XML File: http://192.168.0.1:5678/igd.xml
InternetGatewayDevice
manufacturerURL: http://www.dlink.com
modelName: D-Link Router
UPC: 123456789001
modelNumber: None
presentationURL: http://192.168.0.1:80
friendlyName: D-Link Router
fullName: urn:schemas-upnp-org:device:InternetGatewayDevice:1
modelDescription: Internet Access Router
UDN: uuid:upnp-InternetGatewayDevice-1_0-12345678900001
modelURL: None
manufacturer: D-Link
WANDevice
manufacturerURL: http://www.dlink.com
modelName: D-Link Router
UPC: 123456789001
modelNumber: 1
presentationURL: None
friendlyName: WANDevice
fullName: urn:schemas-upnp-org:device:WANDevice:1
modelDescription: Internet Access Router
UDN: uuid:upnp-WANDevice-1_0-12345678900001
modelURL: http://support.dlink.com
manufacturer: D-Link
WANConnectionDevice
manufacturerURL: http://www.dlink.com
modelName: D-Link Router
UPC: 123456789001
modelNumber: 1
presentationURL: None
friendlyName: WAN Connection Device
fullName: urn:schemas-upnp-org:device:WANConnectionDevice:1
modelDescription: Internet Access Router
UDN: uuid:upnp-WANConnectionDevice-1_0-12345678900001
modelURL: http://support.dlink.com
manufacturer: D-Link

El comando de resumen nos muestra todos los tipos de dispositivos que este host reporta, así como algún dato adicional relacionado con cada tipo de dispositivo. Si quieres ver toda la información que miranda almacena sobre un host en particular, lo puedes hacer con el comando ‘host details 0′. Sin embargo, la información que arroja este comando es generalmente bastante larga, probablemente quieras guardarla en un archivo y verla en un editor de texto; esto lo puedes hacer con el comando ’save info 0′:
Código:
upnp> save info 0 dl524

Host info for '192.168.0.1:5678' saved to 'info_dl524.mir'

El argumento ‘dl524′ es opcional; si no pones ninguna cadena como argumento, se usará el número índice en su lugar. Mientras que estemos en la sesión, también podemos guardar los datos que Miranda ha almacenado sobre todos los hosts que han sido descubiertos, de modo que después podamos cargarlos de nuevo e iniciar una nueva sesión:
Código:
upnp> save data session1

Host data saved to 'struct_session1.mir'

Enviado comandos UPnP con Miranda

Ahora vamos a explorar algunas de las acciones que podemos ejecutar en este dispositivo. Anteriormente cuando ejecutamos el comando ‘host info’, listamos todas las acciones disponibles para el servicio WANIPConnection que está asociado con el dispositivo WANConnectionDevice; vamos a verlas otra vez:
Código:
upnp> host info 0 deviceList WANConnectionDevice services WANIPConnection actions

AddPortMapping : {}
GetNATRSIPStatus : {}
GetGenericPortMappingEntry : {}
GetSpecificPortMappingEntry : {}
ForceTermination : {}
GetExternalIPAddress : {}
GetConnectionTypeInfo : {}
GetStatusInfo : {}
SetConnectionType : {}
DeletePortMapping : {}
RequestConnection : {}

Como puedes ver, este servicio es el que soporta las acciones AddPortMapping y DeletePortMapping, así como algunas otras que parecen interesantes. Primero intentaremos ejecutar la acción GetExternalIPAddress; esto se puede hacer con el comando ‘host send’. Para ejecutar un comando, debes indicar el número índice del host, el nombre del tipo de dispositivo que soporta el servicio, el nombre del servicio que soporta la acción, y el nombre de la acción que quieras ejecutar (de nuevo, todos estos campos se autocompletan, no es mas que escribir mientras se va mirando)
Código:
upnp> host send 0 WANConnectionDevice WANIPConnection GetExternalIPAddress

NewExternalIPAddress : 68.12.34.56

‘NewExternalIPAddres’ es el nombre de la variable asociada con esta acción, y ‘68.12.34.56′ es el valor devuelto para esa variable por el IGD. Algunas acciónes tienen varias variables asociadas con ellas; estas variables pueden ser tanto de entrada (valores que le pasamos al IGS) o de salida (valores devueltos por el IGD). En el caso de la acción GetExternalIPAddress, solo hay una variable de salida. Sin embargo, si hay alguna variable de entrada disponible para una acción, Mirando nos pedirá que introduzcamos estos valores antes de enviar la acción. Toda la información de la variable puede ser enumerada/vista usando los comandos ‘host info’ o ‘host details. No tenemos que tener ningún conocimiento sobre estas variables antes de ejecutar las acciones UPnP.

Intentemos mapeando el puerto 8080 en la WAN para abrir la interfaz administrativa que está en el puerto 80 del IGD (192.168.0.1):
Código:
upnp> host send 0 WANConnectionDevice WANIPConnection AddPortMapping

Required argument:
Argument Name: NewPortMappingDescription
Data Type: string
Allowed Values: []
Set NewPortMappingDescription value to: All your ports are belong to us

Required argument:
Argument Name: NewLeaseDuration
Data Type: ui4
Allowed Values: []
Set NewLeaseDuration value to: 0

Required argument:
Argument Name: NewInternalClient
Data Type: string
Allowed Values: []
Set NewInternalClient value to: 192.168.0.1

Required argument:
Argument Name: NewEnabled
Data Type: boolean
Allowed Values: []
Set NewEnabled value to: 1

Required argument:
Argument Name: NewExternalPort
Data Type: ui2
Allowed Values: []
Set NewExternalPort value to: 8080

Required argument:
Argument Name: NewRemoteHost
Data Type: string
Allowed Values: []
Set NewRemoteHost value to:

Required argument:
Argument Name: NewProtocol
Data Type: string
Allowed Values: ['TCP', 'UDP']
Set NewProtocol value to: TCP

Required argument:
Argument Name: NewInternalPort
Data Type: ui2
Allowed Values: []
Set NewInternalPort value to: 80

La acción AddPortMapping recibe varios valores, pero hay unos puntos importantes que deben ser mencionados:

1. Los valores Booleanos son ‘1′ (verdadero) o ‘0′ (falso)
2. El argumento NewProtocol solo permite dos valores, ‘TCP’ o ‘UDP’
3. No especificamos ningún valor para la variable NewRemoteHost, la cual permite que todos los hosts remotos coincidan con esta asignación de puertos.

No recibimos ningún dato porque la acción AddPortMapping no tiene ninguna variable de salida definida (de nuevo, toda esta información es almacenada en la estructura de datos, si tienes curiosidad). Sin embargo, podemos verificar que la acción fue ejecutada exitosamente lanzando la acción GetSpecificPortMappingEntry:
Código:
upnp> host send 0 WANConnectionDevice WANIPConnection GetSpecificPortMappingEntry

Required argument:
Argument Name: NewExternalPort
Data Type: ui2
Allowed Values: []
Set NewExternalPort value to: 8080

Required argument:
Argument Name: NewRemoteHost
Data Type: string
Allowed Values: []
Set NewRemoteHost value to:

Required argument:
Argument Name: NewProtocol
Data Type: string
Allowed Values: ['TCP', 'UDP']
Set NewProtocol value to: TCP

NewPortMappingDescription : All your ports are belong to us
NewLeaseDuration : 0
NewInternalClient : 192.168.0.1
NewEnabled : 1
NewInternalPort : 80

Ahora podemos borrar el puerto mapeado con la acción DeletePortMapping. Igual que AddPortMapping, la acción DeletePortMapping no devuelve ningún dato a menos que haya ocurrido un error:
Código:
upnp> host send 0 WANConnectionDevice WANIPConnection DeletePortMapping

Required argument:
Argument Name: NewProtocol
Data Type: string
Allowed Values: ['TCP', 'UDP']
Set NewProtocol value to: TCP

Required argument:
Argument Name: NewExternalPort
Data Type: ui2
Allowed Values: []
Set NewExternalPort value to: 8080

Required argument:
Argument Name: NewRemoteHost
Data Type: string
Allowed Values: []
Set NewRemoteHost value to:

Hay una gran multitud de otras acciones interesantes, como por ejemplo ForceTermination, la cual provoca la caída de la conexión WAN del router. Vale la pena explorar los varios servicios y acciones para cada dispositivo que estés auditando.

Conclusión

Si bien, UPnP es un protocolo que pocos entienden, está activo en una amplia mayoría de redes caseras, e incluso también en algunas redes corporativas. Muchos dispositivos soportan UPnP para facilitar el uso a los consumidores, sin embargo, a menudo soportan acciones que ningún servicio debería de estar posibilitado de ejecutar automáticamente, y especialmente sin ninguna autorización. Peor aún, la implementación del protocolo en sí rara vez es construido con una mentalidad prioritaria en la seguridad, dejándolo abierto a futuros ataques.

La mejor defensa contra los ataques UPnP tanto locales como remotos es simplemente deshabilitarlo en algunos/todos los dispositivos de la red. Sin embargo, considerando que este protocolo y otros protocolos “medio-magicos” están diseñados para ayudar a Pepito, quién probablemente esté inconsciente de los peligros de tales protocolos, la única verdadera solución es que los vendedores sean mas atentos en sus diseños, y sus implementaciones, más seguras.

Fin de la 3 y última Parte.

Tradud. de CarmeloC del art.: http://www.ethicalhacker.net/content/view/220/24/

lunes, febrero 16, 2009

Ataque al UPnP en Red (II)

Panorama del Protocolo UPnP

El protocolo UPnP utiliza la dirección de multidifusión 239.255.255.250 y el puerto TCP 1900. Los dispositivos que ofrecen servicios UPnP periódicamente envian NOTIFICACIONES SSDP al 239.255.255.250:1900, anunciandose a sus clientes que están escuchando. Si ves el tráfico en tu LAN con un router UPnP, es muy probable que notes como evía ráfagas de avisos de NOTIFICACION SSDP cada pocos segundos, es porque la mayoría de los rOuters actuales se anuncian como múltiples dispositivos UPnP, y envian una notificación por cada tipo de dispositivo.

Del mismo modo, los clientes UPnP pueden enviar requerimientos SSDP M-SEARCH al 239.255.255.250:1900 para ver si alguno dispositivos UPnP responden. Los Clientes pueden enviar un "requerimiento" M-SEARCH buscando algún dispositivo UPnP cualquiera, o pueden especificar que están buscando un dispositivo UPnP en particular, o pueden hacer "requerimientos" sólo a dispositivos UPnP que soporten un tipo de servicio determinado. Los hosts UPnP en los que coincidan el dispositivo-servicio con los solicitados van a responder con un mensaje de RESPUESTA SSDP, que contiene la misma información enviada en un mensaje de NOTIFICACION SSDP.

Un mensaje de NOTIFICACION SSDP es enviado por el host UPnP que contiene una cabecera de 'Localización' donde especifica la ubicación de un archivo XML. Este archivo XML contiene datos que indican, entre otras cosas, el tipo (s) de dispositivo UPnP y los servicios soportados por el host, así como rutas adicionales a los documentos XML que describen los diversos servicios en detalle. Para descubrir todas las capacidades de un IGD UPnP, hay que analizar todos los archivos XML para extraer los tipos de dispositivos, servicios y acciones que ofrece el IGD.



Los dispositivos UPnP tienen varios servicios que avisan del tipo de acciones que soportan. Un cliente UPnP puede enviar una solilcitud a un dispositivo UPnP en cualquier momento, lo que podría ser una solicitud para abrir un puerto, cambiar el servidor DNS por defecto, o cualquier otra cosa con el que el dispositivo sea compatible con UPnP. Los datos de entrada y salida de las acciones solicitadas se envían utilizando SOAP, que utiliza XML para estructurar la información enviada entre dos partes. Las peticiones SOAP son fundamentalmente peticiones "HTTP POST", con algunas cabeceras SOAP adicionales incluidas en las cabeceras HTTP.

Auditando manualmente los dispositivos UPnP

Para descubrir si un router es compatible con UPnP, puedes ir a la interfaz de administración del router, y comprobar si hay una opción para activar o desactivar UPnP, mientras que la mayoría de los routers tienen UPnP habilitado por defecto, algunos no lo hacen.

En realidad para auditar la configuración de un dispositivo UPnP, tienes que instalar y ejecutar el programa Wireshark (u otro husmeador) y buscar por paquetes de NOTIFICACION SSDP enviados a la dirección de multidifusión 239.255.255.250 en el puerto 1900; estas notificaciones serán dispositivos UPnP anunciandose a la red. Una vez que los mensajes de NOTIFICACION SSDP son capturados, puede examinar las cabeceras SSDP del volcado (dump) del Wireshark para obtener la ubicación del archivo XML raiz. Una vez que consigues ese archivo (simplemente a través de una petición HTTP GET), se puede examinar para ver qué dispositivos y servicios soporta ese host UPnP. A continuación, puedes solicitar otros archivos XML adicionales desde el host (un archivo por cada servicio) y analizar esos documentos XML para determinar qué acciones soporta cada servicio y, a continuación, correlacionar cualquier estado de las variables (variables de entrada y salida) que utiliza cada acción, así como la identificación de las variables que se utilizan para la entrada, y la que se utiliza para la salida (una acción puede utilizar una variable como un parámetro de entrada, mientras que otra utiliza la misma variable como un parámetro de salida).

Obviamente, la auditoría de hosts UPnP manualmente puede necesitar mucho tiempo y nos obliga a generar las solicitudes a dispositivos UPnP de forma manual para ejecutar acciones UPnP en contra de ellos. Utilizando una herramienta para automatizar el proceso hace que todo sea más fácil.

Fin de la segunda Parte. En la tercero empiezo con el programa Miranda.

Carmelo C.

Ataque al UPnP en Red (I)

Universal Plug-n-Play (UPnP) es un protocolo que permite a diversos dispositivos de red autoconfigurarse a sí mismos. Uno de los usos más comunes de este protocolo es permitir que los dispositivos o programas abran puertos en tu router para poder comunicarse correctamente con el mundo exterior (Xbox, por ejemplo, hace esto). El protocolo UPnP se construye encima de los protocolos y especificaciones pre-existentes, en particular, UDP, SSDP, SOAP y XML.

En este artículo se abordan algunas de las cuestiones de seguridad relacionadas con UPNP, se describe brevemente el funcionamiento interno del protocolo, y se muestra cómo identificar y analizar los dispositivos UPnP en una red utilizando herramientas de código abierto. Si bien se centra específicamente en IGDs (dispositivos de puerta de enlace a Internet, alias, routers), es importante recordar que hay muchos otros dispositivos y sistemas que también soportan UPNP, y pueden ser vulnerables a ataques similares.

El Problema de UPnP

Permitiendo que programas legítimos modifiquen la configuración de su router, como lo necesiten, hacen al usuario Pepito la vida mucho más fácil - por desgracia, también hace que la vida de Paquito hacker sea más fácil, también. Para que UPnP sea verdaderamente "plug-n-play", no hay autenticación incorporada en el protocolo, cualquier programa puede utilizar UPnP para modificar la configuración del router (o cualquier otro dispositivo UPnP).



A principios de este año, PDP (de los famosos GNUCITIZEN) publicó la investigación que había realizado en relación con la seguridad de UPnP. Si bien los problemas de seguridad con UPnP no es nada nuevo, es un protocolo que normalmente sólo se ejecuta dentro de una red local, obligando a un atacante infiltrarse en la red local antes de poder explotar cualquier vulnerabilidad de UPnP. Sin embargo, PDP demostró que era posible utilizar Flash para enviar solicitudes UPnP desde el navegador de un cliente local a un router con UPnP habilitado y cambiar la configuración del cortafuegos del router. Dado que el archivo Flash puede ser integrado dentro de una página preparada de manera maliciosa, o inyectado en una página de confianza a través de XSS o inyección de SQL, un atacante de forma remota podría aprovechar esto para alterar la configuración de un router. Lo peor de todo es que en la mayoría de los casos, estos cambios de configuración en el router no se reflejan en su interfaz administrativa, dejando a la víctima completamente ignorante de que haya ocurrido nada.

Por supuesto, para las redes inalámbricas UPnP es peligroso incluso sin el ataque de Flash al navegador, un atacante puede estar físicamente a distancia de la red al mismo tiempo que intenta introducirse en la red interna. Una vez dentro, puede comenzar a alterar la configuración del router a través de UPnP.

¿Cómo es Esto de Grave?

La gravedad de este ataque depende de la aplicación UPnP utilizada por el router, así como de su configuración. Por ejemplo, la alteración de la configuración mediante el ataque Flash descrito anteriormente tendría que adivinar la dirección IP del router algo bastante previsible, pero algunos routers también asignan sus propios nombres de host que toman una dirección IP cualquiera de trabajo. Sin embargo, incluso si un router no resuelve el nombre de host, la seguridad a través de la oscuridad no es buena práctica, y un simple cambio de la dirección IP por defecto de un router no debe considerarse suficiente defensa contra un ataque de este tipo.

Además, unas implementaciones de UPnP tienen más riesgo que otras; varios IGDs con UPnP habilitado permiten alterar la configuración de las DNS directamente a través de UPnP, simplemente con un ataque de phishing MITM (?). Otros, en particular los dispositivos que utilizan alguna forma de Linux embebido, actualmente usan los valores "no-sanitizados" que reciben a través del UPnP como parte de la ejecución de comandos de la shell, dejándolos abiertos a los ataques de inyección de comandos. Aqui se encuentra Una lista de algunos routers vulnerables.

Bien, digamos que ningún nombre de host resuelve la IP del router, y su aplicación UPnP no es vulnerable al secuestro de DNS o la inyección de comandos. Lamentablemente, no estamos fuera de peligro aún, recuerda que el uso más común de UPnP es abrir puertos al router. Debido a esto, casi todos los enrutadores que admiten UPnP tambien soportan AddPortMapping, lo que en esencia permite que un dispositivo o software le diga al router "el tráfico entrante desde internet al puerto X del router lo envias a un host interno que está escuchando en el puerto Z". Bueno, ¿y si nos reenvía el tráfico del puerto 8080 de la WAN a yahoo.com en el puerto 80? Lo sé, lo sé, yahoo.com no es un host de la red interna! Sin embargo, algunas implementaciones de UPnP no comprueban que están remitiendo a un host interno, lo que permite a un atacante mandar su tráfico a través del router. Además, si el atacante sabe la IP interna del router o el nombre del host, puede ser capaz de conectar cualquier puerto de la WAN del router al puerto 80 del la LAN del router, de manera efectiva abriéndo la interfaz de administración del router para todo el mundo.

Hasta aqui la Primera Parte.