Option -p khi gọi shell bash
Linux
111
cynurus8666
2
Bash
12
White

Đăng Bảo viết ngày 30/06/2020

1. Giới thiệu

Trong quá trình tìm hiểu về linux có thể lúc nào đó bạn tình cờ đọc được hướng dẫn sử dụng lệnh như sau:
/tmp/bash -p
Câu lệnh trên có thể chia làm 2 phần.

  • Phần 1 - /tmp/bash: Là file thực thi của bash (chạy nó -> ta có bash shell :v).
  • Phần 2 - -p: Đây là option mà bài viết này tìm hiểu.

2. Giải thích

Trước hết đi vào giải thích thì vấn đề được đưa ra trong bài viết này liên quan tới việc mô tả cách bash thực thi file startup (kw: Bash Startup Files) của nó. Nếu một file nào đó không tồn tại thì bash sẽ báo cáo lỗi. Các file thực thi có thể có nhiều dạng cho bash như: .bashrc, sh, $BASH_ENV, vân vân và mây mây.

Đồng thời mình cũng cần giải thích thêm về một phần khác là về Effective UID (user id) và Real UID (user id).

  • Nói đơn giản, Real UID thể hiện người dùng thực sự là ai (người sở hữu process) và Effective UID thể hiện người dùng mà OS thấy để đưa ra quyết định xem bạn có được quyền làm gì đó hay không.
  • Effective UID được tạo ra khi người dùng cần muốn sử dụng tạm thời định danh của người khác (thông thường thì người dùng thông thường mượn danh tính của root).
  • Khi người dùng đăng nhập thì 2 giá trị này được set như nhau (đều bằng giá trị Real UID).

Để lợi dụng nó thì ta có thể chạy một chương trình setuid. Sau khi chương trình setuid được thực thi thì nó sẽ có Real UID (vì mình chạy process) và Effective UID của file owner (thường sẽ là root để tăng quyền) (mình sẽ thực hiện theo ví dụ ở dưới).

Đó là vấn đề. Effective UID có thể được lợi dụng để tăng quyền của người dùng vào hệ thống. Và để giải thích rõ hơn về option -p thì mình sẽ có một ví dụ về một case được giả lập như sau (case này mình tham khảo ở trang tryhackme như ở phần tham khảo).

Trước hết sau khi đăng nhập vào xác nhận người dùng là user:
Người dùng hiện tại là user
Sau đó kiểm tra thấy file crontab (chỉ ra danh sách các chương trình hoặc tập lệnh mà người dùng có thể lên lịch để chạy vào cách thời điểm hoặc khoảng thời gian cụ thể).
Danh sách các tập lệnh được lên kế hoạch thực thi
Trong hình phía trên thì ta chú ý 2 phần được bôi đậm.

  • /home/user : Phần này nằm trong phần PATH có nghĩa là file có thể được để trong thư mục này và hệ thống sẽ tự tìm đến chạy vào thời gian định sẵn.
  • * * * * * root overwrite.sh : Cụ thể từng phần
    • 5 dấu sao ()* phía trước biểu thị thời gian được lên lịch. Ở đây là khoảng thời gian 1 phút (cứ sau 1 phút thì hệ thống lại chạy file này).
    • root biểu thị user thực thi file. Có root rồi, ngon.
  • overwrite.sh là tên file sẽ được thực thi. Hệ thống tìm file này dựa trên danh sách PATH phía trên.

Trên đây hội ta thấy giống mô tả ở trên về Effective UID và Real UID rồi đó. Ta có file được thực thi bởi người dùng là root. File đó lại có thể chạy ở thư mục quản lý với người dùng là user. Ok, triển tiếp nào.

Tiếp theo ta sẽ tạo một file có tên overwrite.sh ở thư mục /home/user với nội dung như sau:
alt text

3 câu lệnh trên:

  • Lệnh #!/bin/bash : Là shebang dùng để mô tả trình biên dịch được dùng để chạy chương trình.
  • Lệnh cp /bin/bash /tmp/nameyoulike: Dùng để copy file thực thi bash ra một thư mục khác để lúc sau người dùng user có thể sử dụng. Sau lệnh này thì file /tmp/nameyoulike sẽ giống như file /bin/bash. (nameyoulike nên thích đặt gì cũng được :))).
  • Lệnh chmod +xs /tmp/nameyoulike: Dùng để cấp quyền thực thi SUID. Nên nhớ là lúc thực thi những lệnh này là thực thi dưới quyền root, do đó sau khi set SUID thì người dùng khác cũng có thể chạy file /tmp/nameyoulike với quyền của root. Ghê quá. Nội dung file overwrite.sh

Việc quan trọng nữa là cần cấp quyền thực thi cho file mới được tạo ở trên với lệnh sau: chmod +x /home/user/overwrite.sh

Xong, việc tiếp theo chỉ là chờ cho tới khi crontab chạy -> file /tmp/nameyoulike được tạo ra (1 phút lận đó).
Tèn ten, có rồi đây:
File nameyoulike đã xuất hiện

Sau khi có file /tmp/nameyoulike này rồi thì ta có thể chạy nó. Lúc này chính là lúc thể hiện vai trò của option -p đây.

Mình sẽ chạy thử mà không có option -p rồi kiểm tra bằng lệnh whoami.
Chạy file /tmp/nameyoulike không có option -p

Và có option -p:
Chạy file /tmp/nameyoulike không có option -p

Đùng. Ghê quá. Chú ý phần thông tin id khác nhau kìa. Phía dưới có thêm các trường euid (Effective UID) và egid (Efective GID) và groups được set = 0 (quyền root).

Vậy tổng kết lại, option -p này được dùng trong trường hợp mà Effective UID và Real UID không giống nhau. Nếu option này không được truyền vào thì startup files sẽ không được đọc và các hàm của shell sẽ không thể kế thừa từ môi trường, cũng như các biến như SHELLOPTS, BASHOPTS, CDPATH và GLOBIGNORE. Và khi việc kế thừa này bị bỏ qua, thì Effective UID sẽ được set bằng với Real UID.

Vậy option -p sẽ làm bash nhận được 2 giá trị Effective UID và Real UID riêng biệt, nhờ đó mà ta thực hiện được việc tăng quyền như ở trên. Nhìn chung, option này khá là liên quan tới việc bảo mật :3

3. Tham khảo


Mình viết xong mà vẫn chưa thấm mấy. Thông tin trong bài được mình biên soạn lại có thể có nhiều thiếu sót. Nếu có gì hãy góp ý cho mình nhé.

--Cynurus8666---

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Đăng Bảo

2 bài viết.
0 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Bài viết liên quan
White
1 0
sudo du sh
t viết hơn 4 năm trước
1 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
2 bài viết.
0 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!