Jump to content
Eric

Simple & dirty telnetd encryption scanner by Kingcope

Recommended Posts

Posted

/*
* Simple & dirty telnetd encryption scanner by Kingcope
* Year 2011
*
* Compile : gcc telnetscan.c -o telnetscan -lpthread
*/

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/time.h>
#include <fcntl.h>
#include <errno.h>

#define MAX_THREADS 50
#define CONNECT_TIMEOUT 3 // in seconds
#define MAX_BUF 100

void *telnet(void *arg)
{
int sockd;
int count;
struct sockaddr_in serv_name;
unsigned char buf[MAX_BUF];
char ip[256];
char saveip[256];
char request[1024];
char req_enc[6] = "\xff\xfd\x26\xff\xfb\x26";
int status;
FILE *f;

strcpy(ip, (char*)arg);

sockd = socket(AF_INET, SOCK_STREAM, 0);
if (sockd == -1)
{
perror("Socket creation");
return NULL;
}

serv_name.sin_family = AF_INET;
inet_aton(ip, &serv_name.sin_addr);

serv_name.sin_port = htons(23);
unsigned long iMode = 1;

status = connect(sockd, (struct sockaddr*)&serv_name, sizeof(serv_name));
if (status == -1)
{
close(sockd);
return NULL;
}

count = read(sockd, buf, MAX_BUF);

memcpy(request, req_enc, 6);
write(sockd, request, 6);

count = read(sockd, buf, MAX_BUF);

if (buf[0]==0xff&&buf[1]==0xfb&&buf[2]==0x26&&buf[3]==0xff&&buf[4]==0xfd&&buf[5]==0x26) {
printf("\n%s supports encryption\n", ip);
snprintf(saveip, sizeof(saveip), "%s\n", ip);
f = fopen("scan.log", "a");
fputs(saveip, f);
fclose(f);

close(sockd);
return NULL;
}

close(sockd);
return NULL;
}

void usage(char *argv[]) {
printf("%s <startip> <endip>\n", argv[0]);
exit(0);
}

void parseip(char *ip, int *a1, int *a2, int *a3, int *a4)
{
char *pos,*pos2,*pos3;

pos = strchr(ip, '.');
if ((!pos) || (pos-ip > 3)) {
printf("Invalid ip.\n");
exit(0);
}

*pos=0;
*a1 = atoi(ip);

pos2 = strchr(pos+1, '.');
if ((!pos2) || (pos2-(pos+1) > 3)) {
printf("Invalid ip.\n");
exit(0);
}
*pos2=0;
*a2 = atoi(pos+1);

pos3 = strchr(pos2+1, '.');
if ((!pos3) || (pos3-(pos2+1) > 3)) {
printf("Invalid ip.\n");
exit(0);
}
*pos3=0;
*a3 = atoi(pos2+1);

if (strlen(pos3+1) > 3) {
printf("Invalid ip\n");
exit(0);
}
*a4 = atoi(pos3+1);
}

int main(int argc, char *argv[]) {
char *startip;
char *endip;
int a1,a2,a3,a4;
int b1,b2,b3,b4;
pthread_t threads[512];
int threads_running[512];
char scanip[256];
int k,k1,k2,k3,k4;

printf("telnetd encryption scanner by Kingcope\n");
if (argc != 3) usage(argv);

startip = (char*)malloc(strlen(argv[1])+1);
if (startip == NULL) {
printf("error: malloc()\n");
exit(0);
}
strcpy(startip, argv[1]);

endip = (char*)malloc(strlen(argv[2])+1);
if (endip == NULL) {
printf("error: malloc()\n");
exit(0);
}
strcpy(endip, argv[2]);

parseip(startip, &a1, &a2, &a3, &a4);
parseip(endip, &b1, &b2, &b3, &b4);

printf("Starting scan from %d.%d.%d.%d to %d.%d.%d.%d\nSaving hits to scan.log\n", a1, a2, a3, a4, b1, b2, b3, b4);
k1=a1;
k2=a2;
k3=a3;
k4=a4;

k=0;
printf("CURRENT IP: %d.%d.%d.%d\n", k1, k2, k3, k4);
fflush(stdout);

for( {
snprintf(scanip, sizeof(scanip), "%d.%d.%d.%d", k1, k2, k3, k4);
threads_running[k] = time(NULL);
if (pthread_create( &threads[k], NULL, telnet, (void*) scanip) != 0) {
printf("Error: Could not create thread. Done.\n");
exit(0);
}
usleep(1000);

k++;

if (k==MAX_THREADS) {
int kk;
for (kk=0;kk<MAX_THREADS;kk++) {
while (threads_running[kk] + CONNECT_TIMEOUT > time(NULL)) {
__asm("nop");
}
pthread_cancel(threads[kk]);
pthread_join(threads[kk], NULL);
}
for (kk=0;kk<1024;kk++) {
close(kk+4);
}
k=0;

printf("CURRENT IP: %d.%d.%d.%d\n", k1, k2, k3, k4);
fflush(stdout);
}

if (k4==b4 && k3==b3 && k2==b2 && k1==b1) {
printf("\nscan finished\ndone.\n");
exit(0);
}

k4++;

if (k4 == 256) {
k3++;
k4=0;
}

if (k3 == 256) {
k2++;
k3=0;
}

if (k2 == 256) {
k1++;
k2=0;
}

if (k1 == 256) {
printf("\nscan finished\ndone.\n");
exit(0);
}
}

return 0;
}

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...