Gobuster ile Web Dizin ve Dosya Keşfi
Bir pentest projesinde müşterinin web uygulamasına bakıyorsunuz, hedef bir e-ticaret sitesi. Görünürde sadece birkaç sayfa var ama siz yıllardır bu işi yapıyorsunuz ve biliyorsunuz ki görünen her zaman gerçeği yansıtmıyor. İşte tam bu noktada Gobuster devreye giriyor. Bu araç, web sunucularındaki gizli dizinleri ve dosyaları brute-force yöntemiyle keşfetmenizi sağlayan, Go diliyle yazılmış hızlı ve güvenilir bir araç. Bugün bu aracı tüm detaylarıyla inceliyoruz.
Gobuster Nedir ve Neden Kullanmalısınız?
Gobuster, 2019’dan bu yana aktif geliştirilen, Go dilinin getirdiği eşzamanlılık avantajını sonuna kadar kullanan bir keşif aracı. DirBuster veya dirb gibi muadillerine kıyasla çok daha hızlı çalışıyor çünkü Go’nun goroutine yapısı sayesinde onlarca paralel isteği kolayca yönetebiliyor.
Peki neden bu araç? Şöyle düşünün: Bir web uygulamasının /admin, /backup, /config gibi dizinleri ya da config.php.bak, database.sql gibi dosyaları açıkta bırakması son derece yaygın. Geliştiriciler bu dosyaları test ortamından production’a taşırken unutuyor, ya da yedek alma alışkanlıkları güvenlik açığına dönüşüyor. Gobuster bu tür hataları ortaya çıkarmak için biçilmiş kaftan.
Aracın üç temel modu var:
- dir modu: Klasik dizin ve dosya keşfi
- dns modu: Alt alan adı (subdomain) keşfi
- vhost modu: Sanal host keşfi
- fuzz modu: URL parametrelerini fuzzing için
- s3 modu: Amazon S3 bucket keşfi
Kurulum
Kali Linux kullanıyorsanız Gobuster zaten yüklü geliyor. Yoksa ya da güncel versiyona ihtiyacınız varsa:
# Kali/Debian tabanlı sistemler
sudo apt update && sudo apt install gobuster
# Go ile kaynak koddan derleme (en güncel versiyon için)
go install github.com/OJ/gobuster/v3@latest
# Versiyonu kontrol et
gobuster version
Wordlist konusuna da değinmek gerekiyor çünkü Gobuster tek başına anlamsız, iyi bir kelime listesi olmadan. SecLists paketi bu iş için standart haline gelmiş durumda:
# SecLists kurulumu
sudo apt install seclists
# Wordlist'ler şu konumda olacak:
ls /usr/share/seclists/Discovery/Web-Content/
Temel Kullanım: dir Modu
En sık kullanacağınız mod bu. Temel sözdizimi oldukça sade:
gobuster dir -u http://hedef.com -w /usr/share/seclists/Discovery/Web-Content/common.txt
Bu komut hedef.com adresine karşı common.txt içindeki her kelimeyi deniyor ve HTTP yanıt kodlarına göre hangi dizinlerin mevcut olduğunu raporluyor. Ancak bunu olduğu gibi kullanmak pek verimli değil. Gerçek bir taramada şu parametreleri mutlaka ekliyorum:
gobuster dir
-u http://hedef.com
-w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt
-t 50
-x php,html,txt,bak,zip,sql
-s 200,204,301,302,307,401,403
-b 404,500
-o sonuclar.txt
--timeout 10s
Parametreleri tek tek açıklayayım:
- -u: Hedef URL
- -w: Kullanılacak wordlist dosyasının yolu
- -t 50: 50 eşzamanlı thread kullan (dikkatli olun, çok yüksek değerler hedefe DoS etkisi yapabilir)
- -x: Denenecek dosya uzantıları, her kelime bu uzantılarla da denenir
- -s: Başarılı sayılacak HTTP durum kodları
- -b: Kara listeye alınacak durum kodları (görmezden gelinecekler)
- -o: Çıktıyı dosyaya kaydet
- –timeout: Her istek için maksimum bekleme süresi
Dosya Uzantılarıyla Çalışmak
Uzantı keşfi çok kritik bir konu. Bir keresinde müşterinin sunucusunda config.php.bak bulmuştuk ve bu dosya veritabanı şifresini düz metin olarak içeriyordu. Geliştirici PHPStorm’un yedek dosyasını production’a atmıştı, klasik bir hata.
Hangi uzantıları denemeliyiz? Bu, hedef teknoloji stack’ine göre değişiyor:
# PHP tabanlı uygulama için
gobuster dir -u http://hedef.com
-w /usr/share/wordlists/dirb/common.txt
-x php,php3,php4,php5,phtml,bak,old,orig,backup,swp
# ASP.NET uygulaması için
gobuster dir -u http://hedef.com
-w /usr/share/wordlists/dirb/common.txt
-x asp,aspx,ashx,asmx,config,bak,old
# Java/Tomcat için
gobuster dir -u http://hedef.com
-w /usr/share/wordlists/dirb/common.txt
-x jsp,jspx,do,action,war,xml,properties
HTTPS ve Sertifika Sorunları
Pentest ortamlarında öz imzalı sertifikalar sık karşılaşılan bir durum. Gobuster bunu doğrudan red ediyor, ama geçebilirsiniz:
gobuster dir
-u https://hedef.com
-w /usr/share/seclists/Discovery/Web-Content/common.txt
-k
--timeout 15s
-k parametresi TLS sertifika doğrulamasını devre dışı bırakıyor. İç ağ testlerinde ya da self-signed sertifikalı hedeflerde bunu kullanmak zorunda kalıyorsunuz.
Header ve Cookie ile Kimlik Doğrulamalı Tarama
İşin ilginç kısmı şu: Bazen authenticated bir kullanıcı olarak tarama yapmanız gerekiyor. Mesela müşteri size “giriş yaptıktan sonra uygulama içinde ne bulunabilir?” diye soruyor. Bu durumda session cookie’nizi taramaya dahil etmeniz lazım:
# Cookie ile tarama
gobuster dir
-u http://hedef.com/dashboard
-w /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt
-c "PHPSESSID=abc123def456; csrftoken=xyz789"
-t 30
# Özel header ekleyerek (API token gibi)
gobuster dir
-u http://api.hedef.com
-w /usr/share/seclists/Discovery/Web-Content/api/objects.txt
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
-H "X-Custom-Header: deger"
-t 40
Cookie değerini Burp Suite veya tarayıcı developer tools’undan kolayca kopyalayabilirsiniz. Authenticated taramalarda genellikle çok daha ilginç sonuçlar çıkıyor ortaya.
DNS Subdomain Keşfi
Gobuster’ın dns modu, alt alan adlarını keşfetmek için kullanılıyor. Bu mod özellikle bug bounty çalışmalarında ya da bir şirketin attack surface’ini haritalandırırken değer kazanıyor:
gobuster dns
-d hedef.com
-w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt
-t 50
--timeout 5s
-o dns-sonuclar.txt
DNS modunda dikkat edilmesi gereken bir nokta var: wildcard DNS kayıtları. Eğer hedef domain *.hedef.com şeklinde bir wildcard kaydına sahipse, aracınız her kelime için pozitif sonuç alacak ve output anlamsız hale gelecek. Bunu tespit etmek için önce manuel kontrol yapın:
# Wildcard kontrolü
nslookup randomkelimeyok12345.hedef.com
# Gobuster wildcard'ı otomatik tespit edebilir, --wildcard flag'i ile zorla geç
gobuster dns
-d hedef.com
-w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt
--wildcard
Vhost Keşfi
Sanal host keşfi, aynı IP adresi üzerinde host edilen birden fazla web uygulamasını bulmak için kullanılıyor. Bu mod DNS’ten farklı çalışıyor; HTTP Host header’ını değiştirerek yanıtları karşılaştırıyor:
gobuster vhost
-u http://hedef.com
-w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt
--append-domain
-t 30
-o vhost-sonuclar.txt
–append-domain parametresi önemli: Bu flag olmadan wordlist’teki kelimeler olduğu gibi Host header’a yazılıyor. Bu flag ile test kelimesi test.hedef.com şeklinde kullanılıyor.
Gerçek Dünya Senaryosu: Dahili Bir Web Uygulaması Testi
Bir müşteride şöyle bir senaryo yaşadım: Şirketin iç ağında çalışan bir proje yönetim uygulaması vardı. Uygulama görünürde sadece /login, /dashboard ve /projects endpoint’lerini sunuyordu. Ama biz şüpheleniyorduk.
İlk taramayı geniş bir wordlist ile başlatttım:
gobuster dir
-u http://192.168.1.50:8080
-w /usr/share/seclists/Discovery/Web-Content/raft-large-directories.txt
-t 40
-x php,bak,sql,zip,tar.gz,json,xml,log
-o ilk-tarama.txt
--timeout 20s
-q
-q (quiet) parametresi sadece bulunan sonuçları gösteriyor, tüm deneme-yanılma sürecini ekrana basmıyor. Uzun taramalarda çok işe yarıyor.
Bu tarama /api dizinini ortaya çıkardı. Ardından bu dizine özel bir API wordlist ile devam ettim:
gobuster dir
-u http://192.168.1.50:8080/api
-w /usr/share/seclists/Discovery/Web-Content/api/api-endpoints.txt
-t 30
-o api-tarama.txt
Sonuç? /api/v1/export/users endpoint’i 200 döndürüyordu ve tüm kullanıcı veritabanını JSON formatında sunuyordu. Authorization header gerektirmeden. Müşteri çok şaşırmıştı ama bu tür unutulmuş debug endpoint’leri şaşırtıcı derecede yaygın.
Proxy Üzerinden Çalışmak
Burp Suite veya başka bir proxy ile entegre çalışmak analizi çok kolaylaştırıyor. Gobuster’ın bulduğu endpoint’leri Burp’te görebilir, istekleri inceleyebilirsiniz:
# Burp Suite ile birlikte kullan (Burp default 8080'de çalışır)
gobuster dir
-u http://hedef.com
-w /usr/share/seclists/Discovery/Web-Content/common.txt
--proxy http://127.0.0.1:8080
-t 10
Proxy kullanırken thread sayısını düşük tutun, yoksa Burp’ün üstesinden gelemeyeceği bir istek seli oluşturuyor.
Çıktı Analizi ve Sonraki Adımlar
Gobuster raw output veriyor, bunu anlamlandırmak sizin işiniz. Tipik bir çıktı şöyle görünüyor:
/admin (Status: 301) [Size: 318] [--> http://hedef.com/admin/]
/backup (Status: 200) [Size: 1024]
/config.php.bak (Status: 200) [Size: 256]
/wp-admin (Status: 301) [Size: 320] [--> http://hedef.com/wp-admin/]
/.git (Status: 301) [Size: 316] [--> http://hedef.com/.git/]
Burada dikkat etmeniz gerekenler:
- 301 yönlendirmeleri: Genellikle gerçek dizinler, yönlendirilen URL’yi takip edin
- 200 + büyük boyutlu yanıtlar: İçerik var, incelemeye değer
- 200 + küçük boyutlu yanıtlar: Boş sayfa ya da hata mesajı olabilir, kontrol edin
- 403 Forbidden: Dizin var ama erişim yok, bypass denemeleri yapılabilir
- 401 Unauthorized: Kimlik doğrulama gerekiyor, credentials bulmaya çalışın
.git dizini bulmak özellikle kritik. Eğer production sunucuda .git açıksa, tüm kaynak koduna erişebilirsiniz. Bunun için git-dumper gibi araçlar mevcut.
Performans ve Etik Kullanım Konusunda
Bu araçları kullanırken söylememem doğru olmaz: Gobuster’ı sadece yetkili olduğunuz sistemlerde kullanın. Pentest sözleşmesi, bug bounty scope’u veya kendi sistemleriniz. Yetkisiz kullanım Türk Ceza Kanunu’nun 243 ve 244. maddeleri kapsamında suç oluşturuyor.
Performans açısından da dengelemeyi iyi yapın. 100+ thread açmak hedef sunucuya saldırı etkisi yapabilir ve hem hedefe zarar verebilir hem de taramayı kendiniz iptal etmek zorunda kalabilirsiniz. 20-50 thread genellikle makul bir başlangıç noktası.
Rate limiting’e dikkat edin. Bazı WAF’lar saniyede belirli sayıda istek sonrası IP’nizi engelliyor. Bu durumda delay ekleyebilirsiniz:
gobuster dir
-u http://hedef.com
-w /usr/share/seclists/Discovery/Web-Content/common.txt
--delay 200ms
-t 10
–delay ile her istek arasına milisaniye cinsinden bekleme süresi ekliyorsunuz. WAF olan sistemlerde bu çok işe yarıyor.
Wordlist Seçimi: Bu Kritik
Aracın kalitesi kullandığınız wordlist’le doğru orantılı. Benim en çok güvendiğim listeler:
- common.txt (dirb): Hızlı taramalar için, küçük ama etkili
- directory-list-2.3-medium.txt: Orta seviye derinlik, iyi denge
- raft-large-directories.txt: Kapsamlı taramalar, zaman alır
- SecLists/Discovery/Web-Content/: İçinde onlarca özelleşmiş liste var, teknolojiye göre seçin
Kendi wordlist’inizi oluşturmak da mümkün. Hedef uygulama hakkında bilgi topladıktan sonra sektöre özel ya da uygulamaya özel kelimeler eklenmiş özel listeler hazırlayabilirsiniz. CeWL aracı hedef web sitesinin içeriğinden kelime listesi çıkarıyor, Gobuster ile birlikte kullanmak oldukça etkili:
# CeWL ile hedef siteden wordlist oluştur
cewl http://hedef.com -d 3 -m 5 -w hedef-wordlist.txt
# Oluşturulan listeyle Gobuster çalıştır
gobuster dir
-u http://hedef.com
-w hedef-wordlist.txt
-t 20
Sonuç
Gobuster, sızma testinin keşif fazında vazgeçemeyeceğiniz araçlardan biri. Hızı, esnekliği ve aktif geliştirmesiyle alternatiflerinin önünde. Ama şunu unutmayın: Araç sadece bir araç. Sonuçları yorumlamak, neyin kritik olduğuna karar vermek ve bulgulardan aksiyon almak tamamen size kalmış.
Deneyimlerimden çıkardığım ders şu: En basit görünen web uygulamaları bile beklenmedik yerlerde açıklar barındırıyor. Bir /backup dizini, unutulmuş bir .env dosyası, erişime açık bırakılmış bir /api/debug endpoint’i. Gobuster bunları gün yüzüne çıkarmak için güçlü bir araç, doğru wordlist ve doğru parametrelerle kullandığınızda sonuçlar sizi şaşırtacak.
Tarama sonuçlarınızı her zaman belgeleyin, raporlayın ve özellikle kurumsal ortamlarda bulgularınızı ilgili teknik ekiplerle paylaşmaktan çekinmeyin. Güvenlik herkesin işi.
