소개
이 실습에서는 John the Ripper 를 사용한 분산 비밀번호 크래킹의 개념적 측면을 탐구합니다. 복잡성과 리소스 요구 사항으로 인해 실제 분산 환경을 설정하지는 않겠지만, 분산 크래킹이 어떻게 작동하는지, 관련된 도구는 무엇인지, 그리고 그것이 제시하는 도전 과제와 이점에 대한 확실한 이해를 얻게 될 것입니다. 이러한 개념적 이해는 사이버 보안, 침투 테스팅 또는 비밀번호 보안에 관심 있는 모든 사람에게 매우 중요합니다. 비밀번호 크래킹 작업을 분산하는 원리, 이러한 목적으로 다양한 도구가 John the Ripper 와 어떻게 통합되는지, 그리고 이러한 시스템의 성능에 영향을 미치는 요인에 대해 배우게 될 것입니다.
분산 크래킹 개념 이해
이 단계에서는 분산 비밀번호 크래킹의 기본 개념을 배우게 됩니다. 분산 크래킹은 여러 컴퓨팅 리소스 (머신, CPU, GPU) 를 사용하여 일련의 비밀번호 해시를 함께 크래킹하는 작업을 수행하는 것을 포함합니다. 이 접근 방식은 특히 복잡하거나 긴 비밀번호의 경우, 단일 머신을 사용하는 것에 비해 비밀번호를 크래킹하는 데 필요한 시간을 크게 단축합니다.
핵심 아이디어는 워크로드를 여러 "노드" 또는 "워커"로 분할하는 것입니다. 각 워커는 비밀번호 공간의 일부 (예: 가능한 비밀번호 범위 또는 해시의 하위 집합) 를 받아 독립적으로 크래킹을 시도합니다. 워커가 크래킹된 비밀번호를 찾으면 중앙 "마스터" 또는 "코디네이터" 노드에 보고합니다.
주요 개념은 다음과 같습니다.
- 워크로드 분산: 크래킹 작업이 여러 머신으로 분할되는 방식입니다. 이는 각 워커에게 사전 파일의 다른 부분, 다른 문자 세트 또는 다른 해시 하위 집합을 할당하여 수행할 수 있습니다.
- 중앙 집중식 vs. 분산식 제어: 워커가 결과를 통신하고 보고하는 방식입니다. 중앙 집중식 모델에서는 마스터 노드가 모든 워커를 관리합니다. 분산식 모델에서는 워커가 직접 또는 공유 데이터베이스를 통해 통신할 수 있습니다.
- 확장성: 크래킹 속도를 높이기 위해 더 많은 워커를 추가하는 기능입니다.
- 내결함성: 일부 워커가 실패하더라도 시스템이 계속 작동하는 능력입니다.
- 네트워크 지연: 노드 간 통신 지연으로, 전체 성능에 영향을 미칠 수 있습니다.
크래킹할 비밀번호 해시 목록이 많은 시나리오를 생각해 보세요. 한 대의 강력한 머신이 모든 가능한 조합을 시도하는 대신, 10 대의 덜 강력한 머신을 사용하여 각 머신이 조합의 1/10 을 시도하도록 할 수 있습니다. 이러한 병렬 처리는 프로세스를 극적으로 가속화합니다.
설명을 위해 사전 공격이 어떻게 분산될 수 있는지 생각해 봅시다. 사전 파일이 있다면 이를 여러 개의 더 작은 파일로 분할할 수 있으며, 각 워커 머신은 이러한 더 작은 사전 파일 중 하나를 대상 해시에 대해 처리할 수 있습니다.
Conceptual Example:
Master Node:
- Receives password hashes.
- Divides dictionary file into chunks (e.g., dict_chunk_A, dict_chunk_B).
- Assigns dict_chunk_A to Worker 1.
- Assigns dict_chunk_B to Worker 2.
- Collects cracked passwords from workers.
Worker 1:
- Receives dict_chunk_A and hashes.
- Runs John the Ripper with dict_chunk_A against hashes.
- Reports cracked passwords to Master Node.
Worker 2:
- Receives dict_chunk_B and hashes.
- Runs John the Ripper with dict_chunk_B against hashes.
- Reports cracked passwords to Master Node.
이러한 개념적 이해는 다음 단계에서 특정 도구 및 기술을 탐구하는 기초를 형성합니다.
John the Ripper 를 사용한 분산 크래킹 도구 탐색
이 단계에서는 John the Ripper 를 사용한 분산 크래킹을 지원하는 다양한 도구와 방법을 탐색합니다. John the Ripper 자체는 강력한 단일 노드 크래커이지만, 다른 도구 (예: 분산 세션을 위한 Hashcat 의 hashcat-utils) 와 같은 방식으로 내장된 분산 크래킹 기능을 기본적으로 제공하지는 않습니다. 따라서 John the Ripper 를 사용한 분산 크래킹은 종종 외부 오케스트레이션 도구 또는 사용자 정의 스크립팅을 포함합니다.
일반적인 접근 방식 및 도구는 다음과 같습니다.
사용자 정의 스크립팅 (Bash/Python): 가장 유연한 접근 방식은 작업 분산을 관리하는 사용자 정의 스크립트를 작성하는 것입니다. 여기에는 다음이 포함됩니다.
- 대규모 비밀번호 목록 또는 해시 파일 분할.
- 워커 노드로 데이터 복사 (예:
scp또는rsync사용). - 원격 노드에서 John the Ripper 명령 실행 (예:
ssh사용). - 워커 노드에서 결과 수집.
- 예: 마스터 스크립트는 워커 머신에
ssh로 접속하여john --wordlist=part_X.txt hashes.txt를 실행한 다음john.pot파일을scp로 다시 가져올 수 있습니다.
분산 컴퓨팅 프레임워크: 더 복잡한 설정의 경우, 범용 분산 컴퓨팅 프레임워크를 적용할 수 있습니다. 비밀번호 크래킹을 위해 특별히 설계되지는 않았지만, 클러스터 전반에 걸쳐 작업을 관리할 수 있습니다. 예시는 다음과 같습니다.
- Celery (Python): John the Ripper 명령을 워커 노드에 작업으로 분산하는 데 사용할 수 있는 분산 작업 큐입니다.
- Apache Spark: 간단한 크래킹에는 과도하지만, 이론적으로는 매우 대규모의 데이터 집약적인 크래킹 작업에 사용될 수 있습니다.
특수 크래킹 오케스트레이션 도구: 일부 도구는 분산 크래킹을 관리하도록 설계되었으며, 종종 여러 크래킹 엔진을 지원합니다.
- Hashcat 의
hashcat-utils(특히hccapx2john및potfile_merge): 주로 Hashcat 용이지만, 분산 크래킹을 위한 데이터 준비 및 결과 병합의 개념은 유사합니다. John 의 경우, 입력 파일을 분산하고john.pot파일을 병합하는 데 중점을 둘 것입니다. - 사용자 정의 웹 인터페이스/API: 대규모 팀의 경우, 크래킹 작업을 제출하고 진행 상황을 모니터링하며 John the Ripper 인스턴스 클러스터에서 결과를 검색하는 웹 기반 인터페이스를 구축할 수 있습니다.
- Hashcat 의
간단한 분산 설정을 위해 ssh 및 scp를 사용하는 개념적 예시를 살펴보겠습니다.
## Conceptual Master Script (on master machine)
## This script is for conceptual understanding only and will not be executed.
## Assume worker1 and worker2 are accessible via SSH
WORKERS="worker1 worker2"
HASH_FILE="hashes.txt"
DICTIONARY_FILE="rockyou.txt" ## Large dictionary
## Step 1: Split the dictionary file
## This would be done on the master or a shared storage
## For simplicity, let's assume we split it into 2 parts
## split -l 5000000 $DICTIONARY_FILE dict_part_
## Step 2: Distribute hash file and dictionary parts to workers
for WORKER in $WORKERS; do
echo "Distributing files to $WORKER..."
## scp $HASH_FILE $WORKER:~/project/
## scp dict_part_aa $WORKER:~/project/ ## For worker1
## scp dict_part_ab $WORKER:~/project/ ## For worker2
done
## Step 3: Start cracking jobs on workers
## This would be done via SSH
## ssh worker1 "cd ~/project && john --wordlist=dict_part_aa $HASH_FILE" &
## ssh worker2 "cd ~/project && john --wordlist=dict_part_ab $HASH_FILE" &
## Step 4: Monitor and collect results
## This would involve checking john.pot files on workers and merging them
## scp worker1:~/project/john.pot john_worker1.pot
## scp worker2:~/project/john.pot john_worker2.pot
## cat john_worker1.pot john_worker2.pot > merged.pot
이 개념적 스크립트는 여러 머신에서 John the Ripper 를 오케스트레이션하는 데 관련된 수동 노력을 강조합니다. 더 정교한 도구는 이러한 단계를 자동화합니다.
간단한 분산 크래킹 환경 설정 (개념적)
이 단계에서는 개념적으로 간단한 분산 크래킹 환경을 설정합니다. 이 실험실은 개념적이므로 실제 가상 머신이나 물리적 하드웨어를 프로비저닝하지는 않을 것입니다. 대신, 논리적 아키텍처에 초점을 맞춰 이러한 환경을 설정하기 위한 단계와 고려 사항을 개략적으로 설명합니다.
일반적인 개념적 설정은 다음과 같습니다.
마스터 노드:
- 중앙 제어 지점 역할을 합니다.
- 원본 해시 파일 및 잠재적으로 전체 사전/단어 목록을 저장합니다.
- 워커 노드로의 작업 분산을 관리합니다.
- 워커 노드로부터 결과를 수집하고 집계합니다.
ssh클라이언트,scp및 스크립팅 기능 (Bash, Python) 이 필요합니다.
워커 노드 (2 개 이상):
- 실제 크래킹 작업을 수행합니다.
- 마스터로부터 해시의 하위 집합 또는 비밀번호 공간의 일부를 받습니다.
- John the Ripper 인스턴스를 실행합니다.
john.pot파일 (크래킹된 비밀번호) 을 저장합니다.- 결과를 마스터에 보고합니다.
ssh서버, 설치된 John the Ripper 및 충분한 CPU/GPU 리소스가 필요합니다.
개념적 설정 단계:
- 네트워크 구성: 모든 마스터 및 워커 노드가 서로 통신할 수 있는지 확인합니다. 일반적으로 로컬 네트워크를 설정하거나 클라우드 인스턴스를 사용하는 경우 적절한 방화벽 규칙을 적용해야 합니다. 단순화를 위해 동일한 서브넷에 있거나 IP 주소/호스트 이름을 통해 서로 도달할 수 있다고 가정합니다.
- SSH 키 기반 인증: 자동화된 스크립팅을 위해 마스터 노드에서 모든 워커 노드로 SSH 키 기반 인증을 설정하는 것이 중요합니다. 이를 통해 마스터는 수동 비밀번호 입력 없이 명령을 실행하고 파일을 전송할 수 있습니다.
- 마스터에서:
ssh-keygen - 워커로 공개 키 복사:
ssh-copy-id user@worker_ip
- 마스터에서:
- John the Ripper 설치 (개념적): 각 워커 노드에 John the Ripper 를 설치해야 합니다. 이 개념적 실험실에서는 사용 가능하다고 가정합니다.
- 공유 디렉토리 (선택 사항이지만 권장): 더 큰 설정의 경우, 공유 네트워크 파일 시스템 (NFS, SMB) 을 사용하여 해시 파일, 사전 및
john.pot파일을 저장하여 데이터 분산 및 수집을 단순화할 수 있습니다. 그러나 더 작은 설정의 경우scp로도 충분한 경우가 많습니다.
마스터 노드에서 SSH 연결을 단순화하기 위한 개념적 ~/.ssh/config 파일을 고려해 보겠습니다.
## Conceptual ~/.ssh/config on Master Node
## This file is for conceptual understanding only.
Host worker1
Hostname 192.168.1.101
User labex
IdentityFile ~/.ssh/id_rsa
Host worker2
Hostname 192.168.1.102
User labex
IdentityFile ~/.ssh/id_rsa
이 구성을 사용하면 ssh labex@192.168.1.101 대신 간단히 ssh worker1을 사용할 수 있습니다.
개념적 설정은 크래킹 작업을 시작하기 전에 필요한 인프라 및 연결성을 강조합니다. 분산 크래킹의 효율성은 잘 구성되고 안정적인 기본 환경에 크게 의존합니다.
분산 크래킹 작업 관리
이 단계에서는 환경이 설정된 후 분산 크래킹 작업을 관리하는 방법을 개념적으로 학습합니다. 효과적인 작업 관리는 분산 크래킹 설정에서 효율성을 극대화하고, 진행 상황을 모니터링하며, 결과를 처리하는 데 중요합니다.
분산 크래킹 작업 관리의 주요 측면은 다음과 같습니다.
작업 제출:
- 작업 정의: 크래킹할 해시, 크래킹 모드 (단어 목록, 무차별 대입), 규칙 및 사용할 사전/문자 집합.
- 작업량 분할: 이것이 가장 중요한 부분입니다. 단어 목록 공격의 경우, 사전 파일을 청크로 분할할 수 있습니다. 무차별 대입의 경우, 다른 문자 범위를 할당할 수 있습니다 (예: 워커 1 에는
a-m, 워커 2 에는n-z). - 입력 파일 배포: 각 워커가 필요한 해시 파일, 사전 청크 또는 규칙 파일을 가지고 있는지 확인합니다.
진행 상황 모니터링:
- 원격
john상태: John the Ripper 는 콘솔에 상태를 출력할 수 있습니다. 각 워커에서 이 상태를 원격으로 확인할 방법이 필요합니다. - 로그 파일: 각 워커의 로그 파일로 John 의 출력을 리디렉션한 다음, 마스터에서 주기적으로 이 로그를 가져오거나 추적합니다.
- 중앙 집중식 대시보드 (고급): 매우 큰 설정의 경우, 사용자 정의 웹 대시보드에서 모든 워커의 상태, 크래킹된 해시 및 예상 남은 시간을 표시할 수 있습니다.
- 원격
결과 수집 및 병합:
john.pot파일: 워커의 각 John the Ripper 인스턴스는 크래킹된 비밀번호를 포함하는 자체john.pot파일을 생성합니다.john.pot검색:scp또는 공유 파일 시스템을 사용하여 모든john.pot파일을 마스터 노드로 가져옵니다.john.pot파일 병합: John the Ripper 는john.pot파일을 병합하는 내장 메커니즘을 가지고 있습니다. 단순히 연결한 다음 병합된 파일에서john --show를 사용하거나, John 이 중복을 자동으로 처리하므로 결합된john.pot파일에서john --restore를 사용할 수 있습니다.
분산 단어 목록 공격을 관리하기 위한 개념적 워크플로우를 고려해 보겠습니다.
Conceptual Job Management Workflow:
1. Prepare Hashes:
- Master node has `target_hashes.txt`.
2. Prepare Dictionary:
- Master node splits `large_dictionary.txt` into `dict_part_01`, `dict_part_02`, etc.
- Command: `split -l 1000000 large_dictionary.txt dict_part_`
3. Distribute Files:
- Master node `scp`s `target_hashes.txt` to all workers.
- Master node `scp`s `dict_part_XX` to the respective worker (e.g., `dict_part_01` to worker1, `dict_part_02` to worker2).
4. Launch Cracking Jobs:
- Master node `ssh`es into each worker and starts John:
`ssh worker1 "cd ~/project && john --wordlist=dict_part_01 target_hashes.txt --format=raw-md5"`
`ssh worker2 "cd ~/project && john --wordlist=dict_part_02 target_hashes.txt --format=raw-md5"`
- Use `nohup` and `&` to run in background and prevent termination on SSH disconnect.
5. Monitor Progress (Conceptual):
- Periodically `ssh` into workers and check `john.log` or `john --status`.
- `ssh worker1 "cat ~/project/john.log"`
6. Collect Results:
- Once jobs are complete or paused, `scp` `john.pot` files from each worker to master:
`scp worker1:~/project/john.pot worker1_pot.txt`
`scp worker2:~/project/john.pot worker2_pot.txt`
7. Merge Results:
- Concatenate all `pot` files on the master:
`cat worker1_pot.txt worker2_pot.txt > combined.pot`
- John will handle duplicates when showing results from `combined.pot`:
`john --show combined.pot`
이 개념적 워크플로우는 관련된 수동 단계를 보여줍니다. 실제 시나리오에서는 이러한 단계가 스크립트 또는 특수 오케스트레이션 도구를 사용하여 자동화될 것입니다.
분산 크래킹 성능 분석
이 단계에서는 분산 비밀번호 크래킹의 성능 측면을 개념적으로 분석합니다. 성능을 이해하는 것은 설정을 최적화하고 리소스 할당에 대한 정보에 입각한 결정을 내리는 데 중요합니다.
여러 요인이 분산 크래킹 시스템의 성능에 영향을 미칩니다.
- 워커 수: 일반적으로 워커 수가 많을수록 크래킹 속도가 빨라집니다. 그러나 네트워크 지연 및 조정과 같은 오버헤드로 인해 수익 체감 현상이 발생합니다.
- 워커 하드웨어: 개별 워커 노드의 처리 능력 (CPU 코어, GPU 기능) 은 크래킹 속도에 직접적인 영향을 미칩니다. 특정 해시 유형에 대해 John the Ripper 가 지원하는 경우 GPU 를 사용하면 상당한 속도 향상을 얻을 수 있습니다.
- 네트워크 지연 및 대역폭: 마스터와 워커 간, 또는 워커 간 (통신이 필요한 경우) 의 높은 지연 또는 낮은 대역폭은 특히 대규모 사전 파일 또는 결과를 전송할 때 병목 현상이 될 수 있습니다.
- 작업량 분배 전략: 워커 간에 작업이 얼마나 효과적으로 분할되는지입니다. 불균등한 분배 (일부 워커가 다른 워커보다 훨씬 일찍 완료됨) 는 유휴 리소스를 초래하고 전반적인 효율성을 저하시킵니다.
- 해시 유형 복잡성: 일부 해시 유형은 다른 해시 유형보다 크래킹하는 데 계산적으로 더 많은 노력이 필요하며, 이는 분배와 관계없이 전체 시간에 영향을 미칩니다.
- John the Ripper 구성: 각 워커에서 최적의 John the Ripper 설정 (예: 단일 머신의 멀티 코어 CPU 용
--fork옵션, 특정 규칙 또는 단어 목록) 은 개별 워커 성능에 상당한 영향을 미칠 수 있습니다.
개념적 성능 지표:
- 초당 해시 수 (H/s): 크래킹 속도의 주요 지표입니다. 분산 설정에서는 모든 활성 워커의 H/s 를 합산하여 총 시스템 H/s 를 얻습니다.
- 크래킹 시간: 특정 해시 세트를 크래킹하는 데 걸리는 총 시간입니다. 이것이 효율성의 궁극적인 척도입니다.
- 리소스 활용도: 각 워커 및 마스터의 CPU, GPU, 메모리 및 네트워크 사용량을 모니터링하여 병목 현상을 식별합니다.
개념적 최적화 전략:
- 부하 분산: 워커 간에 작업이 고르게 분배되도록 합니다. 사전 공격의 경우, 이는 사전을 대략 동일한 부분으로 분할하는 것을 의미합니다. 무차별 대입의 경우, 균형 잡힌 문자 범위를 할당합니다.
- 네트워크 트래픽 최소화: 필요한 데이터만 전송합니다. 예를 들어, 사전이 정적이면 한 번 전송하고 워커에 유지합니다.
- GPU 활용: John the Ripper 가 대상 해시 유형에 대해 GPU 크래킹을 지원하는 경우, 워커 노드의 GPU 를 활용하여 대규모 속도 향상을 얻습니다.
- 모니터링 및 조정: 분산 시스템의 성능을 지속적으로 모니터링하고 필요에 따라 작업량 분배를 조정하거나 워커를 추가/제거합니다.
개념적 시나리오를 고려해 보겠습니다. 각각 100,000 H/s 를 처리할 수 있는 10 개의 워커 노드가 있습니다. 총 이론적 H/s = 10 * 100,000 H/s = 1,000,000 H/s (1 MH/s). 그러나 네트워크 오버헤드 및 조정으로 인해 실제 효과적인 H/s 는 800,000 H/s 일 수 있습니다. 성능 분석의 목표는 이 격차를 식별하고 줄이는 것입니다.
Conceptual Performance Analysis:
## On each worker, John the Ripper's status output would show H/s:
## Example output from 'john --status' on a worker:
## 0g 0:00:00:05 DONE (2023-10-27 10:30) 0g/s 100000p/s 100000c/s 100000C/s ...
## Master would aggregate these:
## Worker1 H/s: 100,000
## Worker2 H/s: 95,000 (maybe slightly slower due to hardware variation)
## Worker3 H/s: 102,000
## ...
## Total System H/s = Sum of all worker H/s.
## If one worker consistently shows much lower H/s, it might indicate a bottleneck
## (e.g., less powerful hardware, network issues, or an uneven workload).
이러한 성능 요인과 지표를 이해함으로써 더 효율적인 분산 크래킹 환경을 설계하고 관리할 수 있습니다.
요약
이 실습에서는 John the Ripper 를 사용한 분산 비밀번호 크래킹에 대한 포괄적인 개념적 이해를 얻었습니다. 작업량 분배, 확장성 및 내결함성을 포함하여 크래킹 작업을 분산하는 기본 개념을 탐구했습니다. 그런 다음 ssh 및 scp를 사용한 사용자 지정 스크립팅부터 분산 컴퓨팅 프레임워크의 잠재적 사용에 이르기까지 오케스트레이션에 사용되는 다양한 도구 및 접근 방식에 대해 자세히 알아보았습니다.
또한 분산 크래킹 환경의 개념적 설정, 마스터 및 워커 노드의 역할 식별, 네트워크 구성 및 SSH 키 기반 인증의 중요성에 대해 배웠습니다. 또한 작업 제출, 진행 상황 모니터링, 결과 수집 및 병합을 포함하여 분산 크래킹 작업을 관리하는 중요한 측면을 이해했습니다. 마지막으로 워커 수, 하드웨어 기능, 네트워크 조건 및 작업량 분배 전략과 같은 분산 크래킹 시스템 성능에 영향을 미치는 주요 요인을 분석했습니다.
이 실습은 실제 구현보다는 개념적 이해에 중점을 두었지만, 얻은 지식은 대규모 비밀번호 크래킹 작업의 실제 측면에 대해 더 깊이 파고들거나 이러한 강력한 기술의 보안 영향을 이해하려는 모든 사람에게 강력한 기반을 제공합니다.


