Pentest: Laravel Voyager Directory Traversal Lead to Website Takeover

Apa yang penulis tulis disini adalah untuk edukasi dan sharing pengalaman semata, hal-hal yang tidak diinginkan yang terjadi akibat membaca artikel ini adalah diluar tanggung jawab penulis.

Pembukaan

Beberapa pekan lalu saya mencoba melakukan penetration testing pada salah satu website milik teman saya. Pada saat melakukan kegiatan ini saya mendapati celah yang sangat critical pada package Voyager.

Voyager

Voyager adalah Laravel admin package yang menyediakan fitur BREAD(CRUD), manajemen media, menu builder, dan banyak lainnya. Kalian bisa baca-baca langsung di website mereka (https://voyager.devdojo.com).

Step to Reproduce

Seperti biasa, kegiatan pentest rasanya kurang afdhol kalau tidak melakukan enumeration terhadap target. Disini saya menggunakan Nmap, Dirsearch, dan Sublist3r. Terdapat hal menarik ketika saya melakukan scanning terhadap target terutama saat menggunakan Dirsearch, banyak direktori yang seharusnya diproteksi namun luput dari perhatian mereka.

dirsearch

Mata saya langsung tertuju ke direktori admin, ketika saya buka dapatlah informasi kalau website ini menggunakan voyager sebagai CMS nya.

voyager

Saya pun langsung teringat sebuah bug yang terdapat di package ini, yaitu sebuah Directory Traversal yang memungkinkan attacker dapat membaca file diluar root website. Bug tersebut terdapat pada Voyager versi 1.3.0 kebawah. Vulnerable codenya terdapat pada:

voyager/src/Http/Controllers/VoyagerController.php

public function assets(Request $request)
    {
        *$path = str_start(str_replace(['../', './'], '',
urldecode($request->path)), '/');*
*        $path = base_path('vendor/tcg/voyager/publishable/assets'.$path);*
        if (File::exists($path)) {
            $mime = '';
            if (ends_with($path, '.js')) {
                $mime = 'text/javascript';
            } elseif (ends_with($path, '.css')) {
                $mime = 'text/css';
            } else {
                $mime = File::mimeType($path);
            }
            $response = response(File::get($path), 200,
['Content-Type' => $mime]);
            $response->setSharedMaxAge(31536000);
            $response->setMaxAge(31536000);
            $response->setExpires(new \DateTime('+1 year'));
            return $response;
        }
        return response('', 404);
    }

Gapake lama, saya langsung mencoba eksekusi bug ini dengan mencoba membaca file /etc/passwd lewat parameter /voyager-assets?path=

dan BOOM!

/etc/passwd

Tidak berhenti sampai disini, saya pun berniat membaca file .env, tetapi sebelumnya kita harus tau root directory dari web tersebut. Kembali membuka hasill scanning Dirsearch mata saya tertuju pada direktori logs. Ketika saya membuka direktori tersebut saya pun mendapati apa yang saya cari, yaitu root directory dari web tersebut.

logs

Lalu saya mencoba membaca file .env nya dengan payload {rootdirectory}/.env

jengjengjeng...

env

env2

Server pun merespon dengan membawa file .env kepada attacker. Dari sini attacker bisa melanjutkan aksinya dengan memanfaatkan data-data critical yang didapat kan.

Remediation

  • Pastikan untuk membatasi akses terhadap direktori yang sifatnya sensitif.
  • Pastikan untuk selalu mengupdate versi tech stack yang digunakan.

Reference