HEX
Server: Apache/2
System: Linux nexus-01 4.18.0-553.120.1.el8_10.x86_64 #1 SMP Mon Apr 20 18:04:27 EDT 2026 x86_64
User: aglcoke (1118)
PHP: 8.2.31
Disabled: mail,exec,system,passthru,shell_exec,proc_close,proc_open,dl,popen,show_source,posix_kill,posix_mkfifo,posix_getpwuid,posix_setpgid,posix_setsid,posix_setuid,posix_setgid,posix_seteuid,posix_setegid,posix_uname
Upload Files
File: //usr/local/cwaf/scripts/suid.c
/* SUID wrapper script
Written by oleg.tsygany@omodo.com

Script basis was provided by DirectAdmin:
http://help.directadmin.com/item.php?id=510

************************************/

#define EACCES 13  // Permission denied
#define BUFF_LEN 128
#define PLUGIN_USER "cwaf_plugin"
#define CMD_NUM 6

#include <pwd.h>
#include <unistd.h>
#include <string.h>

char cmd[] = "/bin/perl";
char wrp[] = "/usr/local/cwaf/scripts/cwaf-wrapper.pl";

int main(int argc, char **argv) {
    int i;
    int c=0;

    char *cmd_argv[] = { 0, 0, 0, 0, 0, 0, 0 };

// Not enough params
    if (argc < 2) {
        return 0;
    }

    if (strcmp(argv[1], wrp) != 0) {
        // only wrapper run is allowed
        return EACCES;
    }

// various security checks
    uid_t original_uid = getuid();
    struct passwd *pwd_caller = getpwuid(original_uid);

// getpwuid error
    if (pwd_caller == NULL) {
        return EACCES; 
    }

// Couldn't get username from original_uid
    if (!pwd_caller->pw_name || strlen(pwd_caller->pw_name) > 16) {
        return EACCES;
    }
    char original_username[BUFF_LEN];
    strncpy(original_username, pwd_caller->pw_name, BUFF_LEN-1);

// Caller username appears to be blank
    if (*original_username == '\0') {
        return EACCES;
    }

// Not called by an right account
    if (strcmp(original_username, PLUGIN_USER)) {
        if (strcmp(original_username, "root")) {
            return EACCES;
        }
    }

// Error setting to uid 0. Wrapper rights have to be 4755.
    if (setuid(0) == -1) {
         return EACCES;
    }

// Error setting to gid 0. Wrapper rights have to be 4755.
    if (setgid(0) == -1) {
         return EACCES;
    }

// prepare command line
    cmd_argv[c++] = cmd;
    cmd_argv[c++] = wrp;
 
    for (i=2; i<argc && c<CMD_NUM; i++) {
        cmd_argv[c++] = argv[i];
    }

    char environ[120]="PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin";
    putenv(environ);

    execv(cmd, cmd_argv);

    return 0;
}