John the Ripper 를 사용하여 SHA1 해시 크랙하기

Kali LinuxBeginner
지금 연습하기

소개

이 실험에서는 강력한 오픈 소스 비밀번호 크래킹 도구인 John the Ripper 를 사용하여 SHA1 해시를 크래킹하는 과정을 탐구합니다. 해시가 어떻게 크래킹되는지 이해하는 것은 비밀번호 보안 취약점을 이해하고 더 강력한 보안 조치를 구현하는 데 중요합니다. 이 실험을 통해 일반 텍스트 비밀번호에서 SHA1 해시를 생성하고, 이 해시를 John the Ripper 에 맞게 준비한 다음, 도구를 사용하여 원래 비밀번호를 복구하는 방법을 배우게 됩니다. 이러한 실습 경험은 해싱 알고리즘의 효과와 강력하고 고유한 비밀번호의 중요성에 대한 통찰력을 제공할 것입니다.

비밀번호에서 SHA1 해시 생성

이 단계에서는 몇 가지 샘플 비밀번호에서 SHA1 해시를 생성합니다. SHA1(Secure Hash Algorithm 1) 은 입력을 받아 160 비트 (20 바이트) 의 해시 값을 생성하는 암호화 해시 함수로, 일반적으로 40 자리 16 진수 숫자로 표현됩니다. SHA1 은 특정 애플리케이션에서 취약점으로 인해 암호학적으로 깨졌다고 간주되지만, 해시 크래킹 원리를 시연하는 데는 여전히 유용합니다.

먼저, 몇 가지 간단한 비밀번호를 포함하는 passwords.txt라는 파일을 생성합니다.

echo -e "password123\nlabexuser\nsecretpass" > passwords.txt

이제 sha1sum 명령을 사용하여 passwords.txt 파일에 있는 각 비밀번호의 SHA1 해시를 생성합니다. -t 옵션은 sha1sum에 텍스트 모드를 읽도록 지시하고, -b 옵션은 바이너리 모드를 읽도록 지시합니다. xargs를 사용하여 파일의 각 줄을 sha1sum의 인수로 전달합니다.

cat passwords.txt | xargs -I {} sh -c 'echo -n "{}" | sha1sum' > hashes.txt

이 명령은 passwords.txt에서 각 비밀번호를 읽어 sha1sum으로 파이프하고 (해시를 변경할 수 있는 줄 바꿈 문자를 추가하지 않도록 echo -n 사용), 그 출력을 hashes.txt라는 새 파일로 리디렉션합니다 (해시와 원래 비밀번호 포함).

hashes.txt의 내용을 확인해 보겠습니다.

cat hashes.txt

각 줄에 SHA1 해시와 원래 비밀번호가 포함된 다음과 유사한 출력이 표시됩니다.

5d41402abc4b2a76b9719d911017c592070b4783  password123
1234567890abcdef1234567890abcdef12345678  labexuser
5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8  secretpass

참고: 두 번째 열 (원래 비밀번호) 은 기본적으로 sha1sum에 의해 포함됩니다. 크래킹을 위해 John the Ripper 는 일반적으로 해시 자체만 필요로 합니다. 다음 단계에서 John 을 위해 파일을 준비할 것입니다.

SHA1 용 해시 파일 준비

이 단계에서는 John the Ripper 가 크래킹을 위해 예상하는 형식인 SHA1 해시만 포함하도록 hashes.txt 파일을 준비합니다. 현재 hashes.txt 파일에는 해시와 원본 비밀번호가 모두 포함되어 있어 John 에 입력하기에 이상적이지 않습니다.

hashes.txt에서 해시 값만 추출하여 sha1_hashes_for_john.txt라는 새 파일에 저장할 것입니다. awk 명령을 사용하면 파일에서 특정 열을 쉽게 선택할 수 있으므로 이를 달성할 수 있습니다.

awk '{print $1}' hashes.txt > sha1_hashes_for_john.txt

이 명령은 awk에게 hashes.txt의 각 줄에서 첫 번째 필드 ($1) 를 출력하고 그 출력을 sha1_hashes_for_john.txt로 리디렉션하도록 지시합니다.

이제 새 파일의 내용을 검사하여 해시만 포함하는지 확인합니다.

cat sha1_hashes_for_john.txt

다음과 유사한 출력이 표시되며, SHA1 해시만 나열됩니다.

5d41402abc4b2a76b9719d911017c592070b4783
1234567890abcdef1234567890abcdef12345678
5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8

이 파일은 이제 John the Ripper 의 입력으로 사용할 준비가 되었습니다.

John the Ripper 로 SHA1 해시 크랙하기

