libSSH(CVE-2018-10933) Zafiyeti, Exploit Geliştirme ve CVE üzerine

Hoşgeldiniz.

Bu yazımda biraz uzun süredir bilişim alanıda bahsedilen CVE-2018-10933(libSSH-RCE) zafiyetinden, biraz Exploit geliştirilmesinden ve biraz da CVE‘lerden bahsedeceğim.

libSSH Nedir ?

libSSH basit bir şekilde C ile yazılmış bir kütüphanedir ve bu kütüphane Protocol olarak şuanda SSHv2 protokolünü kullanmaktadır.

Sunucular bu kütüphaneyi kullanarak Client ve Server tarafında SSH bağlantıları oluşturmaktadır.

zZzZzZzZzZzZzZzZzZzZ

Çok kısa bir süre öncesinde internet üzerinde Peter Winter-Smith tarafından ortaya çıkarılmış bir zafiyettir bu.

Bu zafiyetin içeriğini basit bir şekilde anlatacak olursam şayet :

Basit bir şekilde Sandviç istediğimizde Hayır deniliyor şayet Sandviç Success dediğimizde şartsız bir şekilde karşıdaki hemen yapayım efendim diyor.

Yani daha da teknik bir şekilde açıklarsam bir Sunucu içerisine Kullanıcı Adı ve Şifre vermeden sadece karşıya MSG_USERAUTH_SUCCESS diyerek girebiliyoruz.

Daha da basit şekilde libSSH‘in 0.6 versiyonun sonrasını kullanan tüm Sunucu‘lara kullanıcı bilgilerini vermeden giriş yapabiliyorduk.

Ve buda bilişim alanın da çok büyük bir yankı oluşturdu.

Zafiyetin ortaya çıktığını nasıl bulup sömürü kodunu geliştirdim ?

Bu zafiyet‘i her saniye yenilenen CVE listesini incelerken aniden gördüm.

libSSH CVE

Ve libSSH‘te bulunan zafiyetin ne olduğuna dair bir açıklama bulunduğundan hemen onu okumaya koyuldum.

Açıklama :

A vulnerability was found in libssh’s server-side state machine before versions 0.7.6 and 0.8.4. A malicious client could create channels without first performing authentication, resulting in unauthorized access.

Ve hızlı bir şekilde libSSH kütüphanesinin kodlarını incelemeye başladım.

Bu kodlar içinde şu kısım çok ilgimi çekti :

Çünkü bu kısımda geçen diyalog basit bir şekilde şöyle :

Eğer oturum içerisinde SSH_AUTH_STATE_SUCCESS mevcut ise Kullanıcı Adı ve Şifre istemeden girişi gerçekleştir.

Bende bunu anladıktan sonra bir Exploit geliştirdim. Karşıda libSSH kullanan Sunucu‘da Komut çalıştırmayı basitleştirmek için.

Bu yazdığım Exploit twitterde çoğu yerde paylaşıldı ve Github içerisinde baya bir Star aldı.

Github‘ta paylaştığım bu Exploit‘in linki : libSSH Exploit Github

Hatta twitterde 16 yaşındaki dayanç soyadlı’nın libSSH için geliştirdiği exploit diye paylaşan arkadaşlar gördüm bu da beni sevindirdi :

Exploit‘i yazdıktan sonra Shodan içerisinden baktığımda twitterde ne kadar 6500 tane potansiyel olarak hacklenmiş sistem olduğunu görsemde Shodan‘da bu sayı 50,000‘i geçmişti.

Sevdiğim bir kanal olan Liveoverflow sahibiyle konuşurken libSSH hakkında video çekecekmisin sorusunu sorduğumda o kadar fazla yerde o kadar farklı şekilde anlatılmış ki bana gerek kalmadı dedi 😂 :

Yazdığım exploit bir çok CVE listesinde yayımlanmış bulunmaktadır :

Aynı zamanda Exploti-DB içerisinde de yayınlandı : libSSH Exploit

Şimdi gelelim bir CVE‘nin ne olduğuna bunun nasıl analizinin yapılacağına ve bunun için Exploit‘in nasıl geliştirileceğine.

CVE Nedir

CVE bilgi güvenliği zafiyetlerinin bir listesidir.

Daha basit bir şekilde bir Zafiyet‘in açıklandığı ve var ise şayet Exploit‘lerinin bulunduğu bir kayıttır.

Bir kaç tane CVE paylaşım sitesi :

CVE Mitre

CVE NVD

CVE details

CVE Analizi

Öncelikle bir CVE bulalım.

Ben libSSH‘den başladığım için aynı şekilde devam edeceğim.

Bu CVE listesi içerisinde benim Exploit‘ini yazdığım CVE‘nin ID‘si CVE-2018-10933 basit bir şekilde daha bu CVE‘nin içerisine girmeden bu Zafiyet‘in ne olduğu açıklanıyor.

Bu CVE kaydına girip benimle ilerlemek isteyenler için link : CVE-2018-10933

Şimdi bu CVE‘nin içerisine girdikten sonra içerisinde CVE‘nin CVSS Score‘unu görebiliriz yani ne kadar Kritik olduğunu.

