2013년 6월 21일 금요일

두 개의 GPU를 이용한 패스워드 해쉬 해독 리얼 사용기

오랜만에 쓰는 포스팅인것 같습니다. 이런저런 일로 글 쓸 시간이 많이 없다 보니 힘드네요 :-)

GPU 를 가지고 패스워드 해쉬를 찾아내는데 얼마나 속도가 나오는지 테스트를 해보았습니다. NVIDIA 사의 GTX 660 Ti 를 가지고 진행했고요, 그 녀석 실물은 다음과 같습니다.


포스팅한 글 중에서 15기가 단어사전을 소개한적이 있습니다. 해당 단어 사전을 이용하는 경우에는 어떨까 우선 테스트를 해 보았습니다. 압축되어 있는 파일은 4.5 기가 입니다.

$ ls -l
total 4469864
-rw-r--r-- 1 xxx xxx 4500756826 Apr 23 18:35 crackstation.txt.gz

해당 파일의 압축을 풀어 보니 15 기가나 되고, 라인수만 12억 라인이 나오네요.

$ gzip -d crackstation.txt.gz
$ ls -l
total 15402816
-rw-r--r-- 1 xxx xxx 15696118781 Apr 23 18:35 crackstation.txt

$ wc -l crackstation.txt
1212356398 crackstation.txt

자 그럼 사전파일을 이용해 성능은 어떤지 테스트 해보겠습니다. packetinside 의 MD5 HASH 값을 사용했는데, 30초 만에 패스워드를 찾아냈습니다. 사전파일에 packetinside 가 들어 있었다니 감사하네요 :-)

해쉬값을 찾는데 사용한 프로그램은 해쉬캣 입니다. 아래 사이트에서 다운로드 받으실 수 있습니다.

[Hashcat] http://hashcat.net/

$ time ./hashcat-cli64.bin -m 0 t ../crackstation.txt

Input.Mode: Dict (../crackstation.txt)
Index.....: 303/468 (segment), 2843682 (words), 33550339 (bytes)
Recovered.: 0/1 hashes, 0/1 salts
Speed/sec.: - plains, - words
Progress..: 2843682/2843682 (100.00%)
Running...: --:--:--:--
Estimated.: --:--:--:--

48bd28f405a9e3713ac0605a48b2bd0b:packetinside
All hashes have been recovered

real 0m30.466s
user 1m26.821s
sys 0m2.372s

즉, 많은 사용자들의 경우가 단순한 조합의 단어 같은 경우를 사용한다면 사전파일에 의해서 쉽게 해독될수도 있다는 의미입니다. 무작정 Brute Force 를 수행하는 경우보다 더 빨리 맞출 확률이 높아집니다. 만약 packetinside 문자열을 사전 없이 추측해서 찾는 경우는 얼마나 걸릴까요? 얼마나 오래 걸리는지는 잠시후에 확인해 드리겠습니다.

일단 이번에는 같은 사전파일을 쓰는데 대신 GPU 를 사용하는 cudaHashcat 을 이용해서 해 보았습니다.

$ time ./cudaHashcat-plus64.bin -m 0 -n 160 -u 1024 ../hashcat-0.44/t ../crackstation.txt
cudaHashcat-plus v0.14 by atom starting...

Hashes: 1 total, 1 unique salts, 1 unique digests
Bitmaps: 8 bits, 256 entries, 0x000000ff mask, 1024 bytes
Rules: 1
Workload: 1024 loops, 160 accel
Watchdog: Temperature abort trigger set to 90c
Watchdog: Temperature retain trigger set to 80c
Device #1: GeForce GTX 660 Ti, 2047MB, 1045Mhz, 7MCU
Device #1: Kernel ./kernels/4318/m0000_a0.sm_30.64.ptx

Cache-hit dictionary stats ../crackstation.txt: 15696118781 bytes, 1035765763 words, 1035765763 keyspace

[s]tatus [p]ause [r]esume [b]ypass [q]uit => s
Session.Name...: cudaHashcat-plus
Status.........: Running
Input.Mode.....: File (../crackstation.txt)
Hash.Target....: 48bd28f405a9e3713ac0605a48b2bd0b
Hash.Type......: MD5
Time.Started...: 0 secs
Time.Estimated.: Fri May  3 09:15:43 2013 (1 min, 49 secs)
Speed.GPU.#1...: 72826.3k/s
Recovered......: 0/1 (0.00%) Digests, 0/1 (0.00%) Salts
Progress.......: 7741441/1035765763 (0.75%)
Rejected.......: 1/7741441 (0.00%)
HWMon.GPU.#1...: -1% Util, 37c Temp, 10% Fan

