본문 바로가기

[☩ Security ☩]

Unix Password 의 구조와 crack 및 대응법

Unix Password 의 구조와 와 크랙이 일어나는 방법 및 대응법입니다. 공부하시는 분들은 참고하세요
사용자 삽입 이미지

유닉스의 암호화 알고리즘은 그 해독 자체가 거의 불가능 하다. 그런데 어떻게 패스워드를 크랙할수 있을까? 자 우선 '/etc/passwd'에 있는 사용자 목록과 그 패스워드 파일들을 잠깐보고가자.

$vi /etc/passwd

root:VRLoJ2QnLhRA2:0:0:Supervisor:/:/bin/csh
daemon:*1:1::/::
uucp:*:4:8::/var/spool/uucppublic:
babo:ntim9ljaUGI.A:104:30:KyeongWon Lee:/home/babo:/usr/local/bin/tcsh
leon:tdtwKgRa3ZZoI:129:30:Kim Huy kang:/home/leon:/usr/local/bin/tcsh
hohle:u2WKlqINaIP8w:11529:410:Hoh eun ha:/home/hohle:/bin/csh


첫 세줄은root,daemon,uucp라는 시스템 계정(account)에 관한 정보 이고 그 다음에 나오는줄들은 babo나 leon 같은 시스템의 일반 유저들에 관한 정보이다. 각각의 줄은 : 을기준으로 다음과 같은 7개의 필드(field)로 나뉜다.

1 Field : 유저 이름
2 Field : 유저의 패스워드(보통 보여주지 않거나 알아보지 못하게 변형시켜 놓는다.)
3 Field : 유저의 ID number(UID)
4 Field : 유저가 속해있는 그룹의 ID number(GID)
5 Field : 유저의 실제 이름
6 Field : 유저의 홈 디렉토리
7 Field : 유저가 사용하는 Shell

그 예를 들어보자. 위에서 leon이란 사람을 살펴보면


leon:##sakai:129:30:Kim Huy kang:/home/leon:/usr/local/bin/tcsh    요렇게 혹은
leon:tdtwKgRa3ZZoI:129:30:Kim Huy kang:/home/leon:/usr/local/bin/tcsh 요렇게

유저이름: leon
password: ##sakai(의도적으로 패스워드 부분을 숨긴 경우)tdtwKgRa3ZZoI(변형시켜서 알지 못하게 한 경우.보통 encrypt(암호화)시켰다고말한다.)

UID : 129
GID : 30
실제 유저의 이름: Kim Huy kang
유저의 홈디렉토리:/home/leon
유저가 사용하는 쉘: tcsh

패스워드 알아내기

흑흑 위에서 말한데로 현존하는 거의 모든 시스템에선 패스워드를 보여주지 않는다.
암호화 패스워드란 일반 패스워드를 암호화 프로그램에 의해서 암호화 시켜놓은 것을 말한다. 위에서 보면 "tdtwKgRa3ZZoI" 요놈이 바로 유저 leon의 암호화 패스워드인것이다. 만약 우리가 우연히던 아님 시스템 관리자가 게을러서 이던 간에 요놈의 암호화 패스만 알게 되어도 진짜패스를 쉽게 알아낼수가 있다. 앞에서 유닉스의 역암호화 알고리즘은 거의 불가능 하다고 했다.. 그러므로 암호화 패스를 역암호화 한다는것은 불가능 하다. 그럼 어떻게? 진짜로 무식하게, 단어사전을 우선 만든다. 영어 사전에 있는 단어는 물론 비속어, 통용어, 기타등등 기타등등 ... 하여간 내가 알고 있는 영어단어는 죄다 모아서 하나의 택스트 파일을 만든다음... 핵핵.... 그 하나하나의 단어를 꺼꾸로 암호화 시킨후 위에서의 암호와 하나씩하나씩 맞추어 보는 것이다... (이 얼마나 무식한 방법인가!, 하지만 이 방법 밖에는 없다.) 이것이 패스워드 크랙의 전부이다. 운 좋게 단어사전 위쪽에 암호가 존재하면 금방알아낼수 있구, 맨 마지막에 있으면 거의 하루종일걸리기도 한다...(컴이 좋으면 그방도 하기는 하겠지만..) 다음은 핵슬에 있는 패스워드 크랙 소스이다.

