John 을 활용한 Kali 비밀번호 크래킹

Kali LinuxBeginner
지금 연습하기

소개

이 실습에서는 강력한 도구인 John the Ripper를 중심으로 Kali Linux 를 활용한 비밀번호 크래킹의 기초를 학습합니다. 주요 목표는 일반적으로 /etc/shadow 파일에 저장되는 비밀번호의 암호화된 형태인 Linux 비밀번호 해시를 해독하는 방법을 이해하는 것입니다. 이 기술은 취약한 비밀번호를 식별하고 시스템 보안을 강화해야 하는 침투 테스트 분야에서 필수적입니다.

터미널을 열면 자동으로 Kali Linux 컨테이너 셸에 접속됩니다. 이 실습의 모든 명령은 해당 환경 내에서 실행되어야 합니다. 단계별 안내에 따라 샘플 해시 파일을 다루고, 사용자 정의 워드리스트를 생성 및 활용하며, John the RipperHashcat 같은 크래킹 도구를 비교하고, 분석을 위해 결과를 저장하는 과정을 거치게 됩니다. 이 실습은 초보자를 위해 설계되었으며, 통제된 환경에서 명확하고 실용적인 학습 경험을 제공합니다.

이 실습은 학습과 연습을 돕기 위해 단계별 지침을 제공하는 가이드형 실습입니다. 각 단계를 완료하고 실무 경험을 쌓으려면 지침을 주의 깊게 따르십시오. 과거 데이터에 따르면 이 실습은 완료율 93%초급 수준이며, 학습자들로부터 95%의 긍정적인 평가를 받았습니다.

환경 설정 및 도구 설치

첫 번째 단계에서는 비밀번호 크래킹에 필요한 도구들을 설치하여 Kali Linux 환경을 준비합니다. 앞서 언급했듯이, 터미널 세션은 이미 Kali Linux 컨테이너 내부에서 실행 중입니다.

우리는 두 가지 주요 도구를 사용할 것입니다. 하나는 다재다능하고 널리 쓰이는 비밀번호 크래커인 John the Ripper이고, 다른 하나는 속도와 유연성으로 유명한 강력한 도구인 Hashcat입니다. 두 도구 모두 침투 테스터의 도구 상자에 반드시 있어야 할 필수 요소입니다.

먼저, 최신 소프트웨어 버전에 접근할 수 있도록 패키지 목록을 업데이트합니다.

apt update

그 다음, 아래 명령어를 사용하여 John the RipperHashcat을 설치합니다. -y 플래그는 설치 확인 질문에 자동으로 동의하도록 합니다.

apt install -y john hashcat

설치 과정은 몇 분 정도 소요될 수 있습니다. 완료되면 옵션 없이 실행하여 John the Ripper가 올바르게 설치되었는지 확인합니다.

john

도구가 준비되었음을 알리는 도움말과 버전 정보가 표시되어야 합니다. 출력 결과는 다음과 유사할 것입니다.

John the Ripper 1.9.0-jumbo-1+bleeding-aec1328d6c 2021-11-02 10:45:52 +0100 OMP [linux-gnu 64-bit x86_64 AVX512BW AC]
Copyright (c) 1996-2021 by Solar Designer and others
Homepage: https://www.openwall.com/john/

Usage: john [OPTIONS] [PASSWORD-FILES]
...

이어서 Hashcat의 버전을 확인하여 설치 상태를 점검합니다.

hashcat --version

예상 출력 결과에는 다음과 같이 버전 번호가 표시됩니다.

v6.2.5

두 도구의 설치와 확인이 모두 끝났으므로, 이제 다음 단계의 비밀번호 크래킹 실습을 위한 환경 준비가 완료되었습니다.

샘플 해시 파일 생성하기

도구 설치가 끝났으니 이제 작업할 데이터가 필요합니다. 이번 단계에서는 John the Ripper 가 실제로 처리할 수 있는 실제 Linux 비밀번호 해시가 포함된 파일을 생성합니다. 이 해시들은 Linux 시스템에서 사용자 비밀번호 정보를 안전하게 저장하는 /etc/shadow 파일의 형식을 모방하여 구성되었습니다. 이를 통해 안전하고 통제된 방식으로 크래킹 연습을 할 수 있습니다.

모든 작업은 Kali 컨테이너의 /root 디렉토리에서 수행됩니다. 빠르게 해독할 수 있는 간단하고 흔한 비밀번호들로 미리 생성된 실제 해시를 사용하여 해시 파일을 직접 만들겠습니다.

