John the Ripper 고급 규칙 생성

Kali LinuxBeginner
지금 연습하기

소개

이 실습에서는 John the Ripper 의 규칙 엔진 (rule engine) 의 고급 기능을 탐구합니다. John the Ripper 는 강력한 비밀번호 크래킹 도구이며, 그 규칙 엔진은 매우 맞춤화되고 효율적인 공격을 가능하게 합니다. 효과적인 규칙을 만드는 방법을 이해하는 것은 잠재력을 극대화하는 데 매우 중요합니다. 규칙 체이닝 (rule chaining), Leet Speak 와 같은 일반적인 변환을 위한 규칙 생성, 일반적인 비밀번호 패턴을 위한 규칙 개발, 복잡한 규칙 세트 테스트, 규칙 성능 최적화에 대해 배우게 됩니다. 이 실습이 끝나면 더 정교한 비밀번호 크래킹 시나리오를 위해 John the Ripper 의 규칙 엔진을 활용하는 방법에 대한 탄탄한 이해를 갖게 될 것입니다.

규칙 체이닝 이해하기

이 단계에서는 John the Ripper 의 규칙 체이닝 (rule chaining) 에 대해 배웁니다. 규칙 체이닝을 사용하면 여러 규칙을 결합하여 더 복잡한 변환을 만들 수 있습니다. 이는 단어 목록 항목에 일련의 수정을 적용해야 할 때 특히 유용합니다.

먼저 John the Ripper 가 설치되어 있는지 확인합니다. 설치되어 있지 않다면 apt를 사용하여 설치할 수 있습니다.

sudo apt update
sudo apt install -y john

다음으로 ~/project 디렉토리에 wordlist.txt라는 간단한 단어 목록 파일을 생성합니다.

echo "password" > ~/project/wordlist.txt
echo "secret" >> ~/project/wordlist.txt

이제 ~/projectchain_rules.rule이라는 규칙 파일을 생성하여 기본 규칙 체이닝을 시연합니다. 이 규칙은 먼저 단어에 "123"을 추가한 다음 첫 글자를 대문자로 바꿉니다.

nano ~/project/chain_rules.rule

chain_rules.rule 파일에 다음 내용을 추가합니다.

: A123 c
  • : (콜론) 은 규칙의 시작을 나타냅니다.
  • A123은 단어 끝에 "123"을 추가합니다.
  • c는 단어의 첫 글자를 대문자로 바꿉니다.

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

이제 이 규칙 파일을 사용하여 John the Ripper 를 실행합니다. 비밀번호를 실제로 크래킹하지 않고 변환된 단어를 보기 위해 --stdout 옵션을 사용합니다.

john --wordlist=~/project/wordlist.txt --rules=~/project/chain_rules.rule --stdout

다음과 유사한 출력이 표시됩니다.

Password123
Secret123

이는 규칙이 체이닝되는 방식을 보여줍니다. 먼저 A123이 적용되고, 그 결과에 c가 적용됩니다.

Leet Speak 변환 규칙 생성

이 단계에서는 Leet Speak 변환을 수행하는 규칙을 생성합니다. Leet Speak("1337 Speak"라고도 함) 는 문자를 비슷하게 생긴 숫자나 기호로 바꾸는 일반적인 관행입니다 (예: 'a'는 '4'로, 'e'는 '3'으로, 's'는 '5'로). 이는 비밀번호에서 자주 사용되는 기법입니다.

~/project 디렉토리에 leet_rules.rule이라는 새 규칙 파일을 생성합니다. 이 파일에는 일반적인 문자를 Leet Speak 등가물로 변환하는 규칙이 포함됩니다.

nano ~/project/leet_rules.rule

leet_rules.rule 파일에 다음 내용을 추가합니다.

: s/a/4 s/e/3 s/i/1 s/o/0 s/s/5
  • s/old/new는 치환 규칙입니다. old의 첫 번째 발생을 new로 바꿉니다.
  • 여러 치환 규칙을 체이닝하여 여러 Leet Speak 변환을 적용합니다.

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

