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

Selam dostlar, ben CyberAlp0. HTB destekli, Tier 1'deki “Bike” adlı yeni bir çözüm rehberine tekrar hoş geldiniz. Bike, HackTheBox'ın Tier 1 — Starting Point aşamasındaki VIP laboratuvarlardan biridir. Özel uygulama, RCE, Sunucu Tarafı Şablon Enjeksiyonu ve keşif gibi becerileri geliştirmeye ve pek çok yönü kavramaya odaklanır. Bir Node.js uygulamasındaki Sunucu Tarafı Şablon Enjeksiyonu (SSTI) zafiyeti kavramını öğretmeye odaklanmaktadır.
Yönetici Özeti
İzleyeceğimiz adımların bir yönetici özeti aşağıdadır:
Bu makine, Handlebars şablon motorunu kullanan ve bir SSTI zafiyeti içeren bir Node.js web uygulaması barındırır. SSTI, kullanıcı girdisinin uygun bir temizleme işlemi yapılmadan doğrudan şablonlara gömülmesiyle ortaya çıkar ve saldırganların sunucuda keyfi kod çalıştırmasına olanak tanır.
Aşama I: Tarama
İlk port taraması, 80 numaralı portta bir Node.js web uygulaması olduğunu ortaya koyuyor. Ayrıca, SSH — OpenSSH 8.2p1 Ubuntu servisini çalıştıran 22 numaralı bir port daha var.
Nmap taramasının ardından aşağıdaki bilgilere ulaşacağız
- Çalışan Servis: node.js (express middleware)
- Açık Port: 80
Aşama II: Numaralandırma (Enumeration)
SSTI'yi test etmek için bir web formuna {{7*7}} gibi bir şablon söz dizimi göndereceğiz. Hata mesajları, uygulamanın Handlebars şablon motorunu kullandığını ortaya koyuyor.
Aşama III: İstismar (Exploitation)
Form gönderimini yakalamak için Burp Suite kullanacağız, ardından URL'yi belirli yüklerle (payload) kodlamayı deneyecek ve root kullanıcısı olarak uzaktan kod çalıştırma (RCE) elde etmek amacıyla şablon enjeksiyonu yoluyla sistem komutları çalıştıracağız.
Girişte daha fazla vakit kaybetmeyelim ve detaylı bir şekilde hacklemeye başlayalım!
Adım 1: Starting Point Laboratuvar Sunucularına Bağlanmak.
Hedef makineye saldırmak için 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 Başlamak.
Görev 1: Nmap hangi TCP portlarını açık olarak tespit ediyor? Düşükten yükseğe doğru, aralarında boşluk olmadan virgülle ayrılmış bir port listesiyle cevap verin.
Answer: 22,80
Çözüm:
Hedef makinede açık olan portları tespit etmek için Nmap aracını kullanabiliriz. Aşağıdaki komutu yazarak açık portları ve bu portlar üzerinden çalışan servisleri belirleyebiliriz.
nmap -sV 10.129.88.205
Ekran görüntüsüne göre, 22 ve 80 olmak üzere iki portun açık olduğunu tespit edebiliyoruz. 22 numaralı port OpenSSH sunuyor, 80 numaralı port ise Node.js çalıştırıyor.
Nmap aracındaki -sV seçeneği, açık portlarda çalışan servisleri tespit eder. Örneğin, 80 numaralı port açıksa, Nmap onun Apache, Nginx ya da başka bir web sunucusu çalıştırıp çalıştırmadığını belirleyebilir. Ayrıca servisin sürümünü de tespit etmeye çalışır.
Görev 2: İlk soruda tespit edilen HTTP/web portunu dinleyen servisi çalıştıran yazılım nedir?
Answer: Node.js
Çözüm:
Son ekran görüntüsüne göre, 80 numaralı portun Node.js adlı bir yazılım sunduğunu görebiliyoruz. Bu da bir web sunucusudur.
Görev 3: Wappalyzer'a göre Web Framework'ünün adı nedir?
Answer: express
Çözüm:
Bu görevi cevaplamadan önce Wappalyzer aracı hakkında daha fazla bilgi sahibi olmamız gerekiyor. Wappalyzer, webin teknolojik yapısını anlamak isteyen herkes için değerli bir araçtır. Eklentisini Firefox'a aşağıdaki bağlantı üzerinden kurabiliriz.
“Bike” web servisini analiz edebilmek için, bike HTB makinesini /etc/hosts altında yer alan yerel DNS sunucumuza eklememiz gerekiyor.