이 단계에서는 sha1_hashes_for_john.txt에 저장된 SHA1 해시를 크랙하기 위해 John the Ripper 를 사용합니다. John the Ripper 는 다양한 운영 체제에서 사용할 수 있는 빠른 비밀번호 크래커입니다. 주요 목적은 취약한 Unix 비밀번호를 탐지하는 것입니다. SHA1 을 포함한 다양한 해시 유형을 지원합니다.

"단어 목록 모드 (wordlist mode)"에서 John the Ripper 를 사용하여 해시를 크랙해 보겠습니다. 이 모드는 미리 정의된 목록 (단어 목록) 에서 비밀번호를 시도합니다. 이 실습에서는 원본 비밀번호를 포함하는 간단한 단어 목록을 생성합니다. 실제 시나리오에서는 훨씬 더 크고 포괄적인 단어 목록을 사용하게 될 것입니다.

먼저 wordlist.txt라는 간단한 단어 목록 파일을 생성합니다.

echo -e "password123\nlabexuser\nsecretpass\nwrongpass\notherpass" > wordlist.txt

이제 준비된 해시 파일과 단어 목록으로 John the Ripper 를 실행합니다.

john --format=raw-sha1 --wordlist=wordlist.txt sha1_hashes_for_john.txt

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

  • john: John the Ripper 를 호출하는 명령입니다.
  • --format=raw-sha1: 입력 해시가 일반 SHA1 해시임을 지정합니다. John 은 많은 형식을 지원하며 올바른 형식을 지정하면 효율적인 크래킹에 도움이 됩니다.
  • --wordlist=wordlist.txt: 크래킹을 위해 wordlist.txt를 사전으로 사용하도록 John 에게 지시합니다.
  • sha1_hashes_for_john.txt: 크랙할 해시가 포함된 파일입니다.

명령을 실행한 후 John 은 해시를 크랙하려고 시도합니다. 성공하면 크랙된 비밀번호를 표시합니다.

크랙된 비밀번호를 나타내는 다음과 유사한 출력이 표시됩니다.

Using default input encoding: UTF-8
Loaded 3 password hashes with no different salts (Raw-SHA1 [SHA1])
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
password123      (5d41402abc4b2a76b9719d911017c592070b4783)
labexuser        (1234567890abcdef1234567890abcdef12345678)
secretpass       (5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8)
3g 0:00:00:00 DONE (2023-10-27 10:30) 100.0% (ETA: 00:00:00) 3.000g/s 100.0p/s 100.0c/s 100.0C/s password123..secretpass
Session completed.

크랙된 비밀번호를 다시 보려면 --show 옵션을 사용할 수 있습니다.

john --show sha1_hashes_for_john.txt

이 명령은 John 이 성공적으로 크랙하고 내부 pot 파일에 저장한 모든 해시를 표시합니다.

password123:5d41402abc4b2a76b9719d911017c592070b4783
labexuser:1234567890abcdef1234567890abcdef12345678
secretpass:5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8

3 password hashes cracked, 0 left

SHA1 크래킹 성능 분석

이 단계에서는 John the Ripper 가 SHA1 해시를 크랙하는 성능을 간략하게 분석합니다. 저희 예제에서는 매우 작은 단어 목록과 간단한 비밀번호를 사용했지만, 실제 시나리오에서는 크래킹 성능이 중요한 요소입니다.

John the Ripper 는 출력에서 "g/s"(초당 추측 횟수) 및 "p/s"(초당 비밀번호 수) 와 같은 성능 지표를 제공합니다. 이러한 지표는 John 이 초당 시도할 수 있는 비밀번호 횟수를 나타냅니다.

크래킹 명령을 다시 실행하고 출력을 주의 깊게 관찰해 보겠습니다.

john --format=raw-sha1 --wordlist=wordlist.txt sha1_hashes_for_john.txt

출력에서 다음과 유사한 줄을 찾아보세요.

3g 0:00:00:00 DONE (2023-10-27 10:30) 100.0% (ETA: 00:00:00) 3.000g/s 100.0p/s 100.0c/s 100.0C/s password123..secretpass

여기서 3.000g/s는 John 이 초당 3 개의 추측을 처리했음을 나타내고, 100.0p/s는 초당 100 개의 비밀번호를 처리했음을 나타냅니다. 이렇게 적은 수의 해시와 작은 단어 목록의 경우 크래킹은 거의 즉각적으로 이루어집니다.

크래킹 성능에 영향을 미치는 요인:

  • 비밀번호 복잡성: 간단하고 일반적인 비밀번호는 복잡하고 고유한 비밀번호보다 훨씬 빠르게 크랙됩니다.
  • 단어 목록 크기 및 품질: 더 크고 관련성 있는 단어 목록은 크랙 가능성을 높이지만 시간도 더 오래 걸립니다.
  • 해싱 알고리즘: 일부 해싱 알고리즘은 크래킹 시도를 늦추기 위해 계산 집약적으로 설계된 반면 (예: bcrypt, scrypt), 일반 SHA1 과 같은 다른 알고리즘은 상대적으로 빠릅니다.
  • 하드웨어: 크래킹 머신의 처리 능력 (CPU/GPU) 은 성능에 상당한 영향을 미칩니다.

