Step 116. Metasploit 입문 — 공격의 표준 조립 공장

Step 116. Metasploit 입문 — 공격의 표준 조립 공장

Level 2 — 보안 입문과 공격 스킬 기초 | 난이도 ★★★☆☆ | 예상 소요 시간 3시간

전제: Step 115에서 CVE-2011-2523(vsftpd 2.3.4 백도어)을 읽었다. "공격 코드가 Exploit-DB와 Metasploit에 공개돼 있다"는 사실을 안다.

  • 준비물: 랩의 Kali 리눅스(Metasploit은 기본 내장). 오늘은 모듈을 "설정"하는 데까지만 — 실행(exploit)은 Step 117에서 합니다.
  • 주의: ⚠️ 이 챕터의 실습은 내 랩·합법 플랫폼 전용입니다. 허가 없는 시스템에 적용하면 범죄입니다. 이 환경에는 Kali와 Metasploit이 없으므로, 이 챕터의 모든 화면은 출력 예시입니다. 여러분의 Kali에서 직접 따라 하며 대조하세요.

Step 115에서 우리는 "vsftpd 2.3.4 백도어 공격 코드가 Metasploit 모듈로 있다(EDB-ID 17491)"는 사실까지 확인했습니다. 오늘은 그 도구 창고의 문을 엽니다. Metasploit은 익스플로잇 프레임워크 — 수천 개의 공격 모듈과 페이로드를 레고처럼 조립해 실행하는, 침투 테스트의 사실상 표준 도구입니다. 다행히 조작 흐름은 언제나 같습니다: search(찾기) → use(선택) → set(설정) → exploit(실행). 오늘은 이 네 글자의 흐름을 손에 익힙니다.


1. 학습 목표

이 챕터를 끝내면 다음을 할 수 있습니다:

  • msfconsole을 실행하고 프롬프트의 변화(일반 셸 → msf 셸)를 인식한다
  • search로 모듈을 찾고 결과 표(번호, 이름, 등급, 설명)를 읽는다
  • use로 모듈을 선택하고 show options로 설정 항목을 확인한다
  • set RHOSTS 등으로 옵션을 설정하고, RHOSTS(타깃)와 LHOST(내 주소)를 구분한다
  • show payloads로 호환 페이로드 목록을 보고, 페이로드의 의미를 설명한다

2. 배경 지식 — 오늘의 도구와 개념

오늘의 도구 한눈에 보기

구분 내용
언어·환경 Kali 리눅스, Metasploit Framework (msfconsole)
오늘의 명령 msfconsole, search, use, show options, set/unset, show payloads, info, back
필요한 개념 모듈 구조(exploit/auxiliary/payload), RHOSTS와 LHOST, Step 115의 CVE 독서 카드
오늘의 산출물 vsftpd 백도어 모듈의 "설정 완료" 상태 (show options 캡처)

2-1. 프레임워크 — 공격 코드의 조립 공장

Step 115의 Exploit-DB에는 공격 코드가 날것으로 있습니다 — 읽고, 고치고, 컴파일하고, 직접 실행해야 합니다. Metasploit은 이 일을 표준화합니다. 모든 공격이 같은 인터페이스로 포장되어 있어서, 개별 코드의 세부를 몰라도 같은 절차로 실행할 수 있습니다.

비유하자면 Exploit-DB가 부품 창고라면, Metasploit은 조립 설명서와 작업대까지 갖춘 공장입니다. 오늘 우리는 작업대 사용법만 배우고, 조립품의 발사는 다음 챕터로 미룹니다.

2-2. 모듈의 세 종류 — exploit, payload, auxiliary

