John the Ripper 와 사용자 정의 문자 세트

Kali LinuxBeginner
지금 연습하기

소개

이 실습에서는 John the Ripper 의 고급 기능을 탐색하고, 특히 사용자 정의 문자 세트 활용 방법에 중점을 둘 것입니다. John the Ripper 는 강력한 오픈 소스 비밀번호 크래킹 도구입니다. 사전 정의된 문자 세트가 제공되지만, 자체적으로 정의하면 특정 비밀번호 정책이나 비표준 문자를 다룰 때 크래킹 효율성을 크게 향상시킬 수 있습니다. 다양한 시나리오에 맞게 이러한 사용자 정의 세트를 생성, 적용 및 최적화하는 방법을 배우고, 이것이 크래킹 프로세스에 미치는 영향에 대해 더 깊이 이해하게 될 것입니다.

증분 모드 (Incremental Mode) 를 위한 사용자 정의 문자 세트 정의

이 단계에서는 John the Ripper 의 증분 모드 (incremental mode) 를 위한 사용자 정의 문자 세트를 정의하는 방법을 배웁니다. 증분 모드는 특정 길이까지 가능한 모든 문자 조합을 시도하는 강력한 크래킹 방법입니다. 기본적으로 John 은 큰 문자 세트를 사용하는데, 비밀번호가 제한된 문자 세트 (예: 소문자 및 숫자만) 를 사용한다는 것을 알고 있다면 비효율적일 수 있습니다.

먼저, 사용자 정의 문자 세트를 사용하여 크래킹할 간단한 비밀번호 해시를 생성해 보겠습니다. 비밀번호 abc에 대한 해시를 생성하고 hash_to_crack.txt라는 파일에 저장하겠습니다.

echo "user1:\$6\$salt1\$y.g.a.hash.for.abc" > ~/project/hash_to_crack.txt

이제 소문자만 포함하는 사용자 정의 문자 세트를 정의해 보겠습니다. 이 정의는 ~/project 디렉토리 내의 custom.chr라는 파일에 저장할 것입니다. 이 파일은 John the Ripper 에게 크래킹 시 사용할 문자를 알려줍니다.

nano ~/project/custom.chr

custom.chr 파일에 다음 내용을 추가합니다.

[CharSet]
charset = abcdefghijklmnopqrstuvwxyz

Ctrl+X, Y, Enter를 눌러 파일을 저장합니다.

이제 이 사용자 정의 문자 세트를 사용하여 John the Ripper 를 증분 모드에서 실행하여 hash_to_crack.txt 파일을 크래킹해 보겠습니다. --incremental 옵션은 John 에게 증분 모드를 사용하도록 지시하고, --external=custom.chr는 사용자 정의 문자 세트를 지정합니다.

john --format=sha512crypt --incremental=custom --external=~/project/custom.chr ~/project/hash_to_crack.txt

John 이 해시를 크래킹하려고 시도하는 것을 볼 수 있습니다. 비밀번호를 찾으면 표시됩니다.

Using default input encoding: UTF-8
Loaded 1 password hash (sha512crypt, crypt(3) $6$ [SHA512 256/256 AVX2])
Will run till completion
Press 'q' or Ctrl-C to abort, almost any other key for status
abc              (user1)
1g 0:00:00:00 DONE (2023-10-27 10:00) 100.0g/s 100p/s 100c/s 100C/s abc
Use the "--show" option to display all of the cracked passwords reliably
Session completed

크래킹된 비밀번호를 표시하려면 --show 옵션을 사용합니다.

john --show ~/project/hash_to_crack.txt
user1:abc

1 password hash cracked, 0 left

이것은 사용자 정의 문자 세트를 사용하여 검색 공간을 좁혀 비밀번호 구성에 대한 일부 지식이 있을 때 크래킹 프로세스를 더 효율적으로 만들 수 있음을 보여줍니다.

특정 시나리오에 사용자 정의 문자 세트 적용

이 단계에서는 사용자 정의 문자 세트의 유연성을 보여주기 위해 더 구체적인 시나리오에 적용해 보겠습니다. 새로운 해시와 더 정제된 사용자 정의 문자 세트를 생성할 것입니다.

예를 들어, 숫자만으로 구성된 비밀번호 1234가 있다고 가정해 보겠습니다. 먼저 이 비밀번호에 대한 해시를 생성하겠습니다.

echo "user2:\$6\$salt2\$y.g.a.hash.for.1234" > ~/project/numeric_hash.txt

이제 숫자 (0-9) 만 포함하는 사용자 정의 문자 세트를 정의해 보겠습니다. 이 파일의 이름은 digits.chr로 하겠습니다.

nano ~/project/digits.chr

digits.chr 파일에 다음 내용을 추가합니다.

[CharSet]
charset = 0123456789

파일을 저장합니다 (Ctrl+X, Y, Enter).

다음으로, 이 새로운 문자 세트를 사용하여 John the Ripper 를 실행하여 numeric_hash.txt 파일을 크래킹하겠습니다.

