2010년 11월 23일 화요일

당신의 패스워드는 안전한가? 클라우드 기반 패스워드 크랙킹

패스워드 크랙킹을 하는데는 많은 컴퓨팅 자원이 필요하다. 많은 연산이 필요해지는데,
CPU 보다는 GPU 가 연산하는데 있어 훨씬 파워풀한 성능을 제공한다. 그런데,이런 GPU 도
클라우드 방식으로 이용하면 더욱 빠르게 처리 가능할 것이다. 최근 아마존에서 제공하는
EC2 클라우드 서비스를 이용해 패스워드를 크랙킹한 것이 소개되었다. 사용된 하드웨어
스펙은 아래와 같다:

22기가 메모리
33.5 EC2 컴퓨터 ( 인텔 제온 X5570, 쿼드코어 X 2)
NVIDIA M2050GPU X 2
1690GB 스토리지
64비트 플랫폼

CUDA-Multiforce 를 이용해 sha1 해쉬 파일을 크랙킹 하는데, 단지 49분이 걸렸다고 한다.
테스트로 이용된 해쉬는 총 14개이며, 아마존 EC2 를 이용하는데 비용은 1시간에 $2.10
이라고 한다. 클라우드 기반의 컴퓨팅 파워를 이용해 저렴한 패스워드 크랙킹이 가능해 진것이다.

일반적으로 이용되는 시스템 자원을 이용하면 얼마나 걸릴까? 때마침 잠깐 테스트할 만한
시스템도 있고하여 겸사겸사 테스트 해보았다. GPU 는 장착되어 있지 않고,
시스템 사양은 아래와같다 :

Intel(R) Xeon(R) CPU E5520  @ 2.27GHz 듀얼 쿼드코아 (16개 로지컬 CPU)
SAS 15K RPM 디스크
메모리 32 기가
64bit 플랫폼/리눅스

사용한 소프트웨어는 RainbowCrack 이다. 사전에 미리 테이블을 만드는 작업을
거쳐 최종 검증을 하게 되는데, 이 테이블을 만드는 사전 작업이 많은 시간이 소요된다.

1. 우선 앞서 예제에서 소개되었던 해쉬는 아래와 같다.

# more sha1_hashes.txt
EB45E66E03EE06E74AC824081C7A71352E51DF90
A94B95A7A4D432DE056B0030DA879AF841376069
3B615E3CD3ACA03AC818C7752A109EC7E2168532
8F2005004F8BAA7A1090A9BF3B03C48D38E78157
26BFB52D1809F04EAD2B7F5C002C1EAA7A584696
7110EDA4D09E062AA5E4A390B0A572AC0D2C0220
1902E3D6FC4E78A0BCC50BA12B882769AFBF4A8C
BFE06C47BE2390ACA934AB6A128C141DCEB4072F
CD3724AC40034097A3D27865D710E4F791B6AEDB
A9993E364706816ABA3E25717850C26C9CD0D89D
0D824508182A1AA0EEF9A0B6EE52F8A32AF06F0A
5BAA61E4C9B93F3F0682250B6CF8331B7EE68FD8
EF8420D70DD7676E04BEA55F405FA39B022A90C8
DA39A3EE5E6B4B0D3255BFEF95601890AFD80709

2. rtgen 을 이용해 레인보우 테이블을 생성한다.  이때 패스워드의 길이는 최소 1 에서
6 사이의 길이로 한 것이다.

# time ./rtgen sha1 ascii-32-95 1 6 1 3800 33554432 0
rainbow table sha1_ascii-32-95#1-6_1_3800x33554432_0.rt parameters
hash algorithm:         sha1
hash length:            20
charset:                 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
charset in hex:         20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e
charset length:         95
plaintext length range: 1 - 6
reduce offset:          0x00010000
plaintext total:        742912017120

sequential starting point begin from 0 (0x0000000000000000)
generating...
524288 of 33554432 rainbow chains generated (1 m 18.4 s)
1048576 of 33554432 rainbow chains generated (1 m 17.2 s)
1572864 of 33554432 rainbow chains generated (1 m 17.8 s)
2097152 of 33554432 rainbow chains generated (1 m 18.2 s)
2621440 of 33554432 rainbow chains generated (1 m 18.4 s)
3145728 of 33554432 rainbow chains generated (1 m 18.3 s)
3670016 of 33554432 rainbow chains generated (1 m 18.4 s)
4194304 of 33554432 rainbow chains generated (1 m 18.4 s)
4718592 of 33554432 rainbow chains generated (1 m 18.3 s)
5242880 of 33554432 rainbow chains generated (1 m 18.2 s)
5767168 of 33554432 rainbow chains generated (1 m 18.2 s)
(생략...)

