LinkVortex
Information Gathering
Port and Services
# nmap -p- -sSVC 10.10.11.47 --min-rate 1000 -oN nmap_result
Starting Nmap 7.95 ( https://nmap.org ) at 2025-04-23 09:57 EDT
Stats: 0:00:28 elapsed; 0 hosts completed (1 up), 1 undergoing SYN Stealth Scan
SYN Stealth Scan Timing: About 58.80% done; ETC: 09:58 (0:00:11 remaining)
Nmap scan report for 10.10.11.47
Host is up (0.13s latency).
Not shown: 65533 closed tcp ports (reset)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.9p1 Ubuntu 3ubuntu0.10 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 256 3e:f8:b9:68:c8:eb:57:0f:cb:0b:47:b9:86:50:83:eb (ECDSA)
|_ 256 a2:ea:6e:e1:b6:d7:e7:c5:86:69:ce:ba:05:9e:38:13 (ED25519)
80/tcp open http Apache httpd
|_http-server-header: Apache
|_http-title: Did not follow redirect to http://linkvortex.htb/
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 56.45 secondsSubdomain Enumeration
disini saya melakukan enumerasi subdomain dengan melakukan brute force menggunakan fuzz
Directory and Files Scanning
disini saya melakukan directory and files scanning dan mendapatkan folder .git yang cukup menarik
Initial Access
Git Exposure
disini saya mendapatkan direktori .git yang dapat diakses seperti yang dapat dilihat pada gambar dibawah ini

selanjutnya saya menggunakan git-dumper untuk mendapatkan souce code dari folder .git yang terekspos tersebut
selanjutnya saya menggunakan perintah git status untuk memeriksa informasi terkini mengenai status working directory dan staging area
disini terdapat 2 file
Dockkerfile.ghost
core/test/regression/api/admin/authentication.test.js
sepertinya mesin ini menggunakan docker untuk aplikasi ghost yang digunakan, selanjutnya saya akan memeriksa kedua file tersebut dengan perintah git diff
disini pada file Dockerfile.ghost saya mendapatkan informasi path dari file configuration ghost dan pada file authentication.test.js disini saya mendapatkan password untuk authentication API yang memungkinkan berasal dari user yang terdaftar pada ghost cms. selanjutnya saya akan mencoba login menggunakan credential tersebut

akan tetapi setelah saya mencoba credential tersebut, email tidak terdaftar pada ghost dengan menampilkan error "There is no user with that email address".
pada halaman artikel terdapat informasi penulis yang memungkinkan sebagai username seperti yang dapat dilihat pada gambar dibawah ini


akan tetapi username tersebut masih belum valid, mungkin ini karena domain yang saya gunakan pada email tersebut masih ke example.com, saya berfikir untuk mencoba menggunakan linkvortex.htb sebagai domainnya

pada gambar diatas tersebut menunjukan "Your password is incorrect" yang berarti username tersebut valid, selanjutnya saya menggunakan password yang valid untuk login dan berhasil masuk ke dashboard seperti yang dapat dilihat pada gambar berikut

SSH as bob
pada halaman settings, disini saya menemukan ghost cms tersebut berjalan pada versi 5.58.0

setelah melakukan pencarian exploit, disini saya mendapatkan kerentanan dengan versi yang sesuai CVE-2023-40028 - Ghost CMS Arbitrary File Read

disini saya melakukan beberapa modifikasi pada script exploit tersebut, pada bagian variable GHOST_URL saya ubah dengan targetnya yaitu http://linkvortex.htb

selanjutnya saya menjalankan exploit tersebut dengan perintah

pada gambar diatas tersebut saya mencoba menjalankannya dengan mencoba membaca file /etc/passwd dan berhasil. disini terdapat user node saya mencoba membaca id_rsa dari user tersebut tapi tidak ditemukan. mengingat sepertinya ghost cms berjalan pada docker container saya mencoba membaca file configurasi /var/lib/ghost/config.production.json (dari hasil git status diatas) dan mendapatkan bob credential


Privilege Escalation
disini saya memeriksa daftar perintah yang dapat dijalankan oleh bob dengan menggunakan hak akses sudo
disini bob dapat menjalankan sudo pada script berikut
script tersebut akan memindahkan file symlink dengan ketentuan harus menggunakan extensi .png. berikut ini adalah urutan flow simple dari script tersebut
memeriksa apakah file tersebut mengunakan .png extension
jika terdapat etc atau root string pada nama file tersebut ada maka akan dihilangkan dari proses / dibatalkan
jika tidak ada etc atau root string pada nama file tersebut maka akan diproses :
memindahkan LINK ke Quarantined directory (/var/quarantined)
memeriksa apakah CHECK_CONTENT adalah true, jika true maka akan membaca konten file yang dipindahkan tersebut
dari flow tersebut disini saya dapat menggunakan duoble symlink untuk membaca suatu file, hal ini dilakukan untuk membypass pengecheckan etc atau root string pada file.
saat pertama kali membuat symlink (link1) akan link tersebut akan menuju /root/.ssh/id_rsa, script akan mendeteksi kata "etc" atau "root" dengan menggunakan /usr/bin/readlink

dengan membuat symlink baru yang mengarah pada link sebelumnya akan membuat kata "etc" atau "root" terganti dengan nama link sebelumnya

dengan cara ini dapat membypass bagian pengecheckan if /usr/bin/echo "$LINK_TARGET" | /usr/bin/grep -Eq '(etc|root)'pada script tersebut. berikut ini adalah stepnya
disini saya berhasil mendapatkan id_rsa dari root, selanjutnya saya akan menggunakannya untuk terhubung ke ssh sebagai root
dan disini telah berhasil privilege escalation ke root.
Last updated