john --format=sha512crypt --incremental=digits --external=~/project/digits.chr ~/project/numeric_hash.txt

John 이 비밀번호 1234를 빠르게 크래킹하는 것을 볼 수 있습니다.

Using default input encoding: UTF-8
Loaded 1 password hash (sha512crypt, crypt(3) $6$ [SHA512 256/256 AVX2])
Will run till completion
Press 'q' or Ctrl-C to abort, almost any other key for status
1234             (user2)
1g 0:00:00:00 DONE (2023-10-27 10:05) 100.0g/s 100p/s 100c/s 100C/s 1234
Use the "--show" option to display all of the cracked passwords reliably
Session completed

크래킹된 비밀번호를 확인하려면 다음을 실행합니다.

john --show ~/project/numeric_hash.txt
user2:1234

1 password hash cracked, 0 left

이 시나리오는 비밀번호의 문자 구성에 대한 정확한 정보가 있을 때 사용자 정의 문자 세트가 얼마나 효과적일 수 있는지 강조하며, 일반 문자 세트를 사용하는 것에 비해 크래킹 시간을 크게 단축시킵니다.

문자 세트 크기가 미치는 영향 이해하기

이 단계에서는 문자 세트 크기가 크래킹 프로세스에 미치는 영향을 관찰합니다. 문자 세트가 클수록 가능한 조합이 많아져 크래킹 시간이 길어집니다.

소문자와 숫자를 모두 사용하는 비밀번호 a1b2에 대한 새 해시를 생성해 보겠습니다.

echo "user3:\$6\$salt3\$y.g.a.hash.for.a1b2" > ~/project/alphanum_hash.txt

이제 소문자와 숫자를 모두 포함하는 사용자 정의 문자 세트를 정의해 보겠습니다. 이 파일의 이름은 alphanum.chr로 하겠습니다.

nano ~/project/alphanum.chr

alphanum.chr 파일에 다음 내용을 추가합니다.

[CharSet]
charset = abcdefghijklmnopqrstuvwxyz0123456789

파일을 저장합니다 (Ctrl+X, Y, Enter).

이제 이 결합된 문자 세트를 사용하여 John the Ripper 를 실행해 보겠습니다.

john --format=sha512crypt --incremental=alphanum --external=~/project/alphanum.chr ~/project/alphanum_hash.txt

이 더 큰 문자 세트로 a1b2를 크래킹하는 것이 각자의 더 작은 세트로 abc 또는 1234를 크래킹하는 것보다 비밀번호 길이가 비슷함에도 불구하고 약간 더 오래 걸릴 수 있음을 알 수 있습니다. 이는 검색 공간 (가능한 조합의 수) 이 훨씬 더 크기 때문입니다.

Using default input encoding: UTF-8
Loaded 1 password hash (sha512crypt, crypt(3) $6$ [SHA512 256/256 AVX2])
Will run till completion
Press 'q' or Ctrl-C to abort, almost any other key for status
a1b2             (user3)
1g 0:00:00:00 DONE (2023-10-27 10:10) 100.0g/s 100p/s 100c/s 100C/s a1b2
Use the "--show" option to display all of the cracked passwords reliably
Session completed

크래킹된 비밀번호를 확인하려면 다음을 실행합니다.

john --show ~/project/alphanum_hash.txt
user3:a1b2

1 password hash cracked, 0 left

이 단계는 문자 세트의 크기와 크래킹에 필요한 시간 사이의 직접적인 관계를 보여줍니다. 사용 가능한 정보를 기반으로 문자 세트를 가능한 한 작고 구체적으로 최적화하는 것은 효율적인 비밀번호 크래킹에 매우 중요합니다.

사용자 정의 문자 세트 정의 최적화하기

이 단계에서는 다양한 문자 유형을 결합하고 John 의 내장 문자 클래스를 사용하여 사용자 정의 문자 세트 정의를 더욱 최적화하는 방법을 배웁니다. John the Ripper 는 소문자의 경우 ?l, 대문자의 경우 ?u, 숫자의 경우 ?d, 기호의 경우 ?s와 같은 미리 정의된 클래스를 사용하여 문자 세트를 정의할 수 있도록 합니다.

Pass123!와 같은 비밀번호에 대한 해시를 생성해 보겠습니다.

echo "user4:\$6\$salt4\$y.g.a.hash.for.Pass123!" > ~/project/complex_hash.txt

모든 문자를 나열하는 대신 John 의 문자 클래스를 사용할 수 있습니다. 이러한 클래스를 결합하는 complex.chr라는 파일을 만들어 보겠습니다.

nano ~/project/complex.chr

complex.chr 파일에 다음 내용을 추가합니다.

[CharSet]
charset = ?l?u?d?s

파일을 저장합니다 (Ctrl+X, Y, Enter).