[s]tatus [p]ause [r]esume [b]ypass [q]uit => s
Session.Name...: cudaHashcat-plus
Status.........: Running
Input.Mode.....: File (../crackstation.txt)
Hash.Target....: 48bd28f405a9e3713ac0605a48b2bd0b
Hash.Type......: MD5
Time.Started...: Fri May  3 09:13:53 2013 (3 secs)
Time.Estimated.: Fri May  3 09:15:43 2013 (1 min, 46 secs)
Speed.GPU.#1...: 72912.7k/s
Recovered......: 0/1 (0.00%) Digests, 0/1 (0.00%) Salts
Progress.......: 35840001/1035765763 (3.46%)
Rejected.......: 1/35840001 (0.00%)
HWMon.GPU.#1...: -1% Util, 37c Temp, 10% Fan

48bd28f405a9e3713ac0605a48b2bd0b:packetinside
                                           
Session.Name...: cudaHashcat-plus
Status.........: Cracked
Input.Mode.....: File (../crackstation.txt)
Hash.Target....: 48bd28f405a9e3713ac0605a48b2bd0b
Hash.Type......: MD5
Time.Started...: Fri May  3 09:13:53 2013 (1 min, 25 secs)
Speed.GPU.#1...: 71962.8k/s
Recovered......: 1/1 (100.00%) Digests, 1/1 (100.00%) Salts
Progress.......: 796221441/1035765763 (76.87%)
Rejected.......: 1/796221441 (0.00%)
HWMon.GPU.#1...: -1% Util, 39c Temp, 10% Fan

Started: Fri May  3 09:13:53 2013
Stopped: Fri May  3 09:15:18 2013

real 1m25.139s
user 1m23.773s
sys 0m1.396s

처음에 사전파일 캐쉬를 만들어서 그런지 오히려 속도가 더 늦어진 1분 25초가 나왔습니다.

GPU 를 이용했는데 속도가 더 느리다고요? 그래서 실망하셨나요. 그렇지 않습니다. GPU 의 힘을 한번 보여드릴께요. 6 자리의 패스워드로 가정하고 GPU 로 bruteforce 해 보도록 하겠습니다.

$ time ./cudaHashcat-plus64.bin -m0 -a 3 --force t ?a?a?a?a?a?a
cudaHashcat-plus v0.14 by atom starting...

Hashes: 1 total, 1 unique salts, 1 unique digests
Bitmaps: 8 bits, 256 entries, 0x000000ff mask, 1024 bytes
Workload: 256 loops, 80 accel
Watchdog: Temperature abort trigger set to 90c
Watchdog: Temperature retain trigger set to 80c
Device #1: GeForce GTX 660 Ti, 2047MB, 1045Mhz, 7MCU
Device #1: Kernel ./kernels/4318/m0000_a3.sm_30.64.ptx

[s]tatus [p]ause [r]esume [b]ypass [q]uit => s
Session.Name...: cudaHashcat-plus
Status.........: Running
Input.Mode.....: Mask (?a?a?a?a?a?a)
Hash.Target....: 9c509e44db33400b9ffef2157ada8b5a
Hash.Type......: MD5
Time.Started...: Fri May  3 10:18:40 2013 (6 secs)
Time.Estimated.: Fri May  3 10:26:50 2013 (8 mins, 3 secs)
Speed.GPU.#1...:  1544.1M/s
Recovered......: 0/1 (0.00%) Digests, 0/1 (0.00%) Salts
Progress.......: 10331955200/735091890625 (1.41%)
Rejected.......: 0/10331955200 (0.00%)
HWMon.GPU.#1...: -1% Util, 56c Temp, 13% Fan

9c509e44db33400b9ffef2157ada8b5a:packet    
                                           
Session.Name...: cudaHashcat-plus
Status.........: Cracked
Input.Mode.....: Mask (?a?a?a?a?a?a)
Hash.Target....: 9c509e44db33400b9ffef2157ada8b5a
Hash.Type......: MD5
Time.Started...: Fri May  3 10:18:40 2013 (19 secs)
Speed.GPU.#1...:  1543.3M/s
Recovered......: 1/1 (100.00%) Digests, 1/1 (100.00%) Salts
Progress.......: 28537528320/735091890625 (3.88%)
Rejected.......: 0/28537528320 (0.00%)
HWMon.GPU.#1...: -1% Util, 52c Temp, 16% Fan

Started: Fri May  3 10:18:40 2013
Stopped: Fri May  3 10:19:00 2013

real 0m19.095s
user 0m0.192s
sys 0m0.124s

