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 seconds

Subdomain 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

  1. memeriksa apakah file tersebut mengunakan .png extension

  2. jika terdapat etc atau root string pada nama file tersebut ada maka akan dihilangkan dari proses / dibatalkan

  3. jika tidak ada etc atau root string pada nama file tersebut maka akan diproses :

    1. memindahkan LINK ke Quarantined directory (/var/quarantined)

    2. 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