Appointment Ctf Writeup

Bu yazıda Hack The Box Starting Point serisinde yer alan Appointment makinesinin çözümünü anlatacağım.
Appointment, Very Easy seviyesinde bir Linux makinesi ve özellikle web güvenliğine yeni başlayanlar için SQL Injection mantığını anlamak açısından oldukça güzel bir başlangıç sunuyor.
Makinenin temel amacı, bir web uygulamasındaki hatalı SQL sorgusunu kullanarak admin hesabına parola bilmeden giriş yapmak.
Hack The Box Appointment Write-Up | SQL Injection ile Login Bypass
Bu yazıda Hack The Box Starting Point serisinde yer alan Appointment makinesinin çözümünü anlatacağım.
Appointment, Very Easy seviyesinde bir Linux makinesi ve özellikle web güvenliğine yeni başlayanlar için SQL Injection mantığını anlamak açısından oldukça güzel bir başlangıç sunuyor.
Makinenin temel amacı, bir web uygulamasındaki hatalı SQL sorgusunu kullanarak admin hesabına parola bilmeden giriş yapmak.
Bu çalışma yalnızca Hack The Box tarafından sağlanan yetkili laboratuvar ortamında gerçekleştirilmiştir.
SQL Nedir?
Makinenin ilk sorusu oldukça temel:
What does the acronym SQL stand for?
SQL'in açılımı:
Structured Query Language
SQL, ilişkisel veritabanlarında veri eklemek, okumak, güncellemek ve silmek için kullanılan bir sorgulama dilidir.
Örneğin bir kullanıcıyı veritabanından çekmek için şöyle bir sorgu kullanılabilir:
SELECT * FROM users WHERE username='admin';
SQL Injection Nedir?
Bir sonraki soru:
What is one of the most common type of SQL vulnerabilities?
Cevap:
SQL Injection
SQL Injection, kullanıcıdan alınan girdinin güvenli şekilde işlenmeden SQL sorgusuna dahil edilmesiyle ortaya çıkan bir güvenlik açığıdır.
Örneğin uygulamanın login sistemi aşağıdaki gibi bir sorgu oluşturuyor olabilir:
SELECT * FROM users
WHERE username='$username'
AND password='$password';
Normal şartlarda kullanıcı:
username: admin
password: password123
girerse sorgu şu hale gelir:
SELECT * FROM users
WHERE username='admin'
AND password='password123';
Fakat kullanıcı girdileri filtrelenmiyorsa SQL sorgusunun yapısını değiştirmek mümkün olabilir.
Appointment makinesinde kullanacağımız zafiyet tam olarak bu.
OWASP Top 10 Sınıflandırması
HTB bize şu soruyu soruyor:
What is the 2021 OWASP Top 10 classification for this vulnerability?
SQL Injection, OWASP Top 10 2021 listesinde:
A03:2021 – Injection
kategorisinde yer alıyor.
Injection sınıfı sadece SQL Injection'ı değil, uygulamanın kullanıcı girdisini güvenli şekilde işlememesi sonucu oluşabilecek farklı injection saldırılarını da kapsıyor.
Hedefi Tarama
Makineyi başlattıktan sonra ilk yaptığım şey hedef üzerinde açık portları ve çalışan servisleri kontrol etmek oldu.
Bunun için Nmap kullandım:
nmap -sC -sV TARGET_IP
Burada:
-sC
Nmap'in varsayılan NSE scriptlerini çalıştırırken,
-sV
açık portlarda çalışan servislerin versiyonlarını tespit etmeye çalışıyor.
Tarama sonucunda port 80 üzerinde bir Apache web sunucusu bulundu:
80/tcp open http Apache httpd 2.4.38 (Debian)
HTB'nin:
What does Nmap report as the service and version that are running on port 80 of the target?
sorusunun cevabı da buradan geliyor:
Apache httpd 2.4.38 (Debian)
Port 80'in açık olması hedefte HTTP üzerinden çalışan bir web uygulaması olduğunu gösteriyor.
Tarayıcıdan hedef IP adresine giderek uygulamayı kontrol ettim:
Karşıma bir login ekranı çıktı.
HTTPS Hangi Portu Kullanır?
HTB daha sonra şu temel soruyu soruyor:
What is the standard port used for the HTTPS protocol?
HTTPS'in standart portu:
443
HTTP genellikle port 80 üzerinde çalışırken HTTPS varsayılan olarak port 443 kullanır.
Web Uygulamalarında Folder Kavramı
Bir diğer soru:
What is a folder called in web-application terminology?
Web uygulamalarında klasörler genellikle:
Directory
olarak ifade edilir.
Örneğin:
http://target/admin/
http://target/uploads/
http://target/assets/
gibi yollar uygulamanın farklı directory'lerine karşılık gelebilir.
Bu tür dizinleri keşfetmek penetration test süreçlerinde oldukça önemlidir.
HTTP 404
Sonraki soru:
What is the HTTP response code that is returned for Not Found errors?
Cevap:
404
HTTP 404 yanıtı, istemcinin talep ettiği kaynağın web sunucusunda bulunamadığını belirtir.
Örneğin:
gibi var olmayan bir endpoint'e istek attığımızda sunucu genellikle:
404 Not Found
cevabı döndürür.
Gobuster ile Directory Enumeration
HTB'nin sonraki sorusu Gobuster ile ilgili:
Gobuster is one tool used to brute force directories on a webserver. What switch do we use with Gobuster to specify we're looking to discover directories, and not subdomains?
Gobuster ile directory enumeration yapmak için:
dir
modu kullanılır.
Örnek kullanım:
gobuster dir -u http://TARGET_IP -w /usr/share/wordlists/dirb/common.txt
Burada:
dir
Gobuster'a directory brute-force yapmak istediğimizi söylüyor.
-u
hedef URL'yi,
-w
ise kullanılacak wordlist'i belirtiyor.
Appointment makinesinde asıl saldırı yolu login ekranındaki SQL Injection olsa da directory enumeration, web pentest sırasında alışkanlık haline getirilmesi gereken temel adımlardan biri.
MySQL Comment Karakteri
Buradan sonra makinenin asıl konusuna geliyoruz.
HTB bize şu soruyu soruyor:
What single character can be used to comment out the rest of a line in MySQL?
MySQL'de tek satırın geri kalanını yorum haline getirmek için kullanılabilecek karakterlerden biri:
#
Bu bilgi login bypass sırasında oldukça önemli olacak.
Örneğin:
SELECT * FROM users WHERE username='admin'# AND password='test';
sorgusunda # karakterinden sonraki bölüm yorum olarak değerlendirilir.
Yani sorgunun etkili kısmı şu olur:
SELECT * FROM users WHERE username='admin'
Parola kontrolü sorgudan çıkarılmış olur.
Login Formunun İncelenmesi
Login ekranına geldiğimde normal kullanıcı adı ve parola kombinasyonları yerine uygulamanın SQL Injection'a açık olup olmadığını test etmeye başladım.
Backend tarafında sorgunun yaklaşık olarak şu şekilde oluşturulduğunu düşünebiliriz:
SELECT * FROM users
WHERE username='$username'
AND password='$password';
Normal girişte sorgu şöyle görünebilir:
SELECT * FROM users
WHERE username='admin'
AND password='test123';
Burada hem username hem de password doğru olmak zorunda.
Ama username alanına şu değeri girersek:
admin'#
SQL sorgusunun yapısını değiştirebiliriz.
Ben login ekranında kullanıcı adı bölümüne:
admin'#
yazdım.
Password alanına yazdığımız değer bu noktadan sonra önemli değil.
Örneğin:
Username: admin'#
Password: test
girildiğinde backend'deki sorgu yaklaşık olarak şu hale geliyor:
SELECT * FROM users
WHERE username='admin'#'
AND password='test';
Burada iki önemli karakter var.
İlk olarak:
'
karakteri SQL sorgusundaki string'i kapatıyor.
Ardından:
#
geri kalan SQL sorgusunu comment haline getiriyor.
Sonuç olarak MySQL'in değerlendirdiği sorgu mantıksal olarak şu hale geliyor:
SELECT * FROM users
WHERE username='admin';
Yani:
AND password='test'
kısmı artık çalıştırılmıyor.
Böylece admin kullanıcısının parolasını bilmeden authentication mekanizmasını bypass etmiş oluyoruz.
Admin Olarak Giriş
Payload olarak:
admin'#
kullandıktan sonra giriş başarılı oldu.
HTB'nin sorusu şuydu:
Use a comment to login as admin without knowing the password. What is the first word on the webpage returned?
Başarılı giriş sonrasında açılan sayfanın ilk kelimesi:
Congratulations
olduğu için Task 11'in cevabı:
Congratulations
oluyor.
Aynı sayfa içerisinde makinenin flag'i de bulunuyor.
Flag'i aldıktan sonra:
Submit Single Flag
bölümüne göndererek makineyi tamamladım.
Appointment Task Cevapları
Makinedeki soruların cevaplarını toplu olarak yazarsam:
Task 1
Structured Query Language
Task 2
SQL Injection
Task 4
A03:2021-Injection
Task 5
Apache httpd 2.4.38 (Debian)
Task 6
443
Task 7
directory
Task 8
404
Task 9
dir
Task 10
#
Task 11
Congratulations
Bu Makineden Ne Öğrendim?
Appointment oldukça kısa bir makine olmasına rağmen SQL Injection'ın temel mantığını anlamak için güzel bir örnek.
Buradaki önemli nokta admin'# payload'ını ezberlemek değil.
Asıl önemli olan payload'ın neden çalıştığını anlamak.
Payload'ı parçalarsak:
admin'#
admin hedeflediğimiz kullanıcıyı,
'
SQL sorgusundaki string'i kapatmayı,
#
ise sorgunun geri kalanını comment haline getirmeyi sağlıyor.
Böylece:
SELECT * FROM users
WHERE username='admin'
AND password='password';
gibi bir sorguyu mantıksal olarak:
SELECT * FROM users
WHERE username='admin';
haline getirmiş oluyoruz.
Bu da password kontrolünün tamamen devre dışı kalmasına neden oluyor.
Sonuç
Appointment, Hack The Box Starting Point içerisinde özellikle SQL Injection öğrenmeye başlayanlar için oldukça güzel bir giriş makinesi.
Makine boyunca:
Nmap ile servis keşfi yaptım,
HTTP ve HTTPS portlarını tekrar ettim,
directory enumeration mantığını gördüm,
Gobuster kullanımını tekrar ettim,
MySQL comment syntax'ını öğrendim,
SQL Injection kullanarak authentication bypass gerçekleştirdim.
Makinenin en önemli kazanımı benim için SQL sorgularına sadece payload gözüyle değil, sorgunun nasıl değiştirildiğini anlayarak bakmak oldu.
SQL Injection çalışırken:
' OR 1=1 -- -
veya:
admin'#
gibi payload'ları ezberlemek yerine arkada oluşan SQL sorgusunu düşünmek işi çok daha kolaylaştırıyor.
Appointment da tam olarak bu mantığın temelini oturtan makinelerden biri.