--------------------------------------------------------
/*
password_crack
-by bugscan
*/

#include stdio.h
#include unistd.h

main(int argc, char **argv)
{

  char word[81],buf[20];
  FILE *fp;

  if ( argc < 2 ) {
      printf("usage : %s 단어사전\n",argv[0]);
      exit(0);
  }

  fp = fopen(argv[1],"r");    /* 단어 사전 파일을 열어요. */

  if ( !fp ) {
      perror("open error");
      exit(0);
  }

  while ( 1 ) {

      if ( fscanf(fp,"%s",word)  < 0)       /* 사전에서 단어가져옴 */
{        
          printf("패스워드 찾기에 실패하였습니다.다른 단어사전을...\n");
          break;
      }

      strcpy(buf,(char *)crypt(word,"요기는 키워드"));  /* 암호화 시킴     */

      if( !strcmp("요기에다 쉐도우 패스워드를 넣어요",buf) )     /* 패스워드를 비교 */
  {          
          printf("축하합니다.\n검색된 패스워드 : %s \n",word );
          break;
      }
  }

  fclose(fp);
  exit(0);
}

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

위 소스에서 보면 '키워드'라는 것이 있다. 핵슬 암호화 강좌에 보면 자세히 나와 있으므로 참고 하시길... 대게 암호화 패스의 앞두글자가 '키워드'이다..

Shadow 패스워드

위에서는 간단하게 암호화된 패스워드를 공략하는 방법에 대해서 알아보았다.
그러나 위에서도 언급 했듯이 거의 모든 시스템에서는 /etc/passwd의 내용에 암호화된 패스워드를 보여주지않는다.
데게 "##" 나 "*" 이러한 표시로 패스워드 부분을 숨겨 놓게된다. 그렇다면 진정 암호화된 내용은 어디에 있을까?
그것은 /etc/sadow에 저장되어 /etc/passwd와 상호 연결되어 passwd파일의 패스워드 부분을 쉐도우화 시키고 있다.
따라서 우리가 좀더 관심을 가져야 할곳도 /etc/passwd보다는 /etc/shdow인것이다. 물론 /etc/shodow는 우리가 접근하기 메우 어렵지만 쉐도우 자제에 문제가 아닌 다른 어플리 케이션의 문제에 있어서 /etc/shdow를 볼수있는 경우가 생기게된다..

-. 2001년 2월 ssh의 환경변수를 이용한 /etc/shadow 읽기가능
-. 1999년 3월 레드햇 5.1에 있는 XFS의 버그로 인한 /etc/shadow 읽기가능
-. 1998년 12월 pam_uix_passwd.so에 보안결점으로 인한 /etc/shadow 접근 가능
-. 1998년 11월 KDE 스크린 세이버에 보안상 헛점을 이용한 /etc/shadow 접근가능


물론 /etc/shadow를 읽는것 만으로는 패스워드를 알아냈다고 할수 없지만, 현재 나와있는 크랙툴의 성능은 거의 어떠한 의미없는(사용자가 멋데로 사전에 없는 낱말을 나열하여도) 단어들이라 하여도 시간만 주어지면 크랙킹할수 있는 막강한 기능을 가지고 있으므로 shadow의 암호화 패스워드만 알게 되어도 그 시스템의 사용자에대한 패스워드 크랙은 성공한것이라 할수있다.

Shadow sute의 이해

패스워드는 비록 암호화 되어 저장되지만 지난번에 설명한 간단한 크랙도구를 이용하더라도 왠만한 사전에 있는 단어로된 패스워드들은 크랙킹할수 있다. 따라서 암호화된 패스워드역시 실제 패스워드처럼 보안에 신경을 써야한다./etc/passwd의 읽기 가능한 퍼미션을 보완하고 암호화된 패스워드를 보이지 않기하기위해서 고안된건이 바로 shadow sute이다. 이러한 쉐도우슈트 툴은 지금은 대부분의 시스템에 체용되고 있으며, shadow sute의 핵심인 /etc/shadow는 파일퍼미션을 root의 권한으로만 읽기 가능하도록 설정되어있어 /etc/passwd의 암호환된 패스워드를 안전하게 보관할수 있다. 또한 쉐도우 슈트툴은 비교적 단순하지만 그자체의 버그가 존재하지 않아 좀처럼 암호화된 패스워드를 알수 있는 방법이 없으므로 시스템에 쉐도우 슈트를 설치하고 업그래이드 하는것은 무엇보다 중요하다고 할수 있겠다..

 /etc/shadow

