John the Ripper 를 사용하여 Linux Shadow 비밀번호 크랙하기

Kali LinuxBeginner
지금 연습하기

소개

이 실습에서는 강력한 도구인 John the Ripper 를 사용하여 Linux 비밀번호 해시를 추출, 준비 및 크래킹하는 과정을 탐색합니다. 비밀번호 크래킹이 어떻게 작동하는지 이해하는 것은 강력한 보안 조치를 구현하는 데 매우 중요합니다. /etc/shadow 파일에 대해 배우고, 이를 /etc/passwd와 결합하여 크래킹 가능한 파일을 만드는 방법, 그리고 John the Ripper 를 사용하여 취약한 비밀번호를 찾는 방법을 배우게 됩니다. 마지막으로, shadow 파일의 구조와 Linux 시스템에서 사용자 비밀번호를 보호하기 위한 모범 사례에 대한 통찰력을 얻게 됩니다.

/etc/shadow 파일 추출

이 단계에서는 /etc/shadow 파일의 내용을 액세스하고 추출하는 방법을 배웁니다. /etc/shadow 파일은 암호화된 사용자 비밀번호 및 기타 보안 관련 정보를 저장합니다. 민감한 특성 때문에 root 사용자만 이 파일에 대한 읽기 액세스 권한을 가집니다. 이 실습을 위해 root 권한 없이 /etc/shadow에 직접 액세스하는 것을 시뮬레이션하기 위해 ~/project 디렉토리에 더미 passwd_dummyshadow_dummy 파일을 생성했습니다.

먼저, 더미 passwd_dummy 파일의 내용을 살펴보겠습니다. 이 파일에는 기본 사용자 계정 정보가 포함되어 있지만 비밀번호 해시는 포함되어 있지 않습니다.

cat ~/project/passwd_dummy

다음과 유사한 출력이 표시되어야 합니다.

root:x:0:0:root:/root:/bin/bash
labex:x:1000:1000:LabEx User,,,:/home/labex:/bin/bash
testuser:x:1001:1001:Test User,,,:/home/labex/testuser:/bin/bash

다음으로, 더미 shadow_dummy 파일의 내용을 살펴보겠습니다. 이 파일에는 실제 비밀번호 해시가 포함되어 있습니다.

cat ~/project/shadow_dummy

두 번째 필드가 해시된 비밀번호인 다음과 유사한 출력이 표시되어야 합니다.

root:$6$rounds=40000$abcdefghijklmnop$abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789./:18000:0:99999:7:::
labex:$6$rounds=40000$fedcba9876543210$ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789./:18000:0:99999:7:::
testuser:$6$rounds=5000$testsalt$testpasswordhash:18000:0:99999:7:::

실제 시나리오에서는 일반적으로 sudo cat /etc/shadow를 사용하여 shadow 파일을 추출하지만, 이 실습에서는 더미 파일을 사용합니다.

비밀번호 파일 언쉐도우 (Unshadow)

이 단계에서는 John the Ripper 스위트의 일부인 unshadow 유틸리티를 사용하여 passwd_dummyshadow_dummy 파일을 John the Ripper 가 처리할 수 있는 단일 파일로 결합합니다. unshadow 도구는 비밀번호 파일의 사용자 정보와 shadow 파일의 비밀번호 해시를 병합하여 크래킹에 적합한 통합 형식을 생성합니다.

다음 명령을 실행하여 passwd_dummyshadow_dummy~/project 디렉토리에 unshadowed.txt라는 새 파일로 결합합니다.

unshadow ~/project/passwd_dummy ~/project/shadow_dummy > ~/project/unshadowed.txt

이제 새로 생성된 unshadowed.txt 파일의 내용을 보고 형식을 이해해 보겠습니다.

cat ~/project/unshadowed.txt

각 줄이 사용자 이름으로 시작하고, 그 뒤에 비밀번호 해시, 그리고 다른 사용자 정보가 오는 출력을 보게 될 것입니다. 예를 들어:

root:$6$rounds=40000$abcdefghijklmnop$abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789./:0:0:root:/root:/bin/bash
labex:$6$rounds=40000$fedcba9876543210$ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789./:1000:1000:LabEx User,,,:/home/labex:/bin/bash
testuser:$6$rounds=5000$testsalt$testpasswordhash:1001:1001:Test User,,,:/home/labex/testuser:/bin/bash

unshadowed.txt 파일은 이제 비밀번호 크래킹을 위해 John the Ripper 에서 사용할 준비가 되었습니다.

John the Ripper 로 Shadow 해시 크랙하기

