사이트 내 전체검색
[linux] shadow 화일풀기
로빈아빠
https://cmd.kr/server/336 URL이 복사되었습니다.

본문

shadow 화일풀기

오준선 e-mail: hollywar@soback.kornet21.net 

이 글을 쓰게된 동기는 아무리 암호화 되어 있다지만 Shadow 화일 분석이 얼마나 쉽고, Shadow 화일의 보안 그리고 패스워드의 정교함이 얼마나 중요한가를 모든 분들에게 알리고자 함 입니다.

1. Shadow 란.?

보통 adduser 를 해서 사용자의 계정을 만들면 /etc/passwd 라는 화일에 이름, 아이디, 비밀번호(암호화된), 쉘, 홈디렉 등등의 정보가 적히게 됩니다. 근데 passwd 화일은 모든 유저가 읽을수 있어야 login 이 가능합니다. 그러므로 passwd 화일의 퍼미션은 others 에게 read 퍼미션이 주어집니다. 다시 말하면 passwd 화일안에 있는 비밀번호(암호화된)는 누구나 가져갈수 있다는 것입니다.. 그렇다고 아무도 login 못하게 이의 퍼미션을 막아도 안될일이지요.. 이때문에 나온것이 pwconv(shadow) 입니다.

이는 비밀번호(암호화된)만 /etc/shadow 라는 화일에 퍼미션을 막은채 놓아두는 것입니다. passwd 화일의 패스워드가 들어갈 자리에는 x 라는 문자만 있을뿐이죠. login 시 passwd 화일은 이 shadow 화일의 암호화된 비밀번호를 참조하게 됩니다.


2. 암호화 기법 crypt .

password 의 암호화 기법은 crypt 라는 것입니다. 한번 암호화 되면 두번다시 풀수 없는 기법이죠. 예를 들어보죠.

guest:/M6M5FL2wCsIY:10650:0:99999:7:-1:-1:134525932

shadow 화일의 일부입니다. 첫번째 guest 가 사용자 이름이고 그 다음의”/M6M5FL2wCsIY” 가 crypt 된 password 입니다. crypt 는 C Language에서 crypt 라는 함수로 쉽게 구현할수 있습니다.

NAME crypt - password and data encryption SYNOPSIS #define _XOPEN_SOURCE #include <unistd.h> char *crypt(const char *key, const char *salt);

한번 암호화되면 풀 수 없다고 말은 했지만 반대로 보시다시피 누구나 쉽게 구현할 수 있습니다. 위의 것은 crypt(“1234”,”/M”) ; 이거 한 문장으로 만들어 진 패스워드입니다. 사용방법은 무지 쉽습니다.

crypt 함수에 넣어줘야 할 값은 첫번째 “1234” 암호와 2번째 “/M” 암호화할 형식이죠. 2번째 값은 꼭 2byte 를 써야 하며 2번째 것이 바뀌면 결과 값 역시 완전히 바뀌어 버립니다.

한번 확인을 해볼까요.? 그렇담 crypt(“1234”,”/M”)으로 만들어진 문자는 분명히 “/M6M5FL2wCsIY” 이 되어야 할테니까요. Liunx 혹은 Unix 기반의 컴퓨터에서 한번 이소스를 실행시켜 보십시요..

---- FILE ex1.c ---- #include <stdio.h> #include <unistd.h> int main(void) { char *salt = “/M” ; printf(“%s”,crypt(“1234”,salt)); return 0 ; } ---- EOF ----

레드헷 5.0 이후버젼에서는 crypt 가 기본 라이브러리에서 제외되어 독립된 라이브러리로 존재하기 때문에 컴파일할 시에 추가 시켜줘야 합니다.

gcc -o ex1 ex1.c -lcrypt

자 결과값이 어떻게 나왔는지요.?  “/M6M5FL2wCsIY” 가 맞습니까.? 식은죽 먹기죠.? 한번 salt 문자를 바꾸어서 넣어보세요. 전혀 다른 문자가 나와 버릴 것입니다. 지금이야 암호가 무엇인지 아니까 맞췄지만 이정도면 crypt 는 완벽하지 않느냐..?? 라는 질문을 할 수도 있습니다.

그러나 crypt 도 약점.. 아니 한계가 있습니다. 무엇이냐고요..??
3장 에서 보시길 바랍니다.


3. shadow 풀기.

자 이제 한번 말로만 하지 말고 직접 풀어보기로 하겠습니다. 그러나 처음 말했듯이 100 % 다 풀기란 힘듭니다. 물론 컴퓨터가 슈퍼컴퓨터거나 시간이 한가하다거나 여럿이서 동시에 풀면 불가능 한 것도 아니죠.

