John the Ripper 를 사용하여 SSH 개인 키 크랙하기

Kali LinuxBeginner
지금 연습하기

소개

SSH (Secure Shell) 키는 원격 서버에 인증하는 안전한 방법으로, 비밀번호 기반 로그인보다 더 강력한 대안을 제공합니다. 추가적인 보안을 위해 SSH 개인 키는 암호 구문 (passphrase) 으로 암호화할 수 있습니다. 공격자가 개인 키 파일에 접근하더라도, 이를 사용하려면 암호 구문이 필요합니다.

하지만 약한 암호 구문은 심각한 취약점이 될 수 있습니다. 이 실습에서는 보안 분석가의 입장에서 이 위험을 이해하게 됩니다. 강력한 오픈 소스 비밀번호 크래킹 도구인 John the Ripper 를 사용하여 SSH 개인 키의 암호 구문을 크래킹하는 방법을 배우게 됩니다. 이 연습은 강력한 암호 구문 사용의 중요성을 강조하기 위한 교육 목적으로 진행됩니다.

비밀번호로 보호되는 SSH 개인 키 생성

이 단계에서는 새로운 SSH 키 쌍을 생성합니다. 개인 키는 간단하고 추측하기 쉬운 암호 구문으로 보호됩니다. 이 키는 다음 단계의 크래킹 실습 대상이 됩니다.

ssh-keygen 명령을 사용하여 키를 생성합니다. 프로젝트 디렉토리 내에 키가 생성되도록 키 유형, 비트 크기 및 파일 이름을 지정할 것입니다.

RSA SSH 키 쌍을 생성하려면 다음 명령을 실행하십시오. 암호 구문을 입력하라는 메시지가 표시되면 labex를 입력합니다.

ssh-keygen -t rsa -b 2048 -f ./my_ssh_key -C "labex@labex.io"

암호 구문을 입력하고 확인하라는 메시지가 표시됩니다. 두 프롬프트 모두에 labex를 입력하고 Enter 키를 누릅니다.

Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): labex
Enter same passphrase again: labex
Your identification has been saved in ./my_ssh_key
Your public key has been saved in ./my_ssh_key.pub
The key fingerprint is:
SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx labex@labex.io
The key's randomart image is:
+---[RSA 2048]----+
|        .        |
|       . .       |
|      .   .      |
|     . . . .     |
|    . . S .      |
|   . . . o       |
|  . . . + .      |
| . . . =.o.o     |
|..  .oo*+E+      |
+----[SHA256]-----+

이제 현재 디렉토리의 파일을 나열하여 새로 생성된 키 쌍, 즉 개인 키 my_ssh_key와 공개 키 my_ssh_key.pub를 확인합니다.

ls -l
total 12
-rw------- 1 labex labex 1823 Jan 01 12:00 my_ssh_key
-rw-r--r-- 1 labex labex  401 Jan 01 12:00 my_ssh_key.pub
-rw-r--r-- 1 labex labex   48 Jan 01 12:00 wordlist.txt

비밀번호로 보호되는 SSH 개인 키를 성공적으로 생성했습니다.

ssh2john 을 사용하여 SSH 키에서 해시 추출

John the Ripper 는 SSH 키 파일 형식으로 직접 작업할 수 없습니다. 암호화된 암호 구문을 나타내는 특정 해시 형식이 필요합니다. 이 해시를 얻기 위해 John the Ripper 스위트에 포함된 ssh2john이라는 유틸리티를 사용할 것입니다.

이 단계에서는 생성한 개인 키 (my_ssh_key) 에 ssh2john을 실행하고 그 출력을 새 파일에 저장합니다. 이 파일에는 john이 크래킹을 시도할 수 있는 해시가 포함됩니다.

해시를 추출하여 ssh_hash.txt라는 파일에 저장하려면 다음 명령을 실행하십시오.

ssh2john my_ssh_key > ssh_hash.txt

이 명령은 > 연산자를 사용하여 출력을 ssh_hash.txt 파일로 리디렉션했기 때문에 터미널에 아무런 출력을 생성하지 않습니다.