real    83m51.179s

시간을 측정해 보았더니 83 분이 걸렸다. 적지 않은 시간이 걸렸는데, 이 작업이
진행되는 동안 CPU 는 100% 풀로 사용된 것이다. (16개의 Logical CPU)

 PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
29166 root      20   0  157m  13m 1012 S 1600  0.0  22:01.80 rtgen

3. 생성된 테이블을 rtsort 로 정렬을 한다.

# ./rtsort  sha1_ascii-32-95#1-6_5_3800x33554432_0.rt
sha1_ascii-32-95#1-6_5_3800x33554432_0.rt:
32361852928 bytes memory available
loading rainbow table...
sorting rainbow table by end point...
writing sorted rainbow table...

4. 만들어진 테이블을 이용해 패스워드 해쉬 파일을 크랙킹 해본다.

# ./rcrack sha1_ascii-32-95#1-6_0_3800x33554432_0.rt -l sha1_hashes.txt
33167699968 bytes memory available
1 x 536870912 bytes memory allocated for table buffer
851200 bytes memory allocated for chain traverse
disk: sha1_ascii-32-95#1-6_0_3800x33554432_0.rt: 536870912 bytes read
searching for 14 hashes...
plaintext of 7110eda4d09e062aa5e4a390b0a572ac0d2c0220 is 1234
plaintext of cd3724ac40034097a3d27865d710e4f791b6aedb is Bwah
plaintext of 8f2005004f8baa7a1090a9bf3b03c48d38e78157 is P4s$
plaintext of a9993e364706816aba3e25717850c26c9cd0d89d is abc
plaintext of 1902e3d6fc4e78a0bcc50ba12b882769afbf4a8c is bad
disk: finished reading all files

statistics
-------------------------------------------------------
plaintext found:                              5 of 14
total time:                                   7.49 s
  time of chain traverse:                     7.19 s
  time of alarm check:                        0.19 s
  time of wait:                               0.00 s
  time of other operation:                    0.11 s
time of disk read:                            0.64 s
hash & reduce calculation of chain traverse:  101026800
hash & reduce calculation of alarm check:     3773101
number of alarm:                              3140
speed of chain traverse:                      14.04 million/s
speed of alarm check:                         19.96 million/s

result
-------------------------------------------------------
eb45e66e03ee06e74ac824081c7a71352e51df90  <not found>  hex:<not found>
a94b95a7a4d432de056b0030da879af841376069  <not found>  hex:<not found>
3b615e3cd3aca03ac818c7752a109ec7e2168532  <not found>  hex:<not found>
8f2005004f8baa7a1090a9bf3b03c48d38e78157  P4s$  hex:50347324
26bfb52d1809f04ead2b7f5c002c1eaa7a584696  <not found>  hex:<not found>
7110eda4d09e062aa5e4a390b0a572ac0d2c0220  1234  hex:31323334
1902e3d6fc4e78a0bcc50ba12b882769afbf4a8c  bad  hex:626164
bfe06c47be2390aca934ab6a128c141dceb4072f  <not found>  hex:<not found>
cd3724ac40034097a3d27865d710e4f791b6aedb  Bwah  hex:42776168
a9993e364706816aba3e25717850c26c9cd0d89d  abc  hex:616263
0d824508182a1aa0eef9a0b6ee52f8a32af06f0a  <not found>  hex:<not found>
5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8  <not found>  hex:<not found>
ef8420d70dd7676e04bea55f405fa39b022a90c8  <not found>  hex:<not found>
da39a3ee5e6b4b0d3255bfef95601890afd80709  <not found>  hex:<not found>

위 결과와 같이 14개의 패스워드 중 5개를 발견하였다.  레인보우 테이블을 2개로
이용한 후에는 6개로 1개의 테이블을 이용했을 때보다 1개를 더 찾아내었다.
테이블을 더 만들어 해 보았더니 6개에서는 9개를 찾아냈다. (1개 테이블 생성에 80분이라고 하면,
6개 생성에만 8시간이 소요된 것이다)