다음 명령어를 실행하여 샘플 해시 파일을 직접 생성하십시오.

cd /root
echo -e "user1:\$6\$randomsalt\$WS2qjCQ1JrmZv8otdbtntIYu6lRzkk2aIVhgIMdMexOcvD9bEAoxtKcyZLXbR3wlhOOPBscJbLCPUU/fYjFhM0:18234:0:99999:7:::\nuser2:\$6\$anothersalt\$ZffCt8y5Hl8gLYS79/rhyT76C12kNhuOvkFR8Ll0RXcjQz2Nzuh3VUdT//e21HYfH6fP9btOp2aG22O3S7q1z/:18234:0:99999:7:::" > sample_hashes.txt

또는 내용을 복사하여 붙여넣는 방식으로 파일을 수동 생성할 수도 있습니다.

cd /root
cat > sample_hashes.txt << 'EOF'
user1:$6$randomsalt$WS2qjCQ1JrmZv8otdbtntIYu6lRzkk2aIVhgIMdMexOcvD9bEAoxtKcyZLXbR3wlhOOPBscJbLCPUU/fYjFhM0:18234:0:99999:7:::
user2:$6$anothersalt$ZffCt8y5Hl8gLYS79/rhyT76C12kNhuOvkFR8Ll0RXcjQz2Nzuh3VUdT//e21HYfH6fP9btOp2aG22O3S7q1z/:18234:0:99999:7:::
EOF

각 줄의 $6$ 접두사는 해당 해시가 현대 Linux 시스템의 표준인 SHA-512 crypt 해시임을 나타냅니다. 형식은 shadow 파일 구조인 사용자명:해시된_비밀번호:마지막_변경일:최소_사용기간:최대_사용기간:경고일:비활성기간:만료일:예약항목을 따릅니다.

파일이 올바르게 생성되었는지 확인하기 위해 cat 명령어로 내용을 출력해 봅니다.

cat /root/sample_hashes.txt

출력 결과에 실제 해시 값을 가진 두 명의 사용자 항목이 나타나야 합니다.

user1:$6$randomsalt$WS2qjCQ1JrmZv8otdbtntIYu6lRzkk2aIVhgIMdMexOcvD9bEAoxtKcyZLXbR3wlhOOPBscJbLCPUU/fYjFhM0:18234:0:99999:7:::
user2:$6$anothersalt$ZffCt8y5Hl8gLYS79/rhyT76C12kNhuOvkFR8Ll0RXcjQz2Nzuh3VUdT//e21HYfH6fP9btOp2aG22O3S7q1z/:18234:0:99999:7:::

주의 사항:

  • 이 해시들은 John the Ripper 가 처리할 수 있는 실제 형식을 갖춘 SHA-512 해시입니다.
  • 설정된 비밀번호는 password123456입니다. 이는 매우 단순하고 흔한 비밀번호이므로 John 의 기본 워드리스트에 반드시 포함되어 있습니다.
  • 이는 시연 목적으로 보통 몇 초 내에 빠르게 해독되도록 보장하기 위함입니다.

샘플 데이터 파일이 준비되었으므로 이제 비밀번호 크래킹 연습을 위한 타겟이 생겼습니다. 다음 단계에서는 John the Ripper를 사용하여 이 해시들을 해독해 보겠습니다.

John the Ripper 의 기본 모드로 해시 해독하기

샘플 해시 파일이 준비되었으니 이제 John the Ripper로 크래킹을 시작할 차례입니다. 기본적으로 John 은 사용자 이름과 기타 정보를 활용해 비밀번호를 추측하는 "싱글 크랙 (single crack)" 모드를 포함하여, 내장된 비밀번호 목록을 사용하는 워드리스트 모드 등 여러 모드를 사용합니다. 이는 취약하고 흔한 비밀번호를 식별하는 데 아주 좋은 시작점입니다.

다음 명령어를 실행하여 sample_hashes.txt 파일에 대한 크래킹 프로세스를 시작하십시오.

john /root/sample_hashes.txt

John 이 해시를 불러오고 크래킹 세션을 시작합니다. 진행 상황을 나타내는 출력이 표시될 것입니다. 우리가 매우 단순하고 흔한 비밀번호 (password123456) 로 실제 해시를 생성했기 때문에, John 은 기본 워드리스트 모드를 사용하여 이를 빠르게 해독할 수 있을 것입니다.

