소개
이 랩에서는 John the Ripper (JtR) 의 강력한 규칙 기반 크래킹 기능을 탐색합니다. 간단한 사전 공격도 효과적이지만, 실제 비밀번호는 종종 대소문자 변경, 숫자 추가 또는 특수 문자 삽입과 같은 변형을 포함합니다. JtR 의 규칙 엔진을 사용하면 단어 목록의 단어에 복잡한 변환을 적용하도록 정의할 수 있으며, 이는 사전에서 직접 찾을 수 없는 비밀번호를 크랙할 가능성을 크게 높입니다. 이 랩에서는 JtR 규칙의 기본 구문을 배우고, 사용자 정의 규칙을 만들고, 단어 목록에 적용하여 그 효과를 확인합니다.
John the Ripper 규칙 구문 이해하기
이 단계에서는 John the Ripper (JtR) 규칙의 기본 구문을 배우게 됩니다. JtR 규칙은 일반적으로 john.conf와 같은 설정 파일에 정의되거나, 간단한 경우에는 명령줄을 통해 직접 전달될 수 있습니다. 각 규칙은 단어를 수정하는 단일 문자 명령의 시퀀스입니다.
일반적인 규칙 명령은 다음과 같습니다.
c: 첫 글자를 대문자로 변경합니다.C: 모든 글자를 대문자로 변경합니다.l: 첫 글자를 소문자로 변경합니다.L: 모든 글자를 소문자로 변경합니다.t: 첫 글자의 대소문자를 전환합니다.T: 모든 글자의 대소문자를 전환합니다.p<N>: 문자<N>를 앞에 붙입니다.a<N>: 문자<N>를 뒤에 붙입니다.s<old><new>:<old>의 첫 번째 발생을<new>로 치환합니다.S<old><new>:<old>의 모든 발생을<new>로 치환합니다.x<N>: 시작 부분에서 길이N의 부분 문자열을 추출합니다.z<N>: 끝 부분에서 길이N의 부분 문자열을 추출합니다.D: 첫 번째 문자를 삭제합니다.M: 마지막 문자를 삭제합니다.r: 단어를 뒤집습니다.
내장된 규칙의 몇 가지 예시를 보기 위해 기본 john.conf 파일을 살펴보는 것부터 시작하겠습니다.
nano를 사용하여 john.conf 파일을 엽니다.
nano /etc/john/john.conf
파일을 스크롤하여 [List.Rules:Wordlist] 섹션을 찾습니다. 거기에 정의된 다양한 규칙 세트를 볼 수 있습니다. 예를 들어, c (첫 글자 대문자화) 또는 a[0-9] (숫자 추가) 와 같은 규칙을 볼 수 있습니다.
nano를 종료하려면 Ctrl+X를 누릅니다.
이제 JtR 의 --stdout 옵션을 사용하여 명령줄에서 직접 간단한 규칙을 시도해 보겠습니다. 이 옵션은 단어 목록에 규칙을 적용하고 해시를 크랙하려고 시도하지 않고 결과를 표준 출력으로 인쇄합니다. 이는 규칙 테스트에 유용합니다.
wordlist.txt에 c (첫 글자 대문자화) 규칙을 적용하려면 다음 명령을 실행합니다.
john --wordlist=~/project/wordlist.txt --rules=single --stdout
wordlist.txt의 단어들이 첫 글자가 대문자로 변경되어 출력되는 것을 볼 수 있습니다. 예를 들어, "password"는 "Password"가 됩니다.
Password
Secret
Labex
Test
이는 간단한 규칙이 단어를 어떻게 변환할 수 있는지 보여줍니다. 다음 단계에서는 더 복잡한 규칙을 만들고 결합할 것입니다.
대문자화를 위한 간단한 규칙 생성
이 단계에서는 대문자화 규칙을 적용하기 위한 사용자 정의 규칙 파일을 생성합니다. JtR 의 single 규칙 세트에는 기본적인 대문자화가 포함되어 있지만, 자체 규칙 파일을 생성하면 더 많은 제어 권한을 얻고 더 구체적인 변환을 수행할 수 있습니다.
먼저 ~/project 디렉토리에 my_rules.rule이라는 새 파일을 생성합니다. 이 파일에는 사용자 정의 규칙이 포함됩니다.
nano ~/project/my_rules.rule
my_rules.rule 파일에 다음 줄을 추가합니다. 이 규칙들은 다음과 같은 작업을 수행합니다.
c: 첫 글자를 대문자로 변경합니다.C: 모든 글자를 대문자로 변경합니다.t: 첫 글자의 대소문자를 전환합니다 (예: "password" -> "Password", "Password" -> "password").
c
C
t
Ctrl+O를 누르고 Enter를 눌러 파일을 저장한 다음, Ctrl+X를 눌러 nano를 종료합니다.
이제 --rules 옵션을 사용하여 새 규칙 파일을 지정하여 사용자 정의 규칙을 wordlist.txt에 적용합니다.
john --wordlist=~/project/wordlist.txt --rules=file:~/project/my_rules.rule --stdout
출력을 관찰합니다. wordlist.txt의 각 단어가 정의한 각 규칙에 의해 변환되는 것을 볼 수 있습니다. 예를 들어, "password"는 "Password", "PASSWORD", 그리고 (원본 "password"에 t 규칙이 적용되어) "Password"로 나타날 것입니다.
Password
SECRET
LABEX
TEST
password
PASSWORD
secret
SECRET
labex
LABEX
test
TEST
Password
Secret
Labex
Test
이는 사용자 정의 규칙 파일을 정의하고 사용하는 방법을 보여줍니다. 파일의 각 규칙은 단어 목록의 모든 단어에 순차적으로 적용됩니다.
숫자 추가 규칙 적용
이 단계에서는 JtR 규칙을 사용하여 단어에 숫자를 추가하는 방법을 배우게 됩니다. 숫자 추가는 매우 일반적인 비밀번호 변형이며, JtR 은 이러한 변형을 효율적으로 생성하는 강력한 명령을 제공합니다.
a<N> 명령은 문자 <N>를 추가합니다. 숫자를 추가하려면 a[0-9]와 같은 문자 범위를 사용하여 0 부터 9 까지의 단일 숫자를 추가할 수 있습니다. 이를 다른 규칙과 결합할 수도 있습니다.
my_rules.rule에 숫자를 추가하는 규칙을 추가해 보겠습니다. 규칙 파일을 다시 엽니다.
nano ~/project/my_rules.rule
파일 끝에 다음 줄을 추가합니다. 이 규칙들은 다음과 같은 작업을 수행합니다.
a[0-9]: 단어에 단일 숫자 (0-9) 를 추가합니다.a[0-9][0-9]: 단어에 두 개의 숫자 (00-99) 를 추가합니다. 이 규칙은 각 단어에 대해 100 개의 변형을 생성합니다.
a[0-9]
a[0-9][0-9]
파일을 저장 (Ctrl+O, Enter) 하고 nano를 종료 (Ctrl+X) 합니다.
이제 업데이트된 규칙을 wordlist.txt에 적용합니다. a[0-9][0-9]는 많은 변형을 생성하므로, 시연을 위해 head를 사용하여 출력을 제한하겠습니다.
john --wordlist=~/project/wordlist.txt --rules=file:~/project/my_rules.rule --stdout | head -n 50
"password0", "password1", ..., "password00", "password01" 등과 같은 단어를 볼 수 있습니다. head -n 50 명령은 전체 출력이 매우 길기 때문에 출력을 처음 50 줄로 제한합니다.
Password
SECRET
LABEX
TEST
password
PASSWORD
secret
SECRET
labex
LABEX
test
TEST
Password
Secret
Labex
Test
password0
password1
password2
password3
password4
password5
password6
password7
password8
password9
secret0
secret1
secret2
secret3
secret4
secret5
secret6
secret7
secret8
secret9
labex0
labex1
labex2
labex3
labex4
labex5
labex6
labex7
labex8
labex9
test0
test1
test2
test3
test4
test5
이는 일반적인 비밀번호 패턴을 크랙하는 데 중요한 숫자 추가 변형을 효과적으로 생성하는 방법을 보여줍니다.
복합 변환을 위한 다중 규칙 결합
이 단계에서는 여러 규칙 명령을 결합하여 더 복잡한 비밀번호 변환을 만드는 방법을 배우게 됩니다. JtR 은 규칙 명령을 한 줄에 연결하여 각 단어에 순차적으로 적용할 수 있도록 합니다.
첫 글자를 대문자로 바꾸고 단일 숫자를 추가하는 규칙을 만들어 보겠습니다.
my_rules.rule 파일을 다시 엽니다.
nano ~/project/my_rules.rule
파일 끝에 다음 규칙을 추가합니다. 이 규칙 ca[0-9]는 다음을 의미합니다.
c: 첫 글자를 대문자로 변경합니다.a[0-9]: 단일 숫자 (0-9) 를 추가합니다.
ca[0-9]
파일을 저장 (Ctrl+O, Enter) 하고 nano를 종료 (Ctrl+X) 합니다.
이제 업데이트된 규칙을 wordlist.txt에 적용하고 출력을 관찰합니다. 마찬가지로 head를 사용하여 출력을 제한하겠습니다.
john --wordlist=~/project/wordlist.txt --rules=file:~/project/my_rules.rule --stdout | head -n 50
"Password0", "Password1", "Secret0", "Secret1" 등과 같은 변형을 볼 수 있습니다.
Password
SECRET
LABEX
TEST
password
PASSWORD
secret
SECRET
labex
LABEX
test
TEST
Password
Secret
Labex
Test
password0
password1
password2
password3
password4
password5
password6
password7
password8
password9
secret0
secret1
secret2
secret3
secret4
secret5
secret6
secret7
secret8
secret9
labex0
labex1
labex2
labex3
labex4
labex5
labex6
labexex7
labex8
labex9
test0
test1
test2
test3
test4
test5
Password0
Password1
Password2
Password3
Password4
Password5
Password6
Password7
Password8
Password9
이는 규칙 결합의 강력함을 보여줍니다. 명령을 연결하여 매우 구체적이고 효과적인 규칙 세트를 만들 수 있습니다. 예를 들어, s@a!ca[0-9]는 '@'를 '!'로 치환하고, 첫 글자를 대문자로 바꾼 다음, 숫자를 추가합니다.
단어 목록에 사용자 정의 규칙 테스트
이 마지막 단계에서는 사용자 정의 규칙을 사용하여 더미 해시를 크랙해 보겠습니다. 이는 실제 비밀번호 크랙 시나리오를 시뮬레이션합니다.
설정 단계에서 "password"라는 단어에 대한 해시가 생성되어 ~/project/hashes.txt에 저장되었음을 기억하십시오. 해당 해시는 user1:5f4dcc3b5aa765d61d8327deb882cf99 (MD5 해시의 "password") 입니다.
먼저, my_rules.rule 파일에 "password" 또는 해당 해시와 일치하는 변형을 생성하는 규칙이 포함되어 있는지 확인합니다. 이 예시에서는 원래 "password" 단어에 대한 해시라고 가정합니다. 만약 "Password0"에 대한 해시가 있었다면, ca[0-9] 규칙이 유용했을 것입니다.
이 시연을 위해 원본 wordlist.txt와 my_rules.rule을 사용하여 해시를 크랙해 보겠습니다.
해시 파일, 단어 목록 및 사용자 정의 규칙으로 John the Ripper 를 실행합니다.
john ~/project/hashes.txt --wordlist=~/project/wordlist.txt --rules=file:~/project/my_rules.rule
John the Ripper 는 단어 목록 처리를 시작하고, 규칙을 적용하며, 생성된 단어를 해시와 비교합니다. 일치하는 항목을 찾으면 크랙된 비밀번호를 표시합니다.
비밀번호가 크랙되었음을 나타내는 다음과 유사한 출력을 볼 수 있습니다.
Using default input encoding: UTF-8
Loaded 1 password hash (md5crypt, crypt(3) $1$ [MD5 SSSP])
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
password (user1)
1g 0:00:00:00 DONE (2023-10-27 10:30) 100% (ETA: 00:00:00)
Session completed.
크랙된 비밀번호를 다시 보려면 --show 옵션을 사용할 수 있습니다.
john --show ~/project/hashes.txt
이 명령은 JtR 이 성공적으로 크랙하여 pot 파일에 저장한 모든 비밀번호를 표시합니다.
user1:password
1 password hash cracked, 0 left
이 마지막 단계는 비밀번호 크랙에서 사용자 정의 규칙의 실제 적용을 보여줍니다. 지능적으로 규칙을 작성함으로써 다양한 비밀번호 패턴에 대한 사전 공격 (dictionary attacks) 의 효과를 크게 향상시킬 수 있습니다.
요약
이 실습에서는 John the Ripper 의 강력한 규칙 엔진을 활용하여 고급 비밀번호 크랙을 수행하는 방법을 성공적으로 배웠습니다. JtR 규칙의 기본 구문, 대문자 변환 및 대소문자 전환 명령을 이해하는 것부터 시작했습니다. 그런 다음 사용자 정의 규칙 파일을 만들고 일반적인 비밀번호 변형인 숫자 추가 규칙을 추가했습니다. 마지막으로 여러 규칙 명령을 결합하여 더 복잡한 변환을 만들고 사용자 정의 규칙을 적용하여 더미 해시를 크랙함으로써 실제 시나리오를 시뮬레이션했습니다. 이러한 실습 경험을 통해 정교한 규칙 세트를 정의하고 적용하는 지식을 갖추게 되었으며, 표준 단어 목록에 직접 포함되지 않은 비밀번호를 크랙하는 능력을 크게 향상시켰습니다.


