레이블이 cracking인 게시물을 표시합니다. 모든 게시물 표시
레이블이 cracking인 게시물을 표시합니다. 모든 게시물 표시

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 이었습니다.

2013년 3월 13일 수요일

15기가의 1,493,677,782 패스워드 단어 사전 공개

블로그에서 몇번 패스워드 해쉬 크랙킹 관련한 글을 포스팅 한적 있습니다.

2011년07월14일 분산 기반의 CPU/GPU 해쉬 크랙 프로젝트 'Durandal'
2010년09월15일 8자리 패스워드는 저리가~ 12자리 패스워드를 사용하자 
2010년11월23일 당신의 패스워드는 안전한가? 클라우드 기반 패스워드 크랙킹
2010년12월01일 자바스크립트기반의 분산 해쉬 크랙킹

이번에 좀 큼지막한 패스워드 사전이 공개가 되었습니다. 단어수가 무려 1,493,677,782 개 입니다. 이번 사전에는 모든 단어리스트와 유출된 패스워드 데이터, 위키 피디아의 데이터등 모두 모아 놓은 것이라고 합니다. hashcat 이나 John the Ripper 등에서 이용할 수 있습니다.

총 4.2 기가 데이터 이며, 압축을 해제하면 15 기가라고 합니다. 좋은 목적으로만 사용하세요~ :-)

다음 토렌트를 이용하여 다운로드 할 수 있다고 하네요.
http://1337x.org/torrent/493880/A-BIG-password-cracking-wordlist/

[참고]
1. 출처
http://toolsyard.thehackernews.com/2013/03/biggest-password-cracking-wordlist-with.html#_

2011년 7월 14일 목요일

분산 기반의 CPU/GPU 해쉬 크랙 프로젝트 'Durandal'

이전에 해쉬 값 크랙과 관련하여 몇번 소개한 적이 있다. 오늘은 분산 기반의 GPU 를 이용한
해쉬 크랙 프로젝트인 'Durandal' 을 알아볼까 한다. 여기서 언급하는 것은,  보안적인 관점에서 소개하는 것이지, 악의적 형태로 이용되기를 원하지는 않는다. 암호화된 패스워드도 얼마나 쉽게 깨질 수 있는지, 왜 패스워드 문자열을 길게 사용해야 하는지 그 이유를 알게될 것이다.

우선 이와 관련해 소개된 이전 블로그를 참고해 보기 바란다.

2010년09월15일 8자리 패스워드는 저리가~ 12자리 패스워드를 사용하자 
2010년11월23일 당신의 패스워드는 안전한가? 클라우드 기반 패스워드 크랙킹
2010년12월01일 자바스크립트기반의 분산 해쉬 크랙킹

일단, Durandal 은 아래 사이트를 방문하면 정보를 얻을 수 있다.
http://durandal-project.org/

윈도우, 리눅스를 지원하며 현재는 64비트만 코드가 공개되어 있다. 32비트도 곧 공개되어 질 것이라고 한다. MD5, SHA1, SHA256, SHA512, NTLMv1, MySQL 의 HASH 를 지원하며, Nvidia 의 CUDA 를 지원한다. 즉, GPU 이용이 가능하며 또 다른 주요 특징으로 분산처리가 지원된다는 점이다.

윈도우 사용자는 바이너리를 다운로드 받아 사용할 수 있으며, 리눅스 사용자라면 아래와 같은 방법으로 하면 된다. 필자가 좋아하는 데비안 사용자라 가정하면, 우선 컴파일에 필요한 패키지를 설치하고 소스를 받아 컴파일을 하면 된다.

$ apt-get install cmake make g++ libboost-serialization-dev libboost-thread-dev libboost-system-dev libboost-filesystem-dev

$ git clone http://durandal-project.org/durandal/

$ cd durandal

$ ./install_linux.sh

컴파일이 완료된 후 부터는 따로 어떤 메뉴얼이 없어서, 직접 실행해 보고야 알았다. 설치된 후 바이너리도 해당 디렉토리 밑에 있는 것이 아니라 한단계 상위 디렉토리인 bin 아래에 들어 있다.

# ls -l
total 48592
-rwxr-xr-x 1 root root 13972420 Jul 12 22:11 admin
-rwxr-xr-x 1 root root 18445133 Jul 12 22:13 agent
-rwxr-xr-x 1 root root    98929 Jul 12 22:13 cudump
-rwxr-xr-x 1 root root 17149247 Jul 12 22:14 durandal

durandal 은 메인 서버로 동작하는 프로그램이다. 실행하게 되면 포트번호 지정과 패스워드
그리고 관리용 포트, 관리용 패스워드를 정의한다.