속도를 보셨나요? 초당 1544M/s 의 속도로 대입해 봅니다. 6자리가 단지 19초 만에 해독되었습니다. 이번에는 그럼 GPU 가 아닌 형태로 해보죠. cudaHashcat 에서 hashcat 을 이용하는 것으로만 바꾸고 똑같이 6자리라는 힌트를 줍니다.

$ time ./hashcat-cli64.bin -m 0 -a 3 t ?a?a?a?a?a?a
Initializing hashcat v0.44 by atom with 8 threads and 32mb segment-size...

Added hashes from file t: 1 (1 salts)
Activating quick-digest mode for single-hash

NOTE: press enter for status-screen

Input.Mode: Mask (?a)
Index.....: 0/1 (segment), 95 (words), 0 (bytes)
Recovered.: 0/1 hashes, 0/1 salts
Speed/sec.: - plains, - words
Progress..: 95/95 (100.00%)
Running...: --:--:--:--
Estimated.: --:--:--:--

Input.Mode: Mask (?a?a)
Index.....: 0/1 (segment), 9025 (words), 0 (bytes)
Recovered.: 0/1 hashes, 0/1 salts
Speed/sec.: - plains, - words
Progress..: 9025/9025 (100.00%)
Running...: --:--:--:--
Estimated.: --:--:--:--

Input.Mode: Mask (?a?a?a)
Index.....: 0/1 (segment), 857375 (words), 0 (bytes)
Recovered.: 0/1 hashes, 0/1 salts
Speed/sec.: - plains, - words
Progress..: 857375/857375 (100.00%)
Running...: --:--:--:--
Estimated.: --:--:--:--

Input.Mode: Mask (?a?a?a?a)
Index.....: 0/1 (segment), 81450625 (words), 0 (bytes)
Recovered.: 0/1 hashes, 0/1 salts
Speed/sec.: 92.80M plains, 92.80M words
Progress..: 81450625/81450625 (100.00%)
Running...: 00:00:00:01
Estimated.: --:--:--:--

Input.Mode: Mask (?a?a?a?a?a)
Index.....: 0/1 (segment), 7737809375 (words), 0 (bytes)
Recovered.: 0/1 hashes, 0/1 salts
Speed/sec.: 95.85M plains, 95.85M words
Progress..: 7737809375/7737809375 (100.00%)
Running...: 00:00:01:21
Estimated.: --:--:--:--

9c509e44db33400b9ffef2157ada8b5a:packet
All hashes have been recovered

real 18m40.477s
user 148m1.191s
sys 0m4.644s

18 분만에 결과가 나왔습니다. 초당 95M/s 속도밖에 안 나왔고 GPU 를 이용한 것과는 너무나 큰 차이를 확인할 수 있습니다.

GPU 의 성능을 더 확인해 볼까요? 6자리 테스트에서 2자리를 늘려 8자리로 해 보겠습니다. 패스워드는 packetin 이고 MD5 는 8ebf50fe1d60d34fba86bf48cbec7f3b 와 같습니다.
                                           
Session.Name...: cudaHashcat-plus
Status.........: Cracked
Input.Mode.....: Mask (?a?a?a?a?a?a?a?a)
Hash.Target....: 8ebf50fe1d60d34fba86bf48cbec7f3b
Hash.Type......: MD5
Time.Started...: Fri May  3 14:29:57 2013 (16 mins, 7 secs)
Speed.GPU.#1...:  1545.7M/s
Recovered......: 1/1 (100.00%) Digests, 1/1 (100.00%) Salts
Progress.......: 1493089239040/6634204312890625 (0.02%)
Rejected.......: 0/1493089239040 (0.00%)
HWMon.GPU.#1...: -1% Util, 61c Temp, 39% Fan

Started: Fri May  3 14:29:57 2013
Stopped: Fri May  3 14:46:05 2013

real 16m7.484s
user 0m2.108s
sys 0m1.040s

6자리 19초에 비해 8 자리는 시간이 크게 늘어난 16분 7초가 소요되었습니다. 더 궁금해 지기 시작합니다. 다시 한번 2자리를 늘려서 10자리로 해 보겠습니다.

Session.Name...: cudaHashcat-plus
Status.........: Running
Input.Mode.....: Mask (?a?a?a?a?a?a?a?a?a?a)
Hash.Target....: ffc67bb0648c6f880f100719b3442e63
Hash.Type......: MD5
Time.Started...: Mon May  6 18:27:36 2013 (4 days, 0 hours)
Time.Estimated.: > 10 Years
Speed.GPU.#1...:  1248.2M/s
Recovered......: 0/1 (0.00%) Digests, 0/1 (0.00%) Salts
Progress.......: 433747785318400/4533461702709235777 (0.01%)
Rejected.......: 0/433747785318400 (0.00%)
HWMon.GPU.#1...: -1% Util, 67c Temp, 36% Fan