Artık web servisine, http://bike.htb. yazarak web üzerinden serbestçe erişebiliriz. Bu bizi otomatik olarak hedefin IP adresine yönlendirecektir. Wappalyzer'ı kurduktan sonra, hedefin kullandığı web framework'lerini tespit edebiliriz.

Görev 4: {{7*7}} göndererek test ettiğimiz zafiyetin adı nedir?
Cevap: Sunucu Tarafı Şablon Enjeksiyonu (SSTI)
Çözüm:
{{7*7}} göndererek test edilen zafiyet Sunucu Tarafı Şablon Enjeksiyonu (SSTI) olarak bilinir. Bu tür bir zafiyet, kullanıcı girdisinin uygun bir temizleme veya doğrulama yapılmadan sunucu tarafı şablonlara gömülmesiyle ortaya çıkar.
Birçok web framework'ü, dinamik içerik üretimine olanak tanıyan şablon motorları kullanır. Bu şablonlar kullanıcı girdisini değerlendiriyorsa, bir saldırgan keyfi kod çalıştırabilir ya da şablonun işlenişini manipüle edebilir. Başarılı bir istismar; veri sızıntısına, uzaktan kod çalıştırmaya veya hassas bilgilere yetkisiz erişime yol açabilir.
SSTI testi genellikle, matematiksel ifadeler veya kontrol yapıları gibi şablon motorunun davranışını istismar eden yükler (payload) göndermeyi içerir.
Görev 5: Node.js içinde kullanılan şablon motoru nedir?
Answer: handlebars
Çözüm:
Öncelikle şablonlama (templating) ile neyin kastedildiğini anlamamız gerekiyor. Şablon motorları, web geliştirmede şablonları verilerle birleştirerek dinamik HTML sayfaları üretmek için kullanılan araçlardır.
HTB makinemize tarayıcı üzerinden HTTP://bike.htb, yazarak eriştiğimizde, aşağıdaki web sayfasını fark edeceğiz

Web uygulamasının şu anda geliştirilme aşamasında olduğunu belirtiyor ve tamamlandığında sizi bilgilendirmek için e-posta adresinizi girmenizi istiyor; “tıpkı sosyal medya platformlarının pazarlama bültenleri gibi”.
Zihin Haritası (Mindmap) Çözümü
İlk olarak: Herhangi bir geçici e-posta adresi girelim ve sonucu görelim

Sunucu, e-posta alanına girdiğiniz değeri yanıt olarak geri döndürüyor. Bu, web uygulamasında bir Yansıtılmış (Reflected) XSS zafiyetine yol açabilir
Yansıtılmış XSS, bir web sunucusunun doğrulanmamış kullanıcı girdisini (genellikle URL parametreleri biçiminde) uygun bir temizleme veya kodlama yapmadan yanıta dahil etmesiyle ortaya çıkar. Bu, kötü niyetli betiğin web sunucusundan “yansıtılması” ve kullanıcı özel olarak hazırlanmış bir bağlantıya tıkladığında anında tarayıcısında çalıştırılması anlamına gelir.
Bu zafiyeti test etmek için basit bir yük enjekte edebiliriz: <script>alert(1)</script>. Bunu e-posta alanına yazdığımızda, beklediğimiz yanıtı (yani bir uyarı penceresinin görüntülenmesini) alamadığımızı fark edeceğiz. Bu, zafiyetin geçerli olmadığı anlamına gelir.

İkinci olarak: Sunucu Tarafı Şablon Enjeksiyonu (SSTI)
E-posta alanına {{7*7}} girdisini göndermeyi deneyelim ve yanıtı görelim. Ekran görüntüsünde gösterildiği gibi bir hata sayfası belirdi

Bir web uygulamasında SSTI zafiyeti bulunması, sunucunun ifadeleri algılayıp çalıştırdığı anlamına gelir. Ancak 7*7 ifadesini yazdığımızda, sunucu matematiksel işlemin sonucuyla yanıt vermedi, bunun yerine bir hatayla karşılık verdi. Bu da web uygulamasının SSTI'den etkilendiğini gösterdi.

