HTB Labs — Tier 1 — “Appointment” Makinesi Çözümü | Yazan: CyberAlp0

Merhaba dostlar, ben CyberAlp0. HTB tarafından sunulan, Tier 1 seviyesindeki “Appointment” adlı yeni bir çözüme hoş geldiniz. Appointment makinesi, temel SQL injection kavramlarını ve kimlik doğrulama atlatma (authentication bypass) tekniklerini öğretmek için tasarlanmıştır. Ağırlıklı olarak web uygulaması oturum açma sayfasındaki SQL Injection zafiyetine odaklanır. Makinede yalnızca 80 portu açık olup, üzerinde Apache httpd 2.4.38 çalışmakta ve basit bir oturum açma sayfası barındırmaktadır. Oturum açma formu SQL injection'a karşı savunmasızdır ve kimlik doğrulamanın atlatılmasına olanak tanır.
Yönetici Özeti
İzleyeceğimiz adımların yönetici özeti aşağıdadır:
Aşama I: Tarama (Scanning)
Açık portları ve web sunucusunda çalışan servisleri ortaya çıkarmak için Nmap kullanacağız. 80 portunun açık olduğunu ve üzerinde Apache httpd 2.4.38'in çalıştığını bulacağız.
Nmap taraması sonucunda aşağıdaki bilgileri bulacağız
- Çalışan Servis: Debian httpd
- Servis Sürümü: 2.4.38
- Açık Port: 80/tcp
Aşama II: Numaralandırma (Enumeration)
Hedef web sunucusunun IP adresini yerel olarak çözümleyecek ve oturum açma sayfasına erişeceğiz.
Aşama III: Sömürme (Exploiting)
Oturum açma formu SQL injection'a karşı savunmasızdır. Kullanıcı adı olarak {admin’#} kullanmak (herhangi bir parola ile ya da parolasız) kimlik doğrulamayı başarıyla atlatır. Bu işe yarar çünkü # işareti SQL sorgusunun geri kalanını yorum satırına çevirir ve sorgunun yalnızca "admin" kullanıcı adını kontrol edip parolayı doğrulamamasını sağlar.
Girişte daha fazla vakit kaybetmeyelim ve ayrıntılı olarak hacklemeye başlayalım!
Adım 1: Starting Point Labs Sunucularına Bağlanmak.
Hedef makineye saldırmak için onunla aynı ağda olmanız gerekir. Sizi hedef makineye bağlanma konusunda adım adım yönlendirecek olan blog yazımı okuyabilirsiniz.
Adım 2: Makineyi Başlatmak ve Görevleri Çözmeye Koyulmak.
Görev 1: SQL kısaltması neyin baş harflerinden oluşur?
Cevap: Structured Query Language
Açıklama:
İlişkisel veritabanlarını yönetmek ve üzerinde işlem yapmak için tasarlanmış bir programlama dilidir.
Görev 2: En yaygın SQL zafiyetlerinden biri nedir?
Cevap: SQL Injection
Açıklama:
En yaygın SQL zafiyetlerinden biri SQL injection'dır. Bu zafiyet, bir saldırganın uygun doğrulama veya temizleme (sanitization) yapılmadan doğrudan SQL sorgularına dahil edilen giriş alanlarına kötü amaçlı SQL kodu eklemesiyle ortaya çıkar.
Bir SQL injection saldırısında saldırgan, sorgunun amaçlanan davranışını değiştiren, özel olarak hazırlanmış bir girdi ekleyerek uygulamanın SQL sorgusunu manipüle eder.
Klasik bir örnek, bir oturum açma formuna ' OR '1'='1' gibi bir şey girmektir; bu, bir sorguyu şu haldeyken:
SELECT * FROM users WHERE username='input_username' AND password='input_password'Şu hale getirebilir:
SELECT * FROM users WHERE username='' OR '1'='1' AND password='password'(‘1’=’1') koşulu her zaman doğrudur ve bu da potansiyel olarak kimlik doğrulamanın atlatılmasına olanak tanır.
SQL injection'a karşı en iyi savunmalar arasında parametreli sorgular (hazırlanmış ifadeler / prepared statements) kullanmak, giriş doğrulaması yapmak, stored procedure'ler kullanmak ve veritabanı hesapları için en az ayrıcalık (least privilege) ilkesini uygulamak yer alır.
Görev 3: Bu zafiyetin 2021 OWASP Top 10 sınıflandırması nedir?
Cevap: A03:2021 — Injection
Açıklama:
OWASP, 2021 güncellemesinde çeşitli injection zafiyeti türlerini (SQL injection, LDAP injection, OS command injection vb. dahil) bu tek ve daha geniş kategoride birleştirdi ve bunu en kritik üçüncü web uygulaması güvenlik riski olarak sıraladı.
Görev 4: Nmap, hedefin 80 portunda çalışan servis ve sürüm olarak neyi raporluyor?
Cevap: Apache httpd 2.4.38 ((Debian))
Açıklama:
Hedef makinede çalışan portları belirlemek için ağı taramak amacıyla Nmap kullanacağız. Ya Nmap'in çalıştırmasını istediğimiz bayrakları (flag) belirlediğimiz geleneksel yöntemi kullanabiliriz ya da Nmap'i belirli tarama türleriyle birlikte çalıştıran otomatik bir araç kullanabiliriz.
Bu otomatik araç “Nmap Automator” olarak adlandırılır. Aşağıdaki bağlantı üzerinden indirebilirsiniz.
Bu aracı hedefin IP'sinde tam bir tarama çalıştırmak için kullanacağım. Araç, nihai tarama sonuçlarına ulaşmak için Nmap tarafından önceden tanımlanmış tüm olası seçenekleri ve bayrakları kullanacaktır.
Aracın kullanımı oldukça kolaydır ve GitHub'daki açıklama bölümünde onunla ilgili daha fazla bilgi bulabilirsiniz. Tam bir tarama gerçekleştirmek için aşağıdaki komutu yazın:
bash nmapAutomator.sh --host 10.129.83.105 --type all

Görev 5: HTTPS protokolü için kullanılan standart port nedir?
Cevap: 443
Açıklama:
HTTP 80 portunu kullanırken, HTTPS (HTTP Secure) şifreli web trafiği için varsayılan olarak 443 portunu kullanır. Bu port, web tarayıcıları ile sunucular arasındaki güvenli iletişimi TLS/SSL şifrelemesi kullanarak sağlar.
Görev 6: Web uygulaması terminolojisinde bir klasöre ne ad verilir?
Cevap: directory
Açıklama:
Web sitelerinin ve web uygulamalarının yapısından söz ederken, genel olarak “klasör (folder)” olarak adlandırılabilecek şey için standart teknik terim “dizin (directory)”dir. Örneğin:
- Kök dizin (/)
- Alt dizin (/images)
- Üst dizin (../)
Görev 7: ‘Not Found’ (Bulunamadı) hataları için verilen HTTP yanıt kodu nedir?
Cevap: 404
Açıklama:
Sunuculardan çeşitli yanıtlar geldiğini fark edeceğiz. Yanıtların her birinin bir durum numarası vardır. HTTP Yanıt Kodu 404, en bilinen HTTP durum kodlarından biridir ve sunucunun istenen kaynağı bulamadığını gösterir. 404 durum kodu, bir istemci sunucuda var olmayan bir URL istediğinde döndürülür.


Görev 8: Gobuster, bir web sunucusundaki dizinleri kaba kuvvetle (brute force) denemek için kullanılan araçlardan biridir. Alt alan adlarını değil, dizinleri keşfetmek istediğimizi belirtmek için Gobuster ile hangi anahtarı (switch) kullanırız?
Cevap: dir
Açıklama:
Bir web sunucusundaki dizinleri kaba kuvvetle denemek için Gobuster kullanırken dir mod anahtarını kullanırız. Kullanacağımız komut şu şekildedir:
gobuster dir -u http://10.129.21.111 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txtBu, Gobuster'a hedef web sunucusundaki (10.129.21.111) dizinleri numaralandırmak istediğinizi açıkça belirtir.
Makinenin sıfırlanması nedeniyle hedef makinenin IP'si değişti.
/etc/hosts dosyasını düzenleyebilir ve hedef IP'yi yerel DNS sunucusunda çözümlemek için ekleyebilirsiniz. Çözümlenecek URL'ye karşılık gelen IP'yi hosts dosyasına eklemeniz yeterlidir; bu URL şu olacaktır: http://appointment.htb.

Belirtilen kelime listesi (wordlist) dosyasına göre tüm olası dizinlerin numaralandırılması biraz zaman alacaktır.
HTTP durum kodu 301, istenen kaynağın kalıcı olarak yeni bir URL'ye taşındığı ve bu URL'nin yanıtın “Location” başlığında verilmesi gerektiği anlamına gelir. Tarayıcılar ve arama motorları otomatik olarak yeni konuma yönlendirir ve gelecekteki istekler için referanslarını yeni URL'yi kullanacak şekilde güncellemelidir.
Bu web sunucusu dizin numaralandırması, kullandığınız listenin boyutuna bağlı olarak biraz zaman alacaktır. Sabırlı olun; sonuçta nihai sonucu göreceksiniz.
Görev 9: MySQL'de bir satırın geri kalanını yorum satırına çevirmek için hangi tek karakter kullanılabilir?
Cevap: #
Açıklama:
Yalnızca tek bir karaktere ihtiyaç duyduğunuz tek satırlık yorumlar için kullanılacak olan, kare/diyez işaretidir (#).
MySQL ayrıca iki farklı yorum stilini daha destekler:
1- Bir boşluk takip eden çift tire ( — ): ( — ) işaretinden satır sonuna kadar olan her şey bir yorumdur.
2- C tarzı yorumlar (/* /): / ile */ arasındaki her şey bir yorumdur (bu, birden çok satıra yayılabilir).
Görev 10: Kullanıcı girdisi dikkatli bir şekilde ele alınmazsa, bir yorum olarak yorumlanabilir. Parolayı bilmeden admin olarak oturum açmak için bir yorum kullanın. Döndürülen web sayfasındaki ilk kelime nedir?
Cevap: Congratulations
Açıklama:
SQL injection'a karşı savunmasız bir oturum açma formu için saldırgan şöyle bir girdi girebilir:
- Kullanıcı adı: {admin'#} veya {admin '--}
- Parola: {herhangi bir şey veya boş}
Bu, SQL veritabanındaki bir sorguyu şu şekilde değiştirir:
SELECT * FROM users WHERE username='admin'#' AND password='whatever'# kullanılarak yapılan yorumlama yöntemi, parola kontrolünü kaldırır ve onu hiç var olmamış gibi yapar. Yani, web uygulaması yalnızca kullanıcı adını doğrular ve “admin” adında bir yönetici kullanıcının olup olmadığını, parolayla kimlik doğrulaması yapmadan kontrol eder; çünkü bu alan artık yorum satırına çevrilmiş ve yok sayılmıştır. Başarılı olursanız, admin kullanıcısı olarak oturum açmış olursunuz.
Öncelikle, hedef web sunucusunun IP adresini yerel olarak Kali Linux'ta çözümlemeniz gerekir. /etc/hosts dosyasını düzenlemeniz ve IP adresini çözümlenen URL ile birlikte eklemeniz gerekecek.

İkinci olarak, web tarayıcısı üzerinden şunu yazarak URL'ye giriş yapacaksınız: http://appointment.htb. Aşağıdaki oturum açma sayfasına yönlendirileceksiniz

Üçüncü olarak, kullanıcı adı olarak (admin’#}) ekleyip “password” alanına herhangi bir parola yazarak web sunucusunun SQL injection'a karşı savunmasız olup olmadığını göreceksiniz.
Parola alanını boş da bırakabilirsiniz.
Web sunucusunun SQL injection'a karşı savunmasız olduğunu ve sunucunun “admin” kullanıcı adını parolayla doğrulamaya çalışmadığını göreceksiniz. Yalnızca admin adında bir kullanıcının olup olmadığını arar ve görür; parolayı da içeren sorgunun geri kalanını yok sayar.

Web sunucusunu başarıyla atlattığınızı ve flag'i elde etmeyi başardığınızı gösteren aşağıdaki sayfa görünecektir.

Görev 11: root flag'ini gönderin
Answer: e3d0796d002a446c0e622226f42e9672
Açıklama:
“Appointment” makinesinin root flag'i “e3d0796d002a446c0e622226f42e9672”
HTB — Tier 1 — Starting Point aşamasından Appointment makinesini çözmeyle ilgili blog yazımı okumaktan keyif aldığınızı umarım.
Başka bir write-up'ta görüşmek üzere!.


