마스크 공격에서 사용자 정의 문자 집합 사용하기

Kali LinuxBeginner
지금 연습하기

소개

이 랩에서는 Hashcat 의 고급 기능인 마스크 공격에서의 사용자 정의 문자 집합 (custom charsets) 을 탐구합니다. Hashcat 의 내장 문자 집합 (?l, ?u, ?d, ?s) 은 강력하지만, 비밀번호에 사용된 문자에 대한 특정 정보가 있다면 비효율적일 수 있습니다. 예를 들어, 비밀번호가 'a', 'b', 'c', '1', '2', '3' 문자로만 구성되어 있다는 것을 안다면, 표준 ?l?d 문자 집합을 사용하는 것은 불필요한 많은 문자를 테스트하게 됩니다.

사용자 정의 문자 집합을 사용하면 정확한 문자 집합을 정의하여 검색 공간을 극적으로 줄이고 크래킹 프로세스를 가속화할 수 있습니다. 사용자 정의 문자 집합을 정의하는 방법, 이를 사용하는 마스크를 생성하는 방법, 그리고 고유한 패턴을 따르는 비밀번호 해시를 크래킹하기 위한 타겟 공격을 실행하는 방법을 배우게 됩니다.

내장 문자 집합의 한계 이해하기

이 단계에서는 Hashcat 의 내장 문자 집합과 왜 항상 가장 효율적인 도구가 아닌지에 대해 배웁니다.

Hashcat 은 마스크 공격에서 다양한 유형의 문자를 나타내기 위해 문자 집합 (charsets) 이라고 하는 플레이스홀더를 사용합니다.

  • ?l = abcdefghijklmnopqrstuvwxyz
  • ?u = ABCDEFGHIJKLMNOPQRSTUVWXYZ
  • ?d = 0123456789
  • ?s = !"#$%&'()*+,-./:;<=>?@[]^_`{|}~
  • ?a = 위의 모든 문자를 결합한 것

이들은 일반적인 경우에 유용하지만, 비밀번호가 매우 구체적이고 제한된 문자 집합으로 구성되어 있다는 것을 안다면 이러한 광범위한 문자 집합을 사용하는 것은 비효율적입니다.

먼저, 크래킹해야 할 대상 해시를 검사해 보겠습니다. 설정 스크립트가 현재 디렉토리 (~/project) 에 hash.txt라는 파일을 이미 생성했습니다.

내용을 확인합니다.

cat hash.txt

다음과 같은 MD5 해시가 표시되어야 합니다.

2a5c3a657a73613391a8e58f1a43161e

이 해시는 l, a, b, e, x, 1, 2, 3 문자로만 구성된 8 자리 비밀번호에 해당합니다. 만약 내장 ?l?d 문자 집합을 사용했다면, Hashcat 은 다음 단계에서 이 문제를 해결하기 위해 사용자 정의 문자 집합을 생성할 것이므로, 8 개의 알려진 문자 대신 모든 26 개의 소문자와 10 개의 숫자를 시도하는 데 시간을 낭비하게 될 것입니다.

--custom-charset1 으로 사용자 정의 문자 집합 정의하기

이 단계에서는 비밀번호에 포함된 것으로 알려진 문자와 정확히 일치하는 사용자 정의 문자 집합을 정의합니다.

Hashcat 은 --custom-charset1, --custom-charset2, --custom-charset3, --custom-charset4 명령줄 옵션을 사용하여 최대 네 개의 사용자 정의 문자 집합을 정의할 수 있도록 합니다.

우리의 시나리오에서는 비밀번호가 labex123 세트의 문자만 포함하는 것으로 알려져 있습니다. 이를 첫 번째 사용자 정의 문자 집합으로 정의할 수 있습니다.

이것이 어떻게 작동하는지 보기 위해 명령을 구성해 보겠습니다. 실제 공격을 수행하는 대신 생성된 비밀번호 후보를 화면에 출력하기 위해 --stdout 옵션을 사용할 것입니다. 또한 head를 사용하여 처음 몇 개의 결과만 볼 것입니다.

사용자 정의 문자 집합을 사용하여 3 자리 비밀번호를 생성하려면 다음 명령을 실행합니다.

hashcat --stdout -a 3 --custom-charset1 labex123 ?1?1?1 | head -n 5

이 명령을 분석해 보겠습니다.

  • --stdout: 생성된 후보를 콘솔에 출력합니다.
  • -a 3: 마스크 공격을 지정합니다.
  • --custom-charset1 labex123: ?1을 사용자 정의 문자 집합으로 정의합니다.
  • ?1?1?1: 마스크로, 각 문자가 ?1에 정의된 세트에서 오는 3 자리 후보를 생성하도록 Hashcat 에 지시합니다.

다음과 같은 출력이 표시되며, 지정된 문자만 사용되고 있음을 보여줍니다.

lll
lla
llb
lle
llx

이제 타겟 공격을 위한 사용자 정의 문자 집합을 정의하는 방법을 이해했습니다.

사용자 정의 문자 집합 ?1 을 활용하는 마스크 생성하기

이 단계에서는 이전 단계에서 정의한 사용자 정의 문자 집합을 사용하는 마스크를 구성합니다.

사용자 정의 문자 집합은 사용된 --custom-charset<N> 옵션에 해당하는 플레이스홀더 ?1, ?2, ?3, ?4를 사용하여 마스크에서 참조됩니다. --custom-charset1을 사용했으므로 마스크에서 ?1을 사용할 것입니다.