Session.Name...: cudaHashcat-plus
Status.........: Running
Input.Mode.....: Mask (?a?a?a?a?a?a?a?a?a?a)
Hash.Target....: ffc67bb0648c6f880f100719b3442e63
Hash.Type......: MD5
Time.Started...: Mon May  6 18:27:36 2013 (6 days, 13 hours)
Time.Estimated.: > 10 Years
Speed.GPU.#1...:  1249.5M/s
Recovered......: 0/1 (0.00%) Digests, 0/1 (0.00%) Salts
Progress.......: 710475091558400/4533461702709235777 (0.02%)
Rejected.......: 0/710475091558400 (0.00%)
HWMon.GPU.#1...: -1% Util, 67c Temp, 36% Fan


Started: Mon May  6 18:27:36 2013
Stopped: Mon May 13 07:50:25 2013

real 9442m48.279s
user 24m9.631s
sys 13m39.319s

아, 이럴수가 6일이 넘었는데도 해독될 기미가 보이지 않아서 중도에 포기를 했습니다. 예상 기간은 10년 이상으로 나오네요. 제가 몇번 패스워드 관련해서 포스팅한적이 있는데, 왜 패스워드를 길게 사용해야 하는 이유가 여기서 나오지요 ? :-)

HASH 해독 속도를 더 높일 수는 없을까요? 더 많은 GPU 를 이용하면 되겠지요. 일전에 소개해 드린 분산환경을 이용할수도 있고 여기서는 GPU 1개를 더 추가하여 2개를 가지고 한번 테스트해 보았습니다. 아래 그림과 같이 2개의 그래픽 카드를 황금색으로 보이는 케이블로 연결했습니다. Nvidia 에서는 SLI 기술이라고 합니다.


2개의 GPU 를 이용해 8 자리 패스워드 해독을 해 보겠습니다.

$ time ./cudaHashcat-plus64.bin -m0 -a 3 --force tt ?a?a?a?a?a?a?a?a
cudaHashcat-plus v0.14 by atom starting...

Hashes: 1 total, 1 unique salts, 1 unique digests
Bitmaps: 8 bits, 256 entries, 0x000000ff mask, 1024 bytes
Workload: 256 loops, 80 accel
Watchdog: Temperature abort trigger set to 90c
Watchdog: Temperature retain trigger set to 80c
Device #1: GeForce GTX 660 Ti, 2047MB, 1045Mhz, 7MCU
Device #2: GeForce GTX 660 Ti, 2047MB, 1045Mhz, 7MCU
Device #1: Kernel ./kernels/4318/m0000_a3.sm_30.64.ptx
Device #2: Kernel ./kernels/4318/m0000_a3.sm_30.64.ptx

[s]tatus [p]ause [r]esume [b]ypass [q]uit => s
Session.Name...: cudaHashcat-plus
Status.........: Running
Input.Mode.....: Mask (?a?a?a?a?a?a?a?a)
Hash.Target....: 8ebf50fe1d60d34fba86bf48cbec7f3b
Hash.Type......: MD5
Time.Started...: Mon May 13 10:31:41 2013 (3 secs)
Time.Estimated.: Wed Jun 12 21:23:23 2013 (30 days, 10 hours)
Speed.GPU.#1...:  1529.8M/s
Speed.GPU.#2...:  1547.9M/s
Speed.GPU.#*...:  3077.7M/s
Recovered......: 0/1 (0.00%) Digests, 0/1 (0.00%) Salts
Progress.......: 9615441920/6634204312890625 (0.00%)
Rejected.......: 0/9615441920 (0.00%)
HWMon.GPU.#1...: -1% Util, 72c Temp, 48% Fan
HWMon.GPU.#2...: -1% Util, 71c Temp, 46% Fan

[s]tatus [p]ause [r]esume [b]ypass [q]uit => s
Session.Name...: cudaHashcat-plus
Status.........: Running
Input.Mode.....: Mask (?a?a?a?a?a?a?a?a)
Hash.Target....: 8ebf50fe1d60d34fba86bf48cbec7f3b
Hash.Type......: MD5
Time.Started...: Mon May 13 10:31:41 2013 (18 secs)
Time.Estimated.: Sat Jun  8 09:35:02 2013 (25 days, 23 hours)
Speed.GPU.#1...:  1530.1M/s
Speed.GPU.#2...:  1547.8M/s
Speed.GPU.#*...:  3077.9M/s
Recovered......: 0/1 (0.00%) Digests, 0/1 (0.00%) Salts
Progress.......: 55123640320/6634204312890625 (0.00%)
Rejected.......: 0/55123640320 (0.00%)
HWMon.GPU.#1...: -1% Util, 72c Temp, 48% Fan
HWMon.GPU.#2...: -1% Util, 72c Temp, 47% Fan