Using default input encoding: UTF-8
Loaded 2 password hashes with 2 different salts (sha512crypt, crypt(3) $6$ [SHA512 512/512 AVX512BW 8x])
Cost 1 (iteration count) is 5000 for all loaded hashes
Will run 2 OpenMP threads
Proceeding with single, rules:Single
Press 'q' or Ctrl-C to abort, almost any other key for status
Almost done: Processing the remaining buffered candidate passwords, if any.
Proceeding with wordlist:/usr/share/john/password.lst
...

John 이 크래킹을 시도하도록 잠시 그대로 두거나, 결과를 일찍 확인하고 싶다면 Ctrl-C를 눌러 프로세스를 중단할 수 있습니다. 해독된 비밀번호를 확인하려면 --show 옵션을 사용합니다.

john --show /root/sample_hashes.txt

비밀번호 해독에 성공했다면 출력 결과는 다음과 같을 것입니다.

user1:password:18234:0:99999:7:::
user2:123456:18234:0:99999:7:::

2 password hashes cracked, 0 left

우리가 사용한 매우 단순한 비밀번호 (password123456) 는 John 의 기본 워드리스트에 거의 확실히 포함되어 있으므로, 이 해시들은 대개 몇 초 내에 매우 빠르게 해독됩니다. 이 성공적인 결과는 John the Ripper 가 실제 해시 파일과 올바르게 작동하고 있음을 증명하며, 취약한 비밀번호가 얼마나 빨리 노출될 수 있는지를 보여줍니다.

다음 단계에서는 John 에게 사용자 정의 워드리스트를 제공하고 크래킹 효율성을 높이기 위해 다양한 매개변수를 조정하는 방법을 살펴보겠습니다.

John the Ripper 에서 사용자 정의 워드리스트 사용하기

기본 설정에만 의존하는 것으로는 충분하지 않은 경우가 많습니다. 사용자 정의 워드리스트를 사용한 타겟 공격은 훨씬 더 효과적일 수 있습니다. 워드리스트는 단순히 한 줄에 하나의 잠재적 비밀번호가 포함된 텍스트 파일입니다. 이번 단계에서는 작은 규모의 사용자 정의 워드리스트를 생성하여 John the Ripper와 함께 사용해 보겠습니다.

/root 디렉토리에 custom_wordlist.txt라는 파일을 생성하고, 해시 파일에 포함된 것으로 알고 있는 비밀번호를 포함하여 몇 가지 흔한 비밀번호를 입력합니다.

echo -e "password\n123456\nadmin123\ntest1234\nqwerty\npassword123" > /root/custom_wordlist.txt

새로 만든 워드리스트의 내용을 확인합니다.

cat /root/custom_wordlist.txt

방금 추가한 6 개의 비밀번호가 출력되어야 합니다.

password
123456
admin123
test1234
qwerty
password123

이제 John the Ripper를 다시 실행하되, 이번에는 --wordlist 옵션을 사용하여 사용자 정의 워드리스트를 지정합니다.

john --wordlist=/root/custom_wordlist.txt /root/sample_hashes.txt

이 명령어는 John 에게 custom_wordlist.txt에 있는 모든 비밀번호를 sample_hashes.txt의 해시와 대조해 보라고 지시합니다. 워드리스트에 파일의 해시와 일치하는 실제 비밀번호 (password123456) 가 포함되어 있으므로 John 은 이를 매우 빠르게 해독할 것입니다.

프로세스가 완료되면 결과를 다시 확인합니다.

john --show /root/sample_hashes.txt

워드리스트에 올바른 비밀번호가 포함되어 있으므로, 이제 출력 결과에 해독된 자격 증명이 표시됩니다.

user1:password:18234:0:99999:7:::
user2:123456:18234:0:99999:7:::

2 password hashes cracked, 0 left

이는 타겟 워드리스트 공격의 효과를 잘 보여줍니다. 사용자 정의 워드리스트에 실제 비밀번호를 포함함으로써 John 의 기본 워드리스트에만 의존할 때보다 훨씬 빠르게 해시를 해독할 수 있었습니다. 이 기법은 타겟형 비밀번호 공격의 기본입니다. 다음으로는 Hashcat을 사용하여 유사한 공격을 수행하는 방법을 알아보겠습니다.

비교를 위한 Hashcat 해시 해독

John the Ripper는 훌륭한 도구이지만, Hashcat과 같은 대안에도 익숙해지는 것이 좋습니다. Hashcat은 특히 GPU 가 장착된 시스템에서 매우 빠른 속도로 유명합니다. 여기서는 Hashcat을 사용하여 동일한 사전 공격 (dictionary attack) 을 수행해 보겠습니다.