대상 비밀번호는 8 자리이며 모든 문자가 사용자 정의 세트에 속한다는 것을 알고 있습니다. 따라서 올바른 마스크는 ?1을 여덟 번 반복한 것입니다.

명확성과 재사용성을 위해 마스크를 파일에 저장하는 것이 좋습니다. mask.txt라는 파일을 만들고 마스크를 안에 넣겠습니다.

파일을 만들려면 다음 명령을 실행합니다.

echo "?1?1?1?1?1?1?1?1" > mask.txt

이제 파일 내용을 확인하여 올바른지 확인합니다.

cat mask.txt

출력은 입력한 내용과 정확히 일치해야 합니다.

?1?1?1?1?1?1?1?1

마스크 파일이 준비되었으므로 이제 공격을 시작할 준비가 되었습니다.

사용자 정의 문자 집합으로 마스크 공격 실행하기

이제 모든 것을 결합하여 사용자 정의 문자 집합과 마스크 파일을 사용하여 마스크 공격을 실행합니다.

hash.txt에 해시가 있고, 사용자 정의 문자 집합이 정의되었으며, mask.txt에 마스크가 있습니다. 최종 Hashcat 명령을 조립해 보겠습니다.

터미널에서 다음 명령을 실행하여 공격을 시작합니다.

hashcat -m 0 -a 3 hash.txt --custom-charset1 labex123 mask.txt

전체 명령에 대한 분석은 다음과 같습니다.

  • -m 0: 해시 유형이 MD5 임을 지정합니다.
  • -a 3: 마스크 공격 모드를 선택합니다.
  • hash.txt: 대상 해시가 포함된 입력 파일입니다.
  • --custom-charset1 labex123: 사용자 정의 문자 집합 ?1을 정의합니다.
  • mask.txt: 마스크 ?1?1?1?1?1?1?1?1이 포함된 파일입니다.

Hashcat 이 공격을 시작합니다. 사용자 정의 문자 집합이 매우 구체적이므로 키 공간이 작고 공격이 매우 빠르게 완료될 것입니다. 진행 상황을 나타내는 출력과 최종적으로 Cracked 상태가 표시됩니다.

...
Session..........: hashcat
Status...........: Cracked
Hash.Name........: MD5
Hash.Target......: 2a5c3a657a73613391a8e58f1a43161e
Time.Started.....: ...
Time.Estimated...: 0 secs (0.00ms)
Guess.Mask.......: ?1?1?1?1?1?1?1?1 [8]
Guess.Charset....: Custom Charset 1: 'labex123', len=8
Speed.#1.........:  ... H/s (0.00ms) @ Accel:1 Loops:1 Thr:1 Vec:1
Recovered........: 1/1 (100.00%) Digests, 1/1 (100.00%) Salts
Progress.........: 16777216/16777216 (100.00%)
Rejected.........: 0/16777216 (0.00%)
Restore.Point....: 1/1 (100.00%)
Restore.Sub.#1...: Salt:0 Amplifier:0-1 Iteration:0-1
Candidates.#1....: labex123 -> labex123
Hardware.Mon.#1..: Util:  0%

Started: ...
Stopped: ...

공격이 완료되었으며 성공했습니다. 다음 단계에서는 크랙된 비밀번호를 확인할 것입니다.

크랙된 비밀번호가 사용자 정의 패턴과 일치하는지 확인하기

이 마지막 단계에서는 크랙된 비밀번호를 보고 예상 패턴과 일치하는지 확인합니다.

Hashcat 은 성공적으로 크랙된 비밀번호를 "potfile"(해시와 비밀번호를 "pots"하기 때문) 이라는 파일에 자동으로 저장합니다. 이렇게 하면 향후 동일한 해시를 다시 크랙하는 것을 방지할 수 있습니다. 주어진 해시 파일에 대한 크랙된 비밀번호를 보는 가장 쉬운 방법은 --show 옵션을 사용하는 것입니다.

hash.txt의 해시에 대한 크랙된 비밀번호를 표시하려면 다음 명령을 실행합니다.

hashcat -m 0 --show hash.txt

이 명령은 Hashcat 에게 potfile 에서 hash.txt의 해시를 조회하고 해당 평문 비밀번호를 표시하도록 지시합니다.

출력은 명확하고 간단합니다.

2a5c3a657a73613391a8e58f1a43161e:labex123

보시다시피 크랙된 비밀번호는 labex123입니다. 이 비밀번호는 8 자리이며 정의한 사용자 정의 문자 집합 labex123의 문자만 포함하고 있다는 점에 유의하십시오. 이는 대상 마스크 공격이 성공적이고 매우 효율적이었음을 확인시켜 줍니다.

요약

이 실습에서는 Hashcat 을 사용하여 강력하고 효율적인 비밀번호 크랙 기법을 배웠습니다.

특정 알려진 문자 집합을 가진 비밀번호에 대한 Hashcat 의 내장 문자 집합의 한계를 이해하는 것부터 시작했습니다. 그런 다음 --custom-charset1 옵션을 사용하여 자체 문자 집합을 정의하고 ?1을 사용하여 마스크에서 참조하는 방법을 배웠습니다. 마스크 파일을 생성하고 대상 공격을 시작함으로써 몇 초 만에 MD5 해시를 크랙할 수 있었습니다.

사용자 정의 문자 집합을 사용하는 이 방법은 비밀번호 구조에 대한 정보가 있을 때 효율적인 비밀번호 감사 및 복구에 필수적이며, 공격에 필요한 시간과 컴퓨팅 리소스를 크게 줄여줍니다.