이 단계에서는 John the Ripper 를 사용하여 unshadowed.txt 파일에 포함된 비밀번호 해시를 크랙합니다. John the Ripper 는 미리 정의된 목록의 단어를 사용하는 사전 공격 (dictionary attacks) 을 포함한 다양한 유형의 공격을 수행할 수 있습니다. 설정 과정에서 이미 ~/project 디렉토리에 wordlist.txt라는 간단한 단어 목록을 생성했습니다.

wordlist.txt 파일을 사용하여 비밀번호 크래킹을 시작하려면 다음 명령을 실행합니다.

john --wordlist=~/project/wordlist.txt ~/project/unshadowed.txt

John the Ripper 가 해시를 크랙하려고 시도합니다. 일치하는 항목을 찾으면 크랙된 비밀번호를 표시합니다. 저희의 더미 파일에서 testuserwordlist.txt에 있는 취약한 비밀번호를 가지고 있습니다.

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

Using default input encoding: UTF-8
Loaded 3 password hashes with no different salts to test (sha512crypt, crypt(3) $6$)
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
testpassword     (testuser)
3g 0:00:00:00 DONE (2024-01-01 12:00) 100.0% (ETA: 00:00:00) 3.000g/s 180.0p/s 180.0c/s 180.0C/s testpassword
Session completed.

크랙 후에는 --show 옵션을 사용하여 John the Ripper 가 찾은 크랙된 비밀번호를 볼 수 있습니다.

john --show ~/project/unshadowed.txt

이 명령은 세션에서 성공적으로 크랙된 모든 비밀번호를 표시합니다.

testuser:testpassword

1 password hash cracked, 2 left

이는 쉽게 사용할 수 있는 도구와 단어 목록을 사용하여 취약한 비밀번호가 얼마나 쉽게 크랙될 수 있는지를 보여줍니다.

Shadow 파일 형식 이해하기

이 단계에서는 /etc/shadow 파일 내 필드의 구조와 의미를 더 깊이 살펴보겠습니다. 이 형식을 이해하는 것은 Linux 가 사용자 비밀번호 정보를 안전하게 저장하고 관리하는 방법을 이해하는 데 매우 중요합니다.

/etc/shadow 파일은 사용자당 한 줄씩 포함하며, 각 줄은 콜론으로 구분된 아홉 개의 필드로 구성됩니다. shadow_dummy 파일의 한 줄을 다시 살펴보겠습니다.

testuser:$6$rounds=5000$testsalt$testpasswordhash:18000:0:99999:7:::

각 필드에 대한 설명은 다음과 같습니다.

  1. 사용자 이름 (Username): testuser - 사용자의 로그인 이름입니다.
  2. 암호화된 비밀번호 (Encrypted Password): $6$rounds=5000$testsalt$testpasswordhash - 이것이 가장 중요한 필드입니다. 해시된 비밀번호를 포함합니다.
    • $6은 사용된 해싱 알고리즘 (이 경우 SHA-512) 을 나타냅니다. 다른 일반적인 유형으로는 $1 (MD5), $2a (Blowfish), $5 (SHA-256) 등이 있습니다.
    • rounds=5000은 해싱 라운드 수를 지정하며, 이는 크래킹의 계산 비용을 증가시킵니다.
    • testsalt는 레인보우 테이블 공격을 방지하기 위해 해싱 전에 비밀번호에 추가되는 무작위 문자열인 솔트 (salt) 입니다.
    • testpasswordhash는 실제 해시된 비밀번호입니다.
  3. 마지막 비밀번호 변경일 (Last Password Change): 18000 - 비밀번호가 마지막으로 변경된 날짜로부터 1970 년 1 월 1 일까지의 일수입니다.
  4. 최소 비밀번호 사용 기간 (Minimum Password Age): 0 - 비밀번호 변경 사이에 필요한 최소 일수입니다. 0은 사용자가 언제든지 비밀번호를 변경할 수 있음을 의미합니다.
  5. 최대 비밀번호 사용 기간 (Maximum Password Age): 99999 - 비밀번호가 유효한 최대 일수입니다. 이 기간이 지나면 사용자는 비밀번호를 변경해야 합니다. 99999는 일반적으로 비밀번호가 만료되지 않음을 의미합니다.
  6. 비밀번호 만료 경고 기간 (Password Warning Period): 7 - 비밀번호 만료 전에 사용자에게 경고가 표시되는 일수입니다.
  7. 비밀번호 비활성 기간 (Password Inactive Period): (비어 있음) - 비밀번호가 만료된 후 계정이 비활성화되는 일수입니다. 비어 있으면 비밀번호 비활성으로 인해 계정이 비활성화되지 않습니다.
  8. 계정 만료일 (Account Expiration Date): (비어 있음) - 계정이 비활성화되는 날짜 (1970 년 1 월 1 일부터의 일수) 입니다. 비어 있으면 계정이 만료되지 않습니다.
  9. 예약 필드 (Reserved Field): (비어 있음) - 이 필드는 향후 사용을 위해 예약되어 있습니다.

