Linux Shadow 파일에서 해시 추출 및 크랙하기

Kali LinuxBeginner
지금 연습하기

소개

이 실습에서는 Linux 비밀번호 보안 감사에 대한 기본적인 프로세스를 배우게 됩니다. Linux 가 사용자 비밀번호 정보를 어떻게 저장하는지 살펴보고, 이 정보를 추출한 다음, 사전 공격 (dictionary attack) 을 사용하여 비밀번호를 크랙하는 방법을 시도할 것입니다. 이 과정은 침투 테스터와 시스템 관리자가 시스템 내에서 취약한 비밀번호를 식별하고 수정하는 데 필수적입니다.

두 개의 중요한 파일과 함께 작업하게 됩니다: 사용자 계정 정보를 저장하는 /etc/passwd 파일과 해시된 비밀번호를 안전하게 저장하는 /etc/shadow 파일입니다. 크랙 프로세스를 수행하기 위해 표준 Linux 명령줄 도구와 unshadow (John the Ripper 스위트의 일부) 및 Hashcat과 같은 전문 소프트웨어를 사용할 것입니다.

이 실습이 끝나면 다음과 같은 실습 경험을 쌓게 됩니다:

  • /etc/shadow 파일 형식 이해하기
  • 사용자 및 비밀번호 데이터를 크랙 가능한 형식으로 결합하기
  • 비밀번호 해시 유형 식별하기
  • Hashcat 을 사용하여 사전 공격 수행하기

/etc/shadow 파일 형식 이해하기

이 단계에서는 /etc/shadow 파일을 살펴보겠습니다. 이 파일은 Linux 시스템의 사용자 실제 비밀번호 해시를 저장하며, 보안상의 이유로 root 사용자만 읽을 수 있습니다. 이 파일의 구조를 이해하는 것이 해시를 추출하는 첫 번째 단계입니다.

먼저, /etc/shadow 파일의 내용을 보기 위해 필요한 권한을 얻기 위해 sudo를 사용합니다.

sudo cat /etc/shadow

여러 줄로 구성된 출력을 보게 될 것이며, 각 줄은 사용자 계정에 해당합니다. 우리가 생성한 testuser의 항목을 살펴보겠습니다. 다음과 유사하게 보일 것입니다 (salt 와 hash 는 다를 수 있습니다):

root:*:19327:0:99999:7:::
daemon:*:19327:0:99999:7:::
...
testuser:$6$somerandomsalt$gqE2qSg5aV1A3fH/vjXJ.nLdCn2KkL.D.v5/T6.zT.jC.gB6aB4bY3eZ2aX9cW8dY7eF6gH5iJ4kL3oP2qR1:19422:0:99999:7:::

각 줄은 콜론으로 구분된 여러 필드로 구성됩니다. 이 실습에서는 처음 두 필드에 관심이 있습니다:

  1. 사용자 이름 (Username): testuser
  2. 해시된 비밀번호 (Hashed Password): $6$somerandomsalt$gqE2qSg5aV1A3fH/vjXJ.nLdCn2KkL.D.v5/T6.zT.jC.gB6aB4bY3eZ2aX9cW8dY7eF6gH5iJ4kL3oP2qR1

해시 필드의 달러 기호 ($) 는 중요합니다. 첫 두 개의 $ 문자 사이의 숫자는 해싱 알고리즘을 나타냅니다. 이 경우, $6$은 비밀번호가 sha512crypt 알고리즘을 사용하여 해시되었음을 의미합니다.

unshadow 도구를 사용하여 passwd 및 shadow 파일 결합하기

이 단계에서는 unshadow 유틸리티를 사용하여 Hashcat 과 같은 비밀번호 크랙 도구에 적합한 단일 파일을 생성합니다. 크랙 도구는 /etc/passwd의 사용자 이름과 /etc/shadow의 해시를 특정 형식으로 필요로 합니다. John the Ripper 스위트의 일부인 unshadow 도구는 이 결합 프로세스를 자동화합니다.

