Xin chào,
Hôm nay chúng ta sẽ giải task 21 để lấy mật khẩu cho account shiba3, đồng thời chúng ta sẽ học một ít về phân quyền trong hệ thống Linux. Nhưng vì mảng kiến thức về phân quyền trong hệ thống Linux liên quan chặt chẽ đến các kiến thức về user và group trong hệ thống Linux, nên để tránh cho bài trở nên quá dài và nặng, mình sẽ cắt nó ra thành 2 phần và hôm nay chúng ta sẽ học phần đầu tiên.
1/ Lấy mật khẩu shiba3 (Task 21)
Để lấy được mật khẩu của account shiba3, chúng ta phải vượt qua task 21. Task 21 yêu cầu
This challenge is pretty simple. The binary is checking to see if the environment variable “test1234” exists, and if it’s set equal to the current $USER environment variable.
Nghĩa là chúng ta sẽ kiểm tra xem trong hệ thống hiện tại đã có variable tên là test1234 hay chưa? và giá trị của test1234 có phải là giá trị của variable USER hay không? Nếu variable test1234 chưa có thì tạo và sau đó gán giá trị của variable USER cho variable test1234.
Chúng ta thực hiện như sau:
echo $test1234
Không thấy có giá trị nào trả về, mình có thể kết luận là biến test1234 chưa tồn tại. Nếu vậy mình sẽ tạo và gán giá trị cho test1234 như sau:
export test1234=$USER
Chúng ta sẽ kiểm tra lại biến test1234, nếu giá trị trả về là shiba2, chúng ta đã làm đúng.
echo $test1234
Sau đó dùng lệnh ls để liệt kê các file trong directory hiện tại, mình thấy file shiba2. Cho thực thi file shiba2, mình đã lấy được password cho account shiba3.
ls
./shiba2

Chú ý
Ở bài trước, mình đã cố tình không nêu ra sự khác biệt giữa hai cách tạo variable
Cách 1: <tên-biến>=<giá-trị>
Cách 2: export <tên-biến>=<giá-trị>
Mục đích là để khi các bạn làm task 21 và sử dụng cách 1, khi thực thi file shiba2, các bạn sẽ bị lỗi segmentation fault. Lỗi này xảy ra khi ứng dụng shiba2 không tìm thấy biến test1234 cũng như giá trị được gán cho biến. Lúc này, nếu bạn nào chuyển từ cách số 1 để tạo variable sang cách 2, bạn lại có thể chạy được file thực thi shiba2.

Vấn đề ở đây chính là sự khác biệt giữa 2 cách tạo variable trên.
Với cách 1: Variable bạn tạo ra chỉ có thể được sử dụng trong shell và không thể được sử dụng cho các tác vụ khác.
Với cách 2: Variable của bạn có thể được sử dụng cho bất kỳ tác vụ nào cần đến nó.
Khi tạo variable bằng cách 1, variable của bạn sẽ chỉ có thể được sử dụng trong shell, do đó khi chạy shiba2, shiba2 sẽ cần variable test1234 để chạy tác vụ và xuất ra password của shiba3. Nhưng do test1234 không thể được sử dụng cho các tác vụ ngoài shell, dẫn đến việc shiba2 báo lỗi như bạn đã thấy. Để khắc phục tình trạng trên, bạn cần sử dụng cách 2 để tạo variable.
Tại sao mình lại tạo ra thử thách không báo trước này?
Vì mình muốn khi các bạn sai, bạn sẽ thử một cách làm khác, hoặc chí ít cũng Google để tìm hiểu liệu mình đã làm sai gì hay không?
Đó là để cho các bạn tập luyện mindset của một hacker hay pentester. Trong môi trường luyện tập CTF, bạn sẽ không mất bất cứ thứ gì để thử mọi giải pháp bạn có cả. Nếu như có 2 cách để giải quyết một vấn đề, và cách 1 đã thất bại, việc thử luôn cách 2 cũng chả làm bạn mất mát gì. Nếu may mắn thì tốt, không thì thôi.
Như trong bài pentest server Pickle Rick, ở phần tạo reverse shell, nếu chỉ vì Bash và Netcat thất bại mà bạn bỏ qua luôn việc thử Perl, thì chẳng phải bạn đã bỏ qua cơ hội lấy được reverse shell rồi hay sao.
Cốt lõi của việc làm pentest là thử tất cả mọi trường hợp và giải pháp khả thi mà bạn có thể nghĩ ra. Nếu thử tất cả mọi trường hợp và giải pháp nhưng vẫn không được, lúc này có thể là bạn đã làm sai hay bỏ xót điều gì đó. Khi đó hãy kiểm tra lại những gì mình đã làm và hãy sử dụng Google để tra cứu hoặc sửa lỗi nhé.
2/ Đăng nhập account shiba3
Sau khi có được mật khẩu shiba3, chúng ta sẽ dùng lệnh su để truy cập vào account shiba3
su shiba3
<nhập password>

