Khôi phục từ thiết lập shell của root thành một tập tin xấu


23

Giả sử tôi đã đi và làm một điều ngớ ngẩn, chẳng hạn như sử dụng 'chsh' để thay đổi trình bao của người dùng gốc thành đường dẫn tệp xấu. Đăng nhập trong tương lai vào tài khoản root sẽ đột ngột thất bại, trích dẫn / bin / bất cứ thứ gì không được tìm thấy và khởi động lại bạn trở lại màn hình đăng nhập. Chặn chế độ khôi phục hoặc chèn LiveCD để chỉnh sửa / etc / passwd, các tùy chọn của tôi để lấy lại hệ thống của tôi là gì? Chúng ta cũng giả sử (cho vui?) Rằng không có người dùng nào khác trong bánh xe. Suy nghĩ?


Đây có phải là một tình huống giả định mà bạn đang đề xuất?
Chris Xuống

Tôi thực sự đã thực hiện chính xác điều này trên bản cài đặt FreeBSD (tương đối mới). Nó đã được cài đặt lại, vì vậy tôi cho rằng bây giờ nó hơi giả định, nhưng tôi tò mò về con đường tốt nhất để phục hồi sẽ là gì nếu tôi thực sự có hệ thống đầy đủ.
noffle

Ở đó, làm điều đó, có áo phông. Nhưng kết quả là trên mỗi máy tôi quản lý, tôi duy trì một tài khoản root dự phòng, chỉ trong trường hợp.
Đánh dấu

Câu trả lời:


30

Khi khởi động, hãy thêm init=/bin/bash(hoặc đường dẫn đến bất kỳ shell chức năng nào khác) vào tùy chọn khởi động của bạn - bạn sẽ được thả thẳng vào một vỏ người dùng. Bạn có thể cần phải làm mount -o remount,rw /trước khi sửa đổi /etc/passwdmục trong môi trường đó. Sau đó, chỉ cần khởi động lại hoặc làm exec /sbin/init 3. Chỉ cần khôngexithoặc nhấn Ctrl + D, vì những điều này sẽ dẫn đến hoảng loạn kernel *.

Một biến thể bổ sung của phương pháp này có thể cần thiết trên một số hệ thống được tải ở chế độ hai giai đoạn (với hình ảnh initrd). Nếu bạn nhận thấy rằng các tùy chọn khởi động chứa init=và quan trọng nhất real_init=là vị trí cần đặt /bin/bashphải là tham số sau (nghĩa là real_init=/bin/bash).

* Điều này là do trong môi trường đó, shell được kernel xem là chương trình init - đây là quá trình duy nhất mà kernel biết - nó đại diện cho một hệ thống đang chạy bên dưới mắt của kernel. Đột nhiên kết thúc quá trình đó, mà không yêu cầu kernel tắt hệ thống, phải dẫn đến hoảng loạn kernel. (Bạn sẽ không hoảng sợ nếu đột nhiên mọi thứ xung quanh bạn trở nên tối đen và im lặng?)


Tốt cho điều này exec, nhưng tôi đoán tốt hơn hết là đừng gây rối quá nhiều với các điểm gắn kết trước đó.
Stéphane Gimenez

2
@ Stéph Bạn phải làm điều đó nếu kernel của bạn không gắn root-read-write. Nếu không, bạn sẽ không thể sửa đổi bất kỳ tập tin (bao gồm /etc/passwd).
rozcietrzewiacz

Suy nghĩ tốt! Tôi đã quản lý để vào chế độ một người dùng, nhưng điều đó không ảnh hưởng đến tôi rằng tôi phải xem lại / dưới dạng đọc / ghi để sửa đổi / etc / passwd. Cảm ơn!
noffle

@roz Chắc chắn, tôi đã cố gắng nói rằng tôi sẽ quan tâm đến việc ngắt kết nối mọi thứ khác có thể đã được gắn kết (trừ /) trước khi thực hiện init.
Stéphane Gimenez

@ Stéph Không có vấn đề gì với thú cưỡi. Lưu ý rằng /bin/bashđược chạy chính xác tại điểm, sau đó /sbin/initsẽ được thực hiện khi khởi động bình thường. Vì vậy, không thể có hành động có thể được thực hiện bởi hệ thống tại thời điểm đó.
rozcietrzewiacz