이제 unshadow를 실행하고 /etc/passwd/etc/shadow를 입력으로 제공한 다음, 출력을 ~/project 디렉토리 내의 hashes.txt라는 새 파일로 리디렉션합니다.

터미널에서 다음 명령을 실행합니다:

sudo unshadow /etc/passwd /etc/shadow > ~/project/hashes.txt

이 명령은 두 시스템 파일을 읽고 관련 정보를 병합하여 ~/project/hashes.txt에 저장합니다.

이제 새로 생성된 파일의 내용을 보고 결과를 확인해 보겠습니다.

cat ~/project/hashes.txt

출력에는 크랙 도구가 예상하는 형식으로 사용자 목록과 해당 해시가 표시됩니다. testuser의 줄은 다음과 같이 보일 것입니다:

testuser:$6$somerandomsalt$gqE2qSg5aV1A3fH/vjXJ.nLdCn2KkL.D.v5/T6.zT.jC.gB6aB4bY3eZ2aX9cW8dY7eF6gH5iJ4kL3oP2qR1:1001:1001::/home/testuser:/bin/bash

이 파일은 이제 Hashcat 과 함께 사용할 준비가 되었습니다.

해시 유형 식별 (예: sha512crypt)

이 단계에서는 사용자 비밀번호에 사용된 해시 유형을 확인할 것입니다. 이 단계는 Hashcat 에 정확히 어떤 해싱 알고리즘을 사용할지 알려주어야 하므로 매우 중요합니다. 잘못된 알고리즘은 항상 실패합니다.

1 단계에서 관찰했듯이, 해시 문자열 자체의 형식은 알고리즘을 드러냅니다. hashes.txt 파일을 다시 살펴보겠습니다.

cat ~/project/hashes.txt

testuser의 해시 문자열에 집중합니다:

testuser:$6$somerandomsalt$gqE2qSg5aV1A3fH/vjXJ.nLdCn2KkL.D.v5/T6.zT.jC.gB6aB4bY3eZ2aX9cW8dY7eF6gH5iJ4kL3oP2qR1:...

해시는 $6$으로 시작합니다. 이것은 특정 유형의 해시에 대한 표준 식별자입니다. 일반적인 Linux 해시 식별자에 대한 빠른 참조는 다음과 같습니다:

  • $1$ = md5crypt (MD5)
  • $2a$ 또는 $2y$ = bcrypt (Blowfish)
  • $5$ = sha256crypt (SHA-256)
  • $6$ = sha512crypt (SHA-512)

$6$ 접두사를 기반으로 해시 유형을 sha512crypt로 자신 있게 식별할 수 있습니다. 이것이 다음 단계에 필요한 정보입니다.

해당 Hashcat 모드 선택

이 단계에서는 Hashcat 이 sha512crypt 알고리즘을 식별하는 데 사용하는 올바른 모드 번호를 찾습니다. Hashcat 은 수백 가지의 다양한 해시 유형을 지원하며, 각 유형에는 고유한 모드 번호가 할당됩니다.

sha512crypt의 모드를 찾기 위해 grep을 사용하여 Hashcat 의 도움말 정보를 검색할 수 있습니다. 이는 전체 도움말 메뉴를 읽지 않고 필요한 특정 모드를 찾는 효율적인 방법입니다.

sha512crypt를 검색하려면 다음 명령을 실행합니다:

hashcat --help | grep -i sha512crypt

grep-i 플래그는 검색을 대소문자 구분 없이 수행하므로 좋은 습관입니다. 출력에는 도움말 메뉴의 일치하는 줄이 표시됩니다:

...
1800 | sha512crypt, SHA512(Unix)                  | Operating System
...

이 출력에서 sha512crypt의 모드 번호가 1800임을 알 수 있습니다. 이 모드 번호를 마지막 단계에서 사용하여 Hashcat 이 hashes.txt 파일의 해시를 해석하는 방법을 알려줄 것입니다.

