HoneyPot em PHP

Started by Be.Cool, 05 de August , 2007, 03:23:05 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Be.Cool

Este é mais um artigo que tenta demonstrar que, apesar do PHP ser essencialmente uma linguagem para o desenvolvimento de aplicações web, ela pode ser utilizada para os mais diversos fins. Tentando ultrapassar essa barreira, este artigo tenta demonstrar os princícipios para construção de um Honeypot SMTP utilizando sockets do PHP.

O que são sockets??
Aplicações socket basicamente "escutam"  uma determinada porta aguardando por pedidos e respondendo a eles. Servidores IRC, NTP, WEB, POP e SMTP são exemplos de aplicações que se utilizam de sockets. Você poderia, por exemplo, utilizar sockets PHP para escrever um IRCBot.

Sockets são "compostos" por um endereço IP, um protocolo de transporte (TCP ou UDP) e por uma porta. O PHP permite realizar ações de socket em baixo nível como servidor ou cliente.

O registro das atividades não está sendo guardada em logs e não é feita qualquer análise das assinaturas dos ataques. A idéia aqui é só simular um servidor SMTP e despertar as mentes para novas possibilidades!! Você poderá alterar o código abaixo para simular outros serviços ou até mesmo para melhorar o falso servidor SMTP!

Na função socket_create utilizamos o parâmetro AF_INET para conexões de internet e AF_UNIX para conexões de interprocesso do UNIX (IPC) e SOCKET_STREAM, que provê uma transmissão sequencial e prioriária de dados em duas vias (semântica da transmissão).

Testando...
Para testar você pode rodar o script via browser e abrir uma conexão telnet pelo terminal no endereço local "127.0.0.1".

Quote$ telnet 127.0.0.1 25
Connected to mail.exemplo.com.br

220 mail.exemplo.com.br
helo teste.com

250 Hello [127.0.0.1] localhost , pleased to meet you.
mail from: fake@teste.com... Sender ok
help

500 5.5.1 Command unreconigzed: "help"
quit

221 2.0.0 mail.exemplo.com.br closing connection



Código-Fonte:

<?php
$port
=25;
$host='127&#46;0&#46;0&#46;1';
set_time_limit(0);
 
$ip_remoto $_SERVER['REMOTE_ADDR'&#93;;
$nome_remoto =  gethostbyaddr($ip_remoto);
 
if(!
$socket=socket_create(AF_INET,SOCK_STREAM,0)){
    
trigger_error('Error creating new socket',E_USER_ERROR);
}
 
if(!
socket_bind($socket,$host,$port)){
    
trigger_error('Error binding socket to TCP port',E_USER_ERROR);
}
 
if(!
socket_listen($socket)){
    
trigger_error('Error listening socket connections',E_USER_ERROR);
}
 
if(!
$comSocket=socket_accept($socket)){
    
trigger_error('Error creating communication socket',E_USER_ERROR);
}
 
function 
verifica_dominio($dominio){
$fp fsockopen($dominio,80);
 
    if(
$fp){
        
fclose($fp);
        return 
TRUE;
    }else{
        
fclose($fp);
        return 
FALSE;
    }
}
 
function 
verifica_email($email) {
 
    if(
ereg("^([0-9,a-z,A-Z&#93;+)([&#46;,_,-&#93;([0-9,a-z,A-Z&#93;+))*[@&#93;([0-9,a-z,A-Z&#93;+)([&#46;,_,-&#93;([0-9,a-z,A-Z&#93;+))*[&#46;&#93;([a-z,A-Z&#93;)
{2,3}([0-9,a-z,A-Z&#93;)?$"
$email ) ) {
        return 
TRUE;
    }else{
        return 
FALSE;
    }
}
 
$message="Connected to mail&#46;exemplo&#46;com&#46;br\n\r";
$message&#46;="220 mail&#46;exemplo&#46;com&#46;br PHP Honeypot SMTP\n\r";
 
socket_write($comSocket,$message,strlen($message));
 
do{
    
sleep(8);
        
$socketInput=socket_read($comSocket,1024);   
 
      if(
eregichr(13), $socketInput ) and $socketInput !=''){
        
$socketInput rtrim($socketInput);        
       
        if(
$socketInput !='quit'){
 
            if(
$socketInput == "helo" AND strlen($socketInput) == 4){
                
$socketOutput="\n501 5&#46;0&#46;0 HELO requires domain address\n\r";
            }
            elseif( 
eregi("helo"$socketInput) AND strlen($socketInput) != 4  ){
           
                if( 
verifica_dominiosubstr($socketInput,5,strlen($socketInput)- 4))){
                    
$socketOutput="\n250 mail&#46;exemplo&#46;com&#46;br Hello ["&#46;$ip_remoto&#46;"&#93; "&#46;$nome_remoto&#46;" (may be forged), pleased to meet you\n\r";
                
}else{
                    
$socketOutput="\n501 5&#46;0&#46;0 invalid domain\n\r";
                }
           
            }elseif ( 
eregi("mail from&#58;"$socketInput ) AND strlen($socketInput) >= 10 ) {
 
                if( 
verifica_emailsubstr($socketInput,11,strlen($socketInput)- 11))){
                    
$socketOutput="\n250 2&#46;1&#46;0 "&#46;substr($socketInput,11,strlen($socketInput)- 11)&#46;"&#46;&#46;&#46; Sender ok\n\r";
                
}else{
                    
$socketOutput="\n501 "&#46;substr($socketInput,11,strlen($socketInput)- 11)&#46;"&#46;&#46;&#46; Sender domain must exist\n\r";
                
}
           
            }else{
                
$socketOutput="\n500 5&#46;5&#46;1 Command unrecognized&#58; ""&#46;$socketInput&#46;""\n\r";           
            }
           
            
socket_write($comSocket,$socketOutput,strlen($socketOutput));
 
        }else{    
           
$msg_saida "\n221 2&#46;0&#46;0 mail&#46;exemplo&#46;com&#46;br closing connection\n";
           
socket_write($comSocket,$msg_saida,strlen($msg_saida)); 
           
socket_close($comSocket);
           break;
        }
    }
}
while(
true);
 
 
socket_close($socket);
 
?>


fonte: Insphpired.com


fui.

A sabedoria está em suas mãos

branco

nem testei mas tava pensando aqui em duas coisas...a primeira delas é que o "honeypot" só vai funcionar caso um visitante execute a pagina em php, a segunda é que se outro visitante executar a pagina na mesma hora vai gerar erros, já que as portas já estao abertas...

mas de qualquer modo, bem interessante isso ai...sem contar que dá pra fazer o php rodar sem ser executado por um cliente

t+ vlws
Olha o trem... Quem vai ficar, quem vai partir? Quem vai chorar, quem vai sorrir?

HadeS

É, seria só colocar ele pra ficar rodando.

Colocar pra rodar em modo texto.

HadeS

branco

eu acredito mesmo na possibilidade de o php ser utilizado pra diversos outros fins...inclusive pra sniffar uma rede atravez de php injection, é nisso que estou estudando no momento, pena que esta acontecendo bastante problemas com a funçao dl() mas aos poucos vo tentar chegar lá...

se alguem quiser tentar ajudar, mp
Olha o trem... Quem vai ficar, quem vai partir? Quem vai chorar, quem vai sorrir?

Be.Cool

o php pode fazer praticamente tudo  ;D
é uma das minhas linguagens favoritas!
eu acho que pra ele funcionar em modo texto a pagina deve estar executando via brownser.
mais não deixe de ser um source pra estudo!
pena que eu to sem linux aki em casa!




fui.

A sabedoria está em suas mãos