이러한 필드를 이해하는 것은 비밀번호 정책을 구성하고 시스템 보안을 강화하는 데 도움이 됩니다.

Shadow 파일 보안 모범 사례 구현

이 단계에서는 Linux 시스템에서 /etc/shadow 파일과 사용자 비밀번호를 보호하기 위한 모범 사례를 배우고 이해합니다. Shadow 파일의 민감한 특성을 고려할 때, 이를 보호하는 것은 시스템 보안에 매우 중요합니다.

다음은 몇 가지 주요 모범 사례입니다.

  1. 강력한 비밀번호 정책:

    • 복잡성: 강력한 비밀번호 복잡성 요구 사항 (예: 최소 길이, 대문자, 소문자, 숫자 및 특수 문자 조합) 을 적용합니다.
    • 고유성: 사용자가 이전 비밀번호를 재사용하지 못하도록 합니다.
    • 정기적인 변경: 정기적인 비밀번호 변경 정책을 구현합니다. 다만, 최신 보안 권고 사항에서는 비권한 계정의 경우 빈번한 변경보다 길고 강력하며 고유한 비밀번호를 선호하기도 합니다.
    • 패스프레이즈 (Passphrases): 짧고 복잡한 비밀번호 대신 기억하기 쉽고 크랙하기 어려운 긴 패스프레이즈 사용을 권장합니다.
  2. 파일 권한:

    • /etc/shadow 파일은 매우 엄격한 권한을 가져야 합니다: 0640 (-rw-r-----). 이는 root만 읽고 쓸 수 있으며, shadow 그룹의 멤버만 읽을 수 있음을 의미합니다. 다른 사용자는 접근할 수 없어야 합니다.
    • ls -l /etc/shadow 명령을 사용하여 권한을 확인합니다 (실제 시스템에서, 더미 파일이 아닌).
  3. 해싱 알고리즘:

    • 항상 SHA-512 ($6) 또는 Blowfish ($2a, $2b, $2y) 와 같은 최신 강력한 해싱 알고리즘을 사용합니다. MD5 ($1) 또는 DES 와 같이 오래되고 약한 알고리즘은 피합니다.
    • 시스템의 PAM (Pluggable Authentication Modules) 구성이 강력한 해싱 알고리즘을 사용하도록 설정되었는지 확인합니다.
  4. 솔팅 (Salting):

    • 각 비밀번호에 대해 항상 고유한 솔트를 사용합니다. 이는 최신 해싱 알고리즘에서 자동으로 처리되며 레인보우 테이블 공격을 방지합니다.
  5. 계정 잠금 정책:

    • 무차별 대입 공격 (brute-force attacks) 을 방지하기 위해 계정 잠금 정책을 구현합니다. 특정 횟수 이상의 로그인 실패 후 계정이 일시적으로 잠겨야 합니다.
  6. 의심스러운 활동 모니터링:

    • 비정상적인 로그인 시도나 /etc/shadow 파일의 변경 사항에 대해 시스템 로그를 정기적으로 모니터링합니다. AIDE 또는 Tripwire와 같은 도구는 파일 무결성 변경을 감지할 수 있습니다.
  7. 사용자 교육:

    • 사용자에게 강력하고 고유한 비밀번호의 중요성과 피싱 및 사회 공학 (social engineering) 의 위험에 대해 교육합니다.

이러한 모범 사례를 구현함으로써 Linux 시스템에서 사용자 계정의 보안을 크게 강화하고 민감한 비밀번호 정보를 보호할 수 있습니다.

요약

이 실습에서는 John the Ripper 를 사용하여 Linux 시스템에서 비밀번호 크래킹 프로세스에 대한 실질적인 경험을 쌓았습니다. unshadow를 사용하여 /etc/passwd/etc/shadow 파일을 추출하고 결합하는 방법을 배웠으며, 그런 다음 단어 목록 (wordlist) 과 함께 John the Ripper 를 사용하여 약한 비밀번호 해시를 크랙했습니다. 또한, 특히 해싱 알고리즘과 솔트 (salt) 의 중요성을 이해하며 /etc/shadow 파일의 상세한 형식을 탐구했습니다. 마지막으로 강력한 비밀번호 정책, 적절한 파일 권한, 강력한 해싱 알고리즘 사용을 포함하여 사용자 비밀번호와 shadow 파일을 보호하기 위한 필수적인 모범 사례를 검토했습니다. 이 지식은 공격 보안 (시스템이 어떻게 손상될 수 있는지 이해) 과 방어 보안 (그러한 공격으로부터 보호하기 위한 조치 구현) 모두에 매우 중요합니다.