Linux 해시에 대한 사전 공격 실행

이 마지막 단계에서는 Hashcat 을 사용하여 캡처된 해시에 대해 사전 공격을 실행합니다. 사전 공격은 잠재적 비밀번호 목록 ("사전" 또는 "단어 목록") 을 가져와 대상 해시와 동일한 알고리즘을 사용하여 각 비밀번호를 해싱하고 결과를 비교하는 방식으로 작동합니다. 일치하는 항목이 발견되면 비밀번호가 크랙된 것입니다.

실험실 설정 중에 ~/project 디렉터리로 다운로드한 rockyou.txt 단어 목록을 사용합니다. 이것은 비밀번호 감사에 매우 일반적으로 사용되는 단어 목록입니다.

이제 수집한 모든 정보를 사용하여 전체 Hashcat 명령을 구성합니다:

  • 모드 (-m): sha512crypt의 경우 1800.
  • 해시 파일: ~/project/hashes.txt.
  • 단어 목록: ~/project/rockyou.txt.
  • 옵션 (--force): 가상화된 환경 또는 특정 드라이버에서 Hashcat 을 실행할 때 발생할 수 있는 오류를 방지하기 위해 추가됩니다.

공격을 시작하려면 다음 명령을 실행합니다:

hashcat -m 1800 --force ~/project/hashes.txt ~/project/rockyou.txt

Hashcat 이 초기화되고 크랙 세션을 시작합니다. 비밀번호 password123rockyou.txt 목록에 있으므로 프로세스는 매우 빠를 것입니다.

...
Session..........: hashcat
Status...........: Running
Hash.Name........: sha512crypt, SHA512(Unix)
Hash.Target......: testuser:$6$somerandomsalt$gqE2qSg5aV1A3fH/vjXJ.nLdCn...
...
Approaching final keyspace - workload adjusted.

Session..........: hashcat
Status...........: Cracked
...

Hashcat 이 상태를 Cracked 또는 Exhausted로 표시하면 공격이 완료된 것입니다. 크랙된 비밀번호를 보려면 동일한 명령에 --show 옵션을 사용할 수 있습니다.

hashcat -m 1800 --force ~/project/hashes.txt --show

출력에는 해당 일반 텍스트 비밀번호와 함께 크랙된 해시가 명확하게 표시됩니다.

testuser:$6$somerandomsalt$gqE2qSg5aV1A3fH/vjXJ.nLdCn2KkL.D.v5/T6.zT.jC.gB6aB4bY3eZ2aX9cW8dY7eF6gH5iJ4kL3oP2qR1:password123

testuser의 비밀번호를 성공적으로 크랙했습니다!

요약

이 실험실을 완료하신 것을 축하드립니다! Linux 시스템에서 클래식한 비밀번호 감사 워크플로우를 성공적으로 수행했습니다.

이 실험실에서는 다음을 배웠습니다.

  • 사용자 비밀번호 해시를 저장하는 /etc/shadow 파일의 구조를 읽고 이해하는 방법.
  • unshadow 도구를 사용하여 /etc/passwd/etc/shadow의 사용자 및 해시 데이터를 단일 파일로 결합하는 방법.
  • 해시 형식을 검사하여 비밀번호 해싱 알고리즘 (sha512crypt) 을 식별하는 방법.
  • 식별된 해시 유형에 대한 Hashcat 의 해당 모드 (1800) 를 찾는 방법.
  • 강력한 단어 목록, 추출된 해시를 사용하여 Hashcat 으로 사전 공격을 시작하는 방법.
  • 성공적으로 크랙된 비밀번호를 보는 방법.

이 연습은 일반적인 단어 목록에 없는 강력하고 복잡하며 고유한 비밀번호를 사용하는 것의 중요성을 보여줍니다. 시스템 관리자는 이러한 동일한 기술을 사용하여 환경에서 약한 비밀번호를 사전에 찾고 수정할 수 있습니다.