Detectando celdas falsas GSM/GPRS con Cell Analysis
Introducción
Durante este último año, investigando los ataques y vulnerabilidades en la red GSM, me di de bruces con el ataque de la estación falsa BTS. Este consiste en un ataque "Man In The Middle" tradicional, en el que el atacante sitúa su propia antena entre nuestro terminal y la red. La base para que este ataque sea factible son dos vulnerabilidades muy sencillas:
Nuestro terminal NO autentifica la red GSM a la que se conecta, la supone segura.
El terminal se conecta siempre a la celda que mejor nivel de señal le proporcione.
Este tipo de ataques han sido documentados en varias conferencias de seguridad; BlackHat 2011, CCC, DefCon, etc. Como muestra el video de DefCon 18, de Chris Paget, "Practical Cellphone Spying"
Esto además se complica (o mejora para los posibles atacantes) al poder crear una celda falsa utilizando únicamente un teléfono compatible con osmocom y el software OpenBTS u Osmo-BTS. Ya no es necesario ningún hardware caro ni raro de conseguir, ni soldar y des-soldar las placas del USRP1, ni una BTS real: sólo un teléfono Osmocom.
¿Cómo protegernos de estos ataques?
El equipo de SRLabs (Karsten Nohl) ha creado la herramienta catchercatcher http://opensource.srlabs.de/projects/catcher para detectar posibles ataques, tal y como publicaron en el 28C3, basándose por supuesto en OsmocomBB. Cuando lo he probado, hay algo que no me ha gustado: para que el software detecte los ataques necesitamos ejecutar el programa con una tarjeta SIM dentro del teléfono. ¿Qué pasa si me quiero desplazar a otro sitio? ¿Dejo de detectar posibles ataques? Lógicamente la necesidad de la tarjeta SIM tiene su explicación, ya que con este programa también se detectan los famosos SMS invisibles (para lo cual necesitamos estar registrados en la red GSM).
Respetando la idea de SRLabs he creado un proyecto nuevo: Cell Analysis, con un fin claro y sencillo: detectar celdas falsas (BTS falsas, IMSI Catcher o BTS Rogue, como queráis llamarlo). Para ello necesitaremos un teléfono osmocom y no vamos a utilizar ninguna tarjeta SIM, escanearemos todas las celdas independientemente de la operadora a la que pertenezcan.
La base de la detección es precisamente que una celda falsa nunca llevará el mismo tráfico de control que una celda real. ¿Qué es tráfico de control? En el standard GSM se han definido canales lógicos para transmitir y recibir la información según una jerarquía de canales:
Dentro del canal de control común ("CCCH") nos vamos a fijar en el canal de Paging ("PCH"), que es el que la red GSM utiliza para alertar a los abonados que tienen un servicio pendiente de entrega, donde el servicio será una llamada, un mensaje corto, etc. ¿Y que tiene una celda falsa que decirles a sus abonados? ... Nada o muy poco.
A continuación muestro dos capturas realizadas del tráfico del canal de control común en celdas de cada tipo: real y falsa:
Fijaros bien en el contenido de los mensajes "Paging Request", porque en el caso de la celda falsa el campo "Mobile Identity" está siempre o casi siempre vacío, puesto que no hay usuarios reales a los que anunciarles la entrega de servicios. El porcentaje de mensajes sin un TMSI o un IMSI no puede apreciarse en la captura de pantalla, pero si en la celda falsa no hay ningún teléfono conectado será del 100%. Sin embargo en una celda real el campo "Mobile Identity", la mayor parte de la veces llevará un TMSI o IMSI en porcentajes elevados. Dependiendo de la hora del día, de la celda, de la operadora y más parámetros, variará el valor del porcentaje de mensajes de "Paging Request" con un abonado, pero nunca alcanzará el valor de la celda falsa.
Este análisis es el que va a realizar el programa para cada celda que encuentre y lo hará continuamente cada 10 minutos, hasta que decidamos parar la aplicación. Para cada una de las celdas que no son falsas, generará un fichero CSV con la fecha y hora así como los valores de abonados conectados y potencia con la que el teléfono osmocom recibe la señal de esa celda. Con cada celda falsa que encuentre enviará a una cuenta de correo configurada previamente un email de alarma. Por último, aquellas medidas que hayan tenido demasiados errores ("Dropping Frames", "BURST IND", etc) serán ignoradas guardándose en un tercer fichero de medidas ignoradas.
Para descargar Cell Analysis, esta es la web http://www.fakebts.com/ donde además podéis encontrar las instrucciones para instalarlo y configurarlo correctamente.
Test de Cell Analysis
Para probar la detección he elegido el escenario más simple, dos teléfono osmocom; uno corriendo Cell Analysis (monitorizando el tráfico) y el otro corriendo el SW de transmisión con OpenBTS (transmitiendo una celda falsa).
NOTA IMPORTANTE: transmitir en el espectro de frecuencias asignado a GSM es un delito, esta prueba debe ser llevada a cabo con una jaula de faraday para aislar el alcance de nuestra transmisión.
Una vez la celda falsa queda definida y configurada con valores reales (MCC 214, MNC 22 y ARFCN 1), tal y como se haría en un ataque real, el segundo teléfono osmocom empieza a transmitir:
El primer teléfono empieza a ejecutar Cell Analysis. Observar en la segunda ventana (al frente) el listado de las celdas que ha encontrado el teléfono y fijaros en la tercera celda (es la falsa):
Cuando Cell Analysis realiza el siguiente paso, que es la monitorización del trafico del canal de control común, sólo encuentra los mensajes "System Information" SI1 y SI3, pero no encuentra ningún abonado en la celda:
Por lo que se genera una alarma correspondiente en un fichero CSV y se envía por correo.
Conclusiones
- Como hemos visto, sí se pueden detectar sin problemas las celdas falsas y avisar para, desde luego apagar cualquier teléfono que pueda ser víctima del ataque ya que en nuestros terminales no podemos forzar o elegir a qué celda se deben conectar, lo harán a la que mejor señal les entregue.
- Cell Analysis también genera ficheros CSV para las celdas que no son falsas con medidas de potencia y número de abonados acampados en ella. Se pueden visualizar los resultados en Excel de manera muy sencilla:
- En toda monitorizacíón hay un parámetro que mide la eficacia: la cantidad (o ausencia) de alarmas falsas generadas. Durante semanas he tenido corriendo el programa y no ha detectado ninguna alarma falsa, pero lógicamente es más que probable que esto pueda suceder. Por ejemplo: si una celda real tiene una avería y momentáneamente los abonados no pueden acampar en ella, sus "Paging Request" estarán vacíos.
Sobre FakeBTS.com
- El proyecto Cell Analysis se encuentra recogido en la web fakebts.com donde seguiré actualizando siguientes versiones con mejoras pendientes de implementar:
Pequeño interfaz web para comprobar el estado de la monitorización y gestionar las alarmas
Recoger las medidas de las celdas con "rrdtool" para mostrar gráficas en el interfaz web en tiempo real
Crear paquetes .deb para facilitar la instalación en Ubuntu
Portar el proyecto a la plataforma ARM (Raspberry Pi)
Seguir investigando distintas celdas falsas en busca de nuevos retos a detectar
Autor: Pedro Cabrera