i* Find binaries in PATH when specified in path '*' * Check return value of lstat - sup - small tool for privilege escalation Err bitreich.org 70
hgit clone git://bitreich.org/sup git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/sup URL:git://bitreich.org/sup git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/sup bitreich.org 70
1Log /scm/sup/log.gph bitreich.org 70
1Files /scm/sup/files.gph bitreich.org 70
1Refs /scm/sup/refs.gph bitreich.org 70
1Tags /scm/sup/tag bitreich.org 70
1README /scm/sup/file/README.gph bitreich.org 70
1LICENSE /scm/sup/file/LICENSE.gph bitreich.org 70
i--- Err bitreich.org 70
1commit 836d0723d883384c1ea8e1b4c3fd23eced9c8043 /scm/sup/commit/836d0723d883384c1ea8e1b4c3fd23eced9c8043.gph bitreich.org 70
1parent 8078fe60673809c9ce32dd85613e9f96d7278742 /scm/sup/commit/8078fe60673809c9ce32dd85613e9f96d7278742.gph bitreich.org 70
hAuthor: pancake <unknown> URL:mailto:unknown bitreich.org 70
iDate: Thu, 31 Mar 2011 20:56:00 +0200 Err bitreich.org 70
i Err bitreich.org 70
i* Find binaries in PATH when specified in path '*' Err bitreich.org 70
i* Check return value of lstat Err bitreich.org 70
iDiffstat: Err bitreich.org 70
i M config.def.h | 3 ++- Err bitreich.org 70
i M sup.c | 47 ++++++++++++++++++++++++------- Err bitreich.org 70
i Err bitreich.org 70
i2 files changed, 39 insertions(+), 11 deletions(-) Err bitreich.org 70
i--- Err bitreich.org 70
1diff --git a/config.def.h b/config.def.h /scm/sup/file/config.def.h.gph bitreich.org 70
i@@ -14,6 +14,7 @@ static struct rule_t rules[] = { Err bitreich.org 70
i { USER, GROUP, "ifconfig", "/sbin/ifconfig" }, Err bitreich.org 70
i { USER, GROUP, "ls", "/bin/ls" }, Err bitreich.org 70
i { USER, GROUP, "wifi", "/root/wifi.sh" }, Err bitreich.org 70
i- { USER, GROUP, "", ""}, // allow to run any program Err bitreich.org 70
i+ { USER, GROUP, "cp", "*"}, // allow to run this program in PATH Err bitreich.org 70
i+ { USER, GROUP, "*", "*"}, // allow to run any program in PATH Err bitreich.org 70
i { 0 }, Err bitreich.org 70
i }; Err bitreich.org 70
1diff --git a/sup.c b/sup.c /scm/sup/file/sup.c.gph bitreich.org 70
i@@ -1,13 +1,14 @@ Err bitreich.org 70
i-/* pancake <nopcode.org> -- Copyleft 2009 */ Err bitreich.org 70
i+/* pancake <nopcode.org> -- Copyleft 2009-2011 */ Err bitreich.org 70
i Err bitreich.org 70
i #include <errno.h> Err bitreich.org 70
i-#include <stdio.h> Err bitreich.org 70
i #include <unistd.h> Err bitreich.org 70
i+#include <stdio.h> Err bitreich.org 70
i #include <string.h> Err bitreich.org 70
i+#include <stdlib.h> Err bitreich.org 70
i #include <sys/stat.h> Err bitreich.org 70
i Err bitreich.org 70
i #define HELP "sup [-hlv] [cmd ..]" Err bitreich.org 70
i-#define VERSION "sup 0.1 pancake <nopcode.org> copyleft 2009" Err bitreich.org 70
i+#define VERSION "sup 0.1 pancake <nopcode.org> copyleft 2011" Err bitreich.org 70
i Err bitreich.org 70
i struct rule_t { Err bitreich.org 70
i int uid; Err bitreich.org 70
i@@ -19,11 +20,30 @@ struct rule_t { Err bitreich.org 70
i #include "config.h" Err bitreich.org 70
i Err bitreich.org 70
i static int die(int ret, const char *org, const char *str) { Err bitreich.org 70
i- fprintf (stderr, "%s%s%s\n", org, org?": ":"", str); Err bitreich.org 70
i+ fprintf (stderr, "%s%s%s\n", org?org:"", org?": ":"", str); Err bitreich.org 70
i return ret; Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i+static char *getpath(const char *str) { Err bitreich.org 70
i+ struct stat st; Err bitreich.org 70
i+ static char file[4096]; Err bitreich.org 70
i+ char *p, *path = getenv ("PATH"); Err bitreich.org 70
i+ if (path) Err bitreich.org 70
i+ for (p = path; *p; p++) { Err bitreich.org 70
i+ if (*p==':' && (p>path&&*(p-1)!='\\')) { Err bitreich.org 70
i+ *p = 0; Err bitreich.org 70
i+ snprintf (file, sizeof (file)-1, "%s/%s", path, str); Err bitreich.org 70
i+ if (!lstat (file, &st)) Err bitreich.org 70
i+ return file; Err bitreich.org 70
i+ *p = ':'; Err bitreich.org 70
i+ path = p+1; Err bitreich.org 70
i+ } Err bitreich.org 70
i+ } Err bitreich.org 70
i+ return NULL; Err bitreich.org 70
i+} Err bitreich.org 70
i+ Err bitreich.org 70
i int main(int argc, char **argv) { Err bitreich.org 70
i+ const char *cmd; Err bitreich.org 70
i int i, uid, gid, ret; Err bitreich.org 70
i Err bitreich.org 70
i if (argc < 2 || !strcmp (argv[1], "-h")) Err bitreich.org 70
i@@ -43,18 +63,25 @@ int main(int argc, char **argv) { Err bitreich.org 70
i gid = getgid (); Err bitreich.org 70
i Err bitreich.org 70
i for (i = 0; rules[i].cmd != NULL; i++) { Err bitreich.org 70
i- if (!rules[i].cmd[0] || !strcmp (argv[1], rules[i].cmd)) { Err bitreich.org 70
i+ if (*rules[i].cmd=='*' || !strcmp (argv[1], rules[i].cmd)) { Err bitreich.org 70
i #if ENFORCE Err bitreich.org 70
i struct stat st; Err bitreich.org 70
i- lstat (rules[i].path, &st); Err bitreich.org 70
i+ if (*rules[i].path=='*') { Err bitreich.org 70
i+ if (*argv[1]=='.' || *argv[1]=='/') Err bitreich.org 70
i+ cmd = argv[1]; Err bitreich.org 70
i+ else if (!(cmd = getpath (argv[1]))) Err bitreich.org 70
i+ return die (1, "execv", "cannot find program"); Err bitreich.org 70
i+ } else cmd = rules[i].path; Err bitreich.org 70
i+ if (lstat (cmd, &st) == -1) Err bitreich.org 70
i+ return die (1, "lstat", "cannot stat program"); Err bitreich.org 70
i if (st.st_mode & 0222) Err bitreich.org 70
i- return die (1, "stat", "Cannot run writable binaries."); Err bitreich.org 70
i+ return die (1, "stat", "cannot run writable binaries."); Err bitreich.org 70
i #endif Err bitreich.org 70
i if (uid != SETUID && rules[i].uid != -1 && rules[i].uid != uid) Err bitreich.org 70
i- return die (1, "urule", "User does not match"); Err bitreich.org 70
i+ return die (1, "urule", "user does not match"); Err bitreich.org 70
i Err bitreich.org 70
i if (gid != SETGID && rules[i].gid != -1 && rules[i].gid != gid) Err bitreich.org 70
i- return die (1, "grule", "Group id does not match"); Err bitreich.org 70
i+ return die (1, "grule", "group id does not match"); Err bitreich.org 70
i Err bitreich.org 70
i if (setuid (SETUID) == -1 || setgid (SETGID) == -1 || Err bitreich.org 70
i seteuid (SETUID) == -1 || setegid (SETGID) == -1) Err bitreich.org 70
i@@ -67,7 +94,7 @@ int main(int argc, char **argv) { Err bitreich.org 70
i if (chdir (CHRDIR) == -1) Err bitreich.org 70
i return die (1, "chdir", strerror (errno)); Err bitreich.org 70
i #endif Err bitreich.org 70
i- ret = execv (*rules[i].path? rules[i].path:argv[1], argv+1); Err bitreich.org 70
i+ ret = execv (cmd, argv+1); Err bitreich.org 70
i return die (ret, "execv", strerror (errno)); Err bitreich.org 70
i } Err bitreich.org 70
i } Err bitreich.org 70
.
Response:
text/plain