이제 wordlist.txt로 이러한 규칙을 테스트해 보겠습니다.

john --wordlist=~/project/wordlist.txt --rules=~/project/leet_rules.rule --stdout

다음과 유사한 출력이 표시됩니다.

p4ssw0rd
s3cr3t

이는 이러한 치환을 사용하는 사용자에 대한 비밀번호 크래킹 노력의 효과를 크게 향상시킬 수 있는 일반적인 Leet Speak 변형을 처리하는 규칙을 만드는 방법을 보여줍니다.

일반적인 비밀번호 패턴 규칙 개발

이 단계에서는 연도나 일반 숫자를 추가하거나 첫 글자를 대문자로 바꾸는 것과 같은 일반적인 비밀번호 패턴을 대상으로 하는 규칙을 개발합니다. 이러한 패턴은 사용자가 엔트로피 (entropy) 를 실제로 증가시키지 않고 비밀번호를 "더 강력하게" 만들기 위해 자주 사용합니다.

~/project 디렉토리에 pattern_rules.rule이라는 새 규칙 파일을 생성합니다. 이 파일에는 몇 가지 일반적인 변환이 결합됩니다.

nano ~/project/pattern_rules.rule

pattern_rules.rule 파일에 다음 내용을 추가합니다.

: c A2023
: c A!
: c A@
  • c는 첫 글자를 대문자로 바꿉니다.
  • A2023은 연도 "2023"을 추가합니다.
  • A!는 느낌표를 추가합니다.
  • A@는 앳 기호 (@) 를 추가합니다.

각 줄은 별도의 규칙을 나타냅니다. John the Ripper 는 단어 목록의 각 단어에 각 규칙을 독립적으로 적용합니다.

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

이제 wordlist.txt로 이러한 규칙을 테스트해 보겠습니다.

john --wordlist=~/project/wordlist.txt --rules=~/project/pattern_rules.rule --stdout

다음과 유사한 출력이 표시됩니다.

Password2023
Secret2023
Password!
Secret!
Password@
Secret@

이는 일반적인 비밀번호 패턴을 다루는 규칙 세트를 만드는 방법을 보여주며, 단순한 사전 단어를 넘어 공격 표면을 크게 확장합니다.

복합 규칙 세트 테스트

이 단계에서는 지금까지 배운 개념을 결합하여 더 복잡한 규칙 세트를 테스트합니다. 여기에는 Leet Speak 변환과 일반적인 패턴 추가를 모두 포함하는 규칙 파일을 생성하여 여러 규칙 유형을 함께 사용하는 방법을 보여줍니다.

~/project 디렉토리에 complex_rules.rule이라는 포괄적인 규칙 파일을 생성합니다. 이 파일에는 Leet Speak 치환이 포함된 다음 일반 숫자 또는 기호가 추가됩니다.

nano ~/project/complex_rules.rule

complex_rules.rule 파일에 다음 내용을 추가합니다.

: s/a/4 s/e/3 s/i/1 s/o/0 s/s/5 A123
: s/a/4 s/e/3 s/i/1 s/o/0 s/s/5 A!
  • 첫 번째 규칙은 Leet Speak 를 적용한 다음 "123"을 추가합니다.
  • 두 번째 규칙은 Leet Speak 를 적용한 다음 "!"를 추가합니다.

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

이제 wordlist.txt로 이러한 복합 규칙을 테스트해 보겠습니다.

john --wordlist=~/project/wordlist.txt --rules=~/project/complex_rules.rule --stdout

다음과 유사한 출력이 표시됩니다.

p4ssw0rd123
s3cr3t123
p4ssw0rd!
s3cr3t!

이는 다양한 잠재적 비밀번호 후보를 생성하기 위해 다른 규칙 유형을 결합하는 강력함을 보여주며, 이는 효과적인 비밀번호 크래킹에 필수적입니다.

규칙 성능 최적화