참. 여기서 한가지 집고 넘어갈 것이 있습니다. “shadow 풀기”란 말은 어쩐지 말이 안되는거 같고. 지금 제가 할 것은 “암호 때려 맞추기”란 말이 적절할 듯 합니다.

shadow 화일을 입수 하였습니다. 그 중 root 의 비밀번호는 “/M6M5FL2wCsIY” 입니다. 음.. 이 암호화된 것이 도대체 무엇일까요.?

우선 첫번째로 시도 해볼 만한 것이 1000~9999 숫자입니다. 사람들이 요즘들어서 숫자 4자리 쓰는 것을 아주아주 좋아하니까요..  ^^

그럼 첫번째 2byte “/M” 이 salt 문자이니 crypt 에 대입만 하면 됩니다.

---- FILE ex2.c ---- #include <stdio.h> #include <unistd.h> int main (void) { char *salt = “/M6M5FL2wCsIY” ; int i ; char buf[5] ; for (i=1000 ; i<=9999 ; i++) { sprintf(buf,”%d”,i) ; if ( !strcmp(crypt(buf,”/M”),”/M6M5FL2wCsIY”) ) { printf(“Find password! values is %sn”,buf); exit(1) ; } } printf(“Can’t find passwordn”); return 0 ; } ---- EOF ----

% P.S
이 소스를 공개하게 되기까지 많은 고민이 있었습니다. 뭐 이런 것쯤이야 C 좀 아시는 분이면 누구나 짤 수 있는 기초적인 것이며, 저만 알거나 하는 무슨 특별한 것도 아닙니다.  문제는 제가 글을 쓰는 취지.. 즉 “crypt 를 풀기가 이렇게 쉽다...  그러니 shadow 의 화일의 보안, 그리고 패스워드를 만들때 심사숙고 해주길 바란다.” 이 취지가 반대인 “남의 shadow 화일 입수하였으면 한번 풀어서 해킹(?) 이 뭔지 맛을 보여줘라” 가 되버리는 것이 두렵기 때문입니다. 이렇게 되믄 저의 강좌는 해킹 강좌밖에 더 되겠습니까.?  그러나 Linux World 를 보시는 독자분들은 절대 후자쪽의 생각을 안하리라 믿고 이렇게 소스를 올리게 된것이니 협조 부탁드립니다.

% P.S
1000~9999 의 문자를 “/M” 이라는 salt 문자로 crypt 하여 일일이 다 “/M6M5FL2wCsIY” 과 비교를 하는 것입니다. ex1.c 에서 보셨듯이 똑같은 값이 들어가면 결과값은 똑같아 질 수밖에 없습니다.

for 문 if 문 print 문 crypt 문 strcmp 문.. 기초적인 5개의 명령어만 알면 누구나 할수 있는 무지하게 쉬운 것입니다.
영화나 TV 그리고 요즘 유행하는 rc5des 풀기 project 등등 암호를 푸는데 엄청난 시간이 걸리고 슈퍼 컴퓨터같은 것이 마구마구 풉니다. 이것은 슈퍼컴퓨터가 엄청난 지능으로 암호화된 문자를 해석하는게 아니라 이렇게 일일히 다 경우의 수를 비교하는 것입니다.

위의 소스를 실행시키면 팬티엄2 333 에서 약 1초 가량이 소요 됩니다. 숫자 말고 문자도 풀고 싶다.. 그럴경우에는 우리에게는 아주 좋은 자료가 있습니다. Alzza Linux 배포판에 기본으로 깔리는 “edic” 이라는것이 있죠.? 우리는 이 edic 의 자료를 이용하여 단어 역시 비교할수 있습니다. salt key 야 당연히 shadow 화일의 암호화된 password 의 첫번째 2 byte 이니 이것을 salt 키로 사전단어만 대입시키면 되는것이죠.

한번 login 의 경우를 생각해보죠.

login : guest
password : ****

이렇게 입력을 하였을 경우 login 이라는 프로그램에서는 shadow 에 있는 guest 의 crypt 된 암호를 메모리에 올려서 첫번째  2byte 의 문자를salt 문자로 사용하여 **** 의 문자와 합게 crypt 화 합니다. 만약 결과값이 같으면 login 이 성공하는 것이죠.

자.. 그럼 어떻게 해야 될까요.? 비밀번호를 엄청나게 길게~~ 그것도 숫자 특수문자 대소문자 마구마구 섞어 쓰면 그 누구도 못풀까요.? 여기서 crypt 라는 암호화 기법의 한계성이 나타납니다. Unix System 에서(즉 crypt)는 password 길이의 제한이 있습니다.

