Conheça a ferramenta de busca - Busca PHP. Ela faz uma pesquisa nos sites mais importantes sobre a linguagem, e trará pra você resultados exepcionais!! Estamos customizando o serviço ainda, que você pode conferir no menu a direita....
 

Pesquisar

Login






Esqueceu sua senha?
Honeypots com PHP??? PDF Imprimir E-mail
Avaliação do Usuário: / 2
PiorMelhor 
Por Ricardo Maia   
11 de julho de 2006

 Image

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".

$ 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 <may be forget>, pleased to meet you.
mail from: fake@teste.com

250 2.1.0 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.0.0.1';
set_time_limit(0);
$ip_remoto = $_SERVER['REMOTE_ADDR'];
$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]+)([.,_,-]([0-9,a-z,A-Z]+))*[@]([0-9,a-z,A-Z]+)([.,_,-]([0-9,a-z,A-Z]+))*[.]([a-z,A-Z])
{2,3}([0-9,a-z,A-Z])?$", $email ) ) {
return TRUE;
}else{
return FALSE;
}
}
$message="Connected to mail.exemplo.com.br\n\r";
$message.="220 mail.exemplo.com.br PHP Honeypot SMTP\n\r";
socket_write($comSocket,$message,strlen($message));
do{
sleep(8);
$socketInput=socket_read($comSocket,1024);
if(eregi( chr(13), $socketInput ) and $socketInput !=''){
$socketInput = rtrim($socketInput);
if($socketInput !='quit'){
if($socketInput == "helo" AND strlen($socketInput) == 4){
$socketOutput="\n501 5.0.0 HELO requires domain address\n\r";
}
elseif( eregi("helo", $socketInput) AND strlen($socketInput) != 4
){
if( verifica_dominio( substr($socketInput,5,strlen($socketInput)- 4))){
$socketOutput="\n250 mail.exemplo.com.br Hello [".$ip_remoto."] ".$nome_remoto." (may be forged), pleased to meet you\n\r";
}else{
$socketOutput="\n501 5.0.0 invalid domain\n\r";
}
}elseif ( eregi("mail from:", $socketInput ) AND strlen($socketInput) >= 10 ) {
if( verifica_email( substr($socketInput,11,strlen($socketInput)- 11))){
$socketOutput="\n250 2.1.0 ".substr($socketInput,11,strlen($socketInput)- 11)."... Sender ok\n\r";
}else{
$socketOutput="\n501 ".substr($socketInput,11,strlen($socketInput)- 11)."... Sender domain must exist\n\r";
}
}else{
$socketOutput="\n500 5.5.1 Command unrecognized: \"".$socketInput."\"\n\r";
}
socket_write($comSocket,$socketOutput,strlen($socketOutput));
}else{
$msg_saida = "\n221 2.0.0 mail.exemplo.com.br closing connection\n";
socket_write($comSocket,$msg_saida,strlen($msg_saida));
socket_close($comSocket);
break;
}
}
}
while(true);
socket_close($socket);
?>
 

 

Outras referências:

http://rfc.net/rfc2821.html (RFC)
http://br.php.net/manual/pt_BR/ref.sockets.php (Manual PHP)
http://br.php.net/sockets (Manual PHP)
http://www.zend.com/pecl/tutorials/sockets.php http://www.devarticles.com/c/a/PHP/Sockets-and-PHP/




Gostou do artigo? Então compartilhe!
Digg!Reddit!Del.icio.us!Google!Technorati!StumbleUpon!Add this social bookmarking functionality to your website! title=
Última Atualização ( 10 de janeiro de 2008 )
 




Add to Technorati Favorites

Feed