소개
Hashcat 은 세계적으로 유명한 비밀번호 복구 도구로, 매우 다양한 해시 (hash) 를 놀라운 속도로 크래킹할 수 있습니다. 사전 공격 (dictionary attack) 이 흔히 사용되지만, 이는 비밀번호가 주어진 단어 목록 (wordlist) 에 포함되어 있을 때만 효과적입니다. 가능한 모든 문자 조합을 시도하는 순수 무차별 대입 공격 (pure brute-force attack) 은 실용적으로 너무 느린 경우가 많습니다.
이때 마스크 공격 (mask attack) 이 유용하게 사용됩니다. 마스크 공격은 비밀번호 구조에 대해 어느 정도 알고 있을 때 사용되는 매우 효율적인 무차별 대입 공격 형태입니다. 예를 들어, 비밀번호의 길이 또는 비밀번호가 대문자로 시작하고 숫자로 끝난다는 사실을 알고 있을 수 있습니다.
본 랩 (Lab) 에서는 Hashcat 을 사용하여 마스크 공격을 수행하는 기본 사항을 학습합니다. 먼저 개념을 이해하고, 문자 집합 (character sets) 을 사용하여 마스크를 구축하는 방법을 배운 다음, 이 지식을 적용하여 알려진 패턴을 가진 비밀번호 해시를 크래킹하는 방법을 익히게 됩니다.
마스크 공격 (-a 3) 개념 이해하기
이 단계에서는 Hashcat 에서 마스크 공격의 기본 개념을 학습합니다. 마스크 공격 모드는 -a 3 옵션을 사용하여 지정합니다. 이 모드는 Hashcat 에게 사용자가 정의한 패턴, 즉 "마스크 (mask)"를 기반으로 비밀번호 후보 (candidate) 를 생성하도록 지시합니다.
이는 미리 만들어진 단어 목록을 사용하는 사전 공격 (-a 0) 과는 다릅니다. 마스크 공격은 즉석에서 자체 후보를 생성합니다.
마스크가 어떻게 후보를 생성하는지 살펴보겠습니다. 해시를 크래킹하는 대신 생성된 비밀번호를 화면에 출력하기 위해 --stdout 옵션을 사용할 수 있습니다. 여기서는 단순한 숫자 (0-9) 자리 표시자로 ?d를 사용하겠습니다.
모든 가능한 3 자리 숫자를 생성하려면 다음 명령을 실행하십시오.
hashcat -a 3 ?d?d?d --stdout
Hashcat 은 가능한 모든 3 자리 조합을 생성할 것입니다. Hashcat 의 최적화 알고리즘으로 인해 출력 순서가 무작위로 보일 수 있지만, 000부터 999까지의 모든 조합을 생성할 것입니다.
...
476
576
876
976
...
이는 핵심 아이디어를 보여줍니다. 마스크 ?d?d?d는 템플릿 역할을 하며, Hashcat 은 지정된 문자 집합에서 가능한 모든 조합으로 체계적으로 이를 채웁니다.
내장 문자 집합 (?l, ?u, ?d, ?s) 학습하기
이 단계에서는 마스크의 기본 구성 요소인 내장 문자 집합에 대해 학습합니다. 이는 특정 문자 그룹을 나타내는 자리 표시자입니다.
Hashcat 은 다음과 같은 몇 가지 편리한 내장 문자 집합을 제공합니다.
| 자리 표시자 | 문자 집합 | 설명 |
|---|---|---|
?l |
abcdefghijklmnopqrstuvwxyz |
모든 소문자 |
?u |
ABCDEFGHIJKLMNOPQRSTUVWXYZ |
모든 대문자 |
?d |
0123456789 |
모든 숫자 |
?s |
!"#$%&'()*+,-./:;<=>?@[\]^_~ |
모든 특수 문자 (기호) |
?a |
?l?u?d?s |
가능한 모든 문자 |
이러한 자리 표시자를 조합하여 복잡한 마스크를 만들 수 있습니다. 마스크의 길이는 생성될 비밀번호 후보의 길이를 직접적으로 결정합니다.
대문자 하나 뒤에 숫자 하나로 구성된 비밀번호에 대한 후보를 생성해 보겠습니다. 이 경우 마스크는 ?u?d가 됩니다.
출력을 확인하기 위해 다시 --stdout 옵션을 사용합니다.
hashcat -a 3 ?u?d --stdout
Hashcat 은 대문자 하나 뒤에 숫자 하나가 오는 모든 조합을 생성할 것입니다. 출력 순서는 Hashcat 의 최적화 알고리즘으로 인해 무작위로 보일 수 있지만, A0부터 Z9까지의 모든 조합을 생성할 것입니다.
...
B4
C7
D2
...
이러한 문자 집합들을 조합함으로써 테스트하려는 비밀번호에 대한 정확한 패턴을 정의할 수 있습니다.
3 자리 PIN(NTLM 해시) 에 대한 마스크 공격 실행하기
이 단계에서는 학습한 내용을 실제 시나리오, 즉 3 자리 PIN 을 크래킹하는 데 적용해 볼 것입니다. pin_hash.txt라는 파일이 있으며, 이 파일에는 NTLM 형식의 비밀번호 해시가 포함되어 있습니다. 우리는 원래 비밀번호가 3 자리 숫자일 것이라고 추측합니다.
먼저, 해시 파일의 내용을 확인해 보겠습니다.
cat pin_hash.txt
NTLM 해시를 보게 될 것입니다.
D2063C28444B9B742B9B89C282395EBF
이것을 크래킹하려면 Hashcat 에게 세 가지를 알려줘야 합니다.
- 공격 모드는 마스크 공격 (
-a 3) 입니다. - 해시 유형은 NTLM(
-m 1000) 입니다. - 3 자리 PIN 에 대한 마스크는
?d?d?d입니다.
이제 이들을 하나의 명령으로 결합하여 공격을 시작합니다.
hashcat -a 3 -m 1000 pin_hash.txt ?d?d?d
Hashcat 이 시작될 것이며, 키 공간 (000-999) 이 매우 작기 때문에 거의 즉시 비밀번호를 찾을 것입니다.
...
D2063C28444B9B742B9B89C282395EBF:137
...
Status...........: Cracked
...
Hashcat 이 비밀번호 137을 성공적으로 복구했습니다. 비밀번호가 크래킹되면 Hashcat 은 이를 "potfile"이라는 파일에 저장합니다. --show 옵션을 사용하여 이 해시 유형에 대해 크래킹된 모든 비밀번호를 볼 수 있습니다.
hashcat -m 1000 pin_hash.txt --show
출력:
D2063C28444B9B742B9B89C282395EBF:137
알려진 비밀번호 패턴에 대한 사용자 지정 마스크 생성하기
이 단계에서는 좀 더 복잡한 비밀번호를 다룹니다. 한 회사가 "비밀번호는 정확히 5 개의 소문자로 구성되어야 한다"는 비밀번호 정책을 가지고 있다고 가정해 봅시다. 예시 비밀번호는 labex가 될 수 있습니다.
이러한 비밀번호의 NTLM 해시가 pattern_hash.txt 파일에 있습니다.
먼저, 이 비밀번호 정책을 Hashcat 마스크로 변환해 보겠습니다.
- 5 개의 문자가 모두 소문자여야 합니다:
?l?l?l?l?l
이를 통해 최종 마스크는 ?l?l?l?l?l이 됩니다.
이제 이 마스크를 사용하여 pattern_hash.txt에 있는 해시를 크래킹해 보겠습니다. 명령은 이전 단계와 유사하지만 새로운 마스크를 사용합니다.
hashcat -a 3 -m 1000 pattern_hash.txt ?l?l?l?l?l
Hashcat 은 이 특정 패턴에 맞는 모든 조합을 테스트하기 시작할 것입니다. 이는 5 자리 조합을 시도하는 순수 무차별 대입 공격 (brute-force attack) 보다 훨씬 효율적입니다. 잠시 후 비밀번호를 찾을 것입니다.
...
2BF7D33EC706798E0308F5DF34BC7D2F:labex
...
Status...........: Cracked
...
정확히 5 개의 소문자라는 요구되는 정책과 일치하는 사용자 지정 마스크를 생성하여 특정 패턴의 비밀번호를 성공적으로 크래킹했습니다.
마스크 공격과 사전 공격의 성능 비교
마지막 단계에서는 방금 수행한 마스크 공격과 전통적인 사전 공격의 성능을 비교하여 각 공격 방식의 장점을 이해해 보겠습니다.
사전 공격 (-a 0) 은 비밀번호가 단어 목록 (wordlist) 에 포함되어 있을 경우 매우 빠릅니다. 이전 단계에서 사용한 비밀번호가 포함된 작은 사전 파일 dict.txt가 있습니다.
pattern_hash.txt에 대해 사전 공격을 실행해 보겠습니다.
hashcat -a 0 -m 1000 pattern_hash.txt dict.txt
labex가 dict.txt에 포함되어 있으므로 Hashcat 은 거의 즉시 이를 찾아냅니다.
hashcat (v6.2.5) starting
OpenCL API (OpenCL 2.0 pocl 1.8 Linux, None+Asserts, RELOC, LLVM 11.1.0, SLEEF, DISTRO, POCL_DEBUG) - Platform #1 [The pocl project]
=====================================================================================================================================
* Device #1: pthread-Intel(R) Xeon(R) Platinum 8575C, 6808/13680 MB (2048 MB allocatable), 4MCU
Minimum password length supported by kernel: 0
Maximum password length supported by kernel: 256
INFO: All hashes found in potfile! Use --show to display them.
Started: Sat Oct 11 16:05:20 2025
Stopped: Sat Oct 11 16:05:20 2025
Hashcat 은 해당 해시가 이미 발견되어 potfile 에 저장되었다고 알려줍니다. 크랙된 비밀번호를 보려면 --show 옵션을 사용할 수 있습니다.
hashcat -a 0 -m 1000 pattern_hash.txt dict.txt --show
출력:
2bf7d33ec706798e0308f5df34bc7d2f:labex
그렇다면 마스크 공격이 유리한 경우는 언제일까요? 사전 공격은 오직 정확한 비밀번호가 단어 목록에 존재할 경우에만 성공합니다. 만약 비밀번호가 testx였고 이것이 사전에 없었다면, 공격은 실패했을 것입니다.
하지만 4 단계에서 수행한 마스크 공격 (?l?l?l?l?l) 은 여전히 성공할 것입니다. 이는 해당 패턴에 맞는 모든 비밀번호를 체계적으로 생성하고 테스트하기 때문이며, 해당 비밀번호가 사전에 있는지 여부와는 무관합니다. 마스크 공격은 labex, testx, hello 등을 순서대로 테스트할 것입니다.
결론:
- 사전 공격 (
-a 0): 일반적인 비밀번호를 크랙하거나 고품질의 타겟팅된 단어 목록을 가지고 있을 때 가장 좋습니다. 빠르지만 단어 목록의 내용에 의해 제한됩니다. - 마스크 공격 (
-a 3): 비밀번호의 구조나 패턴 (예: 알려진 비밀번호 정책) 을 알고 있을 때 가장 좋습니다. 사전 공격보다 훨씬 포괄적이며 순수 무차별 대입 공격 (pure brute-force attack) 보다 효율성이 무한히 높습니다.
요약
본 실습 (lab) 에서는 Hashcat 의 가장 강력한 기능 중 하나인 마스크 공격 (mask attack) 에 대한 실습 경험을 쌓았습니다.
다음 내용을 학습했습니다.
- 마스크 공격 (
-a 3) 의 기본 개념과 패턴을 기반으로 비밀번호 후보를 생성하는 방법. - Hashcat 의 내장 문자 집합 (
?l,?u,?d,?s) 을 사용하여 마스크를 구성하는 방법. - 간단한 마스크를 적용하여 3 자리 PIN 을 크래킹하는 방법.
- 알려진 비밀번호 정책 (5 개의 소문자) 을 기반으로 사용자 지정 마스크를 생성하여 특정 패턴의 비밀번호를 크래킹하는 방법.
- 표준 사전 공격과 비교했을 때 마스크 공격을 사용할 때의 주요 차이점과 전략적 이점.
마스크 공격은 사전 공격의 속도와 순수 무차별 대입 공격의 포괄성 사이에서 완벽한 균형을 제공하므로 모든 보안 전문가에게 필수적인 기술입니다.