Aynı zamanda bu Zafiyet‘ten etkilenen Product‘larıda görebiliyoruz :

Bu Zafiyet için bulunan Referans‘larıda görebiliyoruz ayrıca.

Bu Referans‘lar içerisinde Zafiyet‘in yazılmış ise Exploit‘ide bulunur.

Burada bulunan Exploit-DB linki benim size başta bahsettiğim kendi yazdığım Exploit‘tir.

Şimdi bu Exploit‘i nasıl geliştirdiğime yani bir CVE‘nin Analiz‘i sonrası o CVE için Exploit‘in nasıl geliştirileceğinden bahsedeceğim.

Exploit Development

Daha derine inmeden önce size basit bir şekilde bir Exploit‘in ne olduğundan ve nasıl geliştirilebileceğinden bahsetmek istiyorum.

Exploit nedir ?

Bir Exploit genellikle Zafiyet içeren bir kodu sömürmek için geliştirilen bir kod parçasıdır.

Exploit Development Nedir ?

Zafiyet içerilen kodu Analiz ettikten sonra bu kodu sömürge için kullanılacak kodu geliştirmektir.

Daha da açarsam konuyu Exploit geliştirmek için bu sömürge kod parçasını yazacağınız Zafiyeti ve bu Zafiyet‘in Kod‘unu kavramanız gerekmektedir.

libSSH zafiyetinin sömürü kodunu nasıl geliştirdim ? (biraz daha teknik)

Dediğim gibi CVE listelerinde gezerken denk geldim ve libSSH bir kütüphane olduğundan Authentication yapılan kısımları incelemeye başladım bu kütüphane içerisinde.

Yani gerçekleştirilecek oturum yani Session için kütüphane içerisinde var olan Giriş, Çıkış ve Kontrol kodlarını incelemeye başladım.

Ve bu kodlar içerisinde baştada resmini verdiğim Kaynak Kod‘una denk geldim.

libSSH içerisinde bulunan şu küçük Kod Parça‘sı benim gerekli olan Exploit‘i geliştirmemi sağladı diyebilirim :

SSH_PACKET_CALLBACK(ssh_packet_userauth_success)
  (void)packet;
  (void)type;
  (void)user;

  SSH_LOG(SSH_LOG_DEBUG, "Authentication successful");
  SSH_LOG(SSH_LOG_TRACE, "Received SSH_USERAUTH_SUCCESS");

  session->auth.state = SSH_AUTH_STATE_SUCCESS;

Burada gördüğünüz Kaynak Kod basit bir şekilde eğer dışarıdan libSSH çalıştırılan sunucu içerisinde SSH_AUTH_STATE_SUCCESS byte’ı eklenirse aşşağıdaki kodu çalıştır diyor :

session-> auth.state = SSH_AUTH_STATE_SUCCESS;

Ve bu Kod ise basit bir şekilde session içerisinde bulunan auth objesindeki state değişkenine SSH_AUTH_STATE_SUCCESS byte’ını ekliyor.

Buda demek ki sunucuya gönderdiğimiz SSH_AUTH_STATE_SUCCESS byte’ı bizi sunucu’ya Kullanıcı Adı ve Şifre vermeden sokabilecek.

Bende CVE‘de ki açıklamayı okuduktan sonra libSSH içerisindeki Kaynak Kod‘ları inceledikten sonra Exploit‘i geliştirmek için Zafiyet‘i bu şekilde kavradım.

Ve sömürge kodunu geliştirdim.

Şimdi daha da derine inip sizlerin nasıl Exploit geliştirebileceğinden bahsedeyim.

Exploit Development

Öncelikle Kaynak Kod okumaya aşina olmanız gerek.

Çok çok önceden var olan bir söz vardır.

Bir hacker programcıdan daha iyi programlaya bildiği ve bunu tersine kullana bildiği için hackerdir.

Yani basit bir şekilde sizlerin Sömürge Kod‘unu geliştirmeniz için Kaynak Kod‘u okumaya aşina olmanız gerek.

Kendi Exploit‘lerinizi geliştirmek için Zafiyet‘i illaki sizin bulmanız gerekmez.

Yalnız bir hedef’e Saldırmadan önce o hedefi Tanımanız gereklidir.

Bir çok

Exploit kodu görebiliyorum internet’te yalnız bu Exploit geliştirenlerin 0’dan bir FTP ya da SMTP vs… Server‘i ya da Client‘i geliştirebileni %5‘lik hisse.

Dolayısı ile Zafiyet‘i tanımak ve buna gerekli Exploit‘i geliştirebilmeniz için Teknoloji‘yi kendiniz yazmış gibi tanımanız gerekmekte.

THE END

Bu yazımızında sonuna geldik.

Bir CVE‘nin ne olduğundan ve bunun Analizi‘nin nasıl yapılacağından aynı zamanda Zafiyet‘ler için nasıl Sömürge Kodu yani Exploit geliştirilebileceğinden bahsettim.

Sorularınız mevcut ise : Twitter