이 간략한 분석은 John the Ripper 와 같은 강력한 도구를 사용하더라도 원본 비밀번호의 강도와 해싱 알고리즘이 해시를 크랙하는 데 걸리는 시간에 중요한 역할을 한다는 것을 보여줍니다.

SHA1 해시 특성 이해하기

이 단계에서는 SHA1 해시의 특성과 비밀번호 저장에 더 강력한 해싱 알고리즘을 사용하는 것이 왜 중요한지에 대해 더 깊이 이해하게 됩니다.

SHA1 의 주요 특성:

  1. 고정된 출력 크기: SHA1 은 입력 크기에 관계없이 항상 160 비트 (20 바이트) 의 해시 값을 생성합니다. 이것이 40 자리의 16 진수 문자열을 보는 이유입니다.
  2. 단방향 함수: 해시에서 원본 입력을 얻기 위해 해싱 프로세스를 역으로 수행하는 것은 계산적으로 불가능합니다. 이것이 크래킹이 무차별 대입 (brute-force) 또는 사전 공격 (dictionary attacks) 에 의존하는 이유입니다.
  3. 결정론적: 동일한 입력은 항상 동일한 SHA1 해시를 생성합니다. 이 속성은 데이터 무결성을 확인하는 데 필수적입니다.
  4. 눈사태 효과 (Avalanche Effect): 입력의 작은 변경 (단일 비트라도) 은 완전히 다른 해시 출력으로 이어집니다. 이로 인해 해시 유사성을 기반으로 입력을 추측하기 어렵습니다.

SHA1 이 비밀번호 저장에 안전하지 않다고 간주되는 이유:

  • 충돌 공격 (Collision Attacks): 2017 년에 SHA1 에 대한 실질적인 충돌 공격이 시연되었습니다. 충돌은 두 개의 다른 입력이 동일한 해시 출력을 생성할 때 발생합니다. 충돌을 찾는 것이 직접적으로 원본 비밀번호를 밝히지는 않지만, 해시 함수의 무결성을 약화시키고 다양한 공격에 악용될 수 있습니다.
  • 속도: SHA1 은 계산 속도가 비교적 빠릅니다. 이 속도는 현대 컴퓨팅 파워와 결합되어 무차별 대입 및 사전 공격에 취약하며, 특히 일반적이거나 약한 비밀번호의 경우 더욱 그렇습니다.
  • 솔트 (Salting) 부족: 이 실습에서 보여준 일반 SHA1 해시에는 본질적으로 "솔트 (salting)"가 포함되어 있지 않습니다. 솔팅은 해싱 전에 각 비밀번호에 고유하고 무작위적인 문자열을 추가하는 것을 포함합니다. 이는 미리 계산된 레인보우 테이블 (rainbow tables) 의 효과를 방지하고 동일한 데이터베이스에 저장되더라도 동일한 비밀번호가 다른 해시를 갖도록 보장합니다.

오늘날 안전한 비밀번호 저장을 위해서는 bcrypt, scrypt, 또는 Argon2와 같이 더 강력하고 느리며 솔트가 적용된 해싱 알고리즘이 권장됩니다. 이러한 알고리즘은 계산 집약적으로 설계되어 무차별 대입 공격을 훨씬 더 오래 걸리고 비용이 많이 들게 만듭니다.

이 실습은 SHA1 을 사용한 해시 크래킹의 기본 원리를 보여주었습니다. 이는 강력한 해싱 알고리즘과 강력하고 고유한 비밀번호를 사용하여 민감한 정보를 보호하는 것의 중요성을 상기시키는 역할을 합니다.

요약

이 실습에서는 일반 텍스트 비밀번호에서 SHA1 해시를 생성하고 크래킹을 위해 준비하는 방법을 성공적으로 배웠습니다. 그런 다음 John the Ripper 를 단어 목록 모드 (wordlist mode) 로 사용하여 이러한 SHA1 해시를 크랙하고 원본 비밀번호를 복구했습니다. 또한, 해시 크래킹 성능에 영향을 미치는 요인에 대한 통찰력을 얻고 SHA1 의 주요 특성을 이해했으며, 특히 속도와 충돌 공격 (collision attacks) 에 대한 취약성으로 인해 더 이상 비밀번호 저장에 안전하지 않다고 간주되는 이유를 파악했습니다. 이러한 실습 경험은 안전한 비밀번호 관리를 위해 강력하고 고유한 비밀번호와 bcrypt, scrypt 또는 Argon2 와 같은 최신 강력한 해싱 알고리즘을 사용하는 것의 중요성을 강화합니다.