Metasploit의 부품(모듈)은 크게 세 종류입니다.

  • 익스플로잇(exploit): 취약점을 뚫는 코드 본체입니다. "어떻게 문을 여는가"를 담당합니다. 오늘의 주인공 exploit/unix/ftp/vsftpd_234_backdoor가 이 종류입니다.
  • 페이로드(payload): 뚫고 나서 상대 컴퓨터에서 실행될 코드입니다. "문을 연 뒤 무엇을 하는가" — 쉘을 열거나, 사용자를 추가하거나. 익스플로잇과 페이로드를 레고처럼 조합하는 것이 Metasploit의 핵심 설계입니다.
  • 보조(auxiliary): 뚫지는 않는 모듈 — 스캔, 정보 수집, 로그인 시도 등. 우리가 nmap으로 했던 정찰의 일부를 여기서도 할 수 있습니다.

모듈 이름의 경로가 곧 분류입니다. exploit/unix/ftp/vsftpd_234_backdoor는 "exploit / 대상 OS(unix) / 서비스(ftp) / 이름" 순서입니다.

2-3. 네 글자의 흐름 — search → use → set → exploit

어떤 모듈이든 조작 절차는 같습니다.

  1. search: 키워드로 모듈을 찾는다
  2. use: 모듈을 선택한다 — 프롬프트에 모듈 이름이 박힌다
  3. set: show options로 필요한 항목을 보고 값을 채운다
  4. exploit: 실행한다 (오늘은 여기까지만 익히고, 실행은 Step 117)

그리고 방향 변수 둘을 지금부터 확실히 구분하세요. RHOSTS는 "Remote HOSTS — 타깃(피해자 역할 머신)의 주소", LHOST는 "Local HOST — 내(Kali) 주소"입니다. 이 둘을 뒤집는 것이 초보 최고빈도 실수 1위이며, 오늘 6번 섹션의 첫 벽입니다.


3. 따라 하기

3-1. msfconsole 실행 — 첫 실행은 느리다

Kali 터미널에서 실행합니다.

입력 (Kali 터미널)

msfconsole

출력 예시:

                                                  

       =[ metasploit v6.3.x  ]
+ -- --=[ 2376 exploits - 1220 auxiliary - 413 post       ]
+ -- --=[ 1382 payloads - 46 encoders - 11 nops           ]

msf6 >

읽는 법: 첫 실행은 데이터베이스 초기화 때문에 10~30초 걸릴 수 있습니다. 배너 아래 숫자들이 오늘의 창고 재고입니다 — 익스플로잇 2천 개 이상, 페이로드 1천 개 이상. 그리고 프롬프트가 msf6 >로 바뀌었습니다. 지금부터 치는 명령은 리눅스가 아니라 Metasploit이 받습니다. 빠져나갈 때는 exit, 실행 중인 것을 멈출 때는 Ctrl+C입니다.

: 프롬프트의 변화가 "지금 누구와 대화 중인가"를 알려 줍니다. msf6 >에서 ls 같은 셸 명령이 안 먹히는 것은 고장이 아니라 대화 상대가 바뀐 것입니다.

3-2. search — 창고에서 모듈 찾기

Step 115의 독서 카드가 여기서 빛을 발합니다. 찾을 것은 vsftpd입니다.

입력

search vsftpd

출력 예시:

Matching Modules
================

   #  Name                                  Disclosure Date  Rank       Check  Description
   -  ----                                  ---------------  ----       -----  -----------
   0  exploit/unix/ftp/vsftpd_234_backdoor  2011-07-03       excellent  No     VSFTPD v2.3.4 Backdoor Command Execution