생성된 해시 파일의 내용을 보려면 cat 명령을 사용하십시오.

cat ssh_hash.txt

키의 암호 구문에 대한 해시 표현인 긴 텍스트 문자열이 표시됩니다. 다음과 유사하게 보일 것입니다.

my_ssh_key:$ssh2$0$16$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx$1040$xxxxxxxx...

이제 크래킹 프로세스를 위한 해시 파일이 준비되었습니다.

John the Ripper 로 SSH 키 해시 크랙하기

해시를 추출했으므로 이제 John the Ripper 를 사용하여 크랙할 차례입니다. "사전 공격"을 수행할 것이며, 여기서 john은 제공된 목록의 모든 단어를 가능한 암호 구문으로 시도합니다. 이 실습에서는 환경에 미리 생성된 wordlist.txt 파일을 사용할 것입니다.

실제 시나리오에서는 공격자가 수백만 개의 일반적인 암호, 이름 및 사전 단어를 포함하는 대규모 단어 목록을 사용합니다. 우리의 간단한 단어 목록에는 올바른 암호 구문인 labex가 포함되어 있어 이 시연에서 크랙이 성공적으로 이루어지도록 합니다.

단어 목록과 해시 파일을 지정하여 john 명령을 실행합니다.

john --wordlist=wordlist.txt ssh_hash.txt

John 이 크래킹 프로세스를 시작합니다. 암호 구문이 짧은 단어 목록에 있으므로 거의 즉시 발견됩니다.

Using default input encoding: UTF-8
Loaded 1 password hash (SSH [RSA/DSA/EC/OPENSSH private keys ssh2john])
Cost 1 (KDF/cipher) is 0 for all loaded hashes
Cost 2 (iteration count) is 16 for all loaded hashes
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
labex            (my_ssh_key)
1g 0:00:00:00 DONE (2023-01-01 12:05) 12.50g/s 12.50p/s 12.50c/s 12.50C/s sunshine..labex
Use the "--show" option to display all of the cracked passwords reliably
Session completed

성공! 출력 줄 labex (my_ssh_key)는 암호 구문 labex가 키 my_ssh_key에 대해 성공적으로 복구되었음을 보여줍니다.

John the Ripper 는 크랙된 암호를 "pot 파일"(~/.john/john.pot 기본값) 이라는 파일에 저장합니다. 공격을 다시 실행하지 않고 크랙된 암호를 다시 보려면 --show 옵션을 사용할 수 있습니다.

john --show ssh_hash.txt
my_ssh_key:labex

1 password hash cracked, 0 left

이는 크랙된 암호 구문을 확인합니다. 이제 SSH 키의 약한 암호 구문을 성공적으로 크랙했습니다.

SSH 키 보안 이해하기

이 실습은 중요한 점을 보여줍니다. 암호 구문으로 보호되는 SSH 키의 보안은 암호 구문 자체의 강도만큼만 강력하다는 것입니다. SSH 키 보안의 구성 요소를 분석해 보겠습니다.

  • 키 강도 (암호화): 이는 키를 생성하는 데 사용된 알고리즘 (예: RSA, ECDSA, Ed25519) 및 키 크기 (예: 2048, 4096 비트) 를 나타냅니다. 키 크기가 클수록 공격자가 무차별 대입 공격을 통해 기본 암호화를 깨뜨리기 기하급수적으로 어려워집니다. 이는 공개 키에서 개인 키를 파생시키려는 공격으로부터 보호합니다.

  • 암호 구문 강도 (암호화): 이는 개인 키 파일 자체를 보호합니다. 암호 구문을 설정하면 개인 키 파일이 암호화됩니다. 누군가 이 파일을 훔치더라도 먼저 복호화하지 않으면 사용할 수 없습니다. 보았듯이 약하거나 흔하거나 사전 기반의 암호 구문은 쉽게 크랙될 수 있습니다. 강력한 암호 구문은 길고 복잡하며 고유해야 하므로 사전 공격 또는 무차별 대입 공격이 계산적으로 불가능합니다.

  • 파일 권한 (액세스 제어): 운영 체제의 파일 권한은 첫 번째 방어선입니다. 개인 키 파일은 항상 소유자에게만 액세스를 제한하는 권한 (예: 600 또는 -rw-------) 을 가져야 합니다. 이렇게 하면 동일한 시스템의 다른 사용자가 키 파일을 읽는 것을 방지할 수 있습니다.

