John the Ripper 일반적인 문제 해결

Kali LinuxBeginner
지금 연습하기

소개

John the Ripper (JtR) 는 강력하고 널리 사용되는 오픈 소스 비밀번호 크래킹 도구입니다. 매우 효과적이지만, 사용자, 특히 초보자는 진행을 중단시키는 일반적인 문제에 직면할 수 있습니다. 이러한 문제는 이해하기 어려운 오류 메시지부터 성능 저하까지 다양합니다.

이 실습에서는 John the Ripper 사용 시 가장 자주 발생하는 몇 가지 문제를 해결하는 방법을 배우게 됩니다. "No hashes loaded"와 같은 오류 처리, 잘못된 해시 형식 처리, 성능 병목 현상 해결, 손상된 세션 파일 처리, 그리고 막혔을 때 도움을 받을 수 있는 곳을 찾는 방법을 다룰 것입니다. 이 실습이 끝나면 JtR 문제를 효율적으로 진단하고 해결할 수 있는 능력을 갖추게 될 것입니다.

"No hashes loaded" 오류 해결

이 단계에서는 John the Ripper 에서 가장 흔한 오류 중 하나인 No password hashes loaded를 살펴보겠습니다. 이 오류는 주로 두 가지 이유로 발생합니다. John 이 제공된 파일의 모든 해시를 이미 크랙했거나, 파일이 John 이 이해할 수 없는 형식인 경우입니다.

먼저, 유효한 해시 파일에서 John 을 실행해 보겠습니다. 설정 스크립트가 현재 디렉토리 (~/project) 에 shadow.txt라는 파일을 이미 생성했으며, 이 파일에는 John 이 인식하는 형식의 사용자 비밀번호 해시가 포함되어 있습니다.

간단한 단어 목록을 사용하여 크랙을 시도해 보겠습니다.

john --wordlist=pass.list shadow.txt

John 이 하나의 해시를 로드하고 크랙을 시도하고 있음을 나타내는 출력이 표시되어야 합니다. 비밀번호는 빠르게 찾아야 합니다.

