SMOLNET PORTAL home about changes
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
Original URLgopher://bitreich.org/0/scm/sup/commit/836d0723d883384c1e...
Content-Typetext/plain; charset=utf-8