10

Bạn có thể sử dụng suvà chỉ định trình bao để thực thi (Tôi không chắc chắn nếu bạn đang cố gắng ám chỉ điều này là không thể với lưu ý của bạn về việc không có người dùng nào khác tham gia wheel):

su -c /bin/bash

Nếu không, bạn có thể làm điều gì đó tương tự nếu ssh daemon của bạn cho phép đăng nhập vào root:

ssh root@localhost /bin/bash

Ví dụ, bạn cũng có thể đặt shell làm init trong bộ tải khởi động init=/bin/kshhoặc tương tự.


1
Ý tưởng tốt. =) Như bạn nghi ngờ, không người dùng nào khác có thể sử dụng 'su'. sshd cũng bị vô hiệu hóa đăng nhập root.
noffle

6

Nếu bộ tải khởi động của bạn được cấu hình để cho phép chỉnh sửa trực tiếp các tham số kernel, giải pháp là khởi động lại và sử dụng shell làm tiến trình init, ví dụ init=/bin/bash. Sau đó, gắn bất cứ thứ gì cần được gắn bằng tay và chỉnh sửa /etc/passwd. syncvà khởi động lại với bình thường của bạn init.


Ồ, tôi chỉ nhận thấy bạn đã đăng cùng một câu trả lời trong cùng một phút với tôi :-)
rozcietrzewiacz

6

Nếu ý chính của câu hỏi của bạn là bạn đã khóa tất cả các cách để trở thành root, thì theo định nghĩa, bạn không thể trở thành root.

Thông thường cho phép ba cách để trở thành root trên hệ thống unix:

  • Đăng nhập bằng root, bằng cách nhập roottại dấu nhắc đăng nhập và nhập mật khẩu gốc. Cái này chạy vỏ của root.
  • Đăng nhập như một người dùng bình thường, sau đó trở thành root bằng cách chạy suvà gõ mật khẩu root. Trên một số hệ thống, điều này đòi hỏi phải nằm trong một nhóm cụ thể (thường được gọi là wheel); trên các hệ thống khác, bất cứ ai biết mật khẩu root đều có thể trở thành root. Các hệ thống sử dụng PAM để xác thực sử dụng pam_wheelđể quản lý nhóm bánh xe nếu chúng có. Nếu bạn chỉ định một lệnh vớisu -c , nó được thực thi thông qua shell của root.
  • Đăng nhập như một người dùng bình thường, sau đó trở thành root bằng cách chạy sudovà nhập mật khẩu của riêng bạn. Tài khoản người dùng phải được cấp quyền sudo bởi quản trị viên. Trừ khi bị hạn chế trong sudoerstệp, bạn có thể chạy bất kỳ lệnh nào, bất kể shell của root.

Một cách truyền thống để bảo vệ chống lại shell của root không khả dụng là xác định một tài khoản khác có UID 0 và shell khác ( toorlà tên truyền thống). Ví dụ: nếu shell của root là một tệp thực thi được liên kết động (một ý tưởng tốt để bảo tồn bộ nhớ) và nâng cấp thư viện bị lỗi, shell của root có thể không sử dụng được. Tài khoản gốc thay thế sẽ có một tệp thực thi được liên kết tĩnh, có thể là một tài khoản có các tiện ích phổ biến được tích hợp sẵn như BusyBox .


5

Các câu trả lời trên là tuyệt vời và tôi đã học được từ việc đọc chúng. Nếu bạn không nhớ chi tiết về các phương pháp này và không ngại khởi động lại, bạn luôn có thể khởi động hệ thống của mình bằng cách sử dụng bản phân phối CD trực tiếp, gắn phân vùng / rồi chỉnh sửa / etc / passwd và khởi động lại. Không thanh lịch như các giải pháp trên, nhưng dễ nhớ hơn.


Bạn nên chỉ ra những rủi ro liên quan đến việc chỉnh sửa /etc/passwdtập tin theo cách thủ công . Khác với điều này, điểm tốt - tôi chỉ muốn thêm đề xuất tương tự vào câu trả lời của tôi.
rozcietrzewiacz
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.