이 단계에서는 규칙 성능 최적화에 대해 배웁니다. 복잡한 규칙은 강력하지만 계산 집약적일 수도 있습니다. John the Ripper 는 주로 작업 순서를 이해하고 중복 규칙을 피함으로써 규칙 적용을 최적화하는 메커니즘을 제공합니다.

최적화하는 한 가지 방법은 규칙을 가능한 한 구체적으로 만들고 불필요한 후보 생성을 피하는 것입니다. 예를 들어, 비밀번호가 항상 대문자로 시작한다는 것을 안다면 모든 글자를 대문자로 바꾸는 규칙을 적용하는 것은 비효율적입니다.

이전 단계의 complex_rules.rule을 고려해 보세요. 각 규칙은 추가하기 전에 모든 Leet Speak 치환을 적용합니다. 이러한 규칙이 많다면, 치환을 한 번 적용하고 분기하는 것보다 반복적으로 치환하는 것이 덜 효율적일 수 있습니다. 그러나 간단한 경우에는 단일 규칙 내에서 체이닝하는 것이 종종 충분히 효율적입니다.

매우 큰 규칙 세트 또는 특정 시나리오의 경우 John the Ripper 는 더 고급 규칙 구문 및 외부 규칙 파일을 허용합니다. 이 실습에서는 최적화에 대한 개념적 이해에 중점을 둘 것입니다.

일반적인 최적화 기법은 하나의 거대한 포괄적인 규칙 세트 대신 별도의 더 작은 규칙 세트로 단어 목록을 필터링하거나 특정 패턴을 대상으로 하는 것입니다.

l (길이) 규칙을 사용하여 단어 길이가 특정 길이보다 짧은 경우에만 적용되는 규칙을 만들어 간단한 최적화 개념을 시연해 보겠습니다. 이렇게 하면 이미 너무 길어서 일반적인 비밀번호가 될 수 없는 단어에 복잡한 규칙을 적용하는 것을 방지할 수 있습니다.

~/project 디렉토리에 optimized_rules.rule이라는 새 규칙 파일을 생성합니다.

nano ~/project/optimized_rules.rule

optimized_rules.rule 파일에 다음 내용을 추가합니다.

: l<10 s/e/3 A!
  • l<10은 "단어 길이가 10 자 미만인 경우에만 이 규칙을 적용합니다"를 의미합니다.
  • s/e/3은 'e'를 '3'으로 치환합니다.
  • A!는 느낌표를 추가합니다.

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

이제 wordlist.txt로 이 규칙을 테스트해 보겠습니다.

john --wordlist=~/project/wordlist.txt --rules=~/project/optimized_rules.rule --stdout

다음과 유사한 출력이 표시됩니다.

s3cr3t!
p4ssw0rd!

"password"(8 자) 와 "secret"(6 자) 모두 10 자 미만이므로 규칙이 적용됩니다. "superlongpassword"(17 자) 와 같은 단어가 있다면 이 규칙은 해당 단어에 적용되지 않아 계산을 절약합니다.

길이와 같은 조건에 따라 규칙을 선택적으로 적용하는 방법을 이해하면 생성되는 불필요한 후보 수를 줄여 크래킹 시도의 성능을 크게 향상시킬 수 있습니다.

요약

이 실습에서는 John the Ripper 를 위한 고급 규칙 생성에 대한 포괄적인 이해를 얻었습니다. 순차적인 변환을 허용하는 규칙 체이닝을 탐색하는 것으로 시작했습니다. 그런 다음 일반적인 Leet Speak 변환에 대한 특정 규칙을 만드는 방법을 배우고 널리 사용되는 비밀번호 패턴을 대상으로 하는 규칙을 개발했습니다. 또한 다양한 규칙 유형을 결합하여 복잡한 규칙 세트를 테스트하는 연습을 했습니다. 마지막으로 불필요한 계산을 줄이기 위해 조건부 규칙을 사용하는 것과 같은 규칙 성능 최적화 개념을 소개받았습니다. 이러한 기술은 실제 비밀번호 감사 및 크래킹 시나리오에서 John the Ripper 를 효과적으로 활용하는 데 기본이 됩니다.