# ./rcrack *.rt -l sha1_hashes.txt
32374755328 bytes memory available
6 x 536870912 bytes memory allocated for table buffer
851200 bytes memory allocated for chain traverse
disk: sha1_ascii-32-95#1-6_0_3800x33554432_0.rt: 536870912 bytes read
disk: sha1_ascii-32-95#1-6_1_3800x33554432_0.rt: 536870912 bytes read
disk: sha1_ascii-32-95#1-6_2_3800x33554432_0.rt: 536870912 bytes read
disk: sha1_ascii-32-95#1-6_3_3800x33554432_0.rt: 536870912 bytes read
disk: sha1_ascii-32-95#1-6_4_3800x33554432_0.rt: 536870912 bytes read
disk: sha1_ascii-32-95#1-6_5_3800x33554432_0.rt: 536870912 bytes read
searching for 14 hashes...
plaintext of 7110eda4d09e062aa5e4a390b0a572ac0d2c0220 is 1234
plaintext of cd3724ac40034097a3d27865d710e4f791b6aedb is Bwah
plaintext of 8f2005004f8baa7a1090a9bf3b03c48d38e78157 is P4s$
plaintext of a9993e364706816aba3e25717850c26c9cd0d89d is abc
plaintext of 1902e3d6fc4e78a0bcc50ba12b882769afbf4a8c is bad
disk: finished reading all files
searching for 9 hashes...
plaintext of eb45e66e03ee06e74ac824081c7a71352e51df90 is nVidia
searching for 8 hashes...
plaintext of 0d824508182a1aa0eef9a0b6ee52f8a32af06f0a is GoOd!
plaintext of bfe06c47be2390aca934ab6a128c141dceb4072f is G0o|)
searching for 6 hashes...
plaintext of 3b615e3cd3aca03ac818c7752a109ec7e2168532 is W3a$eL
searching for 5 hashes...
searching for 5 hashes...

statistics
-------------------------------------------------------
plaintext found:                              9 of 14
total time:                                   18.14 s
  time of chain traverse:                     17.06 s
  time of alarm check:                        0.76 s
  time of wait:                               0.00 s
  time of other operation:                    0.32 s
time of disk read:                            2.87 s
hash & reduce calculation of chain traverse:  339161400
hash & reduce calculation of alarm check:     17185485
number of alarm:                              13776
speed of chain traverse:                      19.88 million/s
speed of alarm check:                         22.52 million/s

테이블을 생성하기 까지는 많은 시간이 걸리나, 테이블을 이용해서 찾는 경우는
금방 찾아진다. 그렇다면, 위와 같은 경우를 접목해 보면
클라우드 기반의 시스템 파워를 이용해 테이블을 크게 생성해 놓는다면
추후에 패스워드를 찾는데 오랜 시간이 걸리지 않는것이다. 패스워드 길이가 왜
짧으면 위험한지에 대한 이유를 알 수 있을 것이다. 다음 글은 왜 12자리의 패스워드를 사용해야 하는 가에
대한 포스팅이다.


각 개별 컴퓨팅 파워는 높아지고, 클라우드 방식의 활용은 점차 확대되고 있다. 여기서 필자가 이것을
소개한 이유는 크랙킹을 소개하고자 하는 것은 아니다. 이런 자원이 좋은 쪽으로 이용되면
다양한 과학발전등 큰 도움이 되지만, 악의적 형태로 이용되면 말 하지 않아도 알 것이다.

현재의 수준이 이렇다는 것을 함께 공유하고 싶다. 왜 자꾸 '보안' 이라는 것에 대해서 관심을
가져야 하는 것인지를 말이다...

[참고]
1. 아마존 EC2 를 이용한 클라우트 크랙킹
2. RainbowCrack Project

댓글 4개:

  1. 드뎌 현실화 되는군요. ㅋㅋ 충분한 스토리지만 있다면 미리 테이블을 만들어놓고 간단히 서치하는 것만으로 크래킹하는

    답글삭제
  2. @모래알 - 2010/11/23 05:06
    컴퓨팅 파워가 너무 좋아지고 있죠. :-) 보다 근본적인 보안 대책이 필요해지는 이유이기도 하죠.

    답글삭제
  3. 우연히 들리게 되었는데..좋은 내용이 아주 많군요!

    고맙습니다..앞으로도 화이팅!

    답글삭제
  4. @nsm - 2010/12/01 14:32
    감사합니다. :-) 앞으로도 자주 방문해 주시고 좋은 의견 남겨주세요 ^^

    답글삭제