Zafiyet hakkında daha fazla bilgi için aşağıdaki bağlantıya bakabilirsiniz.
Görev 6: Metin kodlamak için kullanılan Burp Suite sekmesinin adı nedir?
Answer: decoder
Çözüm:
Burp Suite'teki Decoder sekmesi birkaç önemli amaca hizmet eder. Bunların en önemlisi verilerin kodlanması ve çözülmesidir
Görev 7: Bir HTTP isteğinde yükümüzdeki özel karakterleri göndermek için yükü kodlarız. Hangi tür kodlamayı kullanırız?
Answer: URL
Çözüm:
Bir HTTP isteği içindeki bir yükte özel karakterleri göndermek için genellikle URL kodlaması (diğer adıyla yüzde kodlaması (percent encoding)) kullanılır.
URL kodlaması, karakterleri İnternet üzerinden iletilebilecek bir biçime dönüştürür. Özel karakterlerin istek söz dizimini bozmamasını sağlar.
URL kodlamasında özel karakterler, karakterin ASCII değerini temsil eden iki onaltılık (hexadecimal) basamağın izlediği bir % işaretiyle değiştirilir. Örneğin:
- Boşluk ( ) %20 olur
- Ünlem işareti (!) %21 olur
Böyle bir kodlama işlemini gerçekleştirmek için, trafiği yakalamak amacıyla Burp Suite'i açacağız. Burp Suite'teki decoder sekmesini kullanarak e-posta girdi alanını SSTI yüküyle kodlamayı başaracağız.
Web uygulaması web teknolojisi olarak Node.js tabanlı olduğundan, web uygulamasının e-posta alanına eklemek üzere özel bir yük kullanacağız.
Yük, aşağıdaki bağlantı üzerinden Hacktricks yüklerinde açıkça belirtilmiştir: bağlantı.

Bu yükü kopyalayıp Burp Suite'teki decoder ile kodladıktan sonra e-posta alanına eklediğimizde, Burp Suite'ten aşağıdaki yanıtla karşılaşacağız.


Görev 8: HackTricks'ten bir yük kullanarak sistem komutları çalıştırmaya çalıştığımızda geri bir hata alıyoruz. Yanıttaki hatada “not defined” (tanımlı değil) olan nedir?
Cevap: Require.
Çözüm:
Şimdi yükü URL olarak kodladıktan sonra isteğin e-posta alanına ekledik. İsteği göndermeden önce ilk olarak repeater'a göndereceğiz.
İsteğin üzerinde sağ tıklayıp repeater'a göndererek isteği repeater'a taşıyabilirsiniz.
Ardından repeater sekmesine geçin ve ekran görüntüsünde gösterildiği gibi gönderdikten sonra yanıtı izleyin.


Tarayıcıda şunu belirten bir hata belirdi: “ReferenceError: require is not defined”
Görev 9: Tarayıcı bağlamında en üst düzey kapsamın (top-level scope) geleneksel adı olan, ancak Node.js'te böyle olmayan değişken nedir?
Answer: Global
Çözüm:
Node.js'te en üst düzey kapsam bir “window” değildir. Bunun yerine global nesne “global”dir. Ancak Node.js modülleri kendi kapsamlarını oluşturur; dolayısıyla bir modülün en üst düzeyinde var, let ya da const ile tanımlanan değişkenler global nesneye eklenmez.
Görev 10: Root Bayrağı
Answer: 6b258d726d287462d60c103d0142a81c
Çözüm:
Sunucunun önceki yanıtına dayanarak, ki bu yanıt “ReferenceError: Require is not available” (require kullanılabilir değil) olduğunu belirtiyordu, ve kısa bir aramayla bu hatayı aşmak için aşağıdaki bağlantıda belirtilen yükü kullanabiliriz.
Bu yükü Burp Suite'teki decoder'a kopyalayıp URL olarak kodlayın, ardından e-posta alanındaki önceki yükün yerine koyun ve sonra isteği repeater'a gönderin. İsteği sunucuya gönderdiğinizde aşağıdaki yanıtı alacaksınız.

Bu, root erişimi elde ettiğimizi açıkça gösteriyor. Yanıtı tarayıcıda görüntüleyebiliriz.

Şimdi root bayrağını görüntülememiz gerekiyor. Ancak flag.txt dosyasının nerede olduğunu bilmiyoruz. Bu yüzden, bu bağlantıdan kopyaladığımız yükteki tek bir “whoami” komutunu “ls /root” komutuyla değiştireceğiz.
Bu komut, root dizininde ne olduğunu listeleyecek. flag.txt'nin orada olup olmadığını kontrol etmek için.

Ekran görüntüsüne göre aradığımız şeyi bulacağız. Bu yüzden, sunucunun metin dosyasının içeriğiyle bize yanıt vermesi için komutu “cat /root/flag.txt” ile değiştirmemiz gerekiyor.
Komutu değiştirdikten sonra yükü yeniden kodlamayı unutmayın.


HTB — Tier 1 — Starting Point aşamasındaki Bike makinesinin çözümü hakkındaki blog yazımı okumaktan keyif aldığınızı umuyorum.
Bir başka write-up'ta görüşmek üzere!


