
PACK (비밀번호 분석 및 크래킹 키트)
PACK(Password Analysis and Cracking Toolkit)은 비밀번호 리스트 분석을 통해 마스크, 규칙, 문자 집합 및 기타 비밀번호 특성의 패턴 감지를 통해 비밀번호 크래킹을 향상시키기 위해 개발된 유틸리티 모음입니다. 이 툴킷은 Hashcat 계열 비밀번호 크래커에 대한 유효한 입력 파일을 생성합니다.
참고: 툴킷 자체는 비밀번호를 크랙할 수 없지만, 비밀번호 크래커의 작동을 더 효율적으로 만들기 위해 설계되었습니다.
툴킷을 사용하기 전에 비밀번호 리스트의 선택 기준을 설정해야 합니다. 사람들이 비밀번호를 만드는 방식을 분석하고자 하므로, 가능한 한 많은 유출된 비밀번호 샘플을 확보해야 합니다. 그러한 훌륭한 리스트 중 하나는 RockYou.com 침해 사건에 기반합니다. 이 리스트는 유사한 사이트(예: 소셜 네트워킹)에서 사용되는 일반적인 비밀번호에 대한 좋은 결과를 제공할 만큼 크고 다양한 컬렉션을 제공합니다. 이 리스트에서 얻은 분석은 특정 비밀번호 정책을 가진 조직에는 적용되지 않을 수 있습니다. 따라서 샘플 입력을 가능한 한 대상과 가깝게 선택해야 합니다. 또한, 이미 크랙된 비밀번호를 기반으로 한 리스트는 실제 사용자가 아닌 리스트를 크랙한 개인(들)이 사용한 규칙과 마스크의 통계적 편향을 생성하므로, 그러한 리스트는 피하도록 하세요.
수행할 수 있는 가장 기본적인 분석은 제공된 리스트에서 가장 일반적인 길이, 문자 집합 및 기타 비밀번호 특성을 얻는 것입니다. 아래 예에서는 약 1400만 개의 비밀번호를 포함하는 'rockyou.txt'를 사용합니다. 다음 명령줄로 statsgen.py를 실행합니다:
$ python statsgen.py rockyou.txt
위 명령의 출력은 다음과 같습니다:
_
StatsGen #.#.# | |
_ __ __ _ ___| | _
| '_ \ / _` |/ __| |/ /
| |_) | (_| | (__| <
| .__/ \__,_|\___|_|\_\
| |
|_| [email protected]
[*] Analyzing passwords in [rockyou.txt]
[+] Analyzing 100% (14344390/14344390) of passwords
NOTE: Statistics below is relative to the number of analyzed passwords, not total number of passwords
[*] Length:
[+] 8: 20% (2966037)
[+] 7: 17% (2506271)
[+] 9: 15% (2191039)
[+] 10: 14% (2013695)
[+] 6: 13% (1947798)
...
[*] Character-set:
[+] loweralphanum: 42% (6074867)
[+] loweralpha: 25% (3726129)
[+] numeric: 16% (2346744)
[+] loweralphaspecialnum: 02% (426353)
[+] upperalphanum: 02% (407431)
...
[*] Password complexity:
[+] digit: min(0) max(255)
[+] lower: min(0) max(255)
[+] upper: min(0) max(187)
[+] special: min(0) max(255)
[*] Simple Masks:
[+] stringdigit: 37% (5339556)
[+] string: 28% (4115314)
[+] digit: 16% (2346744)
[+] digitstring: 04% (663951)
[+] othermask: 04% (576324)
...
[*] Advanced Masks:
[+] ?l?l?l?l?l?l?l?l: 04% (687991)
[+] ?l?l?l?l?l?l: 04% (601152)
[+] ?l?l?l?l?l?l?l: 04% (585013)
[+] ?l?l?l?l?l?l?l?l?l: 03% (516830)
[+] ?d?d?d?d?d?d?d: 03% (487429)
...
참고: 발생 빈도가 1% 미만인 항목을 표시하지 않는 --hiderare 플래그를 포함하여 이상값의 수를 줄일 수 있습니다.
위 리스트에서 즉시 알 수 있는 내용은 다음과 같습니다:
마지막 섹션인 "Advanced Masks"에는 Hashcat 형식을 사용하여 가장 자주 발생하는 마스크가 포함되어 있습니다. 개별 기호는 다음과 같이 해석됩니다:
?l - 소문자 한 글자
?u - 대문자 한 글자
?d - 숫자 한 글자
?s - 특수 문자 한 글자
예를 들어, 첫 번째 마스크인 "?l?l?l?l?l?l?l?l"은 모든 소문자 알파 비밀번호와 일치합니다. 샘플 크기를 고려하면 약 4%의 비밀번호를 크랙할 수 있습니다. 그러나 초기 출력을 생성한 후 필터를 사용하여 비밀번호 데이터를 좁히는 데 관심이 있을 수 있습니다.
"stringdigit" 간단 마스크(문자열 뒤에 숫자)를 사용하여 RockYou 사용자가 비밀번호를 선택하는 경향을 살펴보겠습니다:
$ python statsgen.py ../PACK-0.0.3/archive/rockyou.txt --simplemask stringdigit -q --hiderare
[*] Analyzing passwords in [rockyou.txt]
[+] Analyzing 37% (5339556/14344390) of passwords
NOTE: Statistics below is relative to the number of analyzed passwords, not total number of passwords
[*] Length:
[+] 8: 23% (1267260)
[+] 7: 18% (981432)
[+] 9: 17% (939971)
[+] 10: 14% (750938)
[+] 6: 11% (618983)
[+] 11: 05% (294869)
[+] 12: 03% (175875)
[+] 13: 01% (103047)
[+] 14: 01% (65958)
[*] Character-set:
[+] loweralphanum: 88% (4720184)
[+] upperalphanum: 06% (325941)
[+] mixedalphanum: 05% (293431)
[*] Password complexity:
[+] digit: min(1) max(252)
[+] lower: min(0) max(46)
[+] upper: min(0) max(31)
[+] special: min(0) max(0)
[*] Simple Masks:
[+] stringdigit: 100% (5339556)
[*] Advanced Masks:
[+] ?l?l?l?l?l?l?d?d: 07% (420318)
[+] ?l?l?l?l?l?d?d: 05% (292306)
[+] ?l?l?l?l?l?l?l?d?d: 05% (273624)
[+] ?l?l?l?l?d?d?d?d: 04% (235360)
[+] ?l?l?l?l?d?d: 04% (215074)
...
출력 맨 위에는 분석된 전체 비밀번호의 백분율이 표시됩니다. 이 경우 "stringdigit" 마스크와 일치하는 비밀번호만 크랙하면 전체 세트의 약 37%만 복구할 수 있으며, 이는 원래 출력에 표시된 것과 동일합니다. 다음으로, 이 비밀번호 유형 중 소문자 이외의 문자를 사용하는 것은 11%에 불과합니다. 따라서 이 마스크와 일치하는 소문자 문자열에 집중하는 것이 현명합니다. 마지막으로 "Advanced Mask" 섹션에서 "stringdigit" 비밀번호의 대부분이 뒤에 두 자리 또는 네 자리 숫자가 있는 문자열로 구성되어 있음을 확인할 수 있습니다. 위 출력에서 얻은 정보를 바탕으로 대상 사용자의 비밀번호 생성 패턴에 대한 정신적 이미지를 만들기 시작할 수 있습니다.
비밀번호 길이, 마스크 및 문자 집합에 대한 몇 가지 다른 필터가 있습니다:
Length: --minlength 및/또는 --maxlength
Simple Mask: --simplemask [numeric, loweralpha, upperalpha, mixedalpha, loweralphanum 등]
Character sets: --charset [digit, string, stringdigit, digitstring, digitstringdigit 등]
참고: 동일한 클래스의 필터를 여러 개 쉼표로 구분된 목록으로 지정할 수 있습니다:
--simplemask="stringdigit,digitstring"
"Advanced Mask" 섹션은 전체 비밀번호의 1% 이상과 일치하는 패턴만 표시하지만, 주어진 딕셔너리와 일치하는 전체 비밀번호 마스크 목록을 얻고 저장하려면 다음 명령을 사용할 수 있습니다:
$ python statsgen.py rockyou.txt -o rockyou.masks
모든 비밀번호 마스크와 해당 빈도는 CSV 형식으로 지정된 파일에 저장됩니다. 당연히 지정된 매개변수와 일치하는 마스크 파일만 생성하도록 필터를 제공할 수 있습니다. 출력 파일은 다음 섹션에서 다룰 MaskGen 도구에 대한 입력으로 사용할 수 있습니다.
MaskGen은 Hashcat 계열 비밀번호 크래커에 대한 입력을 위해 패턴 기반 마스크 공격을 제작할 수 있게 해줍니다. 이 도구는 위에서 statsgen이 '-o' 플래그로 생성한 출력을 사용하여 마스크 복잡도, 마스크 발생 빈도 또는 이 둘의 비율(최적 지수)별로 정렬된 가장 최적의 마스크 공격을 생성합니다.
MaskGen을 StatGen의 출력만 인수로 실행해 보겠습니다:
$ python maskgen.py rockyou.masks
_
MaskGen #.#.# | |
_ __ __ _ ___| | _
| '_ \ / _` |/ __| |/ /
| |_) | (_| | (__| <
| .__/ \__,_|\___|_|\_\
| |
|_| [email protected]
[*] Analyzing masks in [rockyou.masks]
[*] Using 1,000,000,000 keys/sec for calculations.
[*] Sorting masks by their [optindex].
[*] Finished generating masks:
Masks generated: 146578
Masks coverage: 100% (14344390/14344390)
Masks runtime: >1 year
주목해야 할 몇 가지 정보가 있습니다:
공격을 수행하고 제작하는 데 시간이 일반적으로 제한되어 있기 때문에, maskgen은 공격을 수행할 수 있는 시간을 지정하고 정렬 모드에 따라 가장 최적의 마스크 컬렉션을 생성할 수 있습니다. 다양한 정렬 모드와 대상 시간을 실험해 보겠습니다:
$ python maskgen.py rockyou.masks --targettime 600 --optindex -q
[*] Analyzing masks in [rockyou.masks]
[*] Using 1,000,000,000 keys/sec for calculations.
[*] Sorting masks by their [optindex].
[!] Target time exceeded.
[*] Finished generating masks:
Masks generated: 779
Masks coverage: 56% (8116195/14344390)
Masks runtime: 0:11:36