Hackeo de WAP

Hackeo de WAP

Resulta que para comenzar a trabajar cómodamente en entornos móviles en una red inalámbrica, es necesario tener clientes identificados. Además, cuando los servicios de terceros necesitan ser facturados, hay que crear algún tipo de identificador. Lo primero que hacemos es pensar que podemos identificar a un usuario de una aplicación por su MSISDN (número de teléfono), pero resulta que el operador no tiene permiso para ofrecer esa información a un tercero. Lo que puede hacer es crear una pasarela WAP desde la cual los teléfonos móviles acceden a los servidores de aplicaciones. Desde esa pasarela WAP, se puede añadir al encabezado alguna variable definida por el operador. Lo más normal es que el operador asigne como valor de esa variable un hash del MSISDN: md5, sha1, sha256, etc. Se utilizará en el proceso de suscripción como un ID.

El funcionamiento de estas herramientas de terceros suele ser el mismo cuando utilizan este método. Para suscribirse o cobrar por algún servicio, se hace a través de una URL de pago. Cuando el proxy WAP detecta que se intenta acceder a una de esas URLs, se notifica al cliente que se le va a cobrar un extra. El servidor de aplicaciones conoce la ID tan pronto como el cliente accede a la URL y la almacena en una base de datos.

Esta es la razón por la que muchas aplicaciones necesitan usar una conexión especial. Un primer ‘hack’ sería acceder a la URL añadiendo los argumentos necesarios nosotros mismos. Para ver los argumentos que nuestro proxy WAP inyecta, es tan simple como poner netcat a escuchar en el puerto 80 y leer las cabeceras:

# nc -l 80
GET / HTTP/1.1
...
cabeceras
...

Las cabeceras tienen el siguiente formato:

Nombre-Variable: valor

El siguiente paso sería registrarse en el servidor de aplicaciones, pero sin ser cobrado. Para esto, haremos la solicitud desde internet, con telnet.

Supongamos que la URL de suscripción es: http://wap.servidor.es/app/subscribe?session_id=346345347832146

$ telnet wap.servidor.es 80
Trying 10.10.10.10...
Connected to 10.10.10.10.
Escape character is '^]'.
GET /app/subscribe?session_id=346345347832146 HTTP/1.1
Host:  wap.servidor.es:80
User-Agent: telnet command appeared in 4.2BSD
Variable-ID: fa8853aa22023920e9f06d34a8536b8b_proxy23

Con esto, habríamos suscrito el ID fa8853aa22023920e9f06d34a8536b8b_proxy23. Como puedes ver en este ejemplo, hay ruido al final del hash. Ten en cuenta que puede estar en diferentes formas. En este caso, es “_proxy23”.

Supongamos que usan sha1, y el ruido es “local_” antes de la cadena. Lo que haríamos es registrar un ID así para el número 346232323232:

$ # generar el hash
$ sha1 -s "346232323232"
SHA1 ("346232323232") = 2f5e05a6a96866e11a0d5920e582bfb4f06e7cc6
$ # entonces el ID sería: local_2f5e05a6a96866e11a0d5920e582bfb4f06e7cc6

Lo correcto sería usar el hash que ellos usan, para que el proxy WAP inyecte el ID por nosotros, y como está registrado en el servidor de aplicaciones, podríamos usarlo como otro usuario registrado.

Puede haber otro punto de vista. Supongamos que alguien se ha registrado para un servicio restringido a muy pocas personas, y queríamos usarlo. Podríamos extraer su hash y modificar la aplicación para usar ese ID en el encabezado, pero también tendríamos que usar una conexión que no ponga un ID, sino que “sobrescriba” el que ponemos (es decir, una conexión directa a internet en lugar de proxy WAP).

En caso de que no pudiéramos averiguar cuál es el algoritmo de hash, o el ruido nos diera muchos problemas, podríamos registrar un ID inventado por nosotros en la base de datos. Para usar ese ID, también tendríamos que modificar la aplicación.

Tendríamos que descompilar una aplicación midlet y agregar un par de funciones que añadan un ID como el de la aplicación a los encabezados. Para descompilar la aplicación, debemos descargar el jar del midlet y descomprimir las clases.

$ unzip AppMvl.jar
   creating: META-INF/
  inflating: META-INF/MANIFEST.MF
   creating: com/
   creating: com/enterprise/
   creating: com/enterprise/AppMvl/
  inflating: com/enterprise/AppMvl/AppMvl.class
  inflating: com/enterprise/AppMvl/CoreComm.class
  inflating: com/enterprise/AppMvl/CoreGraph.class

Podemos usar JAD, un descompilador de Java. Es probable que los desarrolladores hayan ofuscado el código, pero para lo que vamos a hacer, no importa mucho.

$ # desde el directorio donde se encuentran los archivos .class
$ jad *.class

Esto generará varios archivos .jad, que son fuentes de Java. Necesitaremos buscar la parte de comunicaciones. En este ejemplo, parece claro que CoreComm.class maneja las comunicaciones.

Para las comunicaciones, se utilizan Conectores, y se usan de esta manera:

miConector.open("http://wap.servidor.es");

Deberíamos modificarlo a:

miConector.open("http://wap.servidor.es;variable=miID");

miID es el ID que hemos registrado en el encabezado de la solicitud o el de la persona que queremos suplantar.

Renombramos los archivos .jad a .java:

$ for i in *.jad; do mv $i \
          $(echo $i|sed -e s/\.jad/\.java/g); done

Y compilamos. Si quieres un buen IDE con compilador y todo, puedes descargarlo gratis desde: http://netbeans.org/

Cuando tenemos nuestro jar, lo instalamos y accedemos a internet directamente, no a través del proxy WAP. Con esto, podríamos usar la aplicación perfectamente.

Si el servidor de la aplicación está mal diseñado y no se toman medidas adecuadas en la URL de suscripción, podríamos intentar trabajar con la base de datos a través de SQL Injection y añadir, por ejemplo, el ID nulo.

Otro punto de vista…

Cracking MD5

Partimos del hecho de que conocemos cierta información. Asumimos que lo que se hash es el MSISDN. El MSISDN consta de 9 o 11 números (nunca hay caracteres). En caso de que sean 11 caracteres, comienzan con 346 en España, y si son 9, comienzan con 6. Podemos deducir cuáles podrían ser algunos de los siguientes dígitos, ya que los operadores dividieron los rangos que solo varían en casos particulares (portabilidad de operador). Puedes encontrar una lista en:

http://docs.linenoise.info/crackwap/prefijos.txt

Supongamos que alguien ha comprometido un servidor de aplicaciones y tiene una cantidad de IDs, y lo que quieren es extraer el MSISDN de alguien. Podrían intentar eliminar el ruido del ID y extraerlo descifrando md5 o lo que sea.

Descargamos mdcrack: http://membres.lycos.fr/mdcrack/download/mdcrack-1.2.tar.gz

Deberíamos modificar un poco el programa ya que ya conocemos algunos caracteres. Me estoy quedando sin tiempo, y tal… nos vemos luego.

No recuerdo haber leído nada sobre el funcionamiento del proxy WAP, o sobre las técnicas de “etiquetado” de clientes en WAP. Creo que actualmente hay un gran número de servicios vulnerables y la solución es complicada.

Además, algunos teléfonos móviles como Siemens no pueden salir a través del proxy WAP. Como solución alternativa, se puede enviar el IMEI como identificador. Si encontramos alguna aplicación que use este sistema, podríamos modificar el IMEI de nuestro móvil.

(Me divertí mucho escribiendo estas líneas, espero que tú también al leerlas)