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 (mailto: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);
?>
fonte: Insphpired.com
fui.
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
É, seria só colocar ele pra ficar rodando.
Colocar pra rodar em modo texto.
HadeS
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
o php pode fazer praticamente tudo

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