이 실습에서 키의 암호화 강도는 공격 벡터가 암호화 자체가 아니라 파일을 암호화하는 데 사용된 약한 암호 구문이었기 때문에 관련이 없었습니다.

SSH 키 관리를 위한 모범 사례

위험을 이해하는 것이 첫 번째 단계입니다. 모범 사례를 적용하는 것이 이를 완화하는 방법입니다. 실제 환경에서 SSH 키를 안전하게 관리하기 위한 필수 규칙은 다음과 같습니다.

  • 강력하고 고유한 암호 구문 사용:

    • 일반적인 단어, 이름 또는 간단한 패턴을 절대 사용하지 마십시오.
    • 강력한 암호 구문은 길어야 하며 (15 자 이상), 대문자, 소문자, 숫자 및 기호의 조합을 포함해야 합니다.
    • 암호 관리자를 사용하여 매우 복잡한 암호 구문을 생성하고 저장하는 것을 고려하십시오.
  • 최신 알고리즘 및 적절한 키 크기 사용:

    • 구형 RSA 보다 Ed25519 또는 ECDSA 와 같은 최신 알고리즘을 선호하십시오. 더 나은 보안 및 성능을 제공합니다.
    • RSA 를 사용하는 경우 최소 2048 비트의 키 크기를 사용하고, 장기적인 보안을 위해서는 4096 비트를 권장합니다.
  • 개인 키 파일 보안:

    • 개인 키 파일 (예: ~/.ssh/id_rsa) 에 항상 엄격한 파일 권한을 적용하십시오. chmod 600을 사용하여 사용자만 읽기/쓰기 액세스할 수 있도록 하십시오.
  • SSH 에이전트 사용:

    • SSH 에이전트 (ssh-agent) 는 메모리에 복호화된 개인 키를 캐싱하는 백그라운드 프로그램입니다. 키를 에이전트에 추가할 때 암호 구문을 한 번 입력하면 세션 기간 동안 다시 입력할 필요가 없습니다. 이는 편리하고 안전하며, 암호 구문이 반복적으로 입력되거나 디스크에 저장되지 않습니다.
  • 정기적으로 키 교체:

    • 주기적으로 새 SSH 키 쌍을 생성하고 이전 키는 사용 중지하십시오. 이렇게 하면 이전 키가 손상될 경우 공격자가 악용할 수 있는 기회를 제한할 수 있습니다.
  • 개인 키 절대 공유 금지:

    • 개인 키는 개인적인 것입니다. 고유한 신원입니다. 이메일, 채팅 또는 기타 매체를 통해 절대 보내지 마십시오. 다른 사람이 액세스해야 하는 경우 자체 키 쌍을 생성하고 공개 키를 제공해야 합니다.

요약

이 실습에서는 일반적인 보안 감사 작업을 직접 경험했습니다. 다음을 성공적으로 수행했습니다.

  • 암호 구문으로 보호되는 새 SSH 키 쌍 생성.
  • ssh2john 유틸리티를 사용하여 개인 키 파일에서 크랙 가능한 해시 추출.
  • John the Ripper 를 사용하여 사전 공격을 수행하여 약한 암호 구문 크랙.
  • 암호화 강도와 암호 구문 강도의 고유한 역할을 포함하여 SSH 키 보안의 기본 원리 학습.
  • 안전한 SSH 키 관리를 위한 필수 모범 사례 검토.

이 연습은 강력한 암호화 도구조차도 약한 인간의 관행으로 인해 약화될 수 있음을 보여줍니다. 디지털 신원의 무결성을 보장하기 위해 항상 강력하고 고유한 암호 구문으로 SSH 키를 보호하십시오.