/etc/shadow는 쉐도우된 패스워드의 테이터베이스 파일이다. 그곳에는 패스워드뿐아니라. 특별한 규칙 암시자를 포함하는 특별한 파일이다.
shadow 테이터베이스는 다음의 9가지의 계정을 지니고 있다. 잠시 /etc/shadow파일의 구조를 살펴보자

root:ILOTWOUA.YcaA:10713:0::7:7::
bin:*:10713:0::7:7::
...
...
...
leon:aNi7cQR3XStmc:10713:0::7:7::

얼핏보아서 /etc/passwd의 파일내용과 흡사한 모습을 하고있다. 그내용은 각계정 마다의 ":"으로 내용을 구분한다.

-. 사용자명
-. 사용자 패스워드
-. 1970년 1월 1일 부터 계산하여 최근 패스워드를 변경한 날까지의 날짜수
-. 사용자가 패스워드를 변경한후에 다시 변경이 가능한 날까지의 남은 일수
-. 사용자가 반드시 패스워드를 바꾸어야 하는 날까지의 남은 일수
-. 패스워드가 만료전에 사용자에게 미리경고 하는 기간
-. 계정이 사용 불가능하게 되기전에 사용자가 패스워드를 바꿔야만하는 날까지의 남은 일수
-. 1970년 1월 1일 부터 계정 사용이 불가능 하게 된 날까지의 날수
-. 예약


위의 예에서 leon의 계정을 살펴보면, leon은 암호화된 패스워드가 'aNi7cQR3XStmc'이고 1970년 1월 1일부터 10713일(즉 1999년 5월 1일)에 패스워드를 변경하였으며, 패스워드 변경일등은 규정되어 있지 않으므로 별다를 날짜가 규정되어있지 않다.

것보기에는 /etc/passwd와 비슷하지만 그내용을 보면 전혀다른것을 알수 있다. 즉, 패스워드의 나이(Passwd aging)와 계정사용자가 게으른 경우 사용자에게 패스워드 변경을 요청하고 요청된 사항이 무시되면 아애 계정을 없애버리는 기능을 가지고 있는것이다.

shadow sute의 패스워드 보호및 관리

위에서 말한 패스워드 나이와 패스워드 잠금에 간해서 알아보도록하자

※ 패스워드 에이징
패스워드의 수명을 제한하는 것으로 수명이 만료되면 시스템은 사용자에게 새로운 패스워드를 생성하도록 요구한다. 패스워드 에이징은 사전 패스워드 검사와 함께 사용될때 그 보안력을 강화 할수 있다.

※ 패스워드 잠금
이렇듯 패스워드의 변경하라는 지시에도 몇몇사용자들은 그걸무시하는 경향이 있다. 이때 시스템은 이러한 패스워드 변경요구에 불응하는 사용자 계정을 잠그므로서 그 계정을 통한 시스템 접근을 불허한다. 시스템을 관리하는 관리자로서는 아주 편리한 기능중에 하나이다.

패스워드 크랙 툴
우여골절끝에 암호화된 패스워드를 알아냈다면, 이제 그 시스템으로의 억세싱은 시간 문제이다.
다음소개하는 패스워드 크랙도구들은 파워풀한 능력을 보유하고 있다.

Crack
만든이 : 알렉스 머펫(Alec Muffett)
이 크랙 프로그램은 /etc/passwd 파일을 직접 크랙할수 있는 도구이다.
사용법은

$ crack /etc/passwd 하여도 되고 /etc/passwd파일을 복사한뒤 사용하여도 무방하다.