여기서 ?l은 소문자를, ?u는 대문자를, ?d는 숫자를, ?s는 기호를 나타냅니다. 이는 광범위한 문자 세트를 정의하는 더 간결한 방법입니다.

이제 이 최적화된 문자 세트를 사용하여 John the Ripper 를 실행해 보겠습니다.

john --format=sha512crypt --incremental=complex --external=~/project/complex.chr ~/project/complex_hash.txt

John 은 이제 소문자, 대문자, 숫자 및 기호의 모든 조합을 사용하여 비밀번호를 크래킹하려고 시도합니다.

Using default input encoding: UTF-8
Loaded 1 password hash (sha512crypt, crypt(3) $6$ [SHA512 256/256 AVX2])
Will run till completion
Press 'q' or Ctrl-C to abort, almost any other key for status
Pass123!         (user4)
1g 0:00:00:00 DONE (2023-10-27 10:15) 100.0g/s 100p/s 100c/s 100C/s Pass123!
Use the "--show" option to display all of the cracked passwords reliably
Session completed

크래킹된 비밀번호를 확인하려면 다음을 실행합니다.

john --show ~/project/complex_hash.txt
user4:Pass123!

1 password hash cracked, 0 left

이 방법은 모든 문자를 수동으로 나열하지 않고 일반적인 문자 세트를 정의하는 데 효율적입니다. 일반적인 비밀번호 구성에 대해 구체성과 정의 용이성 간의 좋은 균형을 제공합니다.

비영어권 비밀번호를 위한 문자 세트 생성하기

이 단계에서는 일반적으로 표준 영어 문자 세트에는 없는 특수 문자를 포함하는 비영어권 비밀번호를 위한 사용자 정의 문자 세트를 만드는 방법을 배웁니다. 이는 다양한 언어의 비밀번호를 크래킹하는 데 중요합니다.

예를 들어, 일반적인 독일어 움라우트 (umlaut) 를 포함하는 비밀번호 schön이 있다고 가정해 보겠습니다. 먼저 이 비밀번호에 대한 해시를 생성합니다.

echo "user5:\$6\$salt5\$y.g.a.hash.for.schön" > ~/project/german_hash.txt

이제 특정 비영어권 문자를 포함하는 사용자 정의 문자 세트를 정의해야 합니다. schön의 경우 ö가 필요합니다.

nano ~/project/german.chr

german.chr 파일에 다음 내용을 추가합니다. ö 문자를 포함해야 합니다.

[CharSet]
charset = abcdefghijklmnopqrstuvwxyzäöüß

파일을 저장합니다 (Ctrl+X, Y, Enter).

이제 이 사용자 정의 문자 세트를 사용하여 John the Ripper 를 실행해 보겠습니다. 문자가 표준 ASCII 가 아닌 경우 인코딩을 지정하는 것이 중요합니다. John 은 일반적으로 UTF-8 을 잘 처리하지만 명시적인 인코딩이 때때로 필요할 수 있습니다.

john --format=sha512crypt --incremental=german --external=~/project/german.chr --input-encoding=UTF-8 ~/project/german_hash.txt

John 은 이제 특수 독일어 문자를 포함하여 비밀번호를 크래킹하려고 시도합니다.

Using default input encoding: UTF-8
Loaded 1 password hash (sha512crypt, crypt(3) $6$ [SHA512 256/256 AVX2])
Will run till completion
Press 'q' or Ctrl-C to abort, almost any other key for status
schön            (user5)
1g 0:00:00:00 DONE (2023-10-27 10:20) 100.0g/s 100p/s 100c/s 100C/s schön
Use the "--show" option to display all of the cracked passwords reliably
Session completed

크래킹된 비밀번호를 확인하려면 다음을 실행합니다.

john --show ~/project/german_hash.txt
user5:schön

1 password hash cracked, 0 left

이 단계는 국제 비밀번호를 다룰 때 사용자 정의 문자 세트에 특정 비영어권 문자를 포함하는 것의 중요성을 보여줍니다. 이러한 문자가 없으면 John the Ripper 는 증분 모드에서 이러한 비밀번호를 크래킹할 수 없습니다.

요약

이 실습에서는 John the Ripper 를 사용하여 사용자 정의 문자 세트를 정의하고 활용하는 실질적인 경험을 쌓았습니다. 특정 문자 세트 파일 (.chr) 을 만드는 방법, 증분 크래킹 모드에서 이를 적용하는 방법, 문자 세트 크기가 크래킹 효율에 미치는 중요한 영향을 이해하는 방법을 배웠습니다. 또한 John 의 내장 문자 클래스를 사용하여 문자 세트 정의를 최적화하는 방법과 특수 문자를 포함하여 비영어권 비밀번호를 처리하는 방법을 살펴보았습니다. 사용자 정의 문자 세트를 숙달하는 것은 효율적이고 목표 지향적인 비밀번호 크래킹을 위한 중요한 기술로, 알려진 비밀번호 특성을 기반으로 검색 공간을 좁히고 프로세스를 가속화할 수 있습니다.