Wykrywanie chroot jail od wewnątrz
Jak można wykryć bycie w więzieniu chroot bez uprawnień roota? Założyć standardowy system BSD lub Linux. Najlepsze, co wymyśliłem, to przyjrzeć się wartości i-węzła dla " / " I rozważyć, czy jest ona dość niska, ale chciałbym dokładniejszej metody wykrywania.
[edit 20080916 142430 EST]
samo rozglądanie się po systemie plików nie jest wystarczające, ponieważ nie jest trudno powielić rzeczy takie jak /boot i /dev, aby oszukać uwięzionego użytkownika.
[edit 20080916 142950 EST]
dla Systemów Linux, sprawdzanie nieoczekiwane wartości w /proc są rozsądne, ale co z systemami, które w ogóle nie wspierają / proc?
8 answers
I-węzeł dla / będzie zawsze równy 2, jeśli jest katalogiem głównym systemu plików, ale możesz zostać zablokowany wewnątrz kompletnego systemu plików. Jeśli to tylko chroot (a nie jakaś inna wirtualizacja), możesz uruchomić mount i porównać zamontowane systemy plików z tym, co widzisz. Sprawdź, czy każdy punkt montowania ma i-węzeł 2.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-17 23:36:39
Jeśli nie jesteś w chroot, i-węzeł dla / będzie zawsze równy 2. Możesz to sprawdzić używając
stat -c %i /
Lub
ls -id /
Interesujące, ale spróbujmy znaleźć ścieżkę do katalogu chroot. Pytanie stat
na którym urządzeniu / znajduje się:
stat -c %04D /
Pierwszy bajt jest większy od urządzenia, a najmniejszy. Na przykład 0802 oznacza dur 8, moll 1. Jeśli zaznaczysz /dev, zobaczysz, że to urządzenie to / dev / sda2. Jeśli jesteś root możesz bezpośrednio utworzyć urządzenie correspondong w swoim chroot:
mknode /tmp/root_dev b 8 1
Teraz znajdźmy ikod powiązany z naszym chroot. debugfs pozwala na wyświetlanie zawartości plików za pomocą numerów i-węzłów. Dla exemple, ls -id /
zwrócono 923960:
sudo debugfs /tmp/root_dev -R 'ls <923960>'
923960 (12) . 915821 (32) .. 5636100 (12) var
5636319 (12) lib 5636322 (12) usr 5636345 (12) tmp
5636346 (12) sys 5636347 (12) sbin 5636348 (12) run
5636349 (12) root 5636350 (12) proc 5636351 (12) mnt
5636352 (12) home 5636353 (12) dev 5636354 (12) boot
5636355 (12) bin 5636356 (12) etc 5638152 (16) selinux
5769366 (12) srv 5769367 (12) opt 5769375 (3832) media
Interesująca informacja znajduje się w bazie ..
wpisu: 915821 Mogę zapytać o jego treść:
sudo debugfs /tmp/root_dev -R 'ls <915821>'
915821 (12) . 2 (12) .. 923960 (20) debian-jail
923961 (4052) other-jail
Katalog o nazwie debian-jail
mA inode 923960. Ostatnim składnikiem katalogu chroot jest debian-jail
. Zobaczmy teraz Katalog nadrzędny (inode 2):
sudo debugfs /tmp/root_dev -R 'ls <2>'
2 (12) . 2 (12) .. 11 (20) lost+found 1046529 (12) home
130817 (12) etc 784897 (16) media 3603 (20) initrd.img
261633 (12) var 654081 (12) usr 392449 (12) sys 392450 (12) lib
784898 (12) root 915715 (12) sbin 1046530 (12) tmp
1046531 (12) bin 784899 (12) dev 392451 (12) mnt
915716 (12) run 12 (12) proc 1046532 (12) boot 13 (16) lib64
784945 (12) srv 915821 (12) opt 3604 (3796) vmlinuz
Katalog o nazwie opt
mA i-węzeł 915821, a i-węzeł 2 jest korzeń systemu plików. Więc mój katalog chroot to /opt/debian-jail
. Oczywiście, /dev/sda1
Może być montowany na innym systemie plików. Musisz to sprawdzić (użyj lsof lub bezpośrednio wybierz informacje /proc
).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-12 09:40:50
W Linuksie z uprawnieniami root, sprawdź, czy katalog główny procesu init jest Twoim katalogiem głównym. Chociaż {[2] } jest zawsze dowiązaniem symbolicznym do /
, podążając za nim, prowadzi do katalogu głównego "master"(zakładając, że proces init nie jest zablokowany, ale prawie nigdy tego nie robi). Jeśli {[4] }nie jest zamontowany, możesz się założyć, że jesteś w chroot.
[ "$(stat -c %d:%i /)" != "$(stat -c %d:%i /proc/1/root/.)" ]
# With ash/bash/ksh/zsh
! [ -x /proc/1/root/. ] || [ /proc/1/root/. -ef / ]
To jest bardziej precyzyjne niż patrząc na /proc/1/exe
ponieważ to może być inne poza chroot, Jeśli init
został zaktualizowany od ostatniego rozruchu lub jeśli chroot znajduje się na głównym głównym systemie plików i init
jest z nim ciężko połączony.
Jeśli nie masz uprawnień roota, możesz spojrzeć na /proc/1/mountinfo
i /proc/$$/mountinfo
(krótko udokumentowane w filesystems/proc.txt
w dokumentacji jądra Linuksa ). Ten plik jest czytelny dla świata i zawiera wiele informacji o każdym punkcie montowania w widoku systemu plików procesu. Ścieżki w tym pliku są ograniczone przez chroot wpływający na proces reader, jeśli taki istnieje. Jeśli odczyt procesu {[8] } jest zaszeregowane do systemu plików, który różni się od globalnego roota (zakładając, że root pid 1 jest globalnym rootem), wtedy w /proc/1/mountinfo
nie pojawia się żaden wpis dla /
. Jeśli proces odczytujący /proc/1/mountinfo
jest zaszeregowany do katalogu na globalnym głównym systemie plików, to w /proc/1/mountinfo
pojawia się wpis dla /
, ale z innym identyfikatorem mount. Nawiasem mówiąc, pole root ($4
) wskazuje, gdzie chroot znajduje się w głównym systemie plików. Ponownie, jest to specyficzne dla Linuksa.
[ "$(awk '$5=="/" {print $1}' </proc/1/mountinfo)" != "$(awk '$5=="/" {print $1}' </proc/$$/mountinfo)" ]
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:00:16
Zapobieganie takim rzeczom jest o to chodzi. Jeśli twój kod ma działać w chroot, Ustaw flagę przy starcie. Jeśli hakujesz, hack: sprawdź kilka typowych rzeczy w znanych lokalizacjach, policz pliki w /etc, coś w / dev.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 18:14:46
W systemach BSD (sprawdź uname-a), proc powinien być zawsze obecny. Sprawdź, czy para dev /i-węzeł/proc/1 /exe (użyj stat na tej ścieżce, nie będzie podążać za dowiązaniem symbolicznym przez tekst, ale za Hookiem) pasuje do/sbin / init.
Sprawdzanie katalogu głównego dla i-węzła # 2 jest również dobre.
Na większości innych systemów, użytkownik root może dowiedzieć się znacznie szybciej, próbując sztuczki fchdir root-breaking trick. Jeśli to pójdzie gdziekolwiek jesteś w więzieniu chroot.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-18 18:25:29
Myślę, że to zależy, dlaczego możesz być w chroot, i czy jakiś wysiłek poszedł w maskowanie go.
Sprawdziłbym / proc, te pliki są automatycznie generowanymi plikami informacji systemowych. Jądro zapełni je w głównym systemie plików, ale możliwe, że nie istnieją w systemie plików chroot.
Jeśli główny system plików /proc został powiązany z / proc w chroot, to jest prawdopodobne, że istnieją pewne rozbieżności między tą informacją a chroot środowisko. Na przykład Check /proc/mounts.
Similarly, check / sys.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 18:22:21
Jeśli wprowadziłeś chroot za pomocą schroot, możesz sprawdzić wartość $debian_chroot.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-25 07:22:59
Chciałem tych samych informacji dla więzienia działającego na FreeBSD (ponieważ Ansible nie wydaje się wykrywać tego scenariusza).
Na dystrybucji FreeNAS FreeBSD 11, /proc
nie jest zamontowany na serwerze, ale znajduje się w więzieniu. Czy tak jest również na zwykłym FreeBSD Nie wiem na pewno, aleprocfs: Gone But Not Forgotten wydaje się sugerować, że tak. Tak czy inaczej, prawdopodobnie nie chciałbyś spróbować zamontować go tylko po to, aby wykryć status więzienia i dlatego nie jestem pewien, czy może to być używany jako niezawodny prognostyk bycia w więzieniu.
Wykluczyłem również używanie stat na /
, ponieważ na FreeNAS wszystkie więzienia mają swój własny system plików (np. zbiór danych ZFS) i dlatego /
węzeł na hoście i w więzieniu mają inode 4. Spodziewam się, że jest to powszechne na FreeBSD 11 w ogóle.
Więc podejście, które ustaliłem było za pomocą procstat na pid 0.
[root@host ~]# procstat 0
PID PPID PGID SID TSID THR LOGIN WCHAN EMUL COMM
0 0 0 0 0 1234 - swapin - kernel
[root@host ~]# echo $?
0
[root@host ~]# jexec guest tcsh
root@guest:/ # procstat 0
procstat: sysctl(kern.proc): No such process
procstat: procstat_getprocs()
root@guest:/ # echo $?
1
Zakładam tutaj, że PID 0 będzie zawsze jądrem na gospodarz, a w więzieniu nie będzie pid 0.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-17 18:49:01