읽는 법: 표의 열을 읽으세요 — 번호(#), 모듈 경로(Name), 공개일(Disclosure Date), 신뢰 등급(Rank), 설명. excellent는 "실패해도 대상을 망가뜨릴 위험이 거의 없는" 안정 등급입니다. 우리가 찾던 모듈이 번호 0번으로 있습니다.

: search의 결과 표는 "이 취약점에 도구가 있는가"에 대한 프레임워크의 대답입니다. 독서 카드의 EDB-ID 17491(Metasploit)과 같은 모듈임을 설명의 "Backdoor Command Execution"으로 확인할 수 있습니다.

3-3. use와 show options — 모듈 선택과 설정 확인

입력

use exploit/unix/ftp/vsftpd_234_backdoor
show options

출력 예시:

msf6 > use exploit/unix/ftp/vsftpd_234_backdoor
[*] No payload configured, defaulting to cmd/unix/interact

msf6 exploit(unix/ftp/vsftpd_234_backdoor) > show options

Module options (exploit/unix/ftp/vsftpd_234_backdoor):

   Name     Current Setting  Required  Description
   ----     ---------------  --------  -----------
   RHOSTS                    yes       The target host(s) ...
   RPORT    21               yes       The target port (TCP)

읽는 법: 세 가지 변화를 보세요. ① 프롬프트가 msf6 exploit(unix/ftp/vsftpd_234_backdoor) >로 바뀌어 "지금 어느 모듈을 잡고 있는지"를 항상 보여 줍니다. ② 페이로드를 따로 고르지 않았으므로 기본값(cmd/unix/interact — 명령 대화형 쉘)이 자동 배정됐다는 알림. ③ show options 표에서 Required가 yes인데 Current Setting이 비어 있는 항목 — RHOSTS가 오늘 우리가 채워야 할 유일한 빈칸입니다. RPORT 21은 FTP 표준 포트라 이미 채워져 있습니다.

: 모듈 선택 → 빈칸 확인의 흐름은 모든 모듈에서 같습니다. "Required yes인데 빈 것을 채운다" — 이 한 문장이 set의 존재 이유입니다.

3-4. set — 타깃 주소 채우기

입력

set RHOSTS 192.168.56.101
show options

출력 예시:

msf6 exploit(unix/ftp/vsftpd_234_backdoor) > set RHOSTS 192.168.56.101
RHOSTS => 192.168.56.101

msf6 exploit(unix/ftp/vsftpd_234_backdoor) > show options

Module options (exploit/unix/ftp/vsftpd_234_backdoor):

   Name     Current Setting   Required  Description
   ----     ---------------   --------  -----------
   RHOSTS   192.168.56.101    yes       The target host(s) ...
   RPORT    21                yes       The target port (TCP)

읽는 법: set의 확인 응답은 RHOSTS => 값 형태입니다. 다시 show options를 했더니 빈칸이 채워졌습니다. 여기서 192.168.56.101은 랩의 MS2 주소일 뿐, 여러분의 랩 주소로 바꿔야 합니다. 잘못 채웠으면 unset RHOSTS로 비우거나 다시 set하면 됩니다.

: 설정 → 재확인의 습관입니다. 실무에서 발사 전 마지막으로 하는 일이 show options 재확인입니다. 타깃 주소 오타는 "아무 일도 안 일어남" 또는 최악의 경우 "엉뚱한 대상에 발사"를 뜻합니다.

3-5. show payloads — 조립 가능한 부품 보기

이 익스플로잇과 호환되는 페이로드가 무엇인지 구경합니다.

입력

show payloads

출력 예시 (발췌):

Compatible Payloads
===================

   #  Name                                Disclosure Date  Rank    Check  Description
   -  ----                                ---------------  ----    -----  -----------
   0  cmd/unix/interact                                    normal  No     Unix Command, Interact with Established Connection
   1  cmd/unix/bind_perl                                   normal  No     Unix Command Shell, Bind TCP (via Perl)
   2  cmd/unix/bind_perl_ipv6                              normal  No     Unix Command Shell, Bind TCP IPv6 (via Perl)
   3  cmd/unix/bind_ruby                                   normal  No     Unix Command Shell, Bind TCP (via Ruby)
   4  cmd/unix/reverse_perl                                normal  No     Unix Command Shell, Reverse TCP (via Perl)
   5  cmd/unix/reverse_bash                                normal  No     Unix Command Shell, Reverse TCP (/dev/tcp)
   ...

읽는 법: 이름만 봐도 두 패밀리가 보입니다 — bind_*(대상이 문을 열고 기다림)와 reverse_*(대상이 거꾸로 내게 접속). 기본 배정된 cmd/unix/interact는 이 백도어의 특성(이미 열린 6200번 쉘과 대화)에 맞는 최소 페이로드입니다. bind와 reverse의 차이는 Step 118에서 손으로 만들며 배우니, 지금은 "페이로드 이름에 연결 방향이 적혀 있다"는 것만 기억하세요.

: 익스플로잇(문 여는 법)과 페이로드(문 연 뒤 할 일)가 분리되어 있다는 Metasploit의 핵심 설계를 확인하는 단계입니다. 같은 익스플로잇이라도 페이로드를 바꾸면 결과물(쉘의 종류)이 달라집니다.

3-6. info — 모듈의 설명서 읽기

발사 전에 설명서를 읽는 습관입니다.

입력

info

출력 예시 (발췌):

       Name: VSFTPD v2.3.4 Backdoor Command Execution
     Module: exploit/unix/ftp/vsftpd_234_backdoor
   Platform: Unix
       Arch: cmd
 Privileged: No
    License: Metasploit Framework License (BSD)
       Rank: Excellent
  Disclosed: 2011-07-03

Description:
  This module exploits a malicious backdoor that was added to the
  VSFTPD download archive. This backdoor was present in the
  vsftpd-2.3.4.tar.gz archive sometime before 2011-07-03.

References:
  https://nvd.nist.gov/vuln/detail/CVE-2011-2523

읽는 법: Step 115의 독서 카드와 같은 정보가 모듈 안에도 있습니다 — 공개일, 설명, 그리고 CVE 링크. 스캐너(Step 114) → NVD/Exploit-DB(Step 115) → Metasploit 모듈(오늘)이 한 줄로 이어지는 것이 보입니다.

: 지금까지 배운 것들이 서로 다른 도구가 아니라 하나의 흐름임을 확인하는 마무리입니다. 오늘은 실행 버튼 exploit를 누르지 않습니다 — 발사는 설정이 완전히 검증된 다음의 일입니다.


4. 미션과 연습문제

미션 — 모듈 설정 흐름 매뉴얼 없이 재현

  1. msfconsole을 실행합니다.
  2. search로 vsftpd 모듈을 찾고, 결과 표의 Rank 열 값을 노트에 적습니다.
  3. use로 모듈을 선택한 뒤 프롬프트 변화를 확인합니다.
  4. show options로 빈칸을 찾고, set RHOSTS <랩의 MS2 주소>로 채웁니다.
  5. show payloads에서 bind_ 계열과 reverse_ 계열을 각각 하나씩 골라 이름을 적습니다.
  6. back으로 모듈에서 빠져나온 뒤, 다시 처음부터 2~4번을 매뉴얼 없이 재현합니다.

연습문제

문제 1. Metasploit 모듈 세 종류(exploit, payload, auxiliary)의 역할 차이를 한 문장씩 말해 보세요.

문제 2. msf6 exploit(unix/ftp/vsftpd_234_backdoor) >라는 프롬프트가 알려 주는 정보 두 가지를 말해 보세요.

문제 3. RHOSTS와 LHOST의 차이를 "누구의 주소인가"로 설명하고, 둘을 뒤집어 설정하면 어떤 일이 생기는지 말해 보세요.

문제 4. show options에서 Required가 yes인데 Current Setting이 비어 있는 항목은 무엇을 의미하며, 어떻게 처리하나요?


5. 모범 답안과 완료 기준

미션 모범 답안

흐름 전체 (출력 예시):

msf6 > search vsftpd
   #  Name                                  Rank       Description
   0  exploit/unix/ftp/vsftpd_234_backdoor  excellent  VSFTPD v2.3.4 Backdoor Command Execution

msf6 > use exploit/unix/ftp/vsftpd_234_backdoor
msf6 exploit(unix/ftp/vsftpd_234_backdoor) > set RHOSTS 192.168.56.101
RHOSTS => 192.168.56.101
msf6 exploit(unix/ftp/vsftpd_234_backdoor) > show options
   ... RHOSTS  192.168.56.101  yes ...

노트에 적혀 있어야 할 것: Rank는 excellent. bind 계열 예시는 cmd/unix/bind_perl, reverse 계열 예시는 cmd/unix/reverse_bash. back은 선택한 모듈에서 빠져나와 msf6 >로 돌아가는 명령입니다.

검증하는 법: ① 매뉴얼 없이 search → use → set → show options 재확인까지 한 번에 되는가. ② 설정 후 show options로 빈칸이 사라졌음을 직접 확인했는가. ③ 아직 exploit를 누르지 않았는가 — 발사는 Step 117의 몫입니다.

연습문제 해답

문제 1 해답. exploit은 취약점을 뚫어 문을 여는 코드, payload는 문이 열린 뒤 상대 컴퓨터에서 실행될 코드(쉘 등), auxiliary는 뚫지 않고 돕는 모듈(스캔, 정보 수집)입니다. 익스플로잇과 페이로드가 분리되어 자유롭게 조합된다는 것이 프레임워크의 핵심입니다.

문제 2 해답. 첫째, 지금 명령을 받는 주체가 Metasploit이라는 것(msf6). 둘째, 현재 선택된 모듈이 exploit/unix/ftp/vsftpd_234_backdoor라는 것. 프롬프트가 곧 "지금 어디에 있는가"라는 위치 표시판입니다.

문제 3 해답. RHOSTS는 타깃(공격 대상, Remote)의 주소, LHOST는 내 머신(Kali, Local)의 주소입니다. 뒤집으면 공격이 자기 자신을 향하거나, 리버스 페이로드의 경우 피해자가 "접속할 곳"으로 엉뚱한 주소를 배웁니다 — 발사해도 아무 연결이 안 되거나, 최악에는 제3자 대상으로 향합니다. 설정 후 show options 재확인이 이 실수의 방지망입니다.

문제 4 해답. "이 모듈은 이 값 없이는 실행 불가"라는 뜻입니다. 오늘 모듈에서는 RHOSTS가 그랬습니다. set 이름 값으로 채우고, 다시 show options로 채워진 것을 확인한 뒤에만 다음 단계로 갑니다.

완료 기준 체크리스트

  • [ ] msfconsole의 프롬프트 변화를 설명할 수 있다
  • [ ] search 결과 표의 열(번호·경로·등급·설명)을 읽을 수 있다
  • [ ] use로 모듈을 선택하고 info로 설명서를 읽었다
  • [ ] show optionsset → 재확인 흐름을 매뉴얼 없이 했다
  • [ ] RHOSTS와 LHOST를 구분해 설명할 수 있다
  • [ ] show payloads에서 bind 계열과 reverse 계열을 구분했다
  • [ ] 미션: 흐름 전체를 재현하고 설정 완료 상태를 만들었다

6. 흔한 실수와 해결

벽 1. RHOSTS와 LHOST를 뒤집어요

증상 (출력 예시): set RHOSTS <내 Kali 주소>로 설정하고 나서야 뭔가 이상함을 깨닫습니다.

원인: 두 변수 이름이 비슷합니다. R은 Remote(타깃), L은 Local(나)입니다.
해결: "RHOSTS = 맞는 쪽(타깃), LHOST = 놓는 쪽(나)"으로 기억하세요. 그리고 set 직후에는 반드시 show options로 재확인 — 이 습관 하나가 초보 실수 1위를 예방합니다.

벽 2. msfconsole이 실행이 안 되거나 첫 실행이 한없이 느려요

증상 (출력 예시): 명령을 치고 한참 동안 배너가 안 뜹니다.

원인: 첫 실행은 모듈 데이터베이스를 초기화하느라 수십 초가 걸립니다. 두 번째부터는 빠릅니다.
해결: 기다리면 됩니다. 그래도 영원히 안 뜨면 터미널을 닫지 말고 로그를 읽으세요. Kali에서 DB 초기화가 꼬였다면 msfdb init으로 재초기화합니다.

벽 3. msf 프롬프트에서 리눅스 명령이 안 먹혀요

증상 (출력 예시): msf6 >에서 ifconfig를 쳤더니 동작이 이상하거나 오류가 납니다.

원인: 지금 대화 상대는 리눅스 셸이 아니라 Metasploit입니다. (참고로 msfconsole은 일부 시스템 명령을 통과시켜 주지만, 버전에 따라 다릅니다.)
해결: 리눅스 명령이 필요하면 새 터미널 탭을 여세요. Metasploit 창은 exit 전까지 프레임워크의 것입니다.

벽 4. search 결과가 하나도 안 나와요

증상 (출력 예시): search vstfpdMatching Modules가 비어 있습니다.

원인: 오타(vstfpd)이거나, 너무 긴 키워드입니다. search는 이름·설명·CVE 번호까지 검색합니다.
해결: 짧은 핵심어로 줄여 보세요 (vsftpd). CVE 번호(search CVE-2011-2523)로도 찾을 수 있습니다. 모듈 경로가 길면 use 입력 중 Tab 자동완성이 됩니다.

벽 5. set을 했는데 적용이 안 된 것 같아요

증상 (출력 예시): set RHOST 192.168.56.101(S를 빼먹음) — 오류 없이 넘어갔는데 options에 없습니다.

원인: 옵션 이름 오타입니다. 버전에 따라 존재하지 않는 이름을 set하면 조용히 무시되거나 별도 변수로 저장됩니다. 정확한 이름은 RHOSTS(복수형 S)입니다.
해결: show options 표에 있는 철자 그대로 치세요. 그리고 역시, set 후 재확인이 모든 것을 잡아 냅니다.


7. 정리

오늘의 개념

개념 한 줄 설명
익스플로잇 프레임워크 공격 모듈과 페이로드를 표준 인터페이스로 조립·실행하는 도구
모듈(module) Metasploit의 부품 — exploit / payload / auxiliary 등
exploit 취약점을 뚫어 문을 여는 코드 본체
payload 문이 열린 뒤 상대에서 실행될 코드 — 이름에 bind/reverse 방향 표기
RHOSTS / LHOST 타깃(Remote)의 주소 / 내 머신(Local)의 주소 — 최고빈도 혼동
Rank 모듈의 안정성 등급 — excellent는 대상을 망가뜨릴 위험이 낮음

오늘의 명령어

명령 하는 일
msfconsole Metasploit 대화형 셸 실행 (첫 실행은 느림)
search 키워드 이름·설명·CVE로 모듈 검색
use 모듈경로 모듈 선택 — 프롬프트에 경로가 박힘 (Tab 자동완성)
show options 설정 항목과 빈칸(Required yes) 확인
set 이름 값 / unset 이름 옵션 채우기 / 비우기
show payloads 이 익스플로잇과 호환되는 페이로드 목록
info / back / exit 모듈 설명서 / 선택 해제 / 종료

명령어보다 중요한 감각

Metasploit은 만능이 아니라 "정리된 창고"입니다. search → use → set → exploit 네 글자의 흐름만 몸에 붙으면, 새로운 모듈을 만나도 같은 절차로 다룰 수 있습니다. 오늘 우리는 창고에서 부품을 꺼내 조립대에 올리고, 나사(옵션)까지 조여 둔 상태입니다. show options의 빈칸이 사라진 화면이 오늘의 산출물입니다.

그리고 기억하세요 — 조립과 발사는 다른 일입니다. 오늘 우리는 일부러 발사하지 않았습니다. 설정이 완료된 이 상태가 바로 인생 첫 쉘이 열리기 직전의 순간이며, 그 마지막 한 명령은 Step 117의 몫입니다.


전부 체크되면 Step 116 완료입니다. 사이드바의 체크박스를 눌러 진도를 저장하세요.