# ./durandal
________                                  .___        .__
 \______ \  __ ______________     ____   __| _/_____   |  |
 |    |  \|  |  \_  __ \__  \   /    \ / __ | \__  \  |  |
 |    `   \  |  /|  | \// __ \_|   |  | /_/ |  / __ \_|  |__
 /_______  /____/ |__|  (____  /|___|  |____ | (____  /|____/
        \/                  \/      \/     \/      \/
Durandal Server 0.5

Distributing server port ? 1111
Password for distributing server ?
Administration server port ? 1112
Password for administration server ?

Daemonizing server...
서버포트는 1111, 그리고 관리용은 1112 로 지정하였다.  프로세스를 확인해 보면 동작하고
있음을 알 수 있다.

# ps -ef | grep durandal
root     29331     1  0 22:26 ?        00:00:00 ./durandal
root     29335 19079  0 22:26 pts/7    00:00:00 grep durandal
# netstat -na | grep 1111
tcp        0      0 0.0.0.0:1111            0.0.0.0:*               LISTEN

다음으로는 agent 를 동작시켰다. 앞서 정의한 Durandal 서버 접속 주소와 패스워드를 입력한다.
사용될 CPU 는 자동으로 검출되어 8개를 입력하였고, GPU 도 자동으로 잘 인식되었다.
그러면, 몇 가지 Hash 기능등을 테스트 하면서 얼마나 빠른 속도로 가능한지 수치를 보여준다. Bruteforce 로 md5 를 할 경우 초당 138.576 Mhash 가 나왔다. GPU 의 힘인가 보다.

# ./agent

________                                  .___        .__
 \______ \  __ ______________     ____   __| _/_____   |  |
 |    |  \|  |  \_  __ \__  \   /    \ / __ | \__  \  |  |
 |    `   \  |  /|  | \// __ \_|   |  | /_/ |  / __ \_|  |__
 /_______  /____/ |__|  (____  /|___|  |____ | (____  /|____/
        \/                  \/      \/     \/      \/
Durandal Agent 0.5

Durandal server (host:port)? localhost:1111
Password?
Proxy (host:port, empty if no)?
8 CPU(s) detected. How many CPU(s) to use? [default: 8]
1 CUDA-device(s) detected (GeForce GTS 450).
How many device(s) to use? [default: 1]

Intel(R) Core(TM) i7 CPU         870  @ 2.93GHz: 8 hardware threads
CUDA support loaded: 1 CUDA-device(s) (GeForce GTS 450)
Remote Durandal server: localhost:1111
Proxy: no

Evaluating graphic card, your screen may freeze (it can take several
minutes)... done.

Benchmarking hash functions for bruteforce attack... done.

Benchmarking hash functions for dictionary attack... done.

Benchmarking hash functions for markov attack... done.

Benchmarks for bruteforce attack :
md5: 138.576 Mhash/s
sha1: 47.7707 Mhash/s
sha256: 9.47407 Mhash/s
ntlmv1: 91.8744 Mhash/s
mysql: 10.161 Mhash/s
mysqlpre4.1: 195.07 Mhash/s

Benchmarks for dictionary attack :
md5: 19.25 Mhash/s
sha1: 13.8209 Mhash/s
sha256: 7.54898 Mhash/s
ntlmv1: 31.337 Mhash/s
mysql: 8.91741 Mhash/s
mysqlpre4.1: 41.478 Mhash/s

Benchmarks for markov attack :
md5: 39.5677 Mhash/s
sha1: 16.8386 Mhash/s
sha256: 8.2687 Mhash/s
ntlmv1: 43.7967 Mhash/s
mysql: 10.689 Mhash/s
mysqlpre4.1: 55.4634 Mhash/s

Segmentation fault

그런데 나의 경우는 Segmentation 이 발생하였다. 간단히 살펴보았더니, 앞서 서버 접속주소를
localhost 로 사용하였는데, 127.0.0.1 로 다시 지정하니 문제 없었다. 약간의 버그등은 있다.

다시 제대로 실행되면 아래와 같은 문구가 계속 나온다. 즉, 에이전트로서 명령을 기다리고 있다는 것이다.

No running jobs
No running jobs
No running jobs
No running jobs
No running jobs
No running jobs
No running jobs

그럼, 이제 admin 을 접속해 보자. 접속하면 사용 가능한 명령어들이 나오는데, 테스트로
다음의 MD5 를 넣어보았다.

21232f297a57a5a743894a0e4a801fc3

사전방식이 아니라 bruteforce 방식으로 지정했다.
$ ./admin
Usage: ./admin server [-p port] [-k password]
$ ./admin 127.0.0.1 -p 1112 -k 1111
Commands:
add <computation_mode = bf,dico> <hash_type> <hash> [charset]
[time_task] [max_len_pass]
add <computation_mode = markov> <hash_type> <hash> <-time or -level>
<value> <max_len_pass> [time_task]
del <job_id>
show running jobs
show complete jobs
show stats
estimate mkvtime <markov_level> <max_len_pass>
estimate mkvlevel <computation_time> <max_len_pass>
> add bf md5 21232f297a57a5a743894a0e4a801fc3
> show stats
-------------
Global benchmark: 0 MHash/s
> show stats
banana - 127.0.0.1: 138 MHash/s, Intel(R) Core(TM) i7 CPU         870
@ 2.93GHz (8 core(s)), GeForce GTS 450 (1 device(s))
-------------
Global benchmark: 138 MHash/s
Add 를 하게 되면 아래와 같이 agent 콘솔에서 Job 을 받았다는 메시지가 나타난다.

No running jobs
No running jobs
No running jobs
No running jobs
Job#0 Task#0 : Z to miWjFj on 21232f297a57a5a743894a0e4a801fc3 (md5)
No running jobs
No running jobs

금방 작업이 끝난 것 같은데, show complete jobs 로 확인해 보면 HASH 해독 결과가 나타난다.
패스워드는 "admin" 이라고 말이다. 2분도 안되는 시간에 금방 해독이 되었다.

> show stats
> show complete jobs
Job 0 : bruteforce attack on md5 hash 21232f297a57a5a743894a0e4a801fc3
with charset abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,
task time 120 sec, max length pass 15, result : "admin"
>

다음으로는 조금 더 긴 문자열인 'packetinside' 를 사용하였다. 그런데, 계속 해독작업이 진행되며 Job 이793 번까지 실행되는 과정까지도 해독되지 않았다. 패스워드가 길어짐에 따라, 해독하는 시간도 상당히 증가한 것이다. (2틀이 지난 시점까지도 해독되지 않았다)

No running jobs
Job#2 Task#0 : Z to miWjFj on 48bd28f405a9e3713ac0605a48b2bd0b (md5)
Job#2 Task#1 : miWjFj to zpRsjsZ on 48bd28f405a9e3713ac0605a48b2bd0b (md5)
Job#2 Task#2 : zpRsjsZ to MwMBNAY on 48bd28f405a9e3713ac0605a48b2bd0b (md5)
.
.
.
Job#2 Task#787 : MMxQHTtO to ZTsZlctO on 48bd28f405a9e3713ac0605a48b2bd0b (md5)
Job#2 Task#788 : ZTsZlctO to mboiQksO on 48bd28f405a9e3713ac0605a48b2bd0b (md5)
Job#2 Task#789 : mboiQksO to zijrutrO on 48bd28f405a9e3713ac0605a48b2bd0b (md5)
Job#2 Task#790 : zijrutrO to MpeAYBqO on 48bd28f405a9e3713ac0605a48b2bd0b (md5)
Job#2 Task#791 : MpeAYBqO to ZwZICKpO on 48bd28f405a9e3713ac0605a48b2bd0b (md5)
Job#2 Task#792 : ZwZICKpO to mEURgToO on 48bd28f405a9e3713ac0605a48b2bd0b (md5)
Job#2 Task#793 : mEURgToO to zLPaLboO on 48bd28f405a9e3713ac0605a48b2bd0b (md5)

왜, 패스워드를 단순하게 사용하면 안되는지를 보여주는 것이다. 물론, 컴퓨팅 파워를 상당히 높이면 초당 처리할 수 있는 HASH 는 훨씬 높아질 것이다. 더군다나, 분산기술을 이용하고 GPU 를 사용하니 좋은 성능의 컴퓨터 시스템만 구성하여 배치한다면 해독 시간은 짧아질 것이다.

자, 그렇다면 이제 여러분이 해야 할 일은, "패스워드를 길게 사용합시다" :-)

/Rigel

2010년 12월 1일 수요일

자바스크립트기반의 분산 해쉬 크랙킹

일전에 클라우드 기반의 크랙킹에 대해서 소개한 적이 있는데,
또 다른 재미있는 것이 있어서 공유하고자 한다. 이름은 Ravan 이라고,
자바스크립트 기반의 분산 컴퓨팅 방식이다. 사이트는 http://www.andlabs.org/tools/ravan.html 이다.

분산되어 있는 여러 브라우저를 통해 Brute Force 공격을 수행한다는 것이다. 이것은 HTML5 의 WebWorkers 를 이용해 브라우저내에 백그라운드의 자바스크립트 스레드를 생성하여 해쉬를 크랙킹하기 위한
작업을 수행한다. 현재 지원되는 해쉬 알고리즘은 아래와 같다:

MD5
SHA1
SHA256
SHA512

작업을 수행하게 되면 사용하고 있는 컴퓨터의 CPU 가 크게 증가하는 것을
볼 수 있을 것이다. 재미있는 것이 이 WebWorkers 인것 같은데, 세부적인 것은
다음 URL 을 참고해 보기 바란다. 왠지 모르게 재밌고 다양한 것을 많이
해 볼 수 있지 않을까 한다. 만약 악의적으로 이용된다면...

http://www.whatwg.org/specs/web-workers/current-work/


[관련글]

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