int decode_telnet(u_char *buf, int len, u_char *obuf, int olen) { if ((len = strip_telopts(buf, len)) == 0) return (0); if (!is_ascii_string(buf, len)) return (0); if (strip_lines(buf, Opt_lines) < 2) return (0); strlcpy(obuf, buf, olen); return (strlen(obuf)); }
int decode_ftp(u_char *buf, int len, u_char *obuf, int olen) { struct buf *line, inbuf, outbuf; int i, n; if ((len = strip_telopts(buf, len)) == 0) return (0); buf_init(&inbuf, buf, len); buf_init(&outbuf, obuf, olen); if (!buf_isascii(&inbuf)) return (0); n = 0; while ((i = buf_index(&inbuf, "\n", 1)) != -1) { line = buf_tok(&inbuf, NULL, i); buf_skip(&inbuf, 1); if (i > 0 && line->base[i - 1] == '\r') line->end--; line->base[line->end] = '\0'; if (strncasecmp(buf_ptr(line), "USER ", 5) == 0 || strncasecmp(buf_ptr(line), "ACCT ", 5) == 0 || strncasecmp(buf_ptr(line), "PASS ", 5) == 0) { buf_putf(&outbuf, "%s\n", buf_ptr(line)); n++; } } if (n < 2) return (0); buf_end(&outbuf); return (buf_len(&outbuf)); }
void do_ftpd(int fd) { FILE *f; char buf[1024]; int len, portcmd = 0; u_long ip; u_short port; if ((f = fdopen(fd, "r+")) == NULL) return; fprintf(f, "220 ftpd-ozone ready for love.\r\n"); while (fgets(buf, sizeof(buf), f) != NULL) { if ((len = strip_telopts(buf, strlen(buf))) == 0) continue; if (strncasecmp(buf, "SYST", 4) == 0) { fprintf(f, "215 ftpd-ozone\r\n"); } else if (strncasecmp(buf, "USER ", 5) == 0) { fprintf(f, "331 yo there\r\n"); } else if (strncasecmp(buf, "PASS ", 5) == 0) { fprintf(f, "230 sucker\r\n"); } else if (strncasecmp(buf, "PWD", 3) == 0) { fprintf(f, "257 \"/\" is current directory\r\n"); } else if (strncasecmp(buf, "PASV", 4) == 0) { fprintf(f, "502 try PORT instead ;-)\r\n"); /*fprintf(f, "425 try PORT instead ;-)\r\n");*/ } else if (strncasecmp(buf, "PORT ", 5) == 0) { if (portstr2num(buf + 5, &ip, &port) != 0) fprintf(f, "500 you suk\r\n"); else { fprintf(f, "200 ready for love\r\n"); if (portcmd++ < 2) /* XXX */ printf(GREEN "try connecting to %s %d" OFF "\n", int_ntoa(ip), port); } } else if (strncasecmp(buf, "CWD ", 4) == 0 || strncasecmp(buf, "TYPE ", 5) == 0) { fprintf(f, "200 whatever\r\n"); } else if (strncasecmp(buf, "NLST", 4) == 0) { fprintf(f, "550 you suk\r\n"); } else if (strncasecmp(buf, "MDTM ", 5) == 0) { fprintf(f, "213 19960319165527\r\n"); } else if (strncasecmp(buf, "RETR ", 5) == 0 || strncasecmp(buf, "LIST", 4) == 0) { fprintf(f, "150 walking thru your firewall\r\n"); } else if (strncasecmp(buf, "QUIT", 4) == 0) { fprintf(f, "221 l8r\r\n"); break; } else fprintf(f, "502 i suk\r\n"); } fclose(f); }