HackTheBox Flag Command

Merhaba, bu yazıda HackTheBox platformunda bulunan Web Challengelardan birisi olan “Flag Command” çözümünü yapacağım. Bu Challenge genel olarak kaynak kod incelemesi ve web developer tools kullanımı üzerinden ilerlemektedir. Aşağıda detaylı olarak ele alalım.
Sorunun aşağıdaki gibi bir açıklaması var:
Tam olarak bu dünyadan olmayan gizemli bir orman labirentinde uyandığınız “Boyutsal Kaçış Arayışına” başlayın. Diğer dünya sürprizlerine yol açabilecek tuhaf bir labirentte şarkı söyleyen sincaplara, yaramaz perilere ve huysuz büyücülere gidin. Büyülü labirenti fethedecek misin yoksa kendini büyülü zorlukların farklı bir boyutunda kaybolmuş mu bulacaksın? Yolculuk bu mistik kaçışta ortaya çıkıyor!
Daha sonra bize “83.136.255.47:49380” ip adresi ve port verilmektedir. Bu adrese giderek soruya ulaşıyoruz.

Sayfaya gittiğimizde bizi bir terminal ekranı benzeri bir ekran karşılıyor. “start” komutunu gönderdiğimizde geri sayım yaparak başlıyor.

Doğru seçenekleri yazdığımızda sorular ilerleyerek bize en son flag değerini verecek. Ancak bir labirent yapısı olduğu için çok fazla seçeneği deneyerek sonuca ulaşmamız gerekiyor. Bununla uğraşmamak için ilk iş sayfa kaynağına giderek dosyaları ve kodları inceliyorum.

Burada işimize yarayacak JavaScript dosyaları olabilir. “command, main, game” isimli JavaScript dosyaları var. Bunları tek tek açarak inceleyelim.

Command dosyasında işimize yarayacak bir şey bulunmuyor.

Game dosyasında da işimize yarayacak bir şey bulamıyoruz. Daha sonra main dosyasına bakıyorum.

Main dosyasını kontrol ettiğimde HTB{ içeren bir yanıt alırsam playerWon() çalışacak ve oyunu kazanmış olacağım. Oyuna “start” komutunu yazdıktan sonra sırasıyla yazılacak doğru cevaplar burada görülüyor. Bunlar şu şekilde:
- HEAD NORTH
- FOLLOW A MYSTERIOUS PATH
- SET UP CAMP
Bunları yazdıktan sonra yine birçok seçenek seçerek ilerlememiz gerekiyor. Bunu aşmak için başka aramalar yapıyorum.
const fetchOptions = () => {
fetch('/api/options')
.then((data) => data.json())
.then((res) => {
availableOptions = res.allPossibleCommands;
Bu kod parçası, oyun içindeki mevcut komut seçeneklerini almak için sunucuya bir HTTP isteği yapıyor.
if (availableOptions[currentStep].includes(currentCommand) || availableOptions['secret'].includes(currentCommand)) {
await fetch('/api/monitor', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
Bu kod parçası, kullanıcının girdiği komutun mevcut seçenekler arasında olup olmadığını kontrol ediyor. Eğer komut mevcut adımın (currentStep
) içindeki seçenekler arasında veya gizli komutlar (availableOptions['secret']
) içinde yer alıyorsa, bir HTTP POST isteği yaparak /api/monitor
adresine bu komutu gönderiyor.
api/monitor yoluna gittiğimde birşey elde edemiyorum. Daha sonra api/options yoluna göz atıyorum.

Burada bir json formatında seçenekler görülmekte fakat burada dikkatimizi secret altında yazan gizli mesaj çekiyor. “Blip-blop, in a pickle with a hiccup! Shmiggity-shmack” bu gizli mesajı herhangi bir seçenekte girdiğimizde flag degerini direk olarak elde ediyoruz.

DevTools kullanarak da analiz yapabiliriz. DevTools açarak “Network” üzerinden kontrol ettiğimizde istek atılan yerleri görüyoruz. Buradan api/options içeriğine baktığımızda soruları ve cevapları görebiliyoruz. Ayrıca “secret” değerini de görebiliyoruz.

Buradan “secret” değerini elde ettikten sonra aşağıda vereceğim kodu kullanarak DevTools Console ekranından flag değerini alabilirsiniz.
fetch('/api/monitor', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ 'command': "Blip-blop, in a pickle with a hiccup! Shmiggity-shmack" })
}).then(res => res.json()).then(data => console.log(data));
Bu kodu DevTools Console ekranına yazarsak, oyunun /api/monitor
endpoint’ine bir POST isteği göndermiş oluruz.
İçeriğinde “Blip-blop, in a pickle with a hiccup! Shmiggity-shmack” komutu var. Eğer bu komut oyunda özel bir etkileşim tetikliyorsa (örneğin, gizli bir geçidi açmak, direkt kazanmak, özel bir mesaj almak gibi), bu komutu manuel olarak göndermiş oluruz. Bunu manuel olarak gönderdiğimizde flag değerini çıktı olarak alacağız.

Soruyu bu şekilde çözerek finale ulaşıyoruz. Başka yazılarda görüşmek üzere.