TECHCOMFEST 2024

circle-info

Participate with team Shelltatic

Name
Category
Vuln

pressword

Web Exploitation

Deserialization, RCE

yo nda tau

Web Exploitation

RCE, OOB

Kepepet

Web Exploitation

XSS

pressword

Attachment

File Attachment

Description

Author: Dimas

Wordpress baru saja melakukan patch terbaru, tapi sayangnya website saya nda bisa di update :( (sad hackerika noise...)

Summary

Pada challenge ini diberikan sebuah website Wordpress yang memiliki kerentanan pada Insecure Deserialization pada plugin yang dibuat author, dan terdapat sebuah Object Class yang rentan terhadap unserialize yang menyebabkan arbitrary code execution.

Solution

Pada file attachment file entrypoint.sh terlihat ada sebuah plugin yang diinstall

entrypoint.sh

Lanjut, kemudian cek source code dari plugin mac yang diinstall tersebut, yaitu ada pada path wp-contents/plugins/malc/malc.php, plugin ini merupakan buatan dari author soal.

Plugin ini akan melakukan register endpoint REST API baru melalui function register_rest_endpoints.

Untuk mengakses endpoint tersebut dapat melalui <host>/wp-json/malc/v1/handle_data, selanjutnya terlihat ada callback yang memanggil function rest_handle_data.

Terlihat bahwa handle tersebut akan mengambil query params key dan code dimana pada query params code akan dimasukkan pada function maybe_unserialize function tersebut akan memproses serialize object dan mengembalikan hasil unserialize nya. Hal ini bisa mengindikasikan bahwa dapat terjadi Insecure Deserialization.

Selanjutnya adalah mencari Object Class yang dapat digunakan untuk melakukan arbitrary code execution, seperti pada deskripsi soal sepertinya wordpress yang digunakan adalah versi wordpress yang seharusnya sudah ter-patch namun belum diupdate.

Chip of code Dockerfile - Install Wordpress

Versi yang digunakan adalah versi 6.4.1 dan versi terbaru nya saat challenge ini dibuat adalah versi 6.4.2. Selanjutnya adalah mencari bagian kode mana yang telah dipatch yang berhubungan dengan serialization.

Membandingkan Tag version 6.4.1 dan Tag version 6.4.2 pada github repository Wordpress akan terlihat bagian mana yang telah dipatch

Diff compare Tag 6.4.1 vs Tag 6.4.2 Wordpress

Terlihat bahwa ada tambahan kode baru pada patch file class-wp-html-token.php yaitu terdapat magic function __wakeup yang akan mencegah terjadinya unserialize pada Object Class tersebut.

Setelah melihat lebih lanjut, ada bagian kode yang menarik yaitu pada magic function __destruct

Terjadi eksekusi kode call_user_func yang argumentnya dapat diatur sendiri, sepertinya ini bisa dimanfaatkan, karena magic function __destruct akan terpanggil ketika melakukan unserialize object.

Berikut adalah crafting untuk serialize object yang akan digunakan untuk melakukan RCE

Selanjutnya jalankan kode, dan lalu ambil object serialize untuk digunakan pada query params pada api yang vulnerable sebelumnya.

Run solver code

Lakukan request pada endpoint api tadi

Sample request

Dan berhasil, terlihat bahwa eksekusi command telah berhasil, lalu hanya tinggal sesuaikan command yang akan dieksekusi pada object serialize, hingga mendapatkan flagnya

Get the Flag

Flag

TCF2024{wordpress_unserialize_to_rce_on_version_6.4.0+_wink...}

yo nda tau

Attachment

File Attachment

Description

Author: Dimas

Yo nda tau...

Note: This challenge uses a read-only file system, so you can't write anything into the file system.

Summary

Pada challenge ini diharuskan untuk melakukan escaping nodejs sandbox, yaitu escape dari context execution pada vm module nodejs.

Solution

Pada file index.js dari attachment yang diberikan ada konfigurasi handle route yang dapat melakukan sebuah eksekusi kode, berikut isi file tersebut

Handler tersebut akan mengambil query params dengan nama run untuk dieksekusi pada context lain menggunakan function runInNewContext, lalu akan mengambalikan outputnya kedalam response.

Sample Request

Ketika dicoba pun berhasil, selanjutnya adalah mencoba apakah langsung bisa untuk mengakses global module seperti menggunakan require

Ternyata error dan require tidak dapat diakses, sepertinya ini memang ada limit akses terhadap global module, coba kita periksa available object atau module yang ada pada context ini

Ternyata memang hanya basic object yang ada pada default nya, oke kita akan coba melakukan recover beberapa hal yang mungkin bisa, yaitu menggunakan constructor dari non primitive object, seperti berikut

Dah berhasil, mendapatkan lebih banyak object class yang ada, dan dari sini ada sebuah object yang menarik yaitu process

Coba kita akan melihat sub object apa saja yang ada dalam object process tersebut

Ternyata tidak ada object mainModule pada object process tersebut, yang biasanya ini dapat digunakan untuk melakukan recover global module yang ada.

Namun, disini masih terdapat binding value atau function pada object process tersebut, dimana ini dimanfaatkan untuk melakukan native code nodejs execution, salah satunya adalah melakukan binding module spawn_sync yang nantinya dapat dimanfaatkan untuk melakukan RCE, kita coba

Dan it's works, tinggal kita lengkapi pemanggilan kode tersebut agar dapat melakukan spawn shell dan melakukan RCE.

Untuk dapat mengakses dan melakukan kontrol pada shell dan juga melakukan capture output dari spawn yang telah dilakukan, dapat menggunakan kode berikut

RCE

Oke berhasil untuk mendapatkan RCE, selanjutnya kita dapat kontrol command - commandnya hingga mendapatkan flag.

Get the Flag

Flag

TCF2024{gadget_object_from_different_context_is_realy_usefull:)}