Hashcat은 해시 값만 포함된 깨끗한 파일을 선호합니다. awk 명령어를 사용하여 sample_hashes.txt에서 두 번째 필드 (해시) 만 추출하여 새 파일인 clean_hashes.txt에 저장합니다.

awk -F':' '{print $2}' /root/sample_hashes.txt > /root/clean_hashes.txt

새 파일의 내용을 확인합니다.

cat /root/clean_hashes.txt

출력 결과에는 해시 문자열만 포함되어야 합니다.

$6$randomsalt$WS2qjCQ1JrmZv8otdbtntIYu6lRzkk2aIVhgIMdMexOcvD9bEAoxtKcyZLXbR3wlhOOPBscJbLCPUU/fYjFhM0
$6$anothersalt$ZffCt8y5Hl8gLYS79/rhyT76C12kNhuOvkFR8Ll0RXcjQz2Nzuh3VUdT//e21HYfH6fP9btOp2aG22O3S7q1z/

이제 Hashcat을 실행합니다. 해시 모드 (SHA-512 crypt 의 경우 -m 1800) 와 공격 모드 (일반 사전 공격의 경우 -a 0) 를 지정해야 합니다.

hashcat -m 1800 -a 0 /root/clean_hashes.txt /root/custom_wordlist.txt
Session..........: hashcat
Status...........: Cracked
Hash.Mode........: 1800 (sha512crypt $6$, SHA512 (Unix))
Hash.Target......: /root/clean_hashes.txt
Time.Started.....: Mon Sep  1 06:33:21 2025 (0 secs)
Time.Estimated...: Mon Sep  1 06:33:21 2025 (0 secs)
Kernel.Feature...: Pure Kernel
Guess.Base.......: File (/root/custom_wordlist.txt)
Guess.Queue......: 1/1 (100.00%)
Speed.#1.........:      226 H/s (5.08ms) @ Accel:8 Loops:1024 Thr:1 Vec:8
Recovered........: 2/2 (100.00%) Digests (total), 1/2 (50.00%) Digests (new), 2/2 (100.00%) Salts
Progress.........: 6/12 (50.00%)
Rejected.........: 0/6 (0.00%)
Restore.Point....: 0/6 (0.00%)
Restore.Sub.#1...: Salt:0 Amplifier:0-1 Iteration:4096-5000
Candidate.Engine.: Device Generator
Candidates.#1....: password -> password123

Hashcat이 크래킹 세션을 시작합니다. 워드리스트에 올바른 비밀번호 (password123456) 가 있으므로 Hashcat 은 이 해시들을 매우 빠르게 해독할 것입니다. 완료된 후, 동일한 명령어에 --show 플래그를 추가하여 해독된 비밀번호를 확인합니다.

hashcat -m 1800 -a 0 /root/clean_hashes.txt /root/custom_wordlist.txt --show

공격에 성공하면 Hashcat은 해시 뒤에 콜론으로 구분된 해독 비밀번호를 표시합니다.

$6$randomsalt$WS2qjCQ1JrmZv8otdbtntIYu6lRzkk2aIVhgIMdMexOcvD9bEAoxtKcyZLXbR3wlhOOPBscJbLCPUU/fYjFhM0:password
$6$anothersalt$ZffCt8y5Hl8gLYS79/rhyT76C12kNhuOvkFR8Ll0RXcjQz2Nzuh3VUdT//e21HYfH6fP9btOp2aG22O3S7q1z/:123456

이 단계를 통해 비밀번호 크래킹을 위한 강력한 대안인 Hashcat을 경험해 보았습니다. 마지막 단계에서는 발견한 내용을 적절하게 문서화하는 방법을 배웁니다.

요약

이 실습을 통해 Kali Linux 환경에서 기본적인 비밀번호 크래킹 기술을 직접 경험해 보았습니다. 먼저 작업 공간을 설정하고 John the RipperHashcat과 같은 필수 도구를 설치하는 것으로 시작했습니다. 그런 다음 Linux 의 /etc/shadow 형식을 모방한 샘플 해시 파일을 생성하여 타겟 데이터를 준비하는 방법을 배웠습니다.

John the Ripper를 기본 설정과 사용자 정의 워드리스트로 각각 실행해 보았으며, 강력한 대안 도구인 Hashcat도 탐구했습니다. 마지막으로 문서화 및 보고를 위해 발견한 결과를 저장하는 중요한 단계를 학습했습니다. 이러한 기술은 침투 테스트의 견고한 기초가 되며, 이러한 공격으로부터 방어하기 위해 강력한 비밀번호 정책을 수립하는 것이 얼마나 중요한지 일깨워 줍니다.