crack은 각 단어에 규칙을 적용시켜 적당하게 변형한다. 규칙은 패스워드를 발견할 모든 가능성을 이용한다. 대소문자의 변경, 현재단어와 그 단어를 역으로 뒤집은 후 합친다든지, 단어를 반복, 단어의 시작이나 끝에 숫자를 더한다든지... 이처럼 모든 경우의 단어조합을 체크하며 패스워드를 알아낸다...자세한 옵션 및 설명은 크랙 메뉴얼이나
http://alloy.net/writings/funny/crack_readme.txt를 참조하도록하자.

John the Ripper
도스,윈도우,유닉스, 등등의 거의 모든 시스템에서 사용 가능한 패스워드 감시도구이며. 빠르고 많은 규칙을 적용시키는 게 장점이다.
http://www.bullzeyes.net/tools/crackers/john.zip

Killer Cracker
간단한 패스워드 크랙도구 이며 C++로 쓰여져있다. 메우빠른 크랙속도를 자랑한다.
http://www.giga.or.at/pub/hacker/unix/kc9_11.tar.Z

perlCracker
펄로 만들어진 DES 패스워드 크랙도구이다
http://www.netrom.com/~cassidy/utils/pcrack.zip

Xcrack
리눅스 패스워드 크랙을 위한 펄 스크립트. 규칙의 다양화는 없으나 단어사전의 단어를 직접 암호화하여 비교한다
http://www.netrom.com/~cassidy/utils/xcrack.pl

크랙킹의 필수품 - 단어사전
위에 잠시 언급하였지만 Unix시스템의 역암호화 알고리즘은 거의 존재하지 않는다. 따라서 패스워드를 크랙킹한다는 것은 사실 역암호화가 아닌 수많은 단어들을 암호화 하여 생성된 암호화 우리가 알아내고자 하는 패스워드의 암호를 하나씩 비교하여 찾는 것이 고작이다. 이렇다면 패스워드 크랙에 있어서 무었보다 중요한것은 바로 단어사전이다 얼마나 많은 양의 단어를 가지고 있는가에 따라서 암호화된 패스워드를 알아낼수 있는가 아닌가를 알수있다.


※ 이처럼 패스워드에 관한 관리를 소홀히 한다면 우리는 언제든지 시스템으로 접근할수 있는 대표적인 권한인 로그인을 쉽게 이루어 낼수 있다.따라서 시스템 관리자는 다음의 사항을 체크하여 좀더 보안상 완벽한 시스템을 만들도록 노력하여야 겠다.

1.쉐도우를 사용하지 않는 시스템에서는 쉐도우 슈트를 반드시 설치하고 패스워드를 60~90일 사이에 만료되도록 설정하며, 그에 맞는 경고와 잠금상태등을 확인한다.

2. 사전 패스워드 검사기를 사용하여 시스템에 로컬로 로그인된 사용자들의 패스워드를 수시로 체크하여 보안상의 문제를 검토한다

3. 한달에 1회이상 최신 패스워드 크랙툴 및 단어사전들을 검토하여 크랙을 시도해본다

4. /etc/shadow파일에 접근하는 버그들을 관심있게 관찰한다.

5. 각 로컬 사용자들에게 패스워드관리에 대한 교육을 수시로 한다...


6. 패스워드 관리
다행인지 불행인지 시스템에서는 쉐도우 패스를 공개하지 않는다.
그러나 더더욱 무식한 방법을 동원 하면 쉐도우고 나발이고 필요치도 않다. 얼마전에 어떤분이 멜을 보내 왔었다. "친구가 자신의 패스워드를 알아내가지구 나쁜짓을 해요!"라구... 그런경우 뭐 특별한 해킹지식을 가지고 패스워드를 알아낸것이 아니다. 말그대로 친구의 패스워드를 통밥으로 알아낸것이다. 특히 이러한 일은 가까이 있는 사람들에게 자주 일어날수 있다. 따라서 패스워드는 진짜진짜 남이 모르는 아니 상상조차 할수 없는 걸로 만들어야 한다...그렇치 않으면 추리력 좋은 "통밥맨"들에게 시스템을 노출 시킬수도 있다....