John을 이용한 Kali 패스워드 크래킹

Kali LinuxBeginner
지금 연습하기

소개

이 실습에서는 강력한 도구인 John the Ripper를 중심으로 Kali Linux를 사용한 패스워드 크래킹의 기초를 배웁니다. 주요 목표는 일반적으로 /etc/shadow 파일에 저장되는 패스워드의 암호화된 표현인 Linux 패스워드 해시를 크래킹하는 방법을 이해하는 것입니다. 이 기술은 모의 해킹(Penetration Testing)에서 취약한 패스워드를 식별하고 시스템 보안을 강화하는 데 필수적입니다.

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

환경 설정 및 도구 설치

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

우리는 두 가지 주요 도구를 사용할 것입니다. 다재다능하고 널리 사용되는 패스워드 크래커인 John the Ripper와 속도와 유연성으로 유명한 또 다른 강력한 도구인 Hashcat입니다. Hashcat은 OpenCL 런타임을 필요로 하므로, 이 컨테이너에 CPU OpenCL 패키지도 함께 설치하겠습니다.

먼저 패키지 목록을 업데이트하여 최신 소프트웨어 버전을 사용할 수 있도록 합니다.

apt update

다음으로, 다음 명령을 사용하여 John the Ripper, Hashcat 및 CPU OpenCL 런타임을 설치합니다. -y 플래그는 설치를 자동으로 확인합니다.

apt install -y john hashcat pocl-opencl-icd

설치 과정은 몇 분 정도 걸릴 수 있습니다. 완료되면 옵션 없이 실행하여 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 파일 구조인 username:hashed_password:last_change:min_age:max_age:warning:inactive:expire:reserved를 따릅니다.

파일이 올바르게 생성되었는지 확인하려면 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

John의 기본 단어 목록에 거의 확실히 포함되어 있는 매우 간단한 패스워드(password123456)를 사용했기 때문에, 이 해시들은 종종 몇 초 이내에 매우 빠르게 크래킹됩니다. 이 성공은 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을 사용하여 동일한 사전 공격을 수행하겠습니다.

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이 OpenCL 백엔드를 감지할 수 있는지 확인하십시오.

hashcat -I

이 명령이 OpenCL 플랫폼을 사용할 수 없다고 보고하면 CPU OpenCL 런타임을 설치하고 다시 확인하십시오.

apt update
apt install -y pocl-opencl-icd
hashcat -I

OpenCL이 감지된 후 크래킹 명령을 다시 실행하십시오. 이 컨테이너화된 환경에서 Hashcat이 경고를 출력하면 --force를 추가하십시오.

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

공격이 완료된 후 --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을 탐구했습니다. 마지막으로 문서화 및 보고를 위해 결과를 저장하는 중요한 단계를 배웠습니다. 이러한 기술은 모의 해킹을 위한 탄탄한 기반을 형성하며, 이러한 공격을 방어하기 위해 강력한 패스워드 정책을 구현하는 것의 중요성을 강조합니다.