// Linux version 2.2.20 (root@mothership) (gcc version egcs-2.91.66 19990314/Linux (egcs-1.1.2 release))
/*
 * s0t4ipv6@Shellcode.com.ar
 * http://www.shellcode.com.ar
 * 
 * Point out the lam3r banners.
 * version 0011
*/
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <string.h>
#include <signal.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>

#define DEFAULT_PORT	23 			// if u don't specified port number
#define HTTP		"HEAD / HTTP/1.0\n\n\0"

static int socketfd;
_detect() { fprintf (stderr,"\n[...]\nEOF\n"); close(socketfd); exit(0);}

_telnet () {
	static unsigned char tempd[4]={0};
	register unsigned char *tempr;
	fd_set	trulla;
	struct 	timeval valor;
	valor.tv_sec=5; valor.tv_usec=0;

	FD_SET(socketfd, &trulla);
	select(socketfd+1,&trulla,NULL,NULL,&valor);

	while (FD_ISSET(socketfd,&trulla) > 0 && *tempr != 13) {
		read(socketfd,tempr,1);
		if ( *tempr != 255 ) tempd[0]=255;	// IAC
		if ( *tempr == 251 || *tempr == 252 ) tempd[1]=254; // will or wont -> dont
		if ( *tempr == 253 || *tempr == 254 ) tempd[1]=252; // do or dont -> wont
		if (tempd[1]) { tempd[2]=*tempr; write (socketfd , tempd, 3); }
	}
	return (0);
}

main(int argc, char *argv[]) {
int port;
char result, *IPaddr ;

struct sockaddr_in meta;
struct hostent *addr;

if (argc < 2)
 {
  fprintf (stderr, "Banners v0011. by s0t4ipv6\n", argv[0]);
  fprintf (stderr, "Usage: %s [hostname] [port]\n", argv[0]);
  exit (-1);
 }

if (argv[2] == NULL) { port=DEFAULT_PORT; } else { port=atoi(argv[2]) ; } 
 
IPaddr=argv[1];
if ((addr=gethostbyname(IPaddr))==NULL) { perror("Gethostbyname()"); exit(0); }	

socketfd= socket(PF_INET,SOCK_STREAM, 0);
if (!socketfd) { perror ("socket()"); exit(0); }

meta.sin_family=PF_INET;
meta.sin_port=htons(port);
meta.sin_addr=*((struct in_addr*)addr->h_addr);

fprintf (stderr,"Connecting to %s on port %d...\n",IPaddr,port);
if (connect (socketfd, (struct sockaddr *) &meta, sizeof (meta)) < 0)
    { perror("Connect()"); exit (0); }

signal(SIGALRM , (void*) _detect) ;

if (port == 80) write (socketfd, &HTTP, sizeof(HTTP));
if (port == 23) _telnet();

alarm(1);
fprintf (stderr,"[...]\n");
while (read(socketfd,&result,1)) 
	{  
	// if ((int)result < 0) _detect();  // I need more info...
	if ((int)result < 127 && (int)result > 8) 
		{ write (0,&result, 1); alarm(1); }
	} 
}
// EOF
