####################################################################### Luigi Auriemma Applicazione: DConnect Daemon http://www.dc.ds.pg.gda.pl Versioni: <= 0.7.0 e CVS <= 30 Jul 2006 Piattaforme: Windows, *nix, *BSD ed altre Bugs: A] listen_thread_udp buffer-overflow B] dc_chat NULL pointer C] various format string bugs (privileges needed) Exploitation: remoto Data: 06 Aug 2006 Autore: Luigi Auriemma e-mail: aluigi@autistici.org web: aluigi.org ####################################################################### 1) Introduzione 2) Bugs 3) The Code 4) Fix ####################################################################### =============== 1) Introduzione =============== DConnect Daemon e' un server P2P open source per il protocollo Direct Connect. ####################################################################### ======= 2) Bugs ======= ------------------------------------ A] listen_thread_udp buffer-overflow ------------------------------------ La funzione principale che gestisce i pacchetti UDP e' vulnerabile ad un buffer-overflow che avviene quando viene ricevuto un nickname piu' lungo di 32 (NICK_LEN) caratteri. La porta UDP e' disabilitata di default, il parametro min_slots in dcd.conf deve essere abilitato per attivare questo servizio. Da main.c: void listen_thread_udp(void *args) ... char *ip=NULL, bufor[10001], *cmd=NULL, *nick=NULL, *s_slots=NULL, *__strtok_temp__=NULL, nick_prev[NICK_LEN], *filename;; ... if (!i)nick_prev[0]=0; else strcpy(nick_prev,nick); ... ----------------------- B] dc_chat NULL pointer ----------------------- La funzione dc_chat utilizzata per la gestione dei messaggi ricevuti dai clients porta al crash dell'applicazione a causa di usr->nick che punta a NULL se il client non ha ancora inviato il proprio nickname (quindi basta soltanto inviare un messaggio come primo comando per sfruttare questo bug). Da cmd.dc.c: void dc_chat(dc_param_t *param) { userrec_t *usr = param->usr; ... if (strcmp(cmd,usr->nick)) ... ------------------------------------------------- C] various format string bugs (privileges needed) ------------------------------------------------- privmsg e pubmsg sono due funzioni utilizzate per l'invio di messaggi ad uno o piu' utenti. Entrambe le funzioni richiedono una stringa di formattazione (come printf) che manca in alcune parti del codice. Queste vulnerabilita' di tipo format string possono essere sfruttate solo se l'attacker ha privilegi di superior user o administrator. Da cmd.user.c: void chat_msg(chat_param_t *param) ... if (user[n]!=usr) pubmsg(user[n],msg); ... void chat_msg_all(chat_param_t *param) ... pubmsg(NULL,par); ... void chat_msg_prv(chat_param_t *param) ... if (user[n]!=usr) privmsg(user[n],NULL,msg); ... void chat_msg_prv_all(chat_param_t *param) ... privmsg(NULL,NULL,msg); ... From penalties.c: void penalprvmsg(userrec_t *to, char *op, char *fmt, ...) ... privmsg(to,op,str); ... From cmd.dc.c: void dc_OpForceMove(dc_param_t *param) ... privmsg(usr,NULL,msg); ... ####################################################################### =========== 3) The Code =========== http://aluigi.org/poc/dconnx.zip ####################################################################### ====== 4) Fix ====== CVS 31 Jul 2006: cvs -d:pserver:anonymous@cvs.ds.pg.gda.pl:/home/cvsroot get dc-hub #######################################################################