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($s256);
                    if(
    eregi("200"$line))
                    {
                        
    fputs($s"NOOP\r\n");
                        
    $line fread($s256);
                        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($s256);
                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($s256);
            if(
    eregi("\+OK"$line))
            {
                
    fputs($s"USER $login\r\n");
                
    $line=fread($s256);
                if(
    eregi("\+OK"$line))
                {
                    
    fputs($s"PASS $password\r\n");
                    
    $line=fread($s256);
                    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($s256);
            if(
    eregi("\+OK"$line))
            {
                    
    fputs($s"QUIT\r\n");
                    
    $line fread($s256);
                    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($s256);
            if(
    eregi("\+OK"$line))
            {
                
    fputs($s"STAT\r\n");
                
    $line fread($s256);
                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($s256);
            if(
    eregi("\+OK"$line))
            {
                    
    fputs($s"LIST\r\n");
                    while(!
    feof($s)) { 
                        
    $line.=fread($s256);
                        
    $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($s256);
            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($s256);
                        
    $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($s256);
            if(
    eregi("\+OK"$line))
            {
                
    fputs($s"DELE $mid\r\n");
                
    $line fread($s256);
                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($s256);
            if(
    eregi("\+OK"$line))
            {
                
    fputs($s"RSET\r\n");
                
    $line fread($s256);
                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'[email protected]''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,186
    Likes Received:
    618
    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($s256); 
            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($s256); 
                    if(
    eregi("200"$line)) 
                    { 
                        
    fputs($s"NOOP\r\n"); 
                        
    $line fread($s256); 
                        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($s256);
                
    //echo  "USER $login\r\n";
                //echo  $line;
                
    if(eregi("\+OK"$line)) 
                { 
                    
    fputs($s"PASS $password\r\n"); 
                    
    $line=fread($s256); 
                    
    //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($s256); 
                    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($s256); 
                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($s256); 
                        
    $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($s256); 
                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($s256); 
                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;
    $timeout10;
    $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); 
    ?>