PHP POP3 Interface [Proxy Support]

Discussion in 'Уязвимости Mail-сервисов' started by CPU0, 9 Jan 2010.

  1. CPU0

    CPU0 Member

    Joined:
    5 Jan 2010
    Messages:
    49
    Likes Received:
    15
    Reputations:
    0
    PHP POP3 Interface [Proxy Support]

    Описание:
    Набор функций для работы с POP3(RFC 1939).​
    Текущий список функций (будут дополняться по Вашим просьбам):

    • pop3_connect()
    • pop3_disconnect()
    • pop3_login()
    • pop3_stat()
    • pop3_list()
    • pop3_retr()
    • pop3_dele()
    • pop3_rset()
    ​

    =====================================

    Функция pop3_connect()
    Устанавливает подключение с сервером и возвращает идентификатор соединения при успешном подключении. При ошибке возвращает FALSE​
    pop3_connect($host, $proxy=FALSE, $phost='', $pport='', $port='110', $timeout='20')​
    • $host - адрес POP3-сервера
    • $proxy - использование Proxy-сервера при подключении (TRUE/FALSE)
    • $phost - IP-адрес Proxy-сервера
    • $pport - порт Proxy-сервера
    • $port - порт POP3-сервера
    • $timeout - таймаут соеденения
    ​

    PHP:
    function pop3_connect($host, $port='110', $proxy=FALSE, $phost='', $pport='', $timeout='20')
    {
        if(
    $proxy)
        {
            
    $patern_ip="^([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])$";
            
    $patern_port="^([0-9]{2,5})$";
            if(
    ereg($pattern_ip, $phost) AND ereg($pattern_port, $pport))
            {
                
    $s=fsockopen("tcp://".$phost, $pport);
                if(
    $s)
                {
                    
    stream_set_timeout($s, $timeout);
                    
    fputs($s, "CONNECT $host:$port HTTP/1.0\r\n\r\n");
                    
    $line = fread($s, 256);
                    if(
    eregi("200", $line))
                    {
                        
    fputs($s, "NOOP\r\n");
                        
    $line = fread($s, 256);
                        if(
    eregi("\+OK", $line))
                        {
                            return 
    $s;
                        }
                    } else {
                        return 
    false;
                    }
                } else {
                    return 
    false;
                }
            } else {
                return 
    false;
            }
        } else {
            
    $s=fsockopen($host, $port);
            if(
    $s)
            {
                
    stream_set_timeout($s, $timeout);
                
    fputs($s, "NOOP\r\n");
                
    $line=fread($s, 256);
                if(
    eregi("\+OK", $line))
                {
                    return 
    $s;
                } else {
                    return 
    false;
                }
            } else {
                return 
    false;
            }
        }
    }
    Функция pop3_login()
    Авторизует пользователя на POP3-сервере, при успешной авторизации возвращает TRUE, при ошибке возвращает FALSE​
    pop3_login($s, $login, $password)​
    • $s - идентификатор соединения
    • $login - имя пользователя для авторизации
    • $password - пароль для авторизации
    ​
    PHP:
    function pop3_login($s, $login, $password)
    {
        if(
    $s)
        {
            
    fputs($s, "NOOP\r\n");
            
    $line = fread($s, 256);
            if(
    eregi("\+OK", $line))
            {
                
    fputs($s, "USER $login\r\n");
                
    $line=fread($s, 256);
                if(
    eregi("\+OK", $line))
                {
                    
    fputs($s, "PASS $password\r\n");
                    
    $line=fread($s, 256);
                    if(
    eregi("\+OK",$line))
                    {
                        return 
    true;
                    } else {
                        return 
    false;
                    }
                } else {
                    return 
    false;
                }
            } else { 
                return 
    false;
            }
        } else {
             return 
    false;
        }
    }
    Функция pop3_disconnect()
    Закрывает соединение с POP3-сервером, возвращает TRUE при успешном закрытии соединения,и FALSE при ошибке​
    pop3_disconnect($s)​
    • $s - идентификатор соединения
    ​
    PHP:
    function pop3_disconnect($s)
    {
        if(
    $s)
        {
            
    fputs($s, "NOOP\r\n");
            
    $line = fread($s, 256);
            if(
    eregi("\+OK", $line))
            {
                    
    fputs($s, "QUIT\r\n");
                    
    $line = fread($s, 256);
                    if(
    eregi("\+OK", $line))
                    {
                        unset(
    $s);
                        return 
    true;
                    } else {
                        return 
    false;
                    }                
            } else {
                return 
    false;
            }
        } else {
            return 
    false;
        }
    }
    Функция pop3_stat()
    Возвращает массив, 1ый элемент которого - количество писем в ящике, 2ой - размер всех писем в байтах. Возвращает FALSE при ошибке​
    pop3_stat($s)​
    • $s - идентификатор соединения
    ​
    PHP:
    function pop3_stat($s)
    {
        if(
    $s)
        {
            
    fputs($s, "NOOP\r\n");
            
    $line = fread($s, 256);
            if(
    eregi("\+OK", $line))
            {
                
    fputs($s, "STAT\r\n");
                
    $line = fread($s, 256);
                if(
    eregi("\+OK", $line))
                {
                    
    $reply=explode(" ",$line);
                    return array(
    $reply[1], $reply[2]);
                } else {
                    return 
    false;
                }
            } else { 
                return 
    false;
            }
        } else {
             return 
    false;
        }
    }
    Функция pop3_list()
    Возвращает массив, ключи которого - идентификаторы писем, значения - размер письма. Возвращает FALSE при ошибке​
    pop3_list($s)​
    • $s - идентификатор соединения
    ​
    PHP:
    function pop3_list($s)
    {
        if(
    $s)
        {
            
    fputs($s, "NOOP\r\n");
            
    $line = fread($s, 256);
            if(
    eregi("\+OK", $line))
            {
                    
    fputs($s, "LIST\r\n");
                    while(!
    feof($s)) { 
                        
    $line.=fread($s, 256);
                        
    $stream_meta_data=stream_get_meta_data($s);
                        if(
    $stream_meta_data['unread_bytes']<=0) break;
                    }
                    if(
    eregi("\+OK", $line))
                    {
                        
    preg_match_all('#([0-9]{1,})\s+([0-9]{3,10})#i', $line, $reply);
                        unset(
    $reply[0]);
                        
    $result=array_combine($reply[1], $reply[2]);
                        
    ksort($result);
                        return 
    $result;
                    } else {
                        return 
    false;
                    }
            } else { 
                return 
    false;
            }
        } else {
             return 
    false;
        }
    }
    Функция pop3_retr()
    Возвращает полное содержание письма, по его идентификатору. Возвращает FALSE при ошибке​
    pop3_retr($s,$mid)​
    • $s - идентификатор соединения
    • $mid - идентификатор письма
    ​
    PHP:
    function pop3_retr($s,$mid)
    {
        if(
    $s)
        {
            
    fputs($s, "NOOP\r\n");
            
    $line = fread($s, 256);
            if(
    eregi("\+OK", $line))
            {
                
    $mids=array_keys(pop3_list($s));
                if(
    in_array($mid,$mids))
                {
                    
    fputs($s, "RETR $mid\r\n");
                    while(!
    feof($s)) { 
                        
    $line.=fread($s, 256);
                        
    $stream_meta_data=stream_get_meta_data($s);
                        if(
    $stream_meta_data['unread_bytes']<=0) break;
                    }
                    return 
    $line;
                } else {
                    return 
    false;
                }
            } else { 
                return 
    false;
            }
        } else {
             return 
    false;
        }
    }
    Функция pop3_dele()
    Удаляет письмо по его идентификатору, при успешном удалении возвращает TRUE, при ошибке возвращает FALSE​
    pop3_dele($s,$mid)​
    • $s - идентификатор соединения
    • $mid - идентификатор письма
    ​
    PHP:
    function pop3_dele($s,$mid)
    {
        if(
    $s)
        {
            
    fputs($s, "NOOP\r\n");
            
    $line = fread($s, 256);
            if(
    eregi("\+OK", $line))
            {
                
    fputs($s, "DELE $mid\r\n");
                
    $line = fread($s, 256);
                if(
    eregi("\+OK", $line))
                {
                    return 
    true;
                } else {
                    return 
    false;
                }
            } else { 
                return 
    false;
            }
        } else {
             return 
    false;
        }
    }
    Функция pop3_rset()
    Восстанавливает "удаленные письма" текущего соединения, при успешном восстановлении возвращает TRUE, при ошибке возвращает FALSE​
    pop3_rset($s)​
    • $s - идентификатор соединения
    ​
    PHP:
    function pop3_rset($s)
    {
        if(
    $s)
        {
            
    fputs($s, "NOOP\r\n");
            
    $line = fread($s, 256);
            if(
    eregi("\+OK", $line))
            {
                
    fputs($s, "RSET\r\n");
                
    $line = fread($s, 256);
                if(
    eregi("\+OK", $line))
                {
                    return 
    true;
                } else {
                    return 
    false;
                }
            } else {
                return 
    false;
            }
        } else {
            return 
    false;
        }
    }
    =====================================

    В ближайшем времени (по приоритету):
    • функция обработки письма полученного с помощью pop3_retr()
    • функция скачивания всех писем с ящика
    • функция удаления всех писем
    • функция действий со списком e-mail`ов
    • функция "брутфорсер" :)
    ​

    Скрипт(и последующие его версии) Вы можете скачать с сайта:

    Пример использования:
    PHP:
    include('mail.php');
    $s=pop3_connect('pop.yandex.ru');
    if(
    pop3_login($s, 'egorka@yandex.ru', 'preved'))
    {
    //действия при успешной авторизации
    } else {
    //ошибка авторизации
    }
    pop3_disconnect($s);
    Буду рад советам, пожеланиям, критике
     
    #1 CPU0, 9 Jan 2010
    Last edited: 11 Jan 2010
    1 person likes this.
  2. CPU0

    CPU0 Member

    Joined:
    5 Jan 2010
    Messages:
    49
    Likes Received:
    15
    Reputations:
    0
    11.01.2010
    Добавлены функции:
    # pop3_stat()
    # pop3_list()
    # pop3_retr()
    # pop3_dele()
    # pop3_rset()
     
    #2 CPU0, 11 Jan 2010
    Last edited: 11 Jan 2010
  3. shell_c0de

    shell_c0de Hack All World

    Joined:
    7 Jul 2009
    Messages:
    1,051
    Likes Received:
    615
    Reputations:
    690
    залей куда нить готовый скрипт в одном архиве
     
    _________________________
  4. CPU0

    CPU0 Member

    Joined:
    5 Jan 2010
    Messages:
    49
    Likes Received:
    15
    Reputations:
    0
    http://dmtn.ru/develop/pop3_interface/0.1b/mail.zip
     
  5. maximka555

    maximka555 New Member

    Joined:
    10 Mar 2009
    Messages:
    33
    Likes Received:
    0
    Reputations:
    0
    error404
     
  6. CPU0

    CPU0 Member

    Joined:
    5 Jan 2010
    Messages:
    49
    Likes Received:
    15
    Reputations:
    0
    Вообщето 403.
    Вечером восстановлю.
     
  7. CPU0

    CPU0 Member

    Joined:
    5 Jan 2010
    Messages:
    49
    Likes Received:
    15
    Reputations:
    0
    Данный топик интересен кому-либо из присутствующих?
    Если нет - не вижу смысла продолжать разработку.
     
    1 person likes this.
  8. Kusto

    Kusto Elder - Старейшина

    Joined:
    4 Feb 2007
    Messages:
    886
    Likes Received:
    678
    Reputations:
    510
    продолжай конечно, кому надо- тому интересно, просто невсякий знает как довести до ума данные функции (кстати какие еще наработки планируеш?)
     
  9. Alexander89

    Alexander89 Member

    Joined:
    30 Nov 2009
    Messages:
    30
    Likes Received:
    8
    Reputations:
    0
    Все время pop3_login error

    добавлено через 5 мин
    NOOP -ERR Invalid command.


    спусия еще 10 мин
    почикал везде
    PHP:
            fputs($s, "NOOP\r\n"); 
            
    $line = fread($s, 256); 
            if(
    eregi("\+OK", $line)) 
            { 
    PHP:
            } else {  
                return 
    false; 
            } 
    Теперь виснет на
    pop3_retr()

    спусия еще 10 мин
    Для получения ответа от сервера использую
    PHP:
    function get_data($pop_conn){
        
    $data="";
        while (!
    feof($pop_conn)) {
            
    $buffer = chop(fgets($pop_conn,1024));
            
    $data .= "$buffer\r\n";
            if(
    trim($buffer) == "."){ break;}
        }
        return 
    $data;
    } 
    Так скрипт не виснет!
     
    #9 Alexander89, 28 Feb 2010
    Last edited: 28 Feb 2010
    1 person likes this.
  10. Alexander89

    Alexander89 Member

    Joined:
    30 Nov 2009
    Messages:
    30
    Likes Received:
    8
    Reputations:
    0
    Вот что получилось после моего шаманства
    Файл func.php
    PHP:
    <?php
     
    function pop3_connect($host, $port='110', $proxy=FALSE, $phost='', $pport='', $timeout='20') 
    { 
        if(
    $proxy) 
        { 
            
    $patern_ip="^([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])$"; 
            
    $patern_port="^([0-9]{2,5})$"; 
            if(
    ereg($pattern_ip, $phost) AND ereg($pattern_port, $pport)) 
            { 
                
    $s=fsockopen("tcp://".$phost, $pport); 
                if(
    $s) 
                { 
                    
    stream_set_timeout($s, $timeout); 
                    
    fputs($s, "CONNECT $host:$port HTTP/1.0\r\n\r\n"); 
                    
    $line = fread($s, 256); 
                    if(
    eregi("200", $line)) 
                    { 
                        
    fputs($s, "NOOP\r\n"); 
                        
    $line = fread($s, 256); 
                        if(
    eregi("\+OK", $line)) 
                        { 
                            return 
    $s; 
                        } 
                    } else { 
                        return 
    false; 
                    } 
                } else { 
                    return 
    false; 
                } 
            } else { 
                return 
    false; 
            } 
        } else { 
            
    $s=fsockopen($host, $port, $errno, $errstr, $timeout); 
            if(
    $s) 
            {
                
    $line=fgets($s,1024);            
                
    stream_set_timeout($s, $timeout);
                return 
    $s;             
            } else { 
                return 
    false; 
            } 
        } 
    } 



     function 
    pop3_login($s, $login, $password) 
    { 
        if(
    $s) 
        { 
                
    fputs($s, "USER $login\r\n"); 
                
    $line=fread($s, 256);
                
    //echo  "USER $login\r\n";
                //echo  $line;
                
    if(eregi("\+OK", $line)) 
                { 
                    
    fputs($s, "PASS $password\r\n"); 
                    
    $line=fread($s, 256); 
                    
    //echo "PASS $password\r\n";
                    //echo $line;
                    
    if(eregi("\+OK",$line)) 
                    { 
                        return 
    true; 
                    } else { 
                        return 
    false; 
                    } 
                } else { 
                    return 
    false; 
                } 
        } else { 
             return 
    false; 
        } 
    } 


     function 
    pop3_disconnect($s) 
    { 
        if(
    $s) 
        { 
                    
    fputs($s, "QUIT\r\n"); 
                    
    $line = fread($s, 256); 
                    if(
    eregi("\+OK", $line)) 
                    { 
                        unset(
    $s); 
                        return 
    true; 
                    } else { 
                        return 
    false; 
                    }                 
        } else { 
            return 
    false; 
        } 
    } 

     function 
    pop3_stat($s) 
    { 
        if(
    $s) 
        { 
                
    fputs($s, "STAT\r\n"); 
                
    $line = fread($s, 256); 
                if(
    eregi("\+OK", $line)) 
                { 
                    
    $reply=explode(" ",$line); 
                    return array(
    $reply[1], $reply[2]); 
                } else { 
                    return 
    false; 
                } 
        } else { 
             return 
    false; 
        } 
    } 


    //Возвращает массив, ключи которого - идентификаторы писем, значения - размер письма. Возвращает FALSE при ошибке
    //$s - идентификатор соединения
     
    function pop3_list($s) 
    { 
        if(
    $s) 
        { 
                    
    fputs($s, "LIST\r\n"); 
                    while(!
    feof($s)) {  
                        
    $line.=fread($s, 256); 
                        
    $stream_meta_data=stream_get_meta_data($s); 
                        if(
    $stream_meta_data['unread_bytes']<=0) break; 
                    }
                    
    //echo  "LIST\r\n";                
                    //echo  "$line\r\n";                
                    
    if(eregi("\+OK", $line)) 
                    { 
                        
    preg_match_all('#([0-9]{1,})\s+([0-9]{3,10})#i', $line, $reply); 
                        unset(
    $reply[0]); 
                        
    $result=array_combine($reply[1], $reply[2]); 
                        
    ksort($result); 
                        return 
    $result; 
                    } else { 
                        return 
    false; 
                    } 
        } else { 
             return 
    false; 
        } 
    } 



    //Возвращает полное содержание письма, по его идентификатору. Возвращает FALSE при ошибке
    function pop3_retr($s,$mid){ 
        if(
    $s === FALSE){
            return 
    false; 
        }
        
        
    fputs($s, "RETR $mid\r\n"); 
        return 
    get_data($s);
    } 



    //Удаляет письмо по его идентификатору, при успешном удалении возвращает TRUE, при ошибке возвращает FALSE
    //$s - идентификатор соединения
    //$mid - идентификатор письма
     
    function pop3_dele($s,$mid) 
    { 
        if(
    $s) 
        { 
                
    fputs($s, "DELE $mid\r\n"); 
                
    $line = fread($s, 256); 
                if(
    eregi("\+OK", $line)) 
                { 
                    return 
    true; 
                } else { 
                    return 
    false; 
                } 

        } else { 
             return 
    false; 
        } 
    }


    //Восстанавливает "удаленные письма" текущего соединения, при успешном восстановлении возвращает TRUE, при ошибке возвращает FALSE
     
    function pop3_rset($s) 
    { 
        if(
    $s) 
        { 
                
    fputs($s, "RSET\r\n"); 
                
    $line = fread($s, 256); 
                if(
    eregi("\+OK", $line)) 
                { 
                    return 
    true; 
                } else { 
                    return 
    false; 
                } 
        } else { 
            return 
    false; 
        } 
    }


    function 
    get_data($pop_conn){
        
    $data="";
        while (!
    feof($pop_conn)) {
            
    $buffer = chop(fgets($pop_conn,1024));
            
    $data .= "$buffer\r\n";
            if(
    trim($buffer) == "."){ break;}
        }
        return 
    $data;
    } 
    ?>
     



    Ну и пример использования
    PHP:
    <?php
    include('func.php');


    $host    = 'site.ru'; 
    $proxy    = FALSE;
    $phost    = '';
    $pport    = '';
    $port    = 110;
    $timeout= 10;
    $user    = 'username';
    $pass    = 'password';
     


    $s    = pop3_connect($host, $port, $proxy=FALSE, $phost, $pport, $timeout); 
    if(
    $s===FALSE){exit("\r\npop3_connect error\r\n");}

        

    $logined = pop3_login($s, $user, $pass);
    if(
    $logined===FALSE){exit("\r\npop3_login error\r\n");}



    $list     = pop3_list($s);
    if(
    $list===FALSE){exit("pop3_list error");}

    foreach(
    $list as $mid => $msize){

        
    $mtext = pop3_retr($s,$mid);
        
    //pop3_dele($s,$mid);
        
        
        
    echo "<br />\r\n------------------------------------------------------\r\n<br />";
        echo 
    str_replace("\r\n", "<br />",$mtext);
        echo 
    "<br />\r\n------------------------------------------------------\r\n<br />";
    }


    pop3_disconnect($s); 
    ?>