Cũng lưu ý với các bạn là khi đã lấy được các account như shiba2 và shiba3 cùng mật khẩu của chúng. Mỗi lần ssh để kết nối với server Learn Linux, các bạn không cần phải
ssh shiba1@<ip-address>
Sau đó, nâng cấp lên từng account bằng lệnh su nữa, mà bạn có thể ssh trực tiếp shiba2 hoặc shiba3 với cùng câu lệnh luôn
ssh shiba3@<ip-address>
3/ Những kiến thức sẽ học ở shiba3
Ở phần 3 của server Learn Linux, chúng ta sẽ học những kiến thức vô cùng quan trọng ví dụ như:
- SUID hay phân quyền trong hệ thống Linux
- Các thiết lập quyền cho user và group
- Cách các files và directories được tổ chức trong hệ thống Linux
- Cách tạo, xóa, copy, cut và di chuyển giữa các directories
- Cách tạo soft link, hard link cũng như tìm kiếm nội dung thông qua giao diện CLI
Đây đều là những kiến thức vô cùng quan trọng, là nền tảng phục vụ cho Linux Privilege Escalation (các bạn có thể xem lại bài sau phần 3B để hiểu rõ hơn), nên các bạn cần phải nắm thật chắc nhé.
4/ Phân quyền trong hệ thống Linux và câu lệnh chmod
Phân quyền trong hệ thống Linux là một trong những giải pháp được sử dụng để bảo vệ hệ thống Linux. Tất cả mọi thứ trong hệ thống Linux bao gồm câu lệnh, ứng dụng, interface, IP address, ports, v.v. đều ở dạng các file dữ liệu. Việc phân quyền cho phép quy định những ai có quyền được tiếp cận và những file nào được tiếp cận giúp hạn chế rủi ro những account thường được dùng cho các tác vụ thường ngày dù có bị hack cũng không gây ra những rủi ro lớn cho toàn hệ thống.
Việc này cũng giống như việc trên Windows, các bạn thường được khuyên bên cạnh account administrator, các bạn nên tự thiết lập một account bình thường không có quyền cài đặt phần mềm và sử dụng account bình thường này cho các tác vụ hàng ngày để hạn chế trường hợp máy bạn bị cài mã độc mà bạn không biết.
Trong Linux, có 4 quyền chính:
- – (deny): Không được cấp quyền
- r (read): Cho phép bạn truy cập và đọc file dữ liệu
- w (write): Cho phép bạn chỉnh sửa, thay đổi nội dung, tạo mới hoặc xóa bỏ nội dung đang tồn tại trong file dữ liệu, cũng như bạn sẽ có quyền đổi tên dữ liệu được chứa bên trong file hiện tại
- x (execute): Cho phép bạn thực thi, chạy file dữ liệu, nếu file đó là một file thực thi
Khi các bạn sử dụng lệnh ls -l, phía trước mỗi file hoặc directory, bạn sẽ thấy một dãy phân quyền rwx cho biết những quyền mà account hiện tại có thể dùng là gì. Ví dụ
-rw-r--r-- 1 vincent vincent 996 Nov 16 10:25 Book.pdf
Dòng trên cho biết mình chỉ có quyền đọc và viết với file Book.pdf
Ngoài được thể hiện dưới dạng ký tự, các quyền này còn được thể hiện dưới dạng số thập phân.
- 0 = –
- 1 = x
- 2 = w
- 4 = r
Tại sao lại như vậy? Vì số nhị phân đấy bạn.
Chúng ta có bảng giá trị như sau
r w x
0 0 1 = 2^0 = 1
0 1 0 = 2^1 = 2
0 1 1 = 2^0 + 2^1 = 3
1 0 0 = 2^2 = 4
1 0 1 = 2^2 + 2^0 = 5
1 1 0 = 2^2 + 2^1 = 6
1 1 1 = 2^2 + 2^1 + 2^0 = 7
Như bạn đã biết, trong hệ thống số nhị phân số 1 được biểu trưng cho có và 0 biểu trưng cho không. Như vậy, để thiết lập quyền x, bit nhị phân chỗ x phải được bật lên 1. Cứ quyền nào được thiết lập thì bit ở chỗ đó sẽ được bật lên 1, những bit không được thiết lập sẽ là 0.
Căn cứ vào tổng tất cả các bit trong chuỗi ta sẽ có bảng sau (các quyền không được thiết lập sẽ được thể hiện bằng dấu “-“:
- 0: — : Không quyền nào được cấp
- 1: –x : Quyền thực thi
- 2: -w- : Quyền viết
- 3: -wx: Quyền được viết và thực thi
- 4: r– : Quyền đọc
- 5: r-x : Quyền đọc và thực thi
- 6: rw- : Quyền đọc và viết
- 7: rwx: Quyền đọc, viết và thực thi
Chúng ta sẽ tiếp tục đi sâu vào phân quyền, học về SUID, SGID và sticky pick cũng như cách sử dụng lệnh chmod và chown để phân quyền vào bài sau nhé.
Chúc các bạn học tốt,
Vincent Nguyễn