August 14, 2026
Support — Tryhackme Challenge
Room: Support Kategori: Web Application Penetration Testing → Remote Code Execution Estimasi Waktu: 60 menit Target IP: 10.49.167.170
By Arya Utomo
6 min read
1. Ringkasan Skenario
Support Operations Platform adalah aplikasi internal baru yang digunakan untuk membantu tim IT dan helpdesk. Aplikasi ini menangani manajemen user, API internal, dan operasi tingkat sistem. Security bukan fokus utama saat pengembangan beberapa fitur mengandalkan input yang dikontrol user dan trust boundary yang lemah.
Tujuan akhir: melakukan pentest terhadap platform dan melakukan eskalasi akses hingga mencapai Remote Code Execution (RCE) di server.
Kata kunci penting dari deskripsi soal:
- "User management" → kemungkinan ada fitur registrasi/profil user yang bisa disalahgunakan
- "Internal APIs" → kemungkinan ada endpoint API yang seharusnya tidak diakses langsung dari luar, atau kurang autentikasi
- "System-level operations" → indikasi ada fitur yang berinteraksi dengan OS/command sistem, kandidat kuat untuk command injection
- "Weak trust boundaries" → indikasi ada asumsi keliru soal siapa yang boleh mengakses fitur tertentu (mirip pola broken access control atau IDOR)
2. Metodologi
Mengikuti alur reconnaissance → enumerasi → eksploitasi bertahap → RCE, konsisten dengan pola yang sudah dipelajari (fingerprinting stack, cari titik input user-controllable, chaining kerentanan):
- Reconnaissance & fingerprinting stack aplikasi (port, service, framework backend)
- Enumerasi struktur situs, API internal, dan fitur user management
- Analisis fitur yang menangani "system-level operations" — kandidat command/code injection
- Eksploitasi kerentanan awal untuk mendapatkan initial access/foothold
- Chaining ke kerentanan lanjutan (privilege escalation atau akses API internal)
- Eksploitasi akhir menuju Remote Code Execution
3. Reconnaissance & Fingerprinting
3.1 Port & Service Scanning
nmap -sV -sC 10.49.167.170nmap -sV -sC 10.49.167.170Hasil:
Nmap scan report for 10.49.167.170
Host is up (0.12s latency).
Not shown: 998 closed tcp ports (conn-refused)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 9.6p1 Ubuntu 3ubuntu13.11 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 256 e7:84:fa:66:c7:57:83:94:b9:83:73:f3:02:99:3c:7a (ECDSA)
|_ 256 60:f2:c2:ab:a8:44:18:c8:df:31:97:5e:ff:ff:e6:e6 (ED25519)
80/tcp open http Apache httpd 2.4.58 ((Ubuntu))
|_http-server-header: Apache/2.4.58 (Ubuntu)
| http-cookie-flags:
| /:
| PHPSESSID:
|_ httponly flag not set
|_http-title: Support Operations Panel
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernelNmap scan report for 10.49.167.170
Host is up (0.12s latency).
Not shown: 998 closed tcp ports (conn-refused)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 9.6p1 Ubuntu 3ubuntu13.11 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 256 e7:84:fa:66:c7:57:83:94:b9:83:73:f3:02:99:3c:7a (ECDSA)
|_ 256 60:f2:c2:ab:a8:44:18:c8:df:31:97:5e:ff:ff:e6:e6 (ED25519)
80/tcp open http Apache httpd 2.4.58 ((Ubuntu))
|_http-server-header: Apache/2.4.58 (Ubuntu)
| http-cookie-flags:
| /:
| PHPSESSID:
|_ httponly flag not set
|_http-title: Support Operations Panel
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernelCatatan: ditemukan 2 port terbuka yaitu 22 (ssh) dan 80 (http).
3.2 Fingerprinting Web Stack
bash
curl -I 10.49.167.170curl -I 10.49.167.170Hasil:
HTTP/1.1 200 OK
Date: Fri, 14 Aug 2026 04:59:58 GMT
Server: Apache/2.4.58 (Ubuntu)
Set-Cookie: PHPSESSID=5b9869q0tmntj9ee547ke6p3p6; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Content-Type: text/html; charset=UTF-8HTTP/1.1 200 OK
Date: Fri, 14 Aug 2026 04:59:58 GMT
Server: Apache/2.4.58 (Ubuntu)
Set-Cookie: PHPSESSID=5b9869q0tmntj9ee547ke6p3p6; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Content-Type: text/html; charset=UTF-83.3 Directory & Endpoint Enumeration
bash
gobuster dir -u http://10.49.167.170/ -w DirBuster-2007_directory-list-2.3-medium.txt -x php,txt,bak,sql,zip
===============================================================
Gobuster v3.8.2
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://10.49.167.170/
[+] Method: GET
[+] Threads: 10
[+] Wordlist: DirBuster-2007_directory-list-2.3-medium.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.8.2
[+] Extensions: php,txt,bak,sql,zip
[+] Timeout: 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
index.php (Status: 200) [Size: 2591]
info.php (Status: 200) [Size: 73312]
footer.php (Status: 200) [Size: 1253]
skins (Status: 301) [Size: 314] [--> http://10.49.167.170/skins/]
includes (Status: 301) [Size: 317] [--> http://10.49.167.170/includes/]
layout (Status: 301) [Size: 315] [--> http://10.49.167.170/layout/]
js (Status: 301) [Size: 311] [--> http://10.49.167.170/js/]
api.php (Status: 302) [Size: 0] [--> index.php]
logout.php (Status: 302) [Size: 0] [--> index.php]
config.php (Status: 200) [Size: 0]
dashboard.php (Status: 302) [Size: 0] [--> index.php]gobuster dir -u http://10.49.167.170/ -w DirBuster-2007_directory-list-2.3-medium.txt -x php,txt,bak,sql,zip
===============================================================
Gobuster v3.8.2
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://10.49.167.170/
[+] Method: GET
[+] Threads: 10
[+] Wordlist: DirBuster-2007_directory-list-2.3-medium.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.8.2
[+] Extensions: php,txt,bak,sql,zip
[+] Timeout: 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
index.php (Status: 200) [Size: 2591]
info.php (Status: 200) [Size: 73312]
footer.php (Status: 200) [Size: 1253]
skins (Status: 301) [Size: 314] [--> http://10.49.167.170/skins/]
includes (Status: 301) [Size: 317] [--> http://10.49.167.170/includes/]
layout (Status: 301) [Size: 315] [--> http://10.49.167.170/layout/]
js (Status: 301) [Size: 311] [--> http://10.49.167.170/js/]
api.php (Status: 302) [Size: 0] [--> index.php]
logout.php (Status: 302) [Size: 0] [--> index.php]
config.php (Status: 200) [Size: 0]
dashboard.php (Status: 302) [Size: 0] [--> index.php]Hasil temuan:
terdapat berberapa endpoint menarik seperti dashboard.php, config.php, api.php, info.php.
TASK 1 — FLAG ADMIN USER
Dari hasil scanning port sebelumnya didapatkan 2 service yg terbuka, yaitu ssh dan http. Selanjutnya saya lgsung tes aja yang http dimulai dari directory enumeration dan didapatkan berberapa hasil menarik yang bisa saya coba akses. pertama ada info.php.
ini termasuk file sensitive yang tidak terlindungi aplikasi meskipun saya tidak mendapat data apapun dari sini,selanjutnya saya coba akses api.php.
Dan hasilnya halaman api tersebut redirect ke halaman login page yang artinya untuk akses halaman api tersebut diperlukan Autentikasi. Selanjutnya saya coba akses config.php
Ternyata file tersebut bisa diakses, akan tetapi isinya blank baik dari ui web ataupun burpsuite, hal ini sering terjadi saat akses file php yang sensitive. apa lagi file konfigurasi,sering kali file tidak diijinkan dilihat oleh publik, akan tetapi saya masih coba lihat secara lokal jika ada kerentanan seperti LFI ataupun SSRF. selanjutnya saya akses dashboard.php.
Hasilnya sama aja kena redirect ke login page,artinya dari smua jalur serangan saya hanya bisa lewat dari fitur login untuk mendapat Autentikasi. dihalaman login ini saya dikasih tau salah satu kredensial email yaitu 'help@support.thm', selanjutnya saya coba bruteforce password nya dengan kredensial email tersebut menggunakan intruder burpsuite dengan type sniper attack.
dari hasil bruteforce password menggunakan intruder ditemukan bahwa passwordnya adalah 'snoopy', jadi saya akan login dengan 2 kredensial yang sudah ditemukan tadi (help@support.thm:snoopy)
Saya berhasil login dan disuguhkan bentuk dashboard yang hanya ada satu fitur 'select theme'.
saat saya coba pilih salah satu theme ternyata fitur ini menggunakan method get dengan parameter "skin=red" . Kemungkinan parameter ini memanggil file yg ada didalam aplikasi, jadi saya coba panggil file config yang kita dapat sebelumnya di directory & endpoint enumeration, karna kita tidak bisa akses file secara publik, saya coba akses lewat percobaan LFI, langsung saya inject parameternya "skin=../config".
Dari isi config.php ditemukan kredensial password " support@110 ". saat ini saya belum tau fungsi kredensial ini untuk apa. dari dashboard saya sudah tes smua fiturnya, akan tetapi saya belum mendapatkan flag apapun dikarenakan minim fitur pada user yg saya login sekarang, jadi saya berencana mencoba testing session nya dgn mengubah cookie usernya dengan tujuan mendapatkan akses yang lebih tinggi jika ada sesuatu dari cookie yang bisa saya ubah dan tidak diproteksi oleh aplikasi.
Dari cookie ditemukan dua variael yaitu isITUser dan PHPSESSID. value dari isITUser kemungkinan dihash menggunakan md5 jadi saya coba crack menggunaakn crackstation.net.
dan hash berhasil dicrack dengan hasil ' false ', jadi saya tinggal ubah valuenya jadi ' true ' lalu saya hash lagi dengan md5 di cyberchef.
dari hasil hash value 'true' ini saya gunakan dicookie tadi dengan tujuan mendapatkan fitur yang lebih tinggi.
Setelah update cookie muncul lah tombol baru didashoard untuk lihat API.
ditemukan penggunaan untuk ambil data user, dari responnya saya bisa dapat data email dan ketentuan rolenya. jadi saya coba enumeration untuk mencari data user dengan role admin.
Setelah saya coba ambil data dengan id user 1, ternyata ditemukan email user dengan role admin. Jadi saya pikir ini ada hubungannya dengan kredensial passworrd yang kita temukan di file config tadi ' support@110 ' langsung saya coba untuk login dengan kredensial specialadmin@support.thm:support@110.
Setelah saya coba ternyata kredensial tersebut salah, disini saya sangat bingung, jadi saya iseng menghapus karakter '@' pada password.
Dan yapp, saya berhasil login menggunakan akun admin dan mendapatkan flag : THM{I_AM_ADMIN999}.
TASK 2 : RCE
Dari dashboard admin ini saya notice ada fitur baru untuk memperlihatkan tanggal dan waktu.
saya langsung cek request ke burpsuite dan ternyata fitur ini menggunakan method POST Data.
Saya langsung coba lakukan Command Injection untuk buka flag di /home/ubuntu/user.txt pada parameter ' sys= date | cat /home/ubuntu/user.txt '.
Dan ternyata berhasil, aplikasi merespon injeksi tadi dan menampilkan isi dari flag pada /home/ubuntu/user.txt yaitu : THM{GOT_THE_FLAG001}.
Ringkasan Temuan
- Weak Credential Lead to Bruteforce Attack
- Local File Inclusen
- Cookie Not Secure
- Command Injection