Challenge Kepepet

Description

Author: Dimas

Maybe this code will help you exploiting the challenge

Bot configuration

Summary

Target dari challenge ini adalah untuk mendapatkan sebuah XSS, dimana dengan teknik untuk dapat melakukan minify payload XSS yang digunakan. Untuk hal ini XSS dapat dilakukan menggunakan tools yang baru saja muncul yaitu HTMXarrow-up-right, dimana dapat memanfaatkan triggering event yaitu hx-on::load, karena penggunaan attribute hx tidak dibatasi sesuai dengan source code.

Solution

Dengan melihat snippet source code yang diberikan, sudah sangat jelas bahwa pertama dilakukan sebuah validasi input yang dimasukkan tidak dapat lebih dari 26 karakter.

Lalu, selanjutnya terdapat sanitasi input yang dimasukkan dengan tujuan untuk melakukan sanitasi script - script atau kode XSS. Pada sanitasi tersebut, terlihat bahwa ada yang unik, pada bagian berikut:

Dimana kode tersebut bertujuan untuk meng-ignore attribute html yang berawalan dari hx- agar tidak disanitasi, ini artinya kemungkinan dapat memanfaatkan HTMX untuk melakukan XSS.

Selanjutnya, analisa pada bagian source code html nya, pada bagian berikut adalah kode dimana halaman tersebut melakukan rendering konten yang sudah diinput oleh user

snip source code get note

Terlihat bahwa sebenarnya konten akan difetching dahulu melalui dari API, yaitu dengan memanfaatkan tools HTMX, lalu setelah berhasil fetching konten akan dirender atau diswap pada element tersebut, artinya ada sebuah konten baru yang dimasukkan ke dalam DOM saat ini oleh HTMX tersebut.

Jika melihat reference event dari HTMX pada link berikut https://htmx.org/eventsarrow-up-right, ada 1 event yang akan tertrigger ketika ada sebuah konten baru yang dimasukkan kedalam DOM, yaitu event htmx:load, dijelaskan sebagai berikut

Sepertinya ini dapat dimanfaatkan untuk melakukan trigger XSS, oke let's try dengan payload sebagai berikut:

Payload diatas masih terlalu panjang, mari kita buat lebih singkat lagi

Masih belum cukup, sebenarnya prefix htmx bisa dihilangkan sehingga menjadi sebagai berikut

Oke dengan payload diatas sudah sesuai, yaitu panjangnya 26 karakter, kita coba masukkan ke web nya

Input payload

Kemudian submit payload tersebut, dan maka akan tampil XSS seperti berikut

XSS Result

Selanjutnya adalah bagaimana cara untuk dapat mengambil cookie dari bot yang diberikan, karena tentu saja payload nya akan sangat panjang dan tidak akan cukup.

Pada konfigurasi bot nya, url yang dimasukkan dapat dari mana saja dan tidak dibatasi, hal ini bisa kita manfaatkan untuk menggunakan global variable window.name atau bisa langsung diakses name karena ini adalah global.

Sehingga, bisa dilakukan eval sesuai dengan value window.name tersebut, payload nya sebagai berikut

Payload diatas adalah payload yang paling pendek saat ini, yaitu 26 karakter panjangnya, oke dengan payload diatas kita dapat mengatur value name dari origin lain untuk melakukan set name dari window tersebut.

Dengan payload sebagai berikut untuk diletakkan pada server lain atau origin lain dimana akan divisit oleh bot nya:

Karena bot diconfig pada origin url app:8080, maka linknya diarahkan ke origin tersebut

Oke, semua sudah siap, mari kita exploit

  1. Send payload XSS

Exploit Payload
  1. Host third party script html ke server kita, atau yang lain

Host third html payload
  1. Masukkan link host tersebut ke bot, kemudian visit

visit bot

Setelah 3 step diatas selesai, tunggu hasilnya pada webhook

Webhook Result

Dan berhasil.

Flag

TCF2024{mini_xss_using_httpx,_how_far_you_can_minify_it?_dm_me}

Last updated