비밀번호로 “abcdefghijklmn!@#$%^&*()” 이런식으로 집어넣는다 치죠.

System 에서는 이것을 받아 들이기는 합니다. 물론 에러도 없지요...그러나 문제는.. 앞의 8 byte 까지만 받아들이게 됩니다. crypt 암호화의 한계이죠. 아무리 길게 쳐봤자. 앞의 8 byte .. 즉 “abcdefgh” 가 암호화가 되는것입니다. 한번 ex1.c 소스를 가지고 한번은 “abcdefghijk.....&*()”를 넣어보시고. 다시 한번 같은 salt 문자로 “abcdefgh” 를 해보십시오. 결과값은 어떻습니까.? 똑같습니다. 이것이 crypt 의 한계입니다.

키보드로 구현할수 있는 문자.. 즉 password 로 쓸수 있는 숫자 , 문자 , 특수문자는  총 틀어서 약 94 개입니다. ascii code 33 ~126 까지 쓸수 있습니다. 그러나 94 개를 8자리로 비교하게 된다믄 엄청난 시간이 소요 되니 시간이 조금 걸리는것부터 차근차근 풀어보는것이 해커로서는 훨씬 유익한 방법일것입니다.

1. 1000 ~ 99999
2. 사전단어

이 2가지를 맨처음으로 시도를 할것이고 이것이 안통할 경우에는a ~ z 까지. 이것도 안되면 aA ~ zZ 까지... 이것역시 안되면 특수문자 알파펫 숫자 즉 ascii code 33~126 까지 8자리를 비교할것입니다. 요즘 나오는 Pentium II 는 무척이나 빨라서 아마도 1주일 안에 풀어낼것입니다.

해석은 무조건 가능합니다. 시간이 걸릴 뿐이죠. 그리고 요새들어 비밀번호를 숫자 4자리로 쓰는 사람들이 부쩍 늘었습니다. 위에 보시믄 아시겠지만  숫자 4자리 해석하는데는 1초 걸립니다.. 혹시나 shadow 화일을 해커에게 빼앗겨서 해커가 분석을 시작했다 칠때 피해를 보는것은 숫자 4자리나 사전단어를 쓴사람이이 대부분일 것입니다..

그리고 사람이름을 영어 소문자로. 즉.

“순이” --> “tnsdl” , “준선” --> “wnstjs”

이런식으로 하게 되면 우리나라에서만 통용되겠지만. 알파벳 소문자

aaaa ~ zzzzzz 까지 비교만 하믄 다 찾아낼 것입니다. 26 개의 문자를 6자리까지 비교하는 것이니 이건 그리 오래 걸리는 것이 아닙니다.


4. 글을 마치면서.

제가 이 글을 쓰게 된 동기는 요즘들어 Linux 유져들이 많아지고 Linux 를 Server 로 쓰는 회사도 많아지고 있습니다. 그런데 비해 i386 machine 에서 돌아가는 OS 라고 회사에서는 교육.. 혹은 보안에대해서 별로 신경을 안쓰고 있는 실정입니다. 차라리 옛날 SunOS 가 써버 주 시장을 독점하였을때는 교육은 필수였으니 shadow 거는것은 써버 관리자라면 누구나 아는 사실이였을 것입니다.

이 뿐만이 아니라 아직도 우리나라 대형 Unix Server 들 역시 shadow file 의 permission 이 풀려있지를 않나 ,백업화일로 뒹굴지를 않나, shadow 마져 안걸려 있지를 않나...이건 보안 차원에도 안들어 가는 것 일겁니다. “암호화 된것이니 하하 풀어볼려면 풀어보슈...” 이런생각을 가지고 있다면 정말 큰 오산입니다.

퍼미션 막혀 있어도 어떻게든지 속임수로 빼내는 해커들인데... 그리고 이 글을 참고로 shadow 화일을 분석해보라는 것이 절대 아닙니다. 혹 어느 써버에 shadow 화일이 누출되어 있더라도 유혹을 뿌리치시기 바랍니다. 써버 관리자의 실수이기는 하지만 이 역시 엄연한 범죄입니다.

자신이 쓰고있는 password 에 대해서 다시 한번 생각하는 계기가 되었음 좋겠습니다.

앞으로 최소한 이 글을 읽은 분만이라도 pwconv(shadow) 는 필수로 걸어주시고 암호화 된것에 안심을 하지 말고 shadow 자체가 패스워드그 자체로 생각을 하여주시면 우리나라의 보안이 보다 발전할것입니다.

댓글목록

등록된 댓글이 없습니다.

1,139 (8/23P)

Search

Copyright © Cmd 명령어 52.15.224.97