/* download files/folders */ void ftp_download(ftp_t *ftp, char *path) { char *line = NULL; char buffer[MAX_STR]; FILE *data; int co = 0; ftp->alarm_sec = 3; fprintf(ftp->FD, "SIZE %s\r\n", path); line = ftp_getline(ftp); ftp->code = atoi(line); if ( ftp->code == 213 ) { ftp_mkcon(ftp); ftp_download_single(ftp, path, 1); } else { /* TODO: add download time */ print(3, ">>> %sStart downloading from%s %s\'%s\'%s ...\n",YEL,END,GREEN,path,END); ftp->dataport = ftp_getdataport(ftp); fprintf(ftp->FD, "NLST %s\r\n", path); data = tcp_connect(ip, ftp->dataport, "r"); ftp_getline(ftp); while ( fgets(buffer, sizeof(buffer), data)) { buffer[strlen(buffer)-2] = '\0'; ftp_mkcon(ftp); ftp_download_single(ftp, buffer, 0); co++; } fclose(data); close(dfd); print(0, ">>> %sFinished! we have %s%s%d files (:%s", GREEN,END, YEL,co,END, path); } }
char * skod_hc_fingerprint(ftp_t *ftp) { char *line = NULL; const char **ptr = NULL; unsigned long sum = 0; char ssum[MAX_STR]; static char patr[MAX_STR]; int size = sizeof(ftp_commands) / sizeof(ftp_commands[0]); int c = 1; bzero(patr, MAX_STR); bzero(ssum, MAX_STR); ftp_close(ftp); /* It's more safe to make connection to each request * This way we will get the fingerprint 100% */ for ( ptr = ftp_commands; *ptr; ptr++ ) { ftp_mkcon(ftp); fprintf(ftp->FD, "%s\r\n", *ptr); line = ftp_getline(ftp); sum = skod_checksum(line); sprintf(ssum, "%lu", sum); strcat(patr, ssum); if ( c == size ) break; strcat(patr,":"); c++; ftp_close(ftp); } return (char *)patr; }
/* Parse OS/STAT*/ void skod_parse_stat(skod_t *skod, ftp_t *ftp) { char *line = NULL; char buffer[MAX_STR]; const char **p = NULL; if ( ftp->logged ) { fprintf(ftp->FD, "STAT\r\n"); while (( fgets(buffer, sizeof(buffer), ftp->FD)) != NULL ) { for ( p = ftp_prod; *p;p++ ) { if ( strstr(buffer, *p)) print(3, "%s", buffer); } } print(0, " "); } ftp_close(ftp); ftp_mkcon(ftp); /* Parse OS */ fprintf(ftp->FD, "SYST\r\n"); line = ftp_getline(ftp); if (( strstr(line, "UNIX"))) skod->os = SKOD_OS_NIX; if (( strstr(line, "NT"))) skod->os = SKOD_OS_NT; }
int main(int argc, char **argv) { skod_t skod; ftp_t ftp; skod_init(&skod); skod_parse_cla(argc, argv, &skod); signal(SIGINT, signal_handler); /* Init FTP*/ ftp.user = skod.user; ftp.password = skod.password; ftp.server = skod.server; ftp.port = skod.port; ftp.alarm_sec = 1; /* High risk */ ftp_mkcon(&ftp); /* --dest, -e*/ if ( skod.dest != NULL ) ftp_cwd(&ftp, skod.dest); else if ( skod.dest == NULL && flag == 4 ) die("You need to pass --dest (destination folder) with --upload."); switch(flag) { case 1: ftp_list(&ftp, skod.path, 1); break; case 2: ftp_remove(&ftp, skod.path); break; case 3: ftp_download_single(&ftp, skod.path); break; case 4: ftp_upload_single(&ftp, skod.path); break; case 5: ftp_cat(&ftp, skod.path); break; case 6: printf("%d\n", ftp_size(&ftp, skod.path)); break; case 7: printf("%s\n", ftp_pwd(&ftp)); break; case 8: ftp_delete(&ftp, skod.path); break; case 10: ftp_mdtm(&ftp, skod.path); break; case 99: skod_scan(&skod, &ftp); break; } ftp_close(&ftp); return 0; }