
Exploit automatizado en Perl para CVE-2021-33831 dirigido al registro de usuarios no autenticados y la creación de visitas en una aplicación web universitaria de rastreo de contactos, demostrando la creación masiva de cuentas y la denegación de servicio.
La aplicación se utiliza para rastrear personas según las leyes de infección alemanas para poder rastrear cadenas de infección de COVID-19. Fue creada por un proyecto estudiantil llamado iCampus y se utiliza no solo en la universidad de Wildau sino también en Cottbus-Senftenberg. Alrededor de 10.000 personas están afectadas. Se requiere que los invitados de las universidades usen esta aplicación.
La aplicación consta de un frontend Vue y un backend Laravel.
El backend expone el endpoint de registro de usuarios invitados /corona-app-backend/api/account/register
que permite el registro de invitados de la universidad. Los miembros de la universidad pueden iniciar sesión usando su combinación de nombre de usuario/contraseña de inicio de sesión único.
Este endpoint de registro no está protegido contra la creación automatizada de usuarios (por ejemplo, mediante un captcha). Una vez que un programa obtiene una cookie csrf a través de /corona-app-backend/sanctum/csrf-cookie y un token de sesión a través de /corona-app-backend/account, puede crear usuarios. Tantos como quiera. Durante todo el tiempo que quiera. Demasiados usuarios falsos hacen que sea prácticamente imposible para una organización de salud rastrear las cadenas de infección, lo que convierte esto en un tipo de ataque de denegación de servicio.
El registro de un usuario es un POST al endpoint de registro que contiene la cookie csrf y el token de sesión con el siguiente payload json:
{"first_name":"John","last_name":"Doe","telephone":"099182","email":null,"accept":true}
Se debe establecer el campo email o el teléfono. Ambos no se verifican (aparte de las comprobaciones de sintaxis).
Con una sesión de usuario válida, se pueden crear visitas (registros de entrada en salas) a través del endpoint /corona-app-backend/api/visit
Una visita es un POST al endpoint de visitas que contiene la cookie csrf y el token de sesión con el siguiente payload json:
{"room":"15-K01","visited_on":"2021-05-09T22:01:00.000Z","exited_on":"2021-05-10T21:59:00.000Z"}')
El valor del campo room se puede obtener de una lista que se puede recuperar del endpoint de salas /corona-app-backend/api/rooms y entrega un json con todas las salas de la universidad. Solo se necesita la cookie csrf y el token de sesión para que la llamada tenga éxito.
El problema se puede comparar con CVE-2021-33840 pero va mucho más allá.
Además, la aplicación no contiene ningún cifrado en las partes frontend/backend (aparte del cifrado de transporte a través de https). El backend recibe datos json sin cifrar y entrega datos json sin cifrar.
El código de explotación completamente automatizado en lenguaje Perl crea 500 usuarios (a partir de bases de datos de nombres aleatorios) con números de teléfono aleatorios pero de apariencia válida, y todos los usuarios se registran en una sola sala. Completamente automatizado. Se insertó un retardo de 5s/solicitud para no sobrecargar el servidor y no activar ninguna protección que pudiera haber existido. El exploit se ejecutó de forma totalmente automatizada con éxito y reporté el problema, incluidos los usuarios falsos creados, a la universidad ese mismo día.
Antes de elegir una sala, me aseguré de que la sala no hubiera sido visitada ese día. Esto es posible porque la aplicación contiene un contador de con cuántas personas se ha estado en contacto en una sala específica. Entonces, si uno visita una sala y ese contador es 0, nadie más estuvo en esa sala durante ese período de tiempo.
La aplicación también se vio afectada por un RCE de CVE-2021-3129 que reporté el 12.04.2021 a la universidad.
El problema actual se reportó el 31.05.2021.
Para ambos reportes recibí un correo de confirmación de recepción al día siguiente de haberlos reportado. No recibí nada más después.
Una solicitud del código fuente de la aplicación está en curso.