Using default input encoding: UTF-8
Loaded 1 password hash (descrypt, traditional crypt(3) [DES 128/128 SSE2-16])
Cost 1 (algorithm [1:descrypt]...
Press 'q' or Ctrl-C to abort, almost any other key for status
password123      (dummyuser)
1g 0:00:00:00 DONE (2023-10-27 10:30) 100.0g/s 100.0p/s 100.0c/s 100.0C/s password123
Use the "--show" option to display all of the cracked passwords reliably
Session completed

비밀번호가 크랙되었으므로, John 은 이를 john.pot이라는 파일에 저장합니다. 동일한 명령을 다시 실행해 보겠습니다.

john --wordlist=pass.list shadow.txt

이번에는 오류가 표시됩니다.

Using default input encoding: UTF-8
No password hashes loaded (see FAQ)

이는 John 이 시작하기 전에 john.pot 파일을 확인하고 이미 크랙된 해시는 무시하기 때문입니다. john.pot 파일의 내용을 확인하여 이를 확인할 수 있습니다.

cat ~/.john/john.pot

출력에는 해시와 크랙된 비밀번호가 표시됩니다.

$1$notarealhash$b5gQ1P2kPiyP2t.OqI0kS1:password123

이 오류의 또 다른 이유는 잘못된 파일 형식입니다. 해시가 포함되지 않은 파일을 만들어 보겠습니다.

echo "this is just a text file" > plain.txt

이제 이 파일에서 John 을 실행해 보겠습니다.

john plain.txt

John 이 비밀번호 해시처럼 보이는 데이터를 파일에서 찾을 수 없기 때문에 동일한 "No password hashes loaded" 오류가 표시됩니다. 대상 파일에 지원되는 형식의 해시가 포함되어 있는지 항상 확인하십시오.

"Invalid hash type" 오류 디버깅

이 단계에서는 해시 유형과 관련된 문제를 해결합니다. 때때로 John 은 해시 유형을 자동으로 감지하지 못하거나, 사용자가 --format 플래그를 사용하여 잘못된 유형을 지정하여 오류가 발생하거나 크랙 시도가 실패할 수 있습니다.

먼저, 잘못된 형식의 해시 문자열이 포함된 파일이 있을 때 John 이 어떻게 작동하는지 살펴보겠습니다. 이를 위해 invalid_hashes.txt라는 파일을 준비했습니다.

john invalid_hashes.txt

John 은 파일을 분석하고 이전 단계의 오류와 유사하게 유효한 해시를 로드할 수 없다고 보고할 것입니다.

Using default input encoding: UTF-8
No password hashes loaded (see FAQ)

이제 유효한 해시가 포함된 파일을 사용하지만, 잘못된 형식을 지정해 보겠습니다. hashes_md5.txt 파일에는 표준 raw-MD5 해시가 포함되어 있지만, John 에게는 NT 해시라고 알려주겠습니다.

john --wordlist=pass.list --format=nt hashes_md5.txt

해시 데이터가 지정된 형식과 일치하지 않기 때문에 John 은 경고 또는 오류를 생성합니다.

Warning: invalid ciphertext ignored: user1:5d41402abc4b2a76b9719d911017c592
No password hashes loaded (see FAQ)

이를 해결하려면 올바른 해시 형식을 제공해야 합니다. 형식이 raw-MD5임을 알고 있다면 직접 지정할 수 있습니다. 이는 John 이 자동으로 감지하도록 하는 것보다 종종 더 빠릅니다.

올바른 형식으로 명령을 실행해 보겠습니다.

john --wordlist=pass.list --format=raw-md5 hashes_md5.txt

이번에는 명령이 성공하고 비밀번호를 크랙합니다.

Using default input encoding: UTF-8
Loaded 1 password hash (raw-MD5 [MD5 128/128 SSE2-16])
Cost 1 (iteration count) is 1 for all loaded hashes
Press 'q' or Ctrl-C to abort, almost any other key for status
labex            (user1)
1g 0:00:00:00 DONE (2023-10-27 10:35) 100.0g/s 1234Kp/s 1234Kc/s 1234KC/s 123..labex
Use the "--show" option to display all of the cracked passwords reliably
Session completed

해시 유형을 확실하지 않은 경우 --format 플래그를 생략하고 John 이 자동으로 감지하도록 할 수 있습니다. 그러나 모호하거나 비표준 해시의 경우, 형식을 지정하는 것이 성공을 보장하는 가장 좋은 방법입니다.

성능 병목 현상 해결

이 단계에서는 성능 문제를 식별하고 해결하는 방법을 살펴봅니다. 비밀번호 크랙은 매우 리소스 집약적인 작업일 수 있으며, 느린 성능은 비실용적일 수 있습니다.

John the Ripper 에서 성능의 핵심 지표는 "초당 후보 수"(c/s) 입니다. 벤치마크를 실행하여 다양한 해싱 알고리즘으로 시스템이 얼마나 잘 작동하는지 확인할 수 있습니다.

john --test

이 명령은 일련의 벤치마크를 실행합니다. 다양한 알고리즘에 대한 c/s 속도를 출력에서 확인하십시오.

Benchmarking: descrypt, traditional crypt(3) [DES 128/128 SSE2-16]... DONE
Many salts:	1234K c/s real, 1234K c/s virtual
Only one salt:	1111K c/s real, 1111K c/s virtual

... (다른 많은 알고리즘) ...

Benchmarking: raw-MD5 [MD5 128/128 SSE2-16]... DONE
Raw:	45678K c/s real, 45678K c/s virtual

멀티코어 시스템에서 성능을 향상시키는 가장 효과적인 방법 중 하나는 병렬 처리를 사용하는 것입니다. John 은 --fork=N 옵션을 사용하여 이를 수행할 수 있으며, 여기서 N은 생성할 프로세스 수입니다.

이를 테스트하기 전에 1 단계의 해시를 다시 크랙할 수 있도록 john.pot 파일을 지우겠습니다.

rm ~/.john/john.pot

이제 shadow.txt에서 단일 코어 크랙 세션을 실행해 보겠습니다. 실행되는 동안 아무 키나 눌러 (예: Enter) 상태를 확인하십시오. c/s 속도를 기록해 두십시오.

john --wordlist=pass.list shadow.txt

잠시 후 Enter 키를 누릅니다. 상태 줄이 표시됩니다. 그런 다음 Ctrl+C를 눌러 중지합니다.

이제 두 개의 병렬 프로세스로 다시 시도해 보겠습니다.

john --fork=2 --wordlist=pass.list shadow.txt

이번에는 John 이 두 개의 CPU 코어를 사용하여 작업을 처리합니다. 상태를 확인하면 전체 c/s 속도가 단일 코어 속도의 거의 두 배로 상당히 높아져야 합니다. 이렇게 하면 크랙 세션에 필요한 시간을 크게 줄일 수 있습니다.

기타 성능 팁은 다음과 같습니다.

  • 대상 단어 목록 사용: 작고 관련성 있는 단어 목록이 거대하고 일반적인 목록보다 빠릅니다.
  • 형식 지정: 2 단계에서 보았듯이 --format을 사용하면 자동 감지의 오버헤드를 피할 수 있습니다.

손상된 세션 파일 처리

이 단계에서는 손상된 세션 파일을 처리하는 방법을 배웁니다. John the Ripper 는 진행 상황을 ~/.john/ 디렉토리에 있는 세션 파일 (확장자 .rec) 에 자동으로 저장합니다. 이를 통해 오래 실행되는 크랙 세션을 일시 중지하고 다시 시작할 수 있습니다. 그러나 이 파일이 손상되면 세션을 복원할 수 없습니다.

새 세션을 시작해 보겠습니다. 이름을 my_session으로 지정합니다.

john --session=my_session --wordlist=pass.list corrupt_me.txt

명령을 몇 초 동안 실행한 다음 Ctrl+C를 눌러 정상적으로 중지합니다. John 은 진행 상황을 저장합니다.

Session aborted

생성된 세션 파일을 볼 수 있습니다.

ls ~/.john/
john.log  john.pot  my_session.rec

이제 쓰레기 데이터를 추가하여 파일을 손상시키는 것을 시뮬레이션해 보겠습니다.

echo "THIS IS CORRUPTED DATA" >> ~/.john/my_session.rec

세션 파일이 손상된 상태에서 작업을 다시 시작해 보겠습니다.

john --restore=my_session

John 은 복구 파일을 파싱하는 데 실패하고 오류 메시지와 함께 종료될 가능성이 높습니다. 정확한 오류는 다를 수 있지만 .rec 파일에 문제가 있음을 나타낼 것입니다.

Error in recovery file: ~/.john/my_session.rec

이런 일이 발생하면 유일한 해결책은 손상된 세션 파일을 제거하는 것입니다. 이는 해당 특정 세션의 진행 상황을 잃고 다시 시작해야 함을 의미합니다. 그러나 이미 성공적으로 크랙된 비밀번호는 john.pot 파일에 안전하게 저장됩니다.

잘못된 파일을 제거하겠습니다.

rm ~/.john/my_session.rec

이제 처음부터 세션을 다시 시작할 수 있습니다. 이는 크랙 시도 중 예상치 못한 충돌이나 시스템 종료로부터 복구하기 위한 중요한 문제 해결 단계입니다.

John the Ripper 커뮤니티에 도움 요청하기

이 단계에서는 모든 것을 시도했지만 여전히 막혀 있을 때 어떻게 해야 하는지 다룹니다. John the Ripper 커뮤니티는 훌륭한 리소스이지만 효과적인 도움을 받으려면 올바른 정보를 제공해야 합니다.

커뮤니티 지원의 주요 장소는 john-users 메일링 리스트입니다. 게시하기 전에 아카이브를 검색하여 질문에 이미 답변이 있는지 확인하는 것이 좋습니다.

도움을 요청해야 할 때는 명확하고 완전한 정보를 제공하는 것이 중요합니다. 요청에 항상 포함해야 할 내용은 다음과 같습니다.

  1. John the Ripper 버전: 버전마다 기능과 버그가 다릅니다.
  2. 정확한 명령: John 을 실행하는 데 사용한 전체 명령입니다.
  3. 전체 출력: 오류 메시지를 포함한 명령의 모든 출력입니다.
  4. 운영 체제: 사용 중인 OS(예: Ubuntu 22.04, Windows 10) 입니다.
  5. 해시 샘플: 크랙하려는 해시의 예 (민감하지 않은 경우).

--version 플래그를 사용하여 John the Ripper 버전을 얻을 수 있습니다. 지금 실행해 보겠습니다.

john --version

출력은 다음과 유사하게 표시됩니다.

John the Ripper 1.9.0-jumbo-1 [linux-gnu 64-bit x86_64 AVX2 AC]

이 정보를 수집하는 방법을 알면 커뮤니티 구성원이 문제를 이해하고 유용한 솔루션을 제공하는 데 훨씬 쉬워집니다. 오픈 소스 커뮤니티에 도움을 요청할 때는 예의 바르고 인내심을 가지는 것을 잊지 마십시오.

요약

이 실습에서는 John the Ripper 의 가장 일반적인 문제 중 일부를 직접 해결하는 경험을 쌓았습니다.

다음과 같은 방법을 배웠습니다.

  • 이미 크랙된 비밀번호에 대해 john.pot 파일을 확인하고 입력 파일 형식을 확인하여 No hashes loaded 오류를 진단합니다.
  • --format 플래그를 사용하여 올바른 알고리즘을 지정하여 해시 유형 문제를 해결합니다.
  • 벤치마크를 실행하고 병렬 처리를 위해 --fork 옵션을 사용하여 성능 병목 현상을 해결합니다.
  • 손상된 세션 (.rec) 파일을 제거하여 실패한 크랙 시도에서 복구합니다.
  • 커뮤니티에 효과적으로 도움을 요청하기 위해 JtR 버전 및 명령 출력과 같은 필요한 정보를 수집합니다.

이러한 기술을 통해 이제 John the Ripper 를 보다 효과적으로 사용하고 발생하는 문제를 해결할 준비가 되었습니다.