8ebf50fe1d60d34fba86bf48cbec7f3b:packetin  
                                           
Session.Name...: cudaHashcat-plus
Status.........: Cracked
Input.Mode.....: Mask (?a?a?a?a?a?a?a?a)
Hash.Target....: 8ebf50fe1d60d34fba86bf48cbec7f3b
Hash.Type......: MD5
Time.Started...: Mon May 13 10:31:41 2013 (8 mins, 9 secs)
Speed.GPU.#1...:  1530.3M/s
Speed.GPU.#2...:  1546.9M/s
Speed.GPU.#*...:  3077.3M/s
Recovered......: 1/1 (100.00%) Digests, 1/1 (100.00%) Salts
Progress.......: 1503071682560/6634204312890625 (0.02%)
Rejected.......: 0/1503071682560 (0.00%)
HWMon.GPU.#1...: -1% Util, 70c Temp, 51% Fan
HWMon.GPU.#2...: -1% Util, 70c Temp, 50% Fan

Started: Mon May 13 10:31:41 2013
Stopped: Mon May 13 10:39:51 2013

real 8m9.412s
user 0m3.232s
sys 0m1.952s

실행될 때 GPU 가 추가로 하나 더 잡혀서 나오는 것을 볼 수 있고요, 각 GPU 속도가 대략 15XXM/s 이고 합쳐서 3077M/s 를 처리가 가능합니다. 1개 이용했을때 보다는 분명히 속도가 2배 가까이 향상되었고 결과도 그렇게 나왔습니다. 1개의 GPU 를 이용했을 경우는 16분이 걸렸는데, 2개의 GPU 를 이용했더니 그 반인 8분으로 줄었습니다.
분명 2개를 사용하니 효과는 확실히 입증되었습니다.

속도도 2배 빨라졌으니 자릿수를 한자리만 늘려서 9 자리로 테스트 해 보겠습니다.

Session.Name...: cudaHashcat-plus
Status.........: Aborted
Input.Mode.....: Mask (?a?a?a?a?a?a?a?a?a)
Hash.Target....: 8ebf50fe1d60d34fba86bf48cbec7f3b
Hash.Type......: MD5
Time.Started...: Mon May 27 08:15:06 2013 (2 hours, 10 mins)
Time.Estimated.: Sun May 30 14:40:52 2021 (8 years, 3 days)
Speed.GPU.#1...:  1239.5M/s
Speed.GPU.#2...:  1254.7M/s
Speed.GPU.#*...:  2494.2M/s
Recovered......: 0/1 (0.00%) Digests, 0/1 (0.00%) Salts
Progress.......: 19528334622720/630249409724609375 (0.00%)
Rejected.......: 0/19528334622720 (0.00%)
HWMon.GPU.#1...: -1% Util, 67c Temp, 51% Fan
HWMon.GPU.#2...: -1% Util, 70c Temp, 50% Fan

Started: Mon May 27 08:15:06 2013
Stopped: Mon May 27 10:25:37 2013

real 130m31.495s
user 0m40.211s
sys 0m23.233s

2시간 정도 돌려 보고 포기를 했습니다. 예상 시간이 8년으로 나오네요. 8자리와 9자리의 차이가 이렇게 큽니다.  :-)

간단한 GPU 해쉬 사용기는 여기서 마무리 하고요, 패스워드 해쉬가 더 궁금하신 분들은 다음 글들을 참고하세요.

2013년04월10일 25개의 GPU 를 이용해 6시간안에 윈도우 패스워드를 깨트린다고 ?
2013년03월13일 15기가의 1,493,677,782 패스워드 단어 사전 공개
2011년07월14일 분산 기반의 CPU/GPU 해쉬 크랙 프로젝트 'Durandal'
2010년09월15일 8자리 패스워드는 저리가~ 12자리 패스워드를 사용하자 
2010년11월23일 당신의 패스워드는 안전한가? 클라우드 기반 패스워드 크랙킹
2010년12월01일 자바스크립트기반의 분산 해쉬 크랙킹

이상 Rigel 이었습니다.

댓글 없음:

댓글 쓰기