소개
이 실습에서는 강력한 도구인 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_dummy 및 shadow_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_dummy와 shadow_dummy 파일을 John the Ripper 가 처리할 수 있는 단일 파일로 결합합니다. unshadow 도구는 비밀번호 파일의 사용자 정보와 shadow 파일의 비밀번호 해시를 병합하여 크래킹에 적합한 통합 형식을 생성합니다.
다음 명령을 실행하여 passwd_dummy와 shadow_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 가 해시를 크랙하려고 시도합니다. 일치하는 항목을 찾으면 크랙된 비밀번호를 표시합니다. 저희의 더미 파일에서 testuser는 wordlist.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:::
각 필드에 대한 설명은 다음과 같습니다.
- 사용자 이름 (Username):
testuser- 사용자의 로그인 이름입니다. - 암호화된 비밀번호 (Encrypted Password):
$6$rounds=5000$testsalt$testpasswordhash- 이것이 가장 중요한 필드입니다. 해시된 비밀번호를 포함합니다.$6은 사용된 해싱 알고리즘 (이 경우 SHA-512) 을 나타냅니다. 다른 일반적인 유형으로는$1(MD5),$2a(Blowfish),$5(SHA-256) 등이 있습니다.rounds=5000은 해싱 라운드 수를 지정하며, 이는 크래킹의 계산 비용을 증가시킵니다.testsalt는 레인보우 테이블 공격을 방지하기 위해 해싱 전에 비밀번호에 추가되는 무작위 문자열인 솔트 (salt) 입니다.testpasswordhash는 실제 해시된 비밀번호입니다.
- 마지막 비밀번호 변경일 (Last Password Change):
18000- 비밀번호가 마지막으로 변경된 날짜로부터 1970 년 1 월 1 일까지의 일수입니다. - 최소 비밀번호 사용 기간 (Minimum Password Age):
0- 비밀번호 변경 사이에 필요한 최소 일수입니다.0은 사용자가 언제든지 비밀번호를 변경할 수 있음을 의미합니다. - 최대 비밀번호 사용 기간 (Maximum Password Age):
99999- 비밀번호가 유효한 최대 일수입니다. 이 기간이 지나면 사용자는 비밀번호를 변경해야 합니다.99999는 일반적으로 비밀번호가 만료되지 않음을 의미합니다. - 비밀번호 만료 경고 기간 (Password Warning Period):
7- 비밀번호 만료 전에 사용자에게 경고가 표시되는 일수입니다. - 비밀번호 비활성 기간 (Password Inactive Period): (비어 있음) - 비밀번호가 만료된 후 계정이 비활성화되는 일수입니다. 비어 있으면 비밀번호 비활성으로 인해 계정이 비활성화되지 않습니다.
- 계정 만료일 (Account Expiration Date): (비어 있음) - 계정이 비활성화되는 날짜 (1970 년 1 월 1 일부터의 일수) 입니다. 비어 있으면 계정이 만료되지 않습니다.
- 예약 필드 (Reserved Field): (비어 있음) - 이 필드는 향후 사용을 위해 예약되어 있습니다.
이러한 필드를 이해하는 것은 비밀번호 정책을 구성하고 시스템 보안을 강화하는 데 도움이 됩니다.
Shadow 파일 보안 모범 사례 구현
이 단계에서는 Linux 시스템에서 /etc/shadow 파일과 사용자 비밀번호를 보호하기 위한 모범 사례를 배우고 이해합니다. Shadow 파일의 민감한 특성을 고려할 때, 이를 보호하는 것은 시스템 보안에 매우 중요합니다.
다음은 몇 가지 주요 모범 사례입니다.
강력한 비밀번호 정책:
- 복잡성: 강력한 비밀번호 복잡성 요구 사항 (예: 최소 길이, 대문자, 소문자, 숫자 및 특수 문자 조합) 을 적용합니다.
- 고유성: 사용자가 이전 비밀번호를 재사용하지 못하도록 합니다.
- 정기적인 변경: 정기적인 비밀번호 변경 정책을 구현합니다. 다만, 최신 보안 권고 사항에서는 비권한 계정의 경우 빈번한 변경보다 길고 강력하며 고유한 비밀번호를 선호하기도 합니다.
- 패스프레이즈 (Passphrases): 짧고 복잡한 비밀번호 대신 기억하기 쉽고 크랙하기 어려운 긴 패스프레이즈 사용을 권장합니다.
파일 권한:
/etc/shadow파일은 매우 엄격한 권한을 가져야 합니다:0640(-rw-r-----). 이는root만 읽고 쓸 수 있으며,shadow그룹의 멤버만 읽을 수 있음을 의미합니다. 다른 사용자는 접근할 수 없어야 합니다.ls -l /etc/shadow명령을 사용하여 권한을 확인합니다 (실제 시스템에서, 더미 파일이 아닌).
해싱 알고리즘:
- 항상 SHA-512 (
$6) 또는 Blowfish ($2a,$2b,$2y) 와 같은 최신 강력한 해싱 알고리즘을 사용합니다. MD5 ($1) 또는 DES 와 같이 오래되고 약한 알고리즘은 피합니다. - 시스템의
PAM(Pluggable Authentication Modules) 구성이 강력한 해싱 알고리즘을 사용하도록 설정되었는지 확인합니다.
- 항상 SHA-512 (
솔팅 (Salting):
- 각 비밀번호에 대해 항상 고유한 솔트를 사용합니다. 이는 최신 해싱 알고리즘에서 자동으로 처리되며 레인보우 테이블 공격을 방지합니다.
계정 잠금 정책:
- 무차별 대입 공격 (brute-force attacks) 을 방지하기 위해 계정 잠금 정책을 구현합니다. 특정 횟수 이상의 로그인 실패 후 계정이 일시적으로 잠겨야 합니다.
의심스러운 활동 모니터링:
- 비정상적인 로그인 시도나
/etc/shadow파일의 변경 사항에 대해 시스템 로그를 정기적으로 모니터링합니다.AIDE또는Tripwire와 같은 도구는 파일 무결성 변경을 감지할 수 있습니다.
- 비정상적인 로그인 시도나
사용자 교육:
- 사용자에게 강력하고 고유한 비밀번호의 중요성과 피싱 및 사회 공학 (social engineering) 의 위험에 대해 교육합니다.
이러한 모범 사례를 구현함으로써 Linux 시스템에서 사용자 계정의 보안을 크게 강화하고 민감한 비밀번호 정보를 보호할 수 있습니다.
요약
이 실습에서는 John the Ripper 를 사용하여 Linux 시스템에서 비밀번호 크래킹 프로세스에 대한 실질적인 경험을 쌓았습니다. unshadow를 사용하여 /etc/passwd와 /etc/shadow 파일을 추출하고 결합하는 방법을 배웠으며, 그런 다음 단어 목록 (wordlist) 과 함께 John the Ripper 를 사용하여 약한 비밀번호 해시를 크랙했습니다. 또한, 특히 해싱 알고리즘과 솔트 (salt) 의 중요성을 이해하며 /etc/shadow 파일의 상세한 형식을 탐구했습니다. 마지막으로 강력한 비밀번호 정책, 적절한 파일 권한, 강력한 해싱 알고리즘 사용을 포함하여 사용자 비밀번호와 shadow 파일을 보호하기 위한 필수적인 모범 사례를 검토했습니다. 이 지식은 공격 보안 (시스템이 어떻게 손상될 수 있는지 이해) 과 방어 보안 (그러한 공격으로부터 보호하기 위한 조치 구현) 모두에 매우 중요합니다.


