2008-10-31 12 views
8

Cập nhậtchroot + execvp + bash

Got it! Xem giải pháp của tôi (comment thứ năm)

Đây là vấn đề của tôi:

tôi đã tạo ra một nhị phân nhỏ gọi là "tù" và trong/etc/password Tôi đã thực hiện nó shell mặc định cho người dùng thử nghiệm.

Đây là - đơn giản - Mã nguồn:

#define HOME "/home/user" 
#define SHELL "/bin/bash" 
... 
if(chdir(HOME) || chroot(HOME)) return -1; 
... 
char *shellargv[] = { SHELL, "-login", "-rcfile", "/bin/myscript", 0 }; 
execvp(SHELL, shellargv); 

Vâng, không có gì khó khăn khi tôi cố gắng, có vẻ như, khi người dùng đăng nhập thử nghiệm của tôi trong, /bin/myscript sẽ không bao giờ có nguồn gốc. Tương tự, nếu tôi thả một tệp .bashrc vào thư mục chính của người dùng, nó cũng sẽ bị bỏ qua.

Tại sao bash sẽ đánh lừa những kẻ này?

-

Một số độ chính xác, không nhất thiết liên quan, nhưng rõ ràng ra một số điểm thực hiện trong các ý kiến:

  • Các 'tù' nhị phân thực sự là SUID, do đó cho phép nó để chroot() thành công.
  • Tôi đã sử dụng 'ln' để tạo các tệp nhị phân thích hợp sẵn có - ô giam của tôi được đệm độc đáo :)
  • Vấn đề dường như không bị chroot người dùng ...

Trả lời

2

Vỏ không tương tác. Hãy thử thêm -i vào danh sách các đối số.

4

Như Jason C nói, vỏ thực thi không tương tác.

Giải pháp của ông sẽ buộc các vỏ có tính tương tác nếu nó chấp nhận -i để có nghĩa là (và bash không):

char *shellargv[] = { SHELL, "-i", "-login", ... }; 
execvp(SHELL, shellargv); 

Tôi muốn thêm, mặc dù, mà theo truyền thống một vỏ sẽ hoạt động như một lớp vỏ đăng nhập nếu ARGV[0] bắt đầu bằng dấu gạch ngang.

char *shellargv[] = {"-"SHELL, "-i", ...}; 
execvp(SHELL, shellargv); 

Thông thường, Bash sẽ tự động phát hiện có nên chạy tương tác hay không. Sự thất bại trong trường hợp của bạn có thể do thiếu các nút /dev/*.

1

Vào thời điểm người dùng của bạn đăng nhập và vỏ của họ cố gắng nguồn tệp này, tệp đang chạy dưới UID của họ. Cuộc gọi hệ thống chroot() chỉ có thể sử dụng được bằng root - bạn sẽ cần phải khéo léo hơn điều này.

Ngoài ra, việc chroot vào thư mục chính của người dùng sẽ làm cho shell của họ vô dụng, vì (trừ khi họ có nhiều thứ trong đó), họ sẽ không có quyền truy cập vào bất kỳ tệp nhị phân nào. Những thứ hữu ích như ls chẳng hạn.

2

Tôi có thể xác định với mong muốn tự mình làm điều này, nhưng nếu bạn chưa thực hiện, hãy xem jail chroot projectjailkit để biết một số công cụ thả để tạo vỏ trình bao.

1

Nhờ sự giúp đỡ của bạn, guys,

I figured it out:

tôi quên setuid()/setgid(), chroot(), setuid()/setgid() trở lại, sau đó vượt qua một môi trường thích hợp sử dụng execve()

Oh, và nếu tôi vượt qua không tranh luận để bash, nó sẽ nguồn ~/.bashrc

Nếu tôi vượt qua "-l" nếu sẽ nguồn /etc/profile

Chúc mừng!

+0

Ah, tôi đã (giả) giả định rằng chroot của bạn có mọi thứ ở cùng một nơi với hệ thống điển hình hoặc trước tiên bạn đã sửa môi trường. Thiếu setuid/gid trở lại không nên phá vỡ điều này (mặc dù nó sẽ loại bỏ lợi ích an ninh để chroot). – ephemient