Sploitus

Exploit for CVE-2026-13610

githubexploit · 2026-08-15

Exploit Code

README83 lines
## https://sploitus.com/exploit?id=CBD72344-F142-56B5-8556-306D865B45EF
# CVE-2026-13610 — KiviCare – Clinic & Patient Management System ≤ 4.5.1

*Improper Privilege Management* pada endpoint registrasi REST API tanpa autentikasi.

> **English abstract:** The unauthenticated registration endpoint
> `POST /wp-json/kivicare/v1/auth/register` in the KiviCare WordPress plugin
> (≤ 4.5.1) accepts a `user_role` parameter from the request body and lets an
> anonymous attacker create **doctor** (`kiviCare_doctor`) or **receptionist**
> (`kiviCare_receptionist`) accounts with a self-chosen password, mapped into a
> clinic of the attacker's choice. The permission callback performs no
> authentication, no nonce check, and falls through to `return true` by
> default; the `patient_role_only` parameter is declared but never enforced.
> The result is unauthenticated access to patient PHI (appointments,
> encounters, prescriptions, billing) and a valid wp-admin foothold.

## Isi repository

| File | Isi |
|---|---|
| [`LAPORAN-CVE-2026-13610.md`](LAPORAN-CVE-2026-13610.md) | Laporan teknis lengkap (bahasa Indonesia): entry point, rantai penugasan role, bypass, verifikasi live, rekomendasi perbaikan |
| [`poc-cve-2026-13610.py`](poc-cve-2026-13610.py) | PoC: membuat akun dokter/resepsionis tanpa autentikasi + verifikasi login REST |
| [`preflight.py`](preflight.py) | Cek pra-eksploitasi: handshake E2EE + dump pengaturan registrasi target |
| [`verify-impact.py`](verify-impact.py) | Pembuktian dampak: login sebagai akun hasil eksploitasi + baca data klinis via API staf |

## Ringkasan teknis

1. **Entry point** — `AuthController::registerRoutes()`
   (`app/controllers/api/AuthController.php:237–242`) mendaftarkan
   `POST /auth/register` dengan
   `permission_callback => checkRegistrationPermission`.
2. **Permission callback tanpa autentikasi** — `checkRegistrationPermission()`
   (`AuthController.php:602–650`): tidak ada `is_user_logged_in()`, tidak ada
   cek nonce/kapabilitas, dan berakhir dengan **`return true`** secara default
   (gagal deny-by-default).
3. **Role dari input** — whitelist `user_role`
   (`AuthController.php:390–404`) menyertakan `kiviCare_doctor` dan
   `kiviCare_receptionist`, bukan hanya `kiviCare_patient`.
   `patient_role_only` dideklarasikan (`:440–448`) tetapi **tidak pernah
   dipakai** di handler.
4. **Akun dibuat aktif** — `wp_insert_user()` lalu
   `setRole('kiviCare_doctor')` (`app/models/KCDoctor.php:136`,
   `app/models/traits/KCWPUser.php:33–92`).
5. **Transport E2EE** — plugin mengenkripsi body REST (X25519-XSalsa20-Poly1305),
   tetapi handshake-nya (`server-key`, `config/register-key`) terbuka untuk
   siapa pun (`ConfigController.php:190–205`), sehingga enkripsi bukan
   penghalang bagi penyerang.

## Cara menjalankan

```bash
pip install requests pynacl

# 1. (opsional) cek konfigurasi target
python preflight.py http://target.local

# 2. buat akun dokter tanpa autentikasi
python poc-cve-2026-13610.py --url http://target.local \
    --username attacker --email attacker@evil.example --password 'P@ssw0rd-123!'

# 3. (opsional) buktikan akses data klinis
python verify-impact.py --url http://target.local \
    --username attacker --password 'P@ssw0rd-123!'
```

PoC mendeteksi otomatis mode transport target (JSON polos / E2EE terenkripsi)
dan melakukan enumerasi ID klinik bila tidak diberikan.

## Mitigasi

1. Paksa peran `kiviCare_patient` untuk pendaftar tanpa autentikasi.
2. Pindahkan pembuatan akun staf ke endpoint admin ber-nonce.
3. Ubah kebijakan default menjadi **menolak** di `checkRegistrationPermission`.
4. Wajibkan `recaptchaToken` ketika reCAPTCHA diaktifkan.

Detail lengkap: [LAPORAN-CVE-2026-13610.md](LAPORAN-CVE-2026-13610.md) bagian 10.

## Disclaimer

Materi ini hanya untuk **riset keamanan yang sah**: pengujian pada sistem
milik sendiri atau sistem yang Anda miliki izin tertulis untuk mengujinya.
Penulis tidak bertanggung jawab atas penyalahgunaan. Semua bukti diambil